dsh-ssh-tui 0.8.2-rc.1 → 0.8.3

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.
@@ -2166,18 +2166,36 @@ export declare class SshTui {
2166
2166
  * A paste is text input, so it goes through the same ownership question ordinary
2167
2167
  * typing does: into the composer's draft when the composer owns the keyboard, and
2168
2168
  * 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
2169
+ * text field (a confirmation, a menu, a report) takes no paste at all — the
2170
2170
  * alternative was writing the composer's hidden draft behind it, which is how a
2171
2171
  * paste into an approval dialog could silently rewrite the message being written.
2172
+ *
2173
+ * A **Screen** is that same question with a different answer, and it is asked
2174
+ * first because `textIsEditable()` only ever answers for the composer's field: the
2175
+ * setup Screen keeps a field of its own, which the composer's helpers cannot see
2176
+ * and must never be handed (B2.6 §4).
2172
2177
  */
2173
2178
  private handlePasteText;
2179
+ /**
2180
+ * Give a paste to the field the Screen owns, or to nobody.
2181
+ *
2182
+ * The setup Screen is the only Screen with a field, and it is the one place a
2183
+ * paste matters most: an API key, a base URL and a model list are all copied from
2184
+ * somewhere else, and a first run that could only be typed by hand is the
2185
+ * difference between a working session and an empty one. A step without a field —
2186
+ * the model pickers, the confirmation — is not a text field, so the paste is
2187
+ * dropped exactly as a menu drops it: a paste is text, never an answer.
2188
+ */
2189
+ private pasteIntoScreen;
2174
2190
  /**
2175
2191
  * Whether the keys that edit text belong to a field right now.
2176
2192
  *
2177
2193
  * 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.
2194
+ * (a free-text answer). Everything else — a confirmation, a menu, the inspect
2195
+ * overlay, every Screen — owns the keyboard without owning the composer's text,
2196
+ * and those keys must do nothing rather than reach the draft behind the surface.
2197
+ * A Screen is included by name: the setup Screen has a field of its own, and it
2198
+ * is reached through the Screen's own keys, never through the composer's.
2181
2199
  */
2182
2200
  private textIsEditable;
2183
2201
  private handlePlainText;
@@ -2272,6 +2290,16 @@ export declare class SshTui {
2272
2290
  /** Fetch the endpoint's model list into the onboarding wizard's models step. */
2273
2291
  private fetchOnboardingModels;
2274
2292
  private saveOnboarding;
2293
+ /**
2294
+ * Say the wizard is done, where the reader will still be able to read it.
2295
+ *
2296
+ * A saved wizard closes its Screen in the same frame, so its own notice row would
2297
+ * be painted for no frames at all — and the credential line that goes with it is a
2298
+ * footer echo (`command-feedback`), which expires. This is the durable half of the
2299
+ * answer: `command-status` routes to the transcript, exactly like the boot line
2300
+ * that asked for the setup in the first place.
2301
+ */
2302
+ private onboardDone;
2275
2303
  /** Store one credential, falling back to a launch-environment override on shadow/absence. */
2276
2304
  private saveCredential;
2277
2305
  /** Write launch-environment overrides so they beat system-injected variables. */
package/package.json CHANGED
@@ -1,16 +1,19 @@
1
1
  {
2
2
  "name": "dsh-ssh-tui",
3
- "version": "0.8.2-rc.1",
4
- "description": "SSH-friendly interactive terminal TUI plugin for DeepSeek Harness",
3
+ "version": "0.8.3",
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",
7
7
  "dsh",
8
8
  "dsh-plugin",
9
- "plugin",
10
9
  "tui",
11
10
  "terminal",
12
11
  "ssh",
13
- "cordis"
12
+ "coding-agent",
13
+ "cli",
14
+ "remote-development",
15
+ "windows-terminal",
16
+ "conpty"
14
17
  ],
15
18
  "author": "cyjyyd",
16
19
  "repository": {
@@ -58,6 +61,7 @@
58
61
  "docs/screenshots/headless.png",
59
62
  "docs/screenshots/workspace.png",
60
63
  "docs/screenshots/slow-link.gif",
64
+ "docs/screenshots/reconnect.gif",
61
65
  "LICENSE",
62
66
  "docs/display-mode.md",
63
67
  "docs/terminals.md",
@@ -108,7 +112,9 @@
108
112
  "probe:home": "node scripts/probe-home.mjs --probe",
109
113
  "probe:home:drop": "node scripts/probe-home.mjs --probe --script tui-drop-probe.mjs",
110
114
  "screenshots": "npm run build && node scripts/capture-readme-frames.mjs",
111
- "screenshots:slow": "npm run build && node scripts/capture-slow-link.mjs"
115
+ "screenshots:slow": "npm run build && node scripts/capture-slow-link.mjs",
116
+ "screenshots:reconnect": "npm run build && node scripts/capture-reconnect.mjs",
117
+ "bench:report": "node scripts/bench-report.mjs"
112
118
  },
113
119
  "engines": {
114
120
  "node": ">=22.19"