dsh-ssh-tui 0.8.2 → 0.8.4-rc.1
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/CHANGELOG.md +92 -0
- package/README.en.md +17 -15
- package/README.md +11 -8
- package/docs/release-notes-0.8.2.md +3 -1
- package/docs/release-notes-0.8.3.md +72 -0
- package/docs/release-notes-0.8.4-rc.1.md +271 -0
- package/lib/dsh-compat.js +22 -0
- package/lib/dsh-compat.js.map +1 -1
- package/lib/footer-budget.js +1 -7
- package/lib/footer-budget.js.map +1 -1
- package/lib/input-reader.js +415 -0
- package/lib/input-reader.js.map +1 -0
- package/lib/input-router.js +82 -0
- package/lib/input-router.js.map +1 -0
- package/lib/terminal-input.js +14 -10
- package/lib/terminal-input.js.map +1 -1
- package/lib/tui.js +711 -354
- package/lib/tui.js.map +1 -1
- package/lib/types/dsh-compat.d.ts +20 -1
- package/lib/types/footer-budget.d.ts +0 -9
- package/lib/types/input-reader.d.ts +198 -0
- package/lib/types/input-router.d.ts +73 -0
- package/lib/types/terminal-input.d.ts +15 -1
- package/lib/types/tui.d.ts +210 -18
- package/package.json +88 -87
- package/lib/footer-accents.js +0 -28
- package/lib/footer-accents.js.map +0 -1
- package/lib/types/footer-accents.d.ts +0 -22
package/lib/types/tui.d.ts
CHANGED
|
@@ -229,7 +229,6 @@ export declare class SshTui {
|
|
|
229
229
|
private input;
|
|
230
230
|
private cursor;
|
|
231
231
|
private inputFolded;
|
|
232
|
-
private inPaste;
|
|
233
232
|
private history;
|
|
234
233
|
private historyIndex;
|
|
235
234
|
/** Live input parked while browsing history with ↑. Restored by ↓ past the newest item. */
|
|
@@ -375,7 +374,6 @@ export declare class SshTui {
|
|
|
375
374
|
private readonly onReattach;
|
|
376
375
|
private readonly onDetach;
|
|
377
376
|
private renderTimer;
|
|
378
|
-
private readonly decoder;
|
|
379
377
|
private readonly color;
|
|
380
378
|
private readonly maxToolOutputLines;
|
|
381
379
|
private readonly showReasoning;
|
|
@@ -650,8 +648,6 @@ export declare class SshTui {
|
|
|
650
648
|
* `turn/start` is the only thing that resets it.
|
|
651
649
|
*/
|
|
652
650
|
private reasoningExpandedChoice;
|
|
653
|
-
private escapeBuffer;
|
|
654
|
-
private escapeTimer;
|
|
655
651
|
/**
|
|
656
652
|
* How long an acknowledgement or a warning stays on the chrome.
|
|
657
653
|
*
|
|
@@ -666,11 +662,19 @@ export declare class SshTui {
|
|
|
666
662
|
private feedbackTtlMs;
|
|
667
663
|
private feedbackTimer;
|
|
668
664
|
/**
|
|
669
|
-
*
|
|
670
|
-
*
|
|
671
|
-
*
|
|
665
|
+
* The input Reader (AD-21): decoding, reply filtering, escape assembly, paste
|
|
666
|
+
* framing and unit classification live there; the frames come back through
|
|
667
|
+
* `handleInputText` / `consumeFrame`, which own the routing and the semantics.
|
|
672
668
|
*/
|
|
673
|
-
private readonly
|
|
669
|
+
private readonly reader;
|
|
670
|
+
/**
|
|
671
|
+
* The Router (AD-22, W-2): the one place a unit's owner is decided.
|
|
672
|
+
*
|
|
673
|
+
* `ownershipView` is the read-only snapshot it answers from — one object, rewritten
|
|
674
|
+
* per decision, so a keystroke allocates nothing (W-2 is a hot-path migration).
|
|
675
|
+
*/
|
|
676
|
+
private readonly router;
|
|
677
|
+
private readonly ownershipView;
|
|
674
678
|
private thinkingStartedAt;
|
|
675
679
|
private waitStartedAt;
|
|
676
680
|
/**
|
|
@@ -700,6 +704,15 @@ export declare class SshTui {
|
|
|
700
704
|
private cwdChipRow;
|
|
701
705
|
/** Set when a card expand/collapse moves chrome; next paint full-redraws. */
|
|
702
706
|
private forceFullPaint;
|
|
707
|
+
/**
|
|
708
|
+
* How many times the Screen has been dismissed.
|
|
709
|
+
*
|
|
710
|
+
* A read is not a key: its units are delivered one at a time, and a Screen owns the
|
|
711
|
+
* read it was sent — once it is gone the rest is dropped (0.8.3's rule, W-3a keeps
|
|
712
|
+
* it). Counting dismissals rather than comparing the Screen object keeps that check
|
|
713
|
+
* out of the owner-read ratchet, which exists to stop new *ownership* reads.
|
|
714
|
+
*/
|
|
715
|
+
private screenDismissals;
|
|
703
716
|
/** Highest row the last budgeted frame could not paint, resumed next tick. */
|
|
704
717
|
private paintResume;
|
|
705
718
|
/** How many times a display has come back after a drop in this Host's life. */
|
|
@@ -1765,6 +1778,16 @@ export declare class SshTui {
|
|
|
1765
1778
|
private setField;
|
|
1766
1779
|
/** Insert at the caret of whichever field owns the keyboard. */
|
|
1767
1780
|
private insertIntoField;
|
|
1781
|
+
/**
|
|
1782
|
+
* Move the caret of whichever field owns the keyboard to one end (Home/End).
|
|
1783
|
+
*
|
|
1784
|
+
* One implementation for the two owners that carry these keys (W-3b.1): the composer
|
|
1785
|
+
* edits the draft, a Surface with a borrowed field edits the answer, and a Surface
|
|
1786
|
+
* without one has nothing to move — `textIsEditable` is what says which of those the
|
|
1787
|
+
* keyboard is on. Ctrl+A/Ctrl+E reach the same two positions through `composerUnit`,
|
|
1788
|
+
* which asks the same question.
|
|
1789
|
+
*/
|
|
1790
|
+
private moveFieldCursor;
|
|
1768
1791
|
/** One card's key: a call's batch can repeat a question id across calls. */
|
|
1769
1792
|
private questionCardKey;
|
|
1770
1793
|
/**
|
|
@@ -2156,9 +2179,125 @@ export declare class SshTui {
|
|
|
2156
2179
|
private scrollScreenTo;
|
|
2157
2180
|
/** The copy key inside a Screen: what the Screen shows is what the reader means. */
|
|
2158
2181
|
private copyFromScreen;
|
|
2182
|
+
/**
|
|
2183
|
+
* One read, as the Reader framed it: paste traffic is dispatched per frame,
|
|
2184
|
+
* everything else is routed (W-2 lifts the routing itself into a Router).
|
|
2185
|
+
*/
|
|
2159
2186
|
private handleInputText;
|
|
2160
|
-
/**
|
|
2161
|
-
private
|
|
2187
|
+
/** One framed unit, at the owner that takes it. */
|
|
2188
|
+
private consumeFrame;
|
|
2189
|
+
/**
|
|
2190
|
+
* One read from the Reader, as the ladder has always taken it.
|
|
2191
|
+
*
|
|
2192
|
+
* Two kinds of table live here and they are not the same thing:
|
|
2193
|
+
*
|
|
2194
|
+
* - **binding** — which byte means which action (the keymap's rebindable actions,
|
|
2195
|
+
* the Alt chords, the SS3 tail). Those stay; AD-20 F-5 wants one table per key.
|
|
2196
|
+
* - **ownership** — who takes the unit. That question is the Router's now, and it
|
|
2197
|
+
* is asked exactly once per unit, before any binding table is consulted: a
|
|
2198
|
+
* Screen owns the read outright, so the tables below are for the unlayered case,
|
|
2199
|
+
* which is the order the ladder always had.
|
|
2200
|
+
*
|
|
2201
|
+
* The parsing branches that are neither (a read that could still grow — the Reader
|
|
2202
|
+
* holds it; an escape sequence nobody claimed — dropped) stay here as well.
|
|
2203
|
+
*/
|
|
2204
|
+
private route;
|
|
2205
|
+
/**
|
|
2206
|
+
* The Router's read-only view, rewritten per decision (no allocation).
|
|
2207
|
+
*
|
|
2208
|
+
* The card question is the only expensive one — `collapsibleRows()` walks the
|
|
2209
|
+
* visible transcript — so it is answered only for the arrow that asks it, and only
|
|
2210
|
+
* when nothing is layered over the workspace.
|
|
2211
|
+
*/
|
|
2212
|
+
private observe;
|
|
2213
|
+
/**
|
|
2214
|
+
* Whether a read is one of the sequence shapes the ladder claims as a whole.
|
|
2215
|
+
*
|
|
2216
|
+
* These are matched *before* the Reader's hold window — the order the ladder always
|
|
2217
|
+
* had (`ESC [ 5 ~` is a page key, not a prefix that might still grow).
|
|
2218
|
+
*/
|
|
2219
|
+
private isSequenceShape;
|
|
2220
|
+
/** The unit class of one read, by shape (the Reader's classification, allocation-free). */
|
|
2221
|
+
private readKind;
|
|
2222
|
+
/** The unit class of one character — what `handleChar` routes. */
|
|
2223
|
+
private charKind;
|
|
2224
|
+
/** One unit, one owner: the Router decides, the owner adapter runs it. */
|
|
2225
|
+
private dispatch;
|
|
2226
|
+
/** Run a unit at the owner the Router already named. */
|
|
2227
|
+
private dispatchWith;
|
|
2228
|
+
/**
|
|
2229
|
+
* A paste payload: the Router decides, the paste path executes.
|
|
2230
|
+
*
|
|
2231
|
+
* A paste is text, so the field that owns the keyboard takes it — and a Screen that
|
|
2232
|
+
* owns the interaction terminates it (its own field or nothing), never a field
|
|
2233
|
+
* behind it (AD-20 §4.3 priority 1). `handlePasteText` still re-asks that per owner;
|
|
2234
|
+
* that is the compat path W-3 folds into the Router (marked there).
|
|
2235
|
+
*/
|
|
2236
|
+
private dispatchPaste;
|
|
2237
|
+
/**
|
|
2238
|
+
* The Screen adapter: a Screen owns the keyboard outright (AD-20 §4.3 priority 3).
|
|
2239
|
+
*
|
|
2240
|
+
* One unit goes in — the Reader split the read, so a Screen sees the same keys the
|
|
2241
|
+
* composer would (W-3a) and `handleScreenInput` is where the paste-burst rule stays.
|
|
2242
|
+
* Its own `screen === undefined` guard stays too: a release raced by a teardown
|
|
2243
|
+
* reaches it, and refusing there is the adapter's own business rather than a second
|
|
2244
|
+
* ownership decision.
|
|
2245
|
+
*/
|
|
2246
|
+
private ownerScreen;
|
|
2247
|
+
/**
|
|
2248
|
+
* The Surface adapter: a dialog owns the keyboard while it is up.
|
|
2249
|
+
*
|
|
2250
|
+
* Its arrows move a question's cursor (or nothing — an arrow a Surface does not use
|
|
2251
|
+
* is not the transcript's), the page keys are not its business, and its mouse reports
|
|
2252
|
+
* take the same path they always did so the refusal happens where it always did, down
|
|
2253
|
+
* to the remembered press. Its own editing keys are `Home`/`End`/`Delete` (W-3b.1):
|
|
2254
|
+
* they act on the field the Surface borrowed — the one row the reader can see — and a
|
|
2255
|
+
* Surface that borrowed none has no field for them, so it consumes them. The kitty
|
|
2256
|
+
* copy key falls out with the other sequences below: a Surface has no copy contract,
|
|
2257
|
+
* and this round did not invent one. Everything else goes to the shared
|
|
2258
|
+
* composer/Surface body, whose `dialog` branches are the Surface's own behaviour.
|
|
2259
|
+
*/
|
|
2260
|
+
private ownerSurface;
|
|
2261
|
+
/**
|
|
2262
|
+
* The Composer adapter.
|
|
2263
|
+
*
|
|
2264
|
+
* Text — one character or many — is typed: the burst rule first, then one character
|
|
2265
|
+
* at a time through the Router, which is what lets ownership change inside a single
|
|
2266
|
+
* read (a Surface answering `y` with the composer taking the `es` behind it). The
|
|
2267
|
+
* sequence shapes the composer owns are the arrows (the suggestion list, else
|
|
2268
|
+
* history) and the caret keys — which it now only ever gets while it owns the
|
|
2269
|
+
* keyboard: with a Surface up, the Router hands those keys to the Surface (W-3b.1).
|
|
2270
|
+
*/
|
|
2271
|
+
private ownerComposer;
|
|
2272
|
+
/**
|
|
2273
|
+
* The Workspace adapter: the transcript owns the mouse, the page keys and the focus
|
|
2274
|
+
* ring — and the ring only when the Router said so (empty field, a card to land on).
|
|
2275
|
+
*/
|
|
2276
|
+
private ownerWorkspace;
|
|
2277
|
+
/** An arrow the composer keeps: the suggestion list while it is up, else history. */
|
|
2278
|
+
private arrowHistory;
|
|
2279
|
+
/** Press, motion and release: selection, links and card toggles — the transcript's. */
|
|
2280
|
+
private mouseGesture;
|
|
2281
|
+
/**
|
|
2282
|
+
* The composer/Surface body — the switch and the tail the ladder always had.
|
|
2283
|
+
*
|
|
2284
|
+
* It is shared by two adapters on purpose: its `dialog` guards *are* the Surface's
|
|
2285
|
+
* behaviour for those keys (a borrowed field takes them, a field-less dialog refuses
|
|
2286
|
+
* them), and splitting them is W-3's job. What the Router guarantees is that a Screen
|
|
2287
|
+
* never reaches it, so every key below can only spend itself on a field the reader
|
|
2288
|
+
* has in front of them — the composer's or a borrowed one. The unreachable second
|
|
2289
|
+
* Screen gate the old body carried is gone with it (G-6).
|
|
2290
|
+
*/
|
|
2291
|
+
private composerUnit;
|
|
2292
|
+
/**
|
|
2293
|
+
* Ctrl+L's repaint, in one place for the owners that share it (G-6).
|
|
2294
|
+
*
|
|
2295
|
+
* The Screen has its own implementation (`screenNeedsFullPaint`, because it repaints
|
|
2296
|
+
* a Screen's frame); this one drops the cached rows so the next full frame is rebuilt
|
|
2297
|
+
* from scratch. W-2 does not merge them — only a test that proves both owners repaint
|
|
2298
|
+
* identically may (AD-20 §6) — but it does give the composer's copy a name.
|
|
2299
|
+
*/
|
|
2300
|
+
private repaintNow;
|
|
2162
2301
|
/**
|
|
2163
2302
|
* Insert pasted text into the field that owns the keyboard; CR/LF are literal
|
|
2164
2303
|
* newlines.
|
|
@@ -2166,21 +2305,47 @@ export declare class SshTui {
|
|
|
2166
2305
|
* A paste is text input, so it goes through the same ownership question ordinary
|
|
2167
2306
|
* typing does: into the composer's draft when the composer owns the keyboard, and
|
|
2168
2307
|
* into a borrowed field when a surface that has one does. A surface without a
|
|
2169
|
-
* text field (a confirmation,
|
|
2308
|
+
* text field (a confirmation, a menu, a report) takes no paste at all — the
|
|
2170
2309
|
* alternative was writing the composer's hidden draft behind it, which is how a
|
|
2171
2310
|
* paste into an approval dialog could silently rewrite the message being written.
|
|
2311
|
+
*
|
|
2312
|
+
* A **Screen** is that same question with a different answer, and it is asked
|
|
2313
|
+
* first because `textIsEditable()` only ever answers for the composer's field: the
|
|
2314
|
+
* setup Screen keeps a field of its own, which the composer's helpers cannot see
|
|
2315
|
+
* and must never be handed (B2.6 §4).
|
|
2172
2316
|
*/
|
|
2173
2317
|
private handlePasteText;
|
|
2318
|
+
/**
|
|
2319
|
+
* Give a paste to the field the Screen owns, or to nobody.
|
|
2320
|
+
*
|
|
2321
|
+
* The setup Screen is the only Screen with a field, and it is the one place a
|
|
2322
|
+
* paste matters most: an API key, a base URL and a model list are all copied from
|
|
2323
|
+
* somewhere else, and a first run that could only be typed by hand is the
|
|
2324
|
+
* difference between a working session and an empty one. A step without a field —
|
|
2325
|
+
* the model pickers, the confirmation — is not a text field, so the paste is
|
|
2326
|
+
* dropped exactly as a menu drops it: a paste is text, never an answer.
|
|
2327
|
+
*/
|
|
2328
|
+
private pasteIntoScreen;
|
|
2174
2329
|
/**
|
|
2175
2330
|
* Whether the keys that edit text belong to a field right now.
|
|
2176
2331
|
*
|
|
2177
2332
|
* The composer always has one; an open surface only has one when it borrowed it
|
|
2178
|
-
* (a free-text answer
|
|
2179
|
-
*
|
|
2180
|
-
* must do nothing rather than reach the draft behind the surface.
|
|
2333
|
+
* (a free-text answer). Everything else — a confirmation, a menu, the inspect
|
|
2334
|
+
* overlay, every Screen — owns the keyboard without owning the composer's text,
|
|
2335
|
+
* and those keys must do nothing rather than reach the draft behind the surface.
|
|
2336
|
+
* A Screen is included by name: the setup Screen has a field of its own, and it
|
|
2337
|
+
* is reached through the Screen's own keys, never through the composer's.
|
|
2181
2338
|
*/
|
|
2182
2339
|
private textIsEditable;
|
|
2183
2340
|
private handlePlainText;
|
|
2341
|
+
/**
|
|
2342
|
+
* One character, from a read or from the typing loop: the Router decides, again.
|
|
2343
|
+
*
|
|
2344
|
+
* It is asked per character rather than per read because ownership can change inside
|
|
2345
|
+
* one read — a Surface that answers the first character of `yes` is gone for the rest
|
|
2346
|
+
* (pinned by the `yes-typed-at-dialog` trace). A Screen never reaches the body below:
|
|
2347
|
+
* the Router answered `screen` and the Screen adapter took the character.
|
|
2348
|
+
*/
|
|
2184
2349
|
private handleChar;
|
|
2185
2350
|
/**
|
|
2186
2351
|
* Run one rebindable action.
|
|
@@ -2272,6 +2437,16 @@ export declare class SshTui {
|
|
|
2272
2437
|
/** Fetch the endpoint's model list into the onboarding wizard's models step. */
|
|
2273
2438
|
private fetchOnboardingModels;
|
|
2274
2439
|
private saveOnboarding;
|
|
2440
|
+
/**
|
|
2441
|
+
* Say the wizard is done, where the reader will still be able to read it.
|
|
2442
|
+
*
|
|
2443
|
+
* A saved wizard closes its Screen in the same frame, so its own notice row would
|
|
2444
|
+
* be painted for no frames at all — and the credential line that goes with it is a
|
|
2445
|
+
* footer echo (`command-feedback`), which expires. This is the durable half of the
|
|
2446
|
+
* answer: `command-status` routes to the transcript, exactly like the boot line
|
|
2447
|
+
* that asked for the setup in the first place.
|
|
2448
|
+
*/
|
|
2449
|
+
private onboardDone;
|
|
2275
2450
|
/** Store one credential, falling back to a launch-environment override on shadow/absence. */
|
|
2276
2451
|
private saveCredential;
|
|
2277
2452
|
/** Write launch-environment overrides so they beat system-injected variables. */
|
|
@@ -2354,13 +2529,21 @@ export declare class SshTui {
|
|
|
2354
2529
|
* inspect overlay owns the keyboard and takes no scroll at all: the transcript
|
|
2355
2530
|
* behind a dialog must not move.
|
|
2356
2531
|
*/
|
|
2357
|
-
private
|
|
2532
|
+
private scrollWorkspace;
|
|
2358
2533
|
private handleCtrlC;
|
|
2359
2534
|
private submit;
|
|
2360
2535
|
private runCommand;
|
|
2361
|
-
/**
|
|
2536
|
+
/**
|
|
2537
|
+
* Grapheme cluster immediately before `cursor`; cursor-internal positions delete it whole.
|
|
2538
|
+
*
|
|
2539
|
+
* The cluster is measured in the field that owns the keyboard, like `backspace` and
|
|
2540
|
+
* `deleteAtCursor` above, which is what makes their ranges mean the same thing as the
|
|
2541
|
+
* cursor they were handed (W-3b.1b): segmenting the *draft* while editing a borrowed
|
|
2542
|
+
* answer gave offsets from another string, so a borrowed `a🚀` lost one surrogate and
|
|
2543
|
+
* kept the caret inside the pair.
|
|
2544
|
+
*/
|
|
2362
2545
|
private graphemeBefore;
|
|
2363
|
-
/** Grapheme cluster containing or following `cursor
|
|
2546
|
+
/** Grapheme cluster containing or following `cursor`, in the field that owns the keyboard. */
|
|
2364
2547
|
private graphemeAfter;
|
|
2365
2548
|
/** Delete one grapheme back, in whichever field owns the keyboard. */
|
|
2366
2549
|
private backspace;
|
|
@@ -2370,7 +2553,16 @@ export declare class SshTui {
|
|
|
2370
2553
|
private moveCursor;
|
|
2371
2554
|
private historyBack;
|
|
2372
2555
|
private historyForward;
|
|
2373
|
-
/**
|
|
2556
|
+
/**
|
|
2557
|
+
* Typing while browsing history detaches from the saved item.
|
|
2558
|
+
*
|
|
2559
|
+
* The browse is the **composer's**, so only the composer's own field may end it
|
|
2560
|
+
* (W-3b.3a). Every editing key a Surface borrowed the field for arrives here —
|
|
2561
|
+
* `backspace`, `deleteAtCursor`, `handlePasteText`, and `composerUnit`'s Ctrl+U /
|
|
2562
|
+
* Ctrl+K — and detaching on that path wrote the hidden composer's state from the
|
|
2563
|
+
* visible answer: the recalled entry replaced `historyDraft`, so the unsent draft
|
|
2564
|
+
* the browse was holding could never be reached again with `↓`.
|
|
2565
|
+
*/
|
|
2374
2566
|
private leaveHistoryBrowse;
|
|
2375
2567
|
}
|
|
2376
2568
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-ssh-tui",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4-rc.1",
|
|
4
4
|
"description": "Remote-first terminal UI for DeepSeek Harness with SSH reconnect, Windows/ConPTY and incremental ANSI rendering.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"patch": "./cordis.patch.yml"
|
|
76
76
|
},
|
|
77
77
|
"compatibility": {
|
|
78
|
-
"dsh": ">=0.
|
|
78
|
+
"dsh": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
79
79
|
"dshReleases": {
|
|
80
80
|
"0.1.2-rc.1": "incompatible",
|
|
81
81
|
"0.1.3-alpha.1": "incompatible",
|
|
@@ -85,10 +85,11 @@
|
|
|
85
85
|
"0.1.5-rc.1": "incompatible",
|
|
86
86
|
"0.1.5-rc.2": "incompatible",
|
|
87
87
|
"0.1.5-rc.3": "incompatible",
|
|
88
|
-
"0.1.7-rc.1": "
|
|
89
|
-
"0.1.7-rc.2": "
|
|
88
|
+
"0.1.7-rc.1": "incompatible",
|
|
89
|
+
"0.1.7-rc.2": "incompatible",
|
|
90
90
|
"0.2.0-rc.1": "compatible",
|
|
91
|
-
"0.2.0-rc.2": "compatible"
|
|
91
|
+
"0.2.0-rc.2": "compatible",
|
|
92
|
+
"0.2.1-rc.2": "compatible"
|
|
92
93
|
},
|
|
93
94
|
"profiles": [
|
|
94
95
|
"tui"
|
|
@@ -100,6 +101,7 @@
|
|
|
100
101
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
101
102
|
"test": "npm run build && node --test \"tests/*.test.mjs\"",
|
|
102
103
|
"freeze": "node scripts/b2-freeze-audit.mjs",
|
|
104
|
+
"freeze:input": "node scripts/input-freeze-audit.mjs",
|
|
103
105
|
"bench": "node scripts/bench-b2.mjs",
|
|
104
106
|
"clean": "node -e \"require('node:fs').rmSync('lib', { recursive: true, force: true })\"",
|
|
105
107
|
"prepare": "npm run build",
|
|
@@ -125,21 +127,21 @@
|
|
|
125
127
|
},
|
|
126
128
|
"peerDependencies": {
|
|
127
129
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
128
|
-
"@deepseek-ai/dsh-agent": ">=0.
|
|
129
|
-
"@deepseek-ai/dsh-agent-default-model": ">=0.
|
|
130
|
-
"@deepseek-ai/dsh-agent-loop": ">=0.
|
|
131
|
-
"@deepseek-ai/dsh-agent-preset": ">=0.
|
|
132
|
-
"@deepseek-ai/dsh-agent-preset-registry": ">=0.
|
|
133
|
-
"@deepseek-ai/dsh-cmdline": ">=0.
|
|
134
|
-
"@deepseek-ai/dsh-commands": ">=0.
|
|
135
|
-
"@deepseek-ai/dsh-credentials": ">=0.
|
|
136
|
-
"@deepseek-ai/dsh-llm": ">=0.
|
|
137
|
-
"@deepseek-ai/dsh-session": ">=0.
|
|
138
|
-
"@deepseek-ai/dsh-session-persistence": ">=0.
|
|
139
|
-
"@deepseek-ai/dsh-settings": ">=0.
|
|
140
|
-
"@deepseek-ai/dsh-subagent": ">=0.
|
|
141
|
-
"@deepseek-ai/dsh-user-approval": ">=0.
|
|
142
|
-
"@deepseek-ai/dsh-user-questions": ">=0.
|
|
130
|
+
"@deepseek-ai/dsh-agent": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
131
|
+
"@deepseek-ai/dsh-agent-default-model": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
132
|
+
"@deepseek-ai/dsh-agent-loop": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
133
|
+
"@deepseek-ai/dsh-agent-preset": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
134
|
+
"@deepseek-ai/dsh-agent-preset-registry": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
135
|
+
"@deepseek-ai/dsh-cmdline": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
136
|
+
"@deepseek-ai/dsh-commands": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
137
|
+
"@deepseek-ai/dsh-credentials": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
138
|
+
"@deepseek-ai/dsh-llm": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
139
|
+
"@deepseek-ai/dsh-session": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
140
|
+
"@deepseek-ai/dsh-session-persistence": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
141
|
+
"@deepseek-ai/dsh-settings": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
142
|
+
"@deepseek-ai/dsh-subagent": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
143
|
+
"@deepseek-ai/dsh-user-approval": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2",
|
|
144
|
+
"@deepseek-ai/dsh-user-questions": ">=0.2.0-rc.1 <0.2.1 || >=0.2.1-rc.2 <0.2.2"
|
|
143
145
|
},
|
|
144
146
|
"peerDependenciesMeta": {
|
|
145
147
|
"@deepseek-ai/dsh-agent-preset": {
|
|
@@ -162,81 +164,80 @@
|
|
|
162
164
|
}
|
|
163
165
|
},
|
|
164
166
|
"devDependencies": {
|
|
165
|
-
"@deepseek-ai/cordis": "4.0.
|
|
166
|
-
"@deepseek-ai/cordis-plugin-group": "1.0.
|
|
167
|
+
"@deepseek-ai/cordis": "4.0.5",
|
|
168
|
+
"@deepseek-ai/cordis-plugin-group": "1.0.5",
|
|
167
169
|
"@deepseek-ai/cordis-plugin-hmr": "1.0.17",
|
|
168
|
-
"@deepseek-ai/cordis-plugin-include": "1.0.
|
|
169
|
-
"@deepseek-ai/cordis-plugin-loader": "1.0.
|
|
170
|
+
"@deepseek-ai/cordis-plugin-include": "1.0.10",
|
|
171
|
+
"@deepseek-ai/cordis-plugin-loader": "1.0.6",
|
|
170
172
|
"@deepseek-ai/cordis-plugin-timer": "1.1.6",
|
|
171
|
-
"@deepseek-ai/dsh": "0.2.
|
|
172
|
-
"@deepseek-ai/dsh-agent": "0.2.
|
|
173
|
-
"@deepseek-ai/dsh-agent-default-model": "0.2.
|
|
174
|
-
"@deepseek-ai/dsh-agent-loop": "0.2.
|
|
175
|
-
"@deepseek-ai/dsh-agent-preset": "0.2.
|
|
176
|
-
"@deepseek-ai/dsh-agent-preset-registry": "0.2.
|
|
177
|
-
"@deepseek-ai/dsh-atomic-write": "0.2.
|
|
178
|
-
"@deepseek-ai/dsh-attachment": "0.2.
|
|
179
|
-
"@deepseek-ai/dsh-brand": "0.2.
|
|
180
|
-
"@deepseek-ai/dsh-cmdline": "0.2.
|
|
181
|
-
"@deepseek-ai/dsh-commands": "0.2.
|
|
182
|
-
"@deepseek-ai/dsh-credentials": "0.2.
|
|
183
|
-
"@deepseek-ai/dsh-home-paths": "0.2.
|
|
173
|
+
"@deepseek-ai/dsh": "0.2.1-rc.2",
|
|
174
|
+
"@deepseek-ai/dsh-agent": "0.2.1-rc.2",
|
|
175
|
+
"@deepseek-ai/dsh-agent-default-model": "0.2.1-rc.2",
|
|
176
|
+
"@deepseek-ai/dsh-agent-loop": "0.2.1-rc.2",
|
|
177
|
+
"@deepseek-ai/dsh-agent-preset": "0.2.1-rc.2",
|
|
178
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.2.1-rc.2",
|
|
179
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.1-rc.2",
|
|
180
|
+
"@deepseek-ai/dsh-attachment": "0.2.1-rc.2",
|
|
181
|
+
"@deepseek-ai/dsh-brand": "0.2.1-rc.2",
|
|
182
|
+
"@deepseek-ai/dsh-cmdline": "0.2.1-rc.2",
|
|
183
|
+
"@deepseek-ai/dsh-commands": "0.2.1-rc.2",
|
|
184
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-rc.2",
|
|
185
|
+
"@deepseek-ai/dsh-home-paths": "0.2.1-rc.2",
|
|
184
186
|
"@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
|
|
185
|
-
"@deepseek-ai/dsh-jobs": "0.2.
|
|
186
|
-
"@deepseek-ai/dsh-llm": "0.2.
|
|
187
|
-
"@deepseek-ai/dsh-llm-mock-server": "0.2.
|
|
188
|
-
"@deepseek-ai/dsh-sandbox": "0.2.
|
|
189
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.2.
|
|
190
|
-
"@deepseek-ai/dsh-scope": "0.2.
|
|
191
|
-
"@deepseek-ai/dsh-session": "0.2.
|
|
192
|
-
"@deepseek-ai/dsh-session-persistence": "0.2.
|
|
193
|
-
"@deepseek-ai/dsh-session-projection": "0.2.
|
|
194
|
-
"@deepseek-ai/dsh-session-projection-cache": "0.2.
|
|
195
|
-
"@deepseek-ai/dsh-settings": "0.2.
|
|
196
|
-
"@deepseek-ai/dsh-subagent": "0.2.
|
|
197
|
-
"@deepseek-ai/dsh-system-prompt": "0.2.
|
|
198
|
-
"@deepseek-ai/dsh-timeout": "0.2.
|
|
199
|
-
"@deepseek-ai/dsh-tools": "0.2.
|
|
200
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.
|
|
201
|
-
"@deepseek-ai/dsh-user-approval": "0.2.
|
|
202
|
-
"@deepseek-ai/dsh-user-questions": "0.2.
|
|
187
|
+
"@deepseek-ai/dsh-jobs": "0.2.1-rc.2",
|
|
188
|
+
"@deepseek-ai/dsh-llm": "0.2.1-rc.2",
|
|
189
|
+
"@deepseek-ai/dsh-llm-mock-server": "0.2.1-rc.2",
|
|
190
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-rc.2",
|
|
191
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.2",
|
|
192
|
+
"@deepseek-ai/dsh-scope": "0.2.1-rc.2",
|
|
193
|
+
"@deepseek-ai/dsh-session": "0.2.1-rc.2",
|
|
194
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.1-rc.2",
|
|
195
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-rc.2",
|
|
196
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.2.1-rc.2",
|
|
197
|
+
"@deepseek-ai/dsh-settings": "0.2.1-rc.2",
|
|
198
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-rc.2",
|
|
199
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
|
|
200
|
+
"@deepseek-ai/dsh-timeout": "0.2.1-rc.2",
|
|
201
|
+
"@deepseek-ai/dsh-tools": "0.2.1-rc.2",
|
|
202
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-rc.2",
|
|
203
|
+
"@deepseek-ai/dsh-user-approval": "0.2.1-rc.2",
|
|
204
|
+
"@deepseek-ai/dsh-user-questions": "0.2.1-rc.2",
|
|
203
205
|
"@types/node": "^24.0.0",
|
|
204
206
|
"@xterm/headless": "^6.0.0",
|
|
205
207
|
"semver": "^7.8.5",
|
|
206
208
|
"typescript": "^5.9.0"
|
|
207
209
|
},
|
|
208
210
|
"overrides": {
|
|
209
|
-
"@deepseek-ai/dsh": "0.2.
|
|
210
|
-
"@deepseek-ai/dsh-agent": "0.2.
|
|
211
|
-
"@deepseek-ai/dsh-agent-default-model": "0.2.
|
|
212
|
-
"@deepseek-ai/dsh-agent-loop": "0.2.
|
|
213
|
-
"@deepseek-ai/dsh-agent-preset": "0.2.
|
|
214
|
-
"@deepseek-ai/dsh-agent-preset-registry": "0.2.
|
|
215
|
-
"@deepseek-ai/dsh-atomic-write": "0.2.
|
|
216
|
-
"@deepseek-ai/dsh-attachment": "0.2.
|
|
217
|
-
"@deepseek-ai/dsh-brand": "0.2.
|
|
218
|
-
"@deepseek-ai/dsh-cmdline": "0.2.
|
|
219
|
-
"@deepseek-ai/dsh-commands": "0.2.
|
|
220
|
-
"@deepseek-ai/dsh-credentials": "0.2.
|
|
221
|
-
"@deepseek-ai/dsh-home-paths": "0.2.
|
|
222
|
-
"@deepseek-ai/dsh-
|
|
223
|
-
"@deepseek-ai/dsh-
|
|
224
|
-
"@deepseek-ai/dsh-llm": "0.2.
|
|
225
|
-
"@deepseek-ai/dsh-
|
|
226
|
-
"@deepseek-ai/dsh-sandbox": "0.2.
|
|
227
|
-
"@deepseek-ai/dsh-
|
|
228
|
-
"@deepseek-ai/dsh-
|
|
229
|
-
"@deepseek-ai/dsh-session": "0.2.
|
|
230
|
-
"@deepseek-ai/dsh-session-
|
|
231
|
-
"@deepseek-ai/dsh-session-projection": "0.2.
|
|
232
|
-
"@deepseek-ai/dsh-
|
|
233
|
-
"@deepseek-ai/dsh-
|
|
234
|
-
"@deepseek-ai/dsh-
|
|
235
|
-
"@deepseek-ai/dsh-
|
|
236
|
-
"@deepseek-ai/dsh-
|
|
237
|
-
"@deepseek-ai/dsh-
|
|
238
|
-
"@deepseek-ai/dsh-
|
|
239
|
-
"@deepseek-ai/dsh-user-
|
|
240
|
-
"@deepseek-ai/dsh-user-questions": "0.2.0-rc.2"
|
|
211
|
+
"@deepseek-ai/dsh": "0.2.1-rc.2",
|
|
212
|
+
"@deepseek-ai/dsh-agent": "0.2.1-rc.2",
|
|
213
|
+
"@deepseek-ai/dsh-agent-default-model": "0.2.1-rc.2",
|
|
214
|
+
"@deepseek-ai/dsh-agent-loop": "0.2.1-rc.2",
|
|
215
|
+
"@deepseek-ai/dsh-agent-preset": "0.2.1-rc.2",
|
|
216
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.2.1-rc.2",
|
|
217
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.1-rc.2",
|
|
218
|
+
"@deepseek-ai/dsh-attachment": "0.2.1-rc.2",
|
|
219
|
+
"@deepseek-ai/dsh-brand": "0.2.1-rc.2",
|
|
220
|
+
"@deepseek-ai/dsh-cmdline": "0.2.1-rc.2",
|
|
221
|
+
"@deepseek-ai/dsh-commands": "0.2.1-rc.2",
|
|
222
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-rc.2",
|
|
223
|
+
"@deepseek-ai/dsh-home-paths": "0.2.1-rc.2",
|
|
224
|
+
"@deepseek-ai/dsh-jobs": "0.2.1-rc.2",
|
|
225
|
+
"@deepseek-ai/dsh-llm": "0.2.1-rc.2",
|
|
226
|
+
"@deepseek-ai/dsh-llm-mock-server": "0.2.1-rc.2",
|
|
227
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-rc.2",
|
|
228
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.2",
|
|
229
|
+
"@deepseek-ai/dsh-scope": "0.2.1-rc.2",
|
|
230
|
+
"@deepseek-ai/dsh-session": "0.2.1-rc.2",
|
|
231
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.1-rc.2",
|
|
232
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-rc.2",
|
|
233
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.2.1-rc.2",
|
|
234
|
+
"@deepseek-ai/dsh-settings": "0.2.1-rc.2",
|
|
235
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-rc.2",
|
|
236
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
|
|
237
|
+
"@deepseek-ai/dsh-timeout": "0.2.1-rc.2",
|
|
238
|
+
"@deepseek-ai/dsh-tools": "0.2.1-rc.2",
|
|
239
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-rc.2",
|
|
240
|
+
"@deepseek-ai/dsh-user-approval": "0.2.1-rc.2",
|
|
241
|
+
"@deepseek-ai/dsh-user-questions": "0.2.1-rc.2"
|
|
241
242
|
}
|
|
242
243
|
}
|
package/lib/footer-accents.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The one accent helper the footer's colour grammar is built on.
|
|
3
|
-
*
|
|
4
|
-
* It lives alone because two modules need it and neither may own the other: the
|
|
5
|
-
* meter primitives paint their filled cell with it, and the budget paints the
|
|
6
|
-
* link's pips. A helper this small is not worth a module in general; here it is
|
|
7
|
-
* worth avoiding a cycle, and it gives the colour grammar one place to be
|
|
8
|
-
* described:
|
|
9
|
-
*
|
|
10
|
-
* - an accent wraps exactly one run of text, closes itself, and stops there;
|
|
11
|
-
* - re-opening the row's muted style is the *row owner's* job
|
|
12
|
-
* (`muteFooterLine` in `tui.ts` reopens it after every reset), because doing
|
|
13
|
-
* it here as well produced two identical `90m` sequences per accent and made
|
|
14
|
-
* the primitive's output depend on which separator the caller passed;
|
|
15
|
-
* - a terminal with no colour left answers with the text unchanged, so the
|
|
16
|
-
* `no-color` and `mono` paths need no branch of their own.
|
|
17
|
-
*
|
|
18
|
-
* @module dsh-ssh-tui/footer-accents
|
|
19
|
-
*/
|
|
20
|
-
import { downgradeSgr } from './color-depth.js';
|
|
21
|
-
/** Wrap one run in one accent, or return it unchanged when the terminal has none. */
|
|
22
|
-
export function accent(text, token, depth) {
|
|
23
|
-
const code = downgradeSgr(token, depth);
|
|
24
|
-
if (code === '' || text === '')
|
|
25
|
-
return text;
|
|
26
|
-
return `\x1b[${code}m${text}\x1b[0m`;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=footer-accents.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"footer-accents.js","sourceRoot":"","sources":["../src/footer-accents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAA;AAEhE,qFAAqF;AACrF,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,KAAa,EAAE,KAAiB;IACnE,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACvC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAC3C,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAA;AACtC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The one accent helper the footer's colour grammar is built on.
|
|
3
|
-
*
|
|
4
|
-
* It lives alone because two modules need it and neither may own the other: the
|
|
5
|
-
* meter primitives paint their filled cell with it, and the budget paints the
|
|
6
|
-
* link's pips. A helper this small is not worth a module in general; here it is
|
|
7
|
-
* worth avoiding a cycle, and it gives the colour grammar one place to be
|
|
8
|
-
* described:
|
|
9
|
-
*
|
|
10
|
-
* - an accent wraps exactly one run of text, closes itself, and stops there;
|
|
11
|
-
* - re-opening the row's muted style is the *row owner's* job
|
|
12
|
-
* (`muteFooterLine` in `tui.ts` reopens it after every reset), because doing
|
|
13
|
-
* it here as well produced two identical `90m` sequences per accent and made
|
|
14
|
-
* the primitive's output depend on which separator the caller passed;
|
|
15
|
-
* - a terminal with no colour left answers with the text unchanged, so the
|
|
16
|
-
* `no-color` and `mono` paths need no branch of their own.
|
|
17
|
-
*
|
|
18
|
-
* @module dsh-ssh-tui/footer-accents
|
|
19
|
-
*/
|
|
20
|
-
import { type ColorDepth } from './color-depth.js';
|
|
21
|
-
/** Wrap one run in one accent, or return it unchanged when the terminal has none. */
|
|
22
|
-
export declare function accent(text: string, token: string, depth: ColorDepth): string;
|