@lemoncat7/dsh-ssh 1.5.2 → 1.5.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.
@@ -0,0 +1,13 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
3
+ type PanelProps = PropsRuntime<'details'>;
4
+ /** The new host owns session persistence, docking and tab closure. */
5
+ export declare function supportsDockedPanels(ctx: Context): boolean;
6
+ export declare function createDockedPanel(ctx: Context, id: string, title: string, render: (props: PanelProps) => JSX.Element, notify: () => void): {
7
+ open(sessionId: string): void;
8
+ close(sessionId: string): void;
9
+ isOpen(sessionId: string): boolean;
10
+ dispose(): void;
11
+ };
12
+ export {};
13
+ //# sourceMappingURL=docked-panel-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docked-panel-compat.d.ts","sourceRoot":"","sources":["../src/docked-panel-compat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAGpE,KAAK,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;AAMzC,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,GAAG,CAAC,OAAO,EAC1C,MAAM,EAAE,MAAM,IAAI;oBAkDA,MAAM,GAAG,IAAI;qBAwBZ,MAAM,GAAG,IAAI;sBAMZ,MAAM,GAAG,OAAO;eAGvB,IAAI;EAQlB"}
@@ -0,0 +1,116 @@
1
+ import { useEffect } from 'react';
2
+ /** The new host owns session persistence, docking and tab closure. */
3
+ export function supportsDockedPanels(ctx) {
4
+ return typeof ctx.layout.selectPanel === 'function';
5
+ }
6
+ export function createDockedPanel(ctx, id, title, render, notify) {
7
+ const records = new Map();
8
+ let pending;
9
+ let frame;
10
+ let disposed = false;
11
+ let sidebar;
12
+ const cancel = () => {
13
+ if (frame !== undefined)
14
+ window.cancelAnimationFrame(frame);
15
+ frame = undefined;
16
+ pending = undefined;
17
+ };
18
+ function Body(props) {
19
+ const { tab } = props.useTabInfo();
20
+ const sessionId = String(props.sessionId);
21
+ useEffect(() => {
22
+ let entries = records.get(sessionId);
23
+ if (entries === undefined) {
24
+ entries = new Map();
25
+ records.set(sessionId, entries);
26
+ }
27
+ const entry = { visible: tab.visible, close: () => tab.actions.close() };
28
+ entries.set(tab.id, entry);
29
+ const remove = () => {
30
+ if (entries?.get(tab.id) !== entry)
31
+ return;
32
+ entries.delete(tab.id);
33
+ if (entries.size === 0)
34
+ records.delete(sessionId);
35
+ notify();
36
+ };
37
+ tab.signal.addEventListener('abort', remove, { once: true });
38
+ notify();
39
+ return () => {
40
+ tab.signal.removeEventListener('abort', remove);
41
+ remove();
42
+ };
43
+ }, [sessionId, tab.id, tab.visible, tab.signal]);
44
+ // Hidden tabs must not keep terminal polling and document fetching alive.
45
+ return tab.visible ? render(props) : null;
46
+ }
47
+ const fiber = ctx.inject(['sidebarRight', 'sidebarRightTabs'], child => {
48
+ sidebar = child.get('sidebarRight');
49
+ const registry = child.get('sidebarRightTabs');
50
+ const slots = child.slots;
51
+ child.effect(() => registry.register({ id, kind: id, title: () => title }), id + ': tab type');
52
+ child.effect(() => slots.inject('sidebar.right.pane.tab', () => slots.register({
53
+ name: 'sidebar.right.pane.tab', key: id,
54
+ }, Body)), id + ': tab body');
55
+ child.effect(() => () => { sidebar = undefined; }, id + ': tab service');
56
+ });
57
+ return {
58
+ open(sessionId) {
59
+ cancel();
60
+ pending = sessionId;
61
+ // Closing a main panel remounts the conversation seat on the next commit.
62
+ // Do not issue a right-tab command against a stale/unmounted seat.
63
+ let attempts = 0;
64
+ const reveal = () => {
65
+ frame = undefined;
66
+ if (disposed || pending !== sessionId)
67
+ return;
68
+ const sessions = ctx.get('sessions');
69
+ if (String(sessions.list.getSnapshot().current) !== sessionId) {
70
+ cancel();
71
+ notify();
72
+ return;
73
+ }
74
+ try {
75
+ if (sidebar === undefined)
76
+ throw new Error('Right sidebar is not ready');
77
+ sidebar.openTab(id);
78
+ pending = undefined;
79
+ notify();
80
+ }
81
+ catch (error) {
82
+ if (++attempts < 30)
83
+ frame = window.requestAnimationFrame(reveal);
84
+ else {
85
+ cancel();
86
+ notify();
87
+ console.error(title + ': could not open sidebar', error);
88
+ }
89
+ }
90
+ };
91
+ frame = window.requestAnimationFrame(reveal);
92
+ notify();
93
+ },
94
+ close(sessionId) {
95
+ if (pending === sessionId)
96
+ cancel();
97
+ for (const entry of [...(records.get(sessionId)?.values() ?? [])])
98
+ entry.close();
99
+ records.delete(sessionId);
100
+ notify();
101
+ },
102
+ isOpen(sessionId) {
103
+ return pending === sessionId || [...(records.get(sessionId)?.values() ?? [])].some(entry => entry.visible);
104
+ },
105
+ dispose() {
106
+ disposed = true;
107
+ cancel();
108
+ for (const entries of records.values())
109
+ for (const entry of [...entries.values()])
110
+ entry.close();
111
+ records.clear();
112
+ void fiber.dispose();
113
+ },
114
+ };
115
+ }
116
+ //# sourceMappingURL=docked-panel-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docked-panel-compat.js","sourceRoot":"","sources":["../src/docked-panel-compat.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
3
+ /** Keep host-version differences at the navigation boundary, not in pages. */
4
+ export declare function registerMainPanel(ctx: Context, id: string, priority: number, render: (props: PropsRuntime<'conversation'>) => JSX.Element, onHidden?: () => void): () => void;
5
+ //# sourceMappingURL=main-panel-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-panel-compat.d.ts","sourceRoot":"","sources":["../src/main-panel-compat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAIpE,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,OAAO,EAC5D,QAAQ,GAAE,MAAM,IAAe,GAC9B,MAAM,IAAI,CA4BZ"}
@@ -0,0 +1,38 @@
1
+ import { useEffect } from 'react';
2
+ /** Keep host-version differences at the navigation boundary, not in pages. */
3
+ export function registerMainPanel(ctx, id, priority, render, onHidden = () => { }) {
4
+ const layout = ctx.layout;
5
+ if (typeof layout.selectPanel !== 'function') {
6
+ return ctx.slots.register({ name: 'conversation', priority }, render);
7
+ }
8
+ // 0.1.5 moves global panels from the session-scoped conversation seat to
9
+ // root-scoped keyed main entries. This cast is confined to the version bridge.
10
+ const slots = ctx.slots;
11
+ let disposed = false;
12
+ let generation = 0;
13
+ const Body = (props) => {
14
+ useEffect(() => {
15
+ const current = ++generation;
16
+ return () => {
17
+ // Ignore StrictMode's effect replay and our own explicit removal.
18
+ queueMicrotask(() => { if (!disposed && generation === current)
19
+ onHidden(); });
20
+ };
21
+ }, []);
22
+ return render(props);
23
+ };
24
+ const remove = slots.register({ name: 'main', key: id }, Body);
25
+ const dispose = () => { if (disposed)
26
+ return; disposed = true; remove(); };
27
+ try {
28
+ layout.selectPanel(id);
29
+ }
30
+ catch (error) {
31
+ dispose();
32
+ throw error;
33
+ }
34
+ // The host retains registered keys and resets only a removed active key;
35
+ // never select null here, which could close another plugin's newer panel.
36
+ return dispose;
37
+ }
38
+ //# sourceMappingURL=main-panel-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-panel-compat.js","sourceRoot":"","sources":["../src/main-panel-compat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMjC,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAC/B,GAAY,EACZ,EAAU,EACV,QAAgB,EAChB,MAA4D,EAC5D,WAAuB,GAAG,EAAE,GAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAkE,CAAA;IACrF,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAA;IACvE,CAAC;IACD,yEAAyE;IACzE,+EAA+E;IAC/E,MAAM,KAAK,GAAG,GAAG,CAAC,KAEjB,CAAA;IACD,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,MAAM,IAAI,GAAG,CAAC,KAAmC,EAAe,EAAE;QAChE,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,OAAO,GAAG,EAAE,UAAU,CAAA;YAC5B,OAAO,GAAG,EAAE;gBACV,kEAAkE;gBAClE,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,OAAO;oBAAE,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;YAC/E,CAAC,CAAA;QACH,CAAC,EAAE,EAAE,CAAC,CAAA;QACN,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9D,MAAM,OAAO,GAAG,GAAS,EAAE,GAAG,IAAI,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA,CAAC,CAAC,CAAA;IAC/E,IAAI,CAAC;QAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;QAAC,MAAM,KAAK,CAAA;IAAC,CAAC;IACvE,yEAAyE;IACzE,0EAA0E;IAC1E,OAAO,OAAO,CAAA;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncat7/dsh-ssh",
3
- "version": "1.5.2",
3
+ "version": "1.5.3",
4
4
  "description": "Secure SSH, FTP/FTPS/SFTP file transfer, browser terminals, proxies, port forwarding, and session-scoped AI access for DeepSeek Harness",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -38,6 +38,7 @@
38
38
  "cordis.patch.yml",
39
39
  "README.md",
40
40
  "ARCHITECTURE.md",
41
+ "docs/**/*.md",
41
42
  "LICENSE"
42
43
  ],
43
44
  "dsh": {
@@ -81,10 +82,10 @@
81
82
  },
82
83
  "peerDependencies": {
83
84
  "@deepseek-ai/cordis": "^4.0.1",
84
- "@deepseek-ai/dsh-agent": "^0.1.2-rc.1",
85
- "@deepseek-ai/dsh-credentials": "^0.1.2-rc.1",
86
- "@deepseek-ai/dsh-system-prompt": "^0.1.2-rc.1",
87
- "@deepseek-ai/dsh-tools": "^0.1.2-rc.1"
85
+ "@deepseek-ai/dsh-agent": "^0.1.2-rc.1 || ^0.1.5-rc.1",
86
+ "@deepseek-ai/dsh-credentials": "^0.1.2-rc.1 || ^0.1.5-rc.1",
87
+ "@deepseek-ai/dsh-system-prompt": "^0.1.2-rc.1 || ^0.1.5-rc.1",
88
+ "@deepseek-ai/dsh-tools": "^0.1.2-rc.1 || ^0.1.5-rc.1"
88
89
  },
89
90
  "devDependencies": {
90
91
  "@deepseek-ai/cordis": "^4.0.1",