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.
@@ -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
  /**
@@ -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
- * `/mode fix`: write the roster row into this profile's user patch layer.
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
- * The write only takes effect on the next launch — the loader composes the
2079
- * patch tree once at boot — so the report says so instead of pretending the
2080
- * running session gained a roster.
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
- /** Handle one data chunk that may contain bracketed-paste markers. */
2161
- private processPasteChunk;
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 scrollActiveSurface;
2560
+ private scrollWorkspace;
2386
2561
  private handleCtrlC;
2387
2562
  private submit;
2388
2563
  private runCommand;
2389
- /** Grapheme cluster immediately before `cursor`; cursor-internal positions delete it whole. */
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
- /** Typing while browsing history detaches from the saved item. */
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",
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.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;