dsh-ssh-tui 0.8.3 → 0.8.4-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +132 -12
- package/README.en.md +20 -17
- package/README.md +11 -8
- package/docs/release-notes-0.8.4-rc.1.md +271 -0
- package/docs/release-notes-0.8.4-rc.2.md +72 -0
- package/docs/release-notes-0.8.4.md +145 -0
- package/lib/doctor.js +41 -4
- package/lib/doctor.js.map +1 -1
- 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/i18n/en.js +6 -1
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +6 -1
- package/lib/i18n/zh.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/preset-rows.js +70 -19
- package/lib/preset-rows.js.map +1 -1
- package/lib/terminal-input.js +27 -13
- package/lib/terminal-input.js.map +1 -1
- package/lib/tui.js +812 -482
- package/lib/tui.js.map +1 -1
- package/lib/types/doctor.d.ts +13 -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/preset-rows.d.ts +22 -7
- 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
|
/**
|
|
@@ -2073,12 +2096,32 @@ export declare class SshTui {
|
|
|
2073
2096
|
/** /mode: pick an agent preset (standard / minimal / ptc / cordis / routing-suite / ...). */
|
|
2074
2097
|
private runModeCommand;
|
|
2075
2098
|
/**
|
|
2076
|
-
*
|
|
2099
|
+
* The two tools a 0.1.7 terminal profile mounts itself, read from the running
|
|
2100
|
+
* composition. The profile patch is only the instruction; this is the answer
|
|
2101
|
+
* to whether the instruction actually produced a tool.
|
|
2102
|
+
*/
|
|
2103
|
+
private agentPlaneTools;
|
|
2104
|
+
/** Whether this process's agent plane has both tools. */
|
|
2105
|
+
private agentPlaneReady;
|
|
2106
|
+
/**
|
|
2107
|
+
* Repair an already-configured profile at boot and say a restart is needed.
|
|
2077
2108
|
*
|
|
2078
|
-
*
|
|
2079
|
-
*
|
|
2080
|
-
*
|
|
2109
|
+
* A first run deliberately does not call this: its wizard save is the point
|
|
2110
|
+
* where settings and credentials exist, and `onboardDone` repairs immediately
|
|
2111
|
+
* after that write. This method serves the old/partial profile upgrade path,
|
|
2112
|
+
* where there is no wizard to wait for.
|
|
2113
|
+
*/
|
|
2114
|
+
private repairAgentPlaneAtBoot;
|
|
2115
|
+
/**
|
|
2116
|
+
* Add only the profile rows whose tools are missing from this composition.
|
|
2117
|
+
*
|
|
2118
|
+
* A row that is already present in the patch is never written again, even if
|
|
2119
|
+
* its service failed to activate: the planner sees overrides and disables by
|
|
2120
|
+
* id or module name, and `ensureRosterRows` creates a backup first. This is
|
|
2121
|
+
* the first-run/upgrade repair, not an install-hook claim: it changes what
|
|
2122
|
+
* the next boot composes, not what this process has already composed.
|
|
2081
2123
|
*/
|
|
2124
|
+
private ensureProfileAgentPlane;
|
|
2082
2125
|
/** Re-read the roster fact this process was composed with (cheap, no IO). */
|
|
2083
2126
|
private refreshRosterHealth;
|
|
2084
2127
|
/** Which settings protocol this host speaks; decides what "missing" means. */
|
|
@@ -2091,6 +2134,14 @@ export declare class SshTui {
|
|
|
2091
2134
|
* all — the repair there is the agent-plane rows, not a roster.
|
|
2092
2135
|
*/
|
|
2093
2136
|
private missingPresetService;
|
|
2137
|
+
/**
|
|
2138
|
+
* `/mode fix`: write the missing profile rows into the user patch layer.
|
|
2139
|
+
*
|
|
2140
|
+
* The write only takes effect on the next launch — the loader composes the
|
|
2141
|
+
* patch tree once at boot — so the report says so instead of pretending the
|
|
2142
|
+
* running session gained a roster. The helper consults the actual tools, so
|
|
2143
|
+
* a row a bundle already supplies is not mounted a second time.
|
|
2144
|
+
*/
|
|
2094
2145
|
private repairRoster;
|
|
2095
2146
|
/** Current provider route selected for the running agent. */
|
|
2096
2147
|
private currentProvider;
|
|
@@ -2156,9 +2207,125 @@ export declare class SshTui {
|
|
|
2156
2207
|
private scrollScreenTo;
|
|
2157
2208
|
/** The copy key inside a Screen: what the Screen shows is what the reader means. */
|
|
2158
2209
|
private copyFromScreen;
|
|
2210
|
+
/**
|
|
2211
|
+
* One read, as the Reader framed it: paste traffic is dispatched per frame,
|
|
2212
|
+
* everything else is routed (W-2 lifts the routing itself into a Router).
|
|
2213
|
+
*/
|
|
2159
2214
|
private handleInputText;
|
|
2160
|
-
/**
|
|
2161
|
-
private
|
|
2215
|
+
/** One framed unit, at the owner that takes it. */
|
|
2216
|
+
private consumeFrame;
|
|
2217
|
+
/**
|
|
2218
|
+
* One read from the Reader, as the ladder has always taken it.
|
|
2219
|
+
*
|
|
2220
|
+
* Two kinds of table live here and they are not the same thing:
|
|
2221
|
+
*
|
|
2222
|
+
* - **binding** — which byte means which action (the keymap's rebindable actions,
|
|
2223
|
+
* the Alt chords, the SS3 tail). Those stay; AD-20 F-5 wants one table per key.
|
|
2224
|
+
* - **ownership** — who takes the unit. That question is the Router's now, and it
|
|
2225
|
+
* is asked exactly once per unit, before any binding table is consulted: a
|
|
2226
|
+
* Screen owns the read outright, so the tables below are for the unlayered case,
|
|
2227
|
+
* which is the order the ladder always had.
|
|
2228
|
+
*
|
|
2229
|
+
* The parsing branches that are neither (a read that could still grow — the Reader
|
|
2230
|
+
* holds it; an escape sequence nobody claimed — dropped) stay here as well.
|
|
2231
|
+
*/
|
|
2232
|
+
private route;
|
|
2233
|
+
/**
|
|
2234
|
+
* The Router's read-only view, rewritten per decision (no allocation).
|
|
2235
|
+
*
|
|
2236
|
+
* The card question is the only expensive one — `collapsibleRows()` walks the
|
|
2237
|
+
* visible transcript — so it is answered only for the arrow that asks it, and only
|
|
2238
|
+
* when nothing is layered over the workspace.
|
|
2239
|
+
*/
|
|
2240
|
+
private observe;
|
|
2241
|
+
/**
|
|
2242
|
+
* Whether a read is one of the sequence shapes the ladder claims as a whole.
|
|
2243
|
+
*
|
|
2244
|
+
* These are matched *before* the Reader's hold window — the order the ladder always
|
|
2245
|
+
* had (`ESC [ 5 ~` is a page key, not a prefix that might still grow).
|
|
2246
|
+
*/
|
|
2247
|
+
private isSequenceShape;
|
|
2248
|
+
/** The unit class of one read, by shape (the Reader's classification, allocation-free). */
|
|
2249
|
+
private readKind;
|
|
2250
|
+
/** The unit class of one character — what `handleChar` routes. */
|
|
2251
|
+
private charKind;
|
|
2252
|
+
/** One unit, one owner: the Router decides, the owner adapter runs it. */
|
|
2253
|
+
private dispatch;
|
|
2254
|
+
/** Run a unit at the owner the Router already named. */
|
|
2255
|
+
private dispatchWith;
|
|
2256
|
+
/**
|
|
2257
|
+
* A paste payload: the Router decides, the paste path executes.
|
|
2258
|
+
*
|
|
2259
|
+
* A paste is text, so the field that owns the keyboard takes it — and a Screen that
|
|
2260
|
+
* owns the interaction terminates it (its own field or nothing), never a field
|
|
2261
|
+
* behind it (AD-20 §4.3 priority 1). `handlePasteText` still re-asks that per owner;
|
|
2262
|
+
* that is the compat path W-3 folds into the Router (marked there).
|
|
2263
|
+
*/
|
|
2264
|
+
private dispatchPaste;
|
|
2265
|
+
/**
|
|
2266
|
+
* The Screen adapter: a Screen owns the keyboard outright (AD-20 §4.3 priority 3).
|
|
2267
|
+
*
|
|
2268
|
+
* One unit goes in — the Reader split the read, so a Screen sees the same keys the
|
|
2269
|
+
* composer would (W-3a) and `handleScreenInput` is where the paste-burst rule stays.
|
|
2270
|
+
* Its own `screen === undefined` guard stays too: a release raced by a teardown
|
|
2271
|
+
* reaches it, and refusing there is the adapter's own business rather than a second
|
|
2272
|
+
* ownership decision.
|
|
2273
|
+
*/
|
|
2274
|
+
private ownerScreen;
|
|
2275
|
+
/**
|
|
2276
|
+
* The Surface adapter: a dialog owns the keyboard while it is up.
|
|
2277
|
+
*
|
|
2278
|
+
* Its arrows move a question's cursor (or nothing — an arrow a Surface does not use
|
|
2279
|
+
* is not the transcript's), the page keys are not its business, and its mouse reports
|
|
2280
|
+
* take the same path they always did so the refusal happens where it always did, down
|
|
2281
|
+
* to the remembered press. Its own editing keys are `Home`/`End`/`Delete` (W-3b.1):
|
|
2282
|
+
* they act on the field the Surface borrowed — the one row the reader can see — and a
|
|
2283
|
+
* Surface that borrowed none has no field for them, so it consumes them. The kitty
|
|
2284
|
+
* copy key falls out with the other sequences below: a Surface has no copy contract,
|
|
2285
|
+
* and this round did not invent one. Everything else goes to the shared
|
|
2286
|
+
* composer/Surface body, whose `dialog` branches are the Surface's own behaviour.
|
|
2287
|
+
*/
|
|
2288
|
+
private ownerSurface;
|
|
2289
|
+
/**
|
|
2290
|
+
* The Composer adapter.
|
|
2291
|
+
*
|
|
2292
|
+
* Text — one character or many — is typed: the burst rule first, then one character
|
|
2293
|
+
* at a time through the Router, which is what lets ownership change inside a single
|
|
2294
|
+
* read (a Surface answering `y` with the composer taking the `es` behind it). The
|
|
2295
|
+
* sequence shapes the composer owns are the arrows (the suggestion list, else
|
|
2296
|
+
* history) and the caret keys — which it now only ever gets while it owns the
|
|
2297
|
+
* keyboard: with a Surface up, the Router hands those keys to the Surface (W-3b.1).
|
|
2298
|
+
*/
|
|
2299
|
+
private ownerComposer;
|
|
2300
|
+
/**
|
|
2301
|
+
* The Workspace adapter: the transcript owns the mouse, the page keys and the focus
|
|
2302
|
+
* ring — and the ring only when the Router said so (empty field, a card to land on).
|
|
2303
|
+
*/
|
|
2304
|
+
private ownerWorkspace;
|
|
2305
|
+
/** An arrow the composer keeps: the suggestion list while it is up, else history. */
|
|
2306
|
+
private arrowHistory;
|
|
2307
|
+
/** Press, motion and release: selection, links and card toggles — the transcript's. */
|
|
2308
|
+
private mouseGesture;
|
|
2309
|
+
/**
|
|
2310
|
+
* The composer/Surface body — the switch and the tail the ladder always had.
|
|
2311
|
+
*
|
|
2312
|
+
* It is shared by two adapters on purpose: its `dialog` guards *are* the Surface's
|
|
2313
|
+
* behaviour for those keys (a borrowed field takes them, a field-less dialog refuses
|
|
2314
|
+
* them), and splitting them is W-3's job. What the Router guarantees is that a Screen
|
|
2315
|
+
* never reaches it, so every key below can only spend itself on a field the reader
|
|
2316
|
+
* has in front of them — the composer's or a borrowed one. The unreachable second
|
|
2317
|
+
* Screen gate the old body carried is gone with it (G-6).
|
|
2318
|
+
*/
|
|
2319
|
+
private composerUnit;
|
|
2320
|
+
/**
|
|
2321
|
+
* Ctrl+L's repaint, in one place for the owners that share it (G-6).
|
|
2322
|
+
*
|
|
2323
|
+
* The Screen has its own implementation (`screenNeedsFullPaint`, because it repaints
|
|
2324
|
+
* a Screen's frame); this one drops the cached rows so the next full frame is rebuilt
|
|
2325
|
+
* from scratch. W-2 does not merge them — only a test that proves both owners repaint
|
|
2326
|
+
* identically may (AD-20 §6) — but it does give the composer's copy a name.
|
|
2327
|
+
*/
|
|
2328
|
+
private repaintNow;
|
|
2162
2329
|
/**
|
|
2163
2330
|
* Insert pasted text into the field that owns the keyboard; CR/LF are literal
|
|
2164
2331
|
* newlines.
|
|
@@ -2199,6 +2366,14 @@ export declare class SshTui {
|
|
|
2199
2366
|
*/
|
|
2200
2367
|
private textIsEditable;
|
|
2201
2368
|
private handlePlainText;
|
|
2369
|
+
/**
|
|
2370
|
+
* One character, from a read or from the typing loop: the Router decides, again.
|
|
2371
|
+
*
|
|
2372
|
+
* It is asked per character rather than per read because ownership can change inside
|
|
2373
|
+
* one read — a Surface that answers the first character of `yes` is gone for the rest
|
|
2374
|
+
* (pinned by the `yes-typed-at-dialog` trace). A Screen never reaches the body below:
|
|
2375
|
+
* the Router answered `screen` and the Screen adapter took the character.
|
|
2376
|
+
*/
|
|
2202
2377
|
private handleChar;
|
|
2203
2378
|
/**
|
|
2204
2379
|
* Run one rebindable action.
|
|
@@ -2382,13 +2557,21 @@ export declare class SshTui {
|
|
|
2382
2557
|
* inspect overlay owns the keyboard and takes no scroll at all: the transcript
|
|
2383
2558
|
* behind a dialog must not move.
|
|
2384
2559
|
*/
|
|
2385
|
-
private
|
|
2560
|
+
private scrollWorkspace;
|
|
2386
2561
|
private handleCtrlC;
|
|
2387
2562
|
private submit;
|
|
2388
2563
|
private runCommand;
|
|
2389
|
-
/**
|
|
2564
|
+
/**
|
|
2565
|
+
* Grapheme cluster immediately before `cursor`; cursor-internal positions delete it whole.
|
|
2566
|
+
*
|
|
2567
|
+
* The cluster is measured in the field that owns the keyboard, like `backspace` and
|
|
2568
|
+
* `deleteAtCursor` above, which is what makes their ranges mean the same thing as the
|
|
2569
|
+
* cursor they were handed (W-3b.1b): segmenting the *draft* while editing a borrowed
|
|
2570
|
+
* answer gave offsets from another string, so a borrowed `a🚀` lost one surrogate and
|
|
2571
|
+
* kept the caret inside the pair.
|
|
2572
|
+
*/
|
|
2390
2573
|
private graphemeBefore;
|
|
2391
|
-
/** Grapheme cluster containing or following `cursor
|
|
2574
|
+
/** Grapheme cluster containing or following `cursor`, in the field that owns the keyboard. */
|
|
2392
2575
|
private graphemeAfter;
|
|
2393
2576
|
/** Delete one grapheme back, in whichever field owns the keyboard. */
|
|
2394
2577
|
private backspace;
|
|
@@ -2398,7 +2581,16 @@ export declare class SshTui {
|
|
|
2398
2581
|
private moveCursor;
|
|
2399
2582
|
private historyBack;
|
|
2400
2583
|
private historyForward;
|
|
2401
|
-
/**
|
|
2584
|
+
/**
|
|
2585
|
+
* Typing while browsing history detaches from the saved item.
|
|
2586
|
+
*
|
|
2587
|
+
* The browse is the **composer's**, so only the composer's own field may end it
|
|
2588
|
+
* (W-3b.3a). Every editing key a Surface borrowed the field for arrives here —
|
|
2589
|
+
* `backspace`, `deleteAtCursor`, `handlePasteText`, and `composerUnit`'s Ctrl+U /
|
|
2590
|
+
* Ctrl+K — and detaching on that path wrote the hidden composer's state from the
|
|
2591
|
+
* visible answer: the recalled entry replaced `historyDraft`, so the unsent draft
|
|
2592
|
+
* the browse was holding could never be reached again with `↓`.
|
|
2593
|
+
*/
|
|
2402
2594
|
private leaveHistoryBrowse;
|
|
2403
2595
|
}
|
|
2404
2596
|
/**
|
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.2",
|
|
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;
|