dsh-ssh-tui 0.3.7 → 0.3.9

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.
@@ -0,0 +1,2 @@
1
+ /** English UI catalog. Keys match `zh.ts`. */
2
+ export declare const en: Record<string, string>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Runtime UI locale for the SSH TUI.
3
+ *
4
+ * Order: `DSH_TUI_LANG` → settings `ssh-tui.language` (`/language`) →
5
+ * `LC_ALL` / `LC_MESSAGES` / `LANG`. Unrecognized and C/POSIX stay Chinese:
6
+ * jump-host SSH is the default audience, and CI often runs with `LANG=C`.
7
+ */
8
+ import z from '@deepseek-ai/schemastery';
9
+ import type { Context } from '@deepseek-ai/cordis';
10
+ export type Locale = 'zh' | 'en';
11
+ export type MessageVars = Record<string, string | number>;
12
+ export declare const UI_LOCALE_NAMESPACE: import("@deepseek-ai/dsh-settings").SettingsNamespace;
13
+ export declare const UI_LOCALE_SCHEMA: z<Schemastery.ObjectS<{
14
+ language: z<string, string>;
15
+ }>, Schemastery.ObjectT<{
16
+ language: z<string, string>;
17
+ }>>;
18
+ export declare function localeFromTag(tag: string): Locale | undefined;
19
+ /** Pick zh/en from env, optionally after a saved settings value. */
20
+ export declare function resolveLocale(env?: NodeJS.ProcessEnv, saved?: string): Locale;
21
+ export declare function getLocale(): Locale;
22
+ export declare function setLocale(locale: Locale): void;
23
+ export declare function t(key: string, vars?: MessageVars, fallback?: string): string;
24
+ export declare function refreshLocale(env?: NodeJS.ProcessEnv, saved?: string): Locale;
25
+ export declare function applySavedLocale(raw: unknown): Locale;
26
+ /** Register `$DSH_HOME/settings.yaml` `ssh-tui.language` and apply it now. */
27
+ export declare function installUiLocale(ctx: Context): void;
28
+ export declare function localeDisplayName(locale: Locale): string;
@@ -0,0 +1,2 @@
1
+ /** Chinese UI catalog. Keys are stable; values are the current TUI copy. */
2
+ export declare const zh: Record<string, string>;
@@ -10,26 +10,36 @@ export declare const ROUTE_MEMORY_SCHEMA: z<Schemastery.ObjectS<{
10
10
  providers: z<import("@deepseek-ai/cosmokit").Dict<{
11
11
  model?: string | null | undefined;
12
12
  reasoningEffort?: string | null | undefined;
13
+ updatedAt?: number | null | undefined;
13
14
  } & import("@deepseek-ai/cosmokit").Dict, string>, import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<{
14
15
  model: z<string, string>;
15
16
  reasoningEffort: z<string, string>;
17
+ updatedAt: z<number, number>;
16
18
  }>, string>>;
17
19
  }>, Schemastery.ObjectT<{
18
20
  providers: z<import("@deepseek-ai/cosmokit").Dict<{
19
21
  model?: string | null | undefined;
20
22
  reasoningEffort?: string | null | undefined;
23
+ updatedAt?: number | null | undefined;
21
24
  } & import("@deepseek-ai/cosmokit").Dict, string>, import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<{
22
25
  model: z<string, string>;
23
26
  reasoningEffort: z<string, string>;
27
+ updatedAt: z<number, number>;
24
28
  }>, string>>;
25
29
  }>>;
26
30
  export interface RememberedRoute {
27
31
  model: string;
28
32
  reasoningEffort?: string;
33
+ /** Epoch ms of the last time this route was persisted (0 for legacy entries). */
34
+ updatedAt?: number;
29
35
  }
30
36
  export type RouteMemoryMap = Record<string, RememberedRoute>;
31
37
  export declare function parseRouteMemory(raw: unknown): RouteMemoryMap;
32
38
  export declare function rememberedRouteFor(memory: RouteMemoryMap, provider: string): RememberedRoute | undefined;
39
+ /** The most recently persisted route (highest updatedAt), or undefined. */
40
+ export declare function latestRememberedRoute(memory: RouteMemoryMap): (RememberedRoute & {
41
+ provider: string;
42
+ }) | undefined;
33
43
  /** Register the route-memory settings section so /model and /provider can persist. */
34
44
  export declare function installRouteMemory(ctx: Context): void;
35
45
  export declare function upsertRememberedRoute(memory: RouteMemoryMap, provider: string, route: RememberedRoute): RouteMemoryMap;
@@ -4,6 +4,22 @@
4
4
  * both surfaces offer the same sessions.
5
5
  */
6
6
  import type { SessionPersistence } from '@deepseek-ai/dsh-session-persistence';
7
+ /** Last path segment for the footer chip (`\root\genshin\srv` → `srv`). */
8
+ export declare function sessionCwdLabel(cwd: string): string;
9
+ export declare function formatFooterCwd(cwd: string): string;
10
+ /**
11
+ * Switch the process into a persisted session working directory. Returns the
12
+ * directory actually used; missing/invalid paths stay put and are reported.
13
+ */
14
+ export declare function enterSessionCwd(cwd: string | undefined, options?: {
15
+ current?: string;
16
+ exists?: (path: string) => boolean;
17
+ chdir?: (path: string) => void;
18
+ }): {
19
+ cwd: string;
20
+ changed: boolean;
21
+ error?: string;
22
+ };
7
23
  /** One selectable history session. */
8
24
  export interface ResumableSession {
9
25
  id: string;
@@ -19,15 +19,41 @@ export declare const DEFAULT_SUBAGENT_MODEL = "deepseek-v4-flash";
19
19
  export declare const DEFAULT_XAI_SUBAGENT_MODEL = "grok-4.5";
20
20
  /**
21
21
  * Choose the default subagent model for a parent provider, preferring a
22
- * same-family listed model over a leftover DeepSeek flash id.
22
+ * same-family listed model over a leftover DeepSeek flash id. When the
23
+ * parent's own model id is supplied, candidates closest to that name win,
24
+ * with flash-like ids ranked first.
23
25
  */
24
- export declare function defaultSubagentModelForProvider(provider: string, listed?: readonly string[]): string;
26
+ export declare function defaultSubagentModelForProvider(provider: string, listed?: readonly string[], parentModel?: string): string;
25
27
  /**
26
28
  * True when the stored subagent model still belongs to the parent provider
27
29
  * family. An explicit leftover DeepSeek flash id after switching to xAI is
28
30
  * treated as stale so the TUI can pick a same-family default.
31
+ *
32
+ * A non-empty `listed` catalog is an extra constraint, not a bypass: a dirty
33
+ * directory that still contains `deepseek-v4-flash` must not keep that id on
34
+ * an xAI parent.
29
35
  */
30
36
  export declare function subagentModelMatchesProvider(provider: string, model: string, listed?: readonly string[]): boolean;
37
+ /** Cheap vs expensive hint for the automatic subagent default. */
38
+ export type SubagentCostClass = 'light' | 'heavy' | 'other';
39
+ /**
40
+ * Classify a model id for the subagent default. Flash / lite / mini / small
41
+ * and Grok 4.5 / 4.3 count as light; pro / max / 4.6 count as heavy so
42
+ * `/status` can show when the catalog had nothing cheaper.
43
+ */
44
+ export declare function subagentCostClass(model: string): SubagentCostClass;
45
+ /** One `/status` line describing the live subagent route vs the parent. */
46
+ export declare function describeSubagentFit(input: {
47
+ parentProvider: string;
48
+ parentModel?: string;
49
+ subProvider?: string;
50
+ subModel: string;
51
+ }): {
52
+ line: string;
53
+ sameFamily: boolean;
54
+ expensive: boolean;
55
+ following: boolean;
56
+ };
31
57
  /** Raw settings document shape. */
32
58
  export interface SubagentSettings {
33
59
  /** Explicit provider override; omitted means "same provider as the parent". */
@@ -0,0 +1,22 @@
1
+ export declare const SUPERGROK_AUTH_PATHS: readonly [string, string];
2
+ export declare const SUPERGROK_REFRESH_SKEW_MS: number;
3
+ export interface SuperGrokStoredToken {
4
+ accessToken: string;
5
+ refreshToken: string | null;
6
+ expiresAt: number | null;
7
+ clientId: string | null;
8
+ path: string;
9
+ }
10
+ export declare function parseSuperGrokAuthFile(raw: unknown, path: string): SuperGrokStoredToken | undefined;
11
+ export declare function superGrokTokenNeedsRefresh(token: SuperGrokStoredToken, now?: number, skewMs?: number): boolean;
12
+ export declare function loadSuperGrokToken(paths?: readonly string[]): Promise<SuperGrokStoredToken | undefined>;
13
+ export declare function persistSuperGrokToken(path: string, tokenResponse: {
14
+ access_token: string;
15
+ refresh_token?: string;
16
+ expires_in?: number;
17
+ }, previousRefreshToken: string, now?: number): Promise<SuperGrokStoredToken>;
18
+ export declare function resolveFreshSuperGrokToken(options?: {
19
+ force?: boolean;
20
+ now?: number;
21
+ paths?: readonly string[];
22
+ }): Promise<string | undefined>;
@@ -33,6 +33,8 @@ export interface TuiConfig {
33
33
  goodbye?: string;
34
34
  /** Whether this launch resumes an existing persisted session. */
35
35
  resume?: boolean;
36
+ /** One-line notice after entering a resumed session's working directory. */
37
+ cwdNotice?: string;
36
38
  /** Provider route selected at launch (defaults to deepseek-official). */
37
39
  provider?: string;
38
40
  /** Model selected at launch (defaults to the saved/fallback model). */
@@ -154,6 +156,12 @@ type Row = {
154
156
  summary?: string;
155
157
  error?: string;
156
158
  expanded: boolean;
159
+ } | {
160
+ kind: 'prompt';
161
+ sources: string[];
162
+ text: string;
163
+ plugin?: string;
164
+ expanded: boolean;
157
165
  } | {
158
166
  kind: 'system';
159
167
  text: string;
@@ -161,6 +169,27 @@ type Row = {
161
169
  kind: 'error';
162
170
  text: string;
163
171
  };
172
+ /** A reasoning/tool/subagent/plan row or the live streaming-reasoning block. */
173
+ type CollapsibleBlock = Extract<Row, {
174
+ kind: 'reasoning';
175
+ } | {
176
+ kind: 'tool';
177
+ } | {
178
+ kind: 'subagent';
179
+ } | {
180
+ kind: 'plan';
181
+ } | {
182
+ kind: 'question';
183
+ } | {
184
+ kind: 'goal';
185
+ } | {
186
+ kind: 'compaction';
187
+ } | {
188
+ kind: 'prompt';
189
+ }> | {
190
+ kind: 'streaming-reasoning';
191
+ expanded: boolean;
192
+ };
164
193
  type DisplayKind = Row['kind'] | 'tool-result' | 'diff-add' | 'diff-del' | 'diff-path' | 'todo-done' | 'todo-active' | 'todo-pending' | 'plan-dock';
165
194
  /** One file's change, matching the web diff-card contract (`card: 'diff'`). */
166
195
  interface ToolDiffHunk {
@@ -250,6 +279,7 @@ export interface FooterStatusInput {
250
279
  foldedInput: boolean;
251
280
  multiLineInput: boolean;
252
281
  queued: number;
282
+ cwdLabel?: string;
253
283
  }
254
284
  export declare function footerActivity(input: FooterStatusInput): {
255
285
  kind: FooterActivityKind;
@@ -258,6 +288,13 @@ export declare function footerActivity(input: FooterStatusInput): {
258
288
  /** Short remaining-quota bar: 8 pips, filled from the left. */
259
289
  export declare function formatQuotaBar(remainingPercent: number, width?: number): string;
260
290
  export declare function footerIdentityParts(input: FooterStatusInput): string[];
291
+ /** `SuperGrok ███████░ 82%`, or just the bar + percent when `code` is omitted. */
292
+ export declare function formatFooterQuota(percent: number, code?: string): string;
293
+ /**
294
+ * Drop the Go / SuperGrok plan name from a quota identity part, keeping the
295
+ * remaining-percent bar. Returns true when a part was rewritten.
296
+ */
297
+ export declare function dropFooterQuotaPlanName(parts: string[]): boolean;
261
298
  export declare function fitFooterStatusLine(activity: string, identity: readonly string[], width: number): string;
262
299
  /** One incremental paint as a single stdout write (one SSH packet when corked). */
263
300
  export declare function composePaintOutput(options: {
@@ -272,6 +309,26 @@ export declare function composePaintOutput(options: {
272
309
  cursorRow: number;
273
310
  cursorColumn: number;
274
311
  }): string;
312
+ export interface StatusReportInput {
313
+ sessionId: string;
314
+ pluginVersion: string;
315
+ provider: string;
316
+ model: string;
317
+ effort?: string;
318
+ agentStatus: string;
319
+ preset: string;
320
+ activeSubagents: number;
321
+ plan: 'off' | 'pending' | 'on';
322
+ paint: string;
323
+ waitingQuestions: number;
324
+ quota?: QuotaSnapshot;
325
+ parentModel?: string;
326
+ subProvider?: string;
327
+ subModel: string;
328
+ cwd?: string;
329
+ }
330
+ /** Lines printed by `/status` — SSH first-boot diagnostics, no extra command. */
331
+ export declare function formatStatusReport(input: StatusReportInput): string[];
275
332
  /** Human-facing kind for a live LLM route. */
276
333
  export declare function describeProviderRoute(provider: string): {
277
334
  kind: string;
@@ -304,6 +361,12 @@ export declare function padAnsiToWidth(text: string, width: number): string;
304
361
  export declare function visibleWidth(text: string): number;
305
362
  /** Repeat a glyph until it occupies exactly `width` cells. */
306
363
  export declare function repeatToWidth(glyph: string, width: number): string;
364
+ /** One colored span inside a tool-card header line. Offsets are UTF-16 char indices. */
365
+ interface TextSegment {
366
+ start: number;
367
+ end: number;
368
+ sgr: string;
369
+ }
307
370
  /**
308
371
  * Render workspace markdown into width-bounded terminal rows. Assistant
309
372
  * replies get a bold-white base; code blocks, headings, quotes, lists, rules,
@@ -378,6 +441,8 @@ export declare const quotaRefreshEveryTurns: typeof quotaRefreshEverySteps;
378
441
  export declare function parseSuperGrokBilling(payload: unknown): QuotaSnapshot;
379
442
  export declare function parseOpenCodeGoQuota(payload: unknown, provider: string): QuotaSnapshot;
380
443
  export declare function formatQuotaSnapshot(snapshot: QuotaSnapshot): string;
444
+ /** Compact `/status` quota line: tightest window first, then the rest. */
445
+ export declare function formatQuotaStatusLine(snapshot: QuotaSnapshot | undefined): string;
381
446
  /** Tightest remaining window — used for threshold alerts. */
382
447
  export declare function tightestQuotaWindow(snapshot: QuotaSnapshot): QuotaWindow | undefined;
383
448
  /** Render the OpenCode Go quota payload as a transcript block. */
@@ -433,7 +498,7 @@ export declare function applyTurnEndToPlan<T extends {
433
498
  export declare function planCloseNudgeText(plan: {
434
499
  todos: readonly PlanTodoItem[];
435
500
  }): string;
436
- export type CardCategory = 'thinking' | 'plan' | 'subagent' | 'reply' | 'tool' | 'question' | 'goal';
501
+ export type CardCategory = 'thinking' | 'plan' | 'subagent' | 'reply' | 'tool' | 'question' | 'goal' | 'prompt';
437
502
  /** Category for jump / search. Assistant replies are not collapsible cards. */
438
503
  export declare function cardCategoryOf(row: {
439
504
  kind: string;
@@ -443,6 +508,10 @@ export declare function parseFindQuery(raw: string): {
443
508
  category?: CardCategory;
444
509
  query: string;
445
510
  };
511
+ /** Classify one injected prompt blob into display sources. */
512
+ export declare function promptInjectionSources(text: string, plugin?: string): string[];
513
+ export declare function promptInjectionTitle(sources: readonly string[]): string;
514
+ export declare function isPromptInjectionMessage(sourceKind: string, text: string, plugin?: string): boolean;
446
515
  export declare function compactionHeaderText(row: {
447
516
  status: 'running' | 'ok' | 'error';
448
517
  pruneCount: number;
@@ -488,6 +557,34 @@ interface DiffDisplayLine {
488
557
  kind: DisplayKind;
489
558
  text: string;
490
559
  }
560
+ /** Running / ok / error → ANSI color for the status dot and status word only. */
561
+ export declare function toolStateColor(status: 'running' | 'ok' | 'error' | undefined): '33' | '32' | '31';
562
+ export declare function toolStateLabel(status: 'running' | 'ok' | 'error' | undefined): string;
563
+ /** Header + SGR spans: default title, dim operand, colored ● and [ok]/[error]. */
564
+ export declare function buildToolHeader(input: {
565
+ focused: boolean;
566
+ expanded: boolean;
567
+ title: string;
568
+ summary: string;
569
+ status?: 'running' | 'ok' | 'error';
570
+ command?: string;
571
+ signal?: string;
572
+ exitCode?: number;
573
+ spinner?: string;
574
+ }): {
575
+ plain: string;
576
+ segments: TextSegment[];
577
+ };
578
+ /** How many terminal rows a tool body occupies after wrapping. */
579
+ export declare function wrappedToolBodyLineCount(lines: readonly {
580
+ text: string;
581
+ }[], width: number): number;
582
+ /**
583
+ * True when the full tool body plus a one-line header fits in the workspace
584
+ * (the rows between the title bar and the input chrome). Oversized bodies
585
+ * open a dedicated inspect overlay instead of dumping into the transcript.
586
+ */
587
+ export declare function toolBodyFitsWorkspace(bodyLines: number, workspaceRows: number): boolean;
491
588
  /** Flatten hunks into git-style `-`/`+` lines plus the web-compatible footer. */
492
589
  export declare function renderToolDiff(diffs: ToolDiffHunk[], maxLines: number): DiffDisplayLine[];
493
590
  /** Convert any parsed JSON value into readable indented display lines. */
@@ -584,6 +681,10 @@ export declare class SshTui {
584
681
  private lastPaintHeight;
585
682
  private lastChromeStart;
586
683
  private lastTranscriptStart;
684
+ /** 1-based screen row of the footer `目录:` chip, when painted. */
685
+ private cwdChipRow;
686
+ /** Set when a card expand/collapse moves chrome; next paint full-redraws. */
687
+ private forceFullPaint;
587
688
  private paintIntervalMs;
588
689
  private paintLink;
589
690
  private paintProbed;
@@ -636,11 +737,17 @@ export declare class SshTui {
636
737
  private queuePlanCloseNudge;
637
738
  /** Compact web-style plan strip pinned above the input, not in the transcript. */
638
739
  private paintPlanDock;
740
+ private paintToolBodyLine;
741
+ private workspaceRowsFor;
742
+ private paintInspectOverlay;
743
+ private openToolInspect;
744
+ closeInspect(): void;
639
745
  private paintCollapsibleHeader;
640
746
  /** Move the expand/collapse focus among reasoning and tool rows. */
641
747
  private moveCollapsibleFocus;
642
748
  /** Toggle the focused block; without focus, toggle the most recent one. */
643
749
  private toggleCollapsible;
750
+ toggleCard(target: CollapsibleBlock): void;
644
751
  /** Expand all collapsible blocks, or collapse them again when all are open. */
645
752
  private toggleAllCollapsible;
646
753
  private highlightSearchLine;
@@ -652,6 +759,8 @@ export declare class SshTui {
652
759
  private runFindCommand;
653
760
  private stepSearch;
654
761
  private paint;
762
+ private workspaceCwd;
763
+ private announceWorkspaceCwd;
655
764
  private buildSuggestions;
656
765
  private suggestionsVisible;
657
766
  private currentProviderId;
@@ -690,6 +799,7 @@ export declare class SshTui {
690
799
  private handleCommandRun;
691
800
  private handleCommandDone;
692
801
  private handleGoalChange;
802
+ private pushPromptInjection;
693
803
  private handleSubagentExtensionEvent;
694
804
  /** Fold a live subagent's own session events into that child's card. */
695
805
  readonly handleSubagentSessionEvent: (sessionId: SessionId, event: SessionEvent) => void;
@@ -744,6 +854,14 @@ export declare class SshTui {
744
854
  private rememberedRoute;
745
855
  private rememberRoute;
746
856
  private applyModelSelection;
857
+ /**
858
+ * Persist the default provider/model selection. `agentDefaultModel` may be
859
+ * unavailable or its settings namespace may not be registered in this
860
+ * process, so a failed `saveSelection` falls back to writing the
861
+ * `agent-default-model` settings section directly and surfaces a warning
862
+ * when neither path sticks.
863
+ */
864
+ private persistDefaultSelection;
747
865
  /** Provider route the next subagent request should use. */
748
866
  private effectiveSubagentProvider;
749
867
  /**
@@ -752,7 +870,6 @@ export declare class SshTui {
752
870
  * switching to xAI is treated as stale.
753
871
  */
754
872
  private syncSubagentToProvider;
755
- private promptSubagentAfterProviderSwitch;
756
873
  private clearQuotaForProvider;
757
874
  /** Persist one subagent selection and publish it to the live request waterfall. */
758
875
  private saveSubagentSelection;
@@ -762,6 +879,8 @@ export declare class SshTui {
762
879
  private runSubmodelCommand;
763
880
  /** /subeffort: pick the reasoning effort subagent children use. */
764
881
  private runSubeffortCommand;
882
+ /** /language or /lang: persist zh/en and repaint chrome immediately. */
883
+ private runLanguageCommand;
765
884
  /** /mode: pick an agent preset (standard / minimal / ptc / cordis / routing-suite / ...). */
766
885
  private runModeCommand;
767
886
  /** /resume: switch to a past session, or open a picker when no id is given. */
@@ -805,7 +924,8 @@ export declare class SshTui {
805
924
  private ensurePosixEnvHook;
806
925
  private handleEscape;
807
926
  /** Toggle the collapsible row under a click on the transcript area. */
808
- private handleMouseClick;
927
+ handleMouseClick(y: number): void;
928
+ private scrollInspectOrTranscript;
809
929
  private handleCtrlC;
810
930
  private submit;
811
931
  private runCommand;
@@ -17,8 +17,9 @@ export function compareSemver(a, b) {
17
17
  }
18
18
  return 0;
19
19
  }
20
+ import { t } from './i18n/index.js';
20
21
  export function formatUpdateNotice(current, latest) {
21
- return `发现新版本 dsh-ssh-tui ${latest}(当前 ${current})。更新:dsh plugin --profile tui add dsh-ssh-tui`;
22
+ return t('update.notice', { latest, current });
22
23
  }
23
24
  export async function fetchLatestNpmVersion(fetchImpl = fetch) {
24
25
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,YAAY,GAAG,+CAA+C,CAAA;AACpE,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAE7B,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAY,EAAE;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;QACpE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,CAAC,CAAE,KAAK,KAAK,CAAC,CAAC,CAAE;YAAE,OAAO,IAAI,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;IACzD,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAc;IAChE,OAAO,qBAAqB,MAAM,OAAO,OAAO,+CAA+C,CAAA;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAA0B,KAAK;IAE/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;YAC7C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;SAC9C,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,SAAS,CAAA;QAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2B,CAAA;QAC3D,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IACzG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM,EAAE,CAAC;QAClG,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAA;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC1C,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-ssh-tui",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "SSH-friendly interactive terminal TUI plugin for DeepSeek Harness",
5
5
  "keywords": [
6
6
  "deepseek-harness",