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.
@@ -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
- * Cursor-position replies removed from the relay's stdin stream. A launcher
670
- * from an older release (or a reply that raced its own probe) would otherwise
671
- * type `[17;1R` into the prompt or cancel a dialog with a bare ESC.
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 inputGuard;
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
- /** Handle one data chunk that may contain bracketed-paste markers. */
2161
- private processPasteChunk;
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, the inspect overlay) takes no paste at all — the
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, a setup field). Everything else — a confirmation, a menu,
2179
- * the inspect overlay — owns the keyboard without owning text, and those keys
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 scrollActiveSurface;
2532
+ private scrollWorkspace;
2358
2533
  private handleCtrlC;
2359
2534
  private submit;
2360
2535
  private runCommand;
2361
- /** Grapheme cluster immediately before `cursor`; cursor-internal positions delete it whole. */
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
- /** Typing while browsing history detaches from the saved item. */
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.2",
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.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
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": "compatible",
89
- "0.1.7-rc.2": "compatible",
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.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
129
- "@deepseek-ai/dsh-agent-default-model": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
130
- "@deepseek-ai/dsh-agent-loop": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
131
- "@deepseek-ai/dsh-agent-preset": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
132
- "@deepseek-ai/dsh-agent-preset-registry": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
133
- "@deepseek-ai/dsh-cmdline": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
134
- "@deepseek-ai/dsh-commands": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
135
- "@deepseek-ai/dsh-credentials": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
136
- "@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
137
- "@deepseek-ai/dsh-session": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
138
- "@deepseek-ai/dsh-session-persistence": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
139
- "@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
140
- "@deepseek-ai/dsh-subagent": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
141
- "@deepseek-ai/dsh-user-approval": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1",
142
- "@deepseek-ai/dsh-user-questions": ">=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1"
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.4",
166
- "@deepseek-ai/cordis-plugin-group": "1.0.4",
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.9",
169
- "@deepseek-ai/cordis-plugin-loader": "1.0.5",
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.0-rc.2",
172
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
173
- "@deepseek-ai/dsh-agent-default-model": "0.2.0-rc.2",
174
- "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
175
- "@deepseek-ai/dsh-agent-preset": "0.2.0-rc.2",
176
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
177
- "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2",
178
- "@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
179
- "@deepseek-ai/dsh-brand": "0.2.0-rc.2",
180
- "@deepseek-ai/dsh-cmdline": "0.2.0-rc.2",
181
- "@deepseek-ai/dsh-commands": "0.2.0-rc.2",
182
- "@deepseek-ai/dsh-credentials": "0.2.0-rc.2",
183
- "@deepseek-ai/dsh-home-paths": "0.2.0-rc.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.0-rc.2",
186
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
187
- "@deepseek-ai/dsh-llm-mock-server": "0.2.0-rc.2",
188
- "@deepseek-ai/dsh-sandbox": "0.2.0-rc.2",
189
- "@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.2",
190
- "@deepseek-ai/dsh-scope": "0.2.0-rc.2",
191
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
192
- "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
193
- "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
194
- "@deepseek-ai/dsh-session-projection-cache": "0.2.0-rc.2",
195
- "@deepseek-ai/dsh-settings": "0.2.0-rc.2",
196
- "@deepseek-ai/dsh-subagent": "0.2.0-rc.2",
197
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
198
- "@deepseek-ai/dsh-timeout": "0.2.0-rc.2",
199
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
200
- "@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
201
- "@deepseek-ai/dsh-user-approval": "0.2.0-rc.2",
202
- "@deepseek-ai/dsh-user-questions": "0.2.0-rc.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.0-rc.2",
210
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
211
- "@deepseek-ai/dsh-agent-default-model": "0.2.0-rc.2",
212
- "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
213
- "@deepseek-ai/dsh-agent-preset": "0.2.0-rc.2",
214
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
215
- "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2",
216
- "@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
217
- "@deepseek-ai/dsh-brand": "0.2.0-rc.2",
218
- "@deepseek-ai/dsh-cmdline": "0.2.0-rc.2",
219
- "@deepseek-ai/dsh-commands": "0.2.0-rc.2",
220
- "@deepseek-ai/dsh-credentials": "0.2.0-rc.2",
221
- "@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
222
- "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
223
- "@deepseek-ai/dsh-jobs": "0.2.0-rc.2",
224
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
225
- "@deepseek-ai/dsh-llm-mock-server": "0.2.0-rc.2",
226
- "@deepseek-ai/dsh-sandbox": "0.2.0-rc.2",
227
- "@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.2",
228
- "@deepseek-ai/dsh-scope": "0.2.0-rc.2",
229
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
230
- "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
231
- "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
232
- "@deepseek-ai/dsh-session-projection-cache": "0.2.0-rc.2",
233
- "@deepseek-ai/dsh-settings": "0.2.0-rc.2",
234
- "@deepseek-ai/dsh-subagent": "0.2.0-rc.2",
235
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
236
- "@deepseek-ai/dsh-timeout": "0.2.0-rc.2",
237
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
238
- "@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
239
- "@deepseek-ai/dsh-user-approval": "0.2.0-rc.2",
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
  }
@@ -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;