dsh-remote-local-plugin 0.8.3 → 0.8.5
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.
- package/README.md +1 -1
- package/assets/goldenpigeon-dsh-remote-agent-0.2.3.tgz +0 -0
- package/lib/client.js +35 -12
- package/lib/client.js.map +2 -2
- package/lib/index.js +613 -42
- package/lib/types/host-api/contract.d.ts +5 -1
- package/lib/types/mirror/service.d.ts +10 -2
- package/lib/types/remote/restart.d.ts +7 -0
- package/lib/types/rpc/contract.d.ts +114 -0
- package/lib/types/rpc/handler.d.ts +12 -0
- package/lib/types/service.d.ts +13 -1
- package/node_modules/dsh-remote-terminal-controller/lib/client.js.map +7 -0
- package/package.json +1 -1
- package/assets/dsh-remote-agent-0.2.1.tgz +0 -0
|
@@ -12,7 +12,7 @@ import type { AcceptedResult, CreateSessionResult, HostInfo, PromptDeliveryMode,
|
|
|
12
12
|
/** Exact authenticated Fetch route owned by the local plugin. */
|
|
13
13
|
export declare const HOST_API_PATH = "/api/dsh-remote";
|
|
14
14
|
/** Endpoint names. */
|
|
15
|
-
export type HostApiEndpoint = 'state' | 'target/validate' | 'host/add' | 'host/remove' | 'host/connect' | 'host/disconnect' | 'host/refresh' | 'host/provision' | 'host/workspaces' | 'host/workspace/create' | 'host/directory/list' | 'local/directory/list' | 'local/workspace/create' | 'host/sessions' | 'host/session' | 'host/session/create' | 'host/session/prompt' | 'host/session/cancel' | 'host/web-url' | 'host/files/list' | 'host/files/read' | 'host/files/stat' | 'host/files/bytes';
|
|
15
|
+
export type HostApiEndpoint = 'state' | 'target/validate' | 'host/add' | 'host/remove' | 'host/connect' | 'host/disconnect' | 'host/refresh' | 'host/provision' | 'host/restart' | 'host/workspaces' | 'host/workspace/create' | 'host/directory/list' | 'local/directory/list' | 'local/workspace/create' | 'host/sessions' | 'host/session' | 'host/session/create' | 'host/session/prompt' | 'host/session/cancel' | 'host/web-url' | 'host/files/list' | 'host/files/read' | 'host/files/stat' | 'host/files/bytes';
|
|
16
16
|
/** Browser-safe state snapshot. */
|
|
17
17
|
export interface RemoteHostsState {
|
|
18
18
|
readonly protocolVersion: number;
|
|
@@ -94,6 +94,9 @@ export interface HostApiPayloads {
|
|
|
94
94
|
'host/provision': {
|
|
95
95
|
hostId: string;
|
|
96
96
|
};
|
|
97
|
+
'host/restart': {
|
|
98
|
+
hostId: string;
|
|
99
|
+
};
|
|
97
100
|
'host/workspaces': {
|
|
98
101
|
hostId: string;
|
|
99
102
|
};
|
|
@@ -177,6 +180,7 @@ export interface HostApiValues {
|
|
|
177
180
|
'host/disconnect': HostView;
|
|
178
181
|
'host/refresh': HostView;
|
|
179
182
|
'host/provision': HostView;
|
|
183
|
+
'host/restart': HostView;
|
|
180
184
|
'host/workspaces': WorkspacesResult;
|
|
181
185
|
'host/workspace/create': RemoteWorkspace;
|
|
182
186
|
'host/directory/list': {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { Context } from '@deepseek-ai/cordis';
|
|
15
15
|
import type { Session, SessionId } from '@deepseek-ai/dsh-session';
|
|
16
|
-
import type { PromptDeliveryMode } from '@dsh-remote/protocol';
|
|
16
|
+
import type { RemoteAssistantFrame, PromptDeliveryMode } from '@dsh-remote/protocol';
|
|
17
17
|
import type { ResolvedConfig } from '../config.ts';
|
|
18
18
|
import type { RemoteHostsService } from '../service.ts';
|
|
19
19
|
interface MirrorRecord {
|
|
@@ -30,6 +30,14 @@ interface MirrorRuntime {
|
|
|
30
30
|
readonly agent: MirrorAgent;
|
|
31
31
|
readonly session: Session;
|
|
32
32
|
timer: NodeJS.Timeout | undefined;
|
|
33
|
+
stream: AbortController | undefined;
|
|
34
|
+
assistant: AbortController | undefined;
|
|
35
|
+
remoteToLocalSeq: Map<number, number>;
|
|
36
|
+
pendingAssistantEnds: Map<number, RemoteAssistantFrame>;
|
|
37
|
+
latestTurn: number;
|
|
38
|
+
awaitingTurn: number | null;
|
|
39
|
+
awaitingStarted: boolean;
|
|
40
|
+
applyingRemote: boolean;
|
|
33
41
|
running: boolean;
|
|
34
42
|
stopped: boolean;
|
|
35
43
|
lastError: string | null;
|
|
@@ -81,7 +89,7 @@ export declare class RemoteMirrorService {
|
|
|
81
89
|
ensureRemoteSession(hostId: string, remoteSessionId: string): Promise<string | undefined>;
|
|
82
90
|
/** Route one prompt from the local Agent façade to the remote session. */
|
|
83
91
|
prompt(runtime: MirrorRuntime, message: unknown, mode: PromptDeliveryMode): void;
|
|
84
|
-
/** Route cancellation to the remote session. */
|
|
92
|
+
/** Route cancellation to the remote session only after the remote accepts it. */
|
|
85
93
|
cancel(runtime: MirrorRuntime): void;
|
|
86
94
|
}
|
|
87
95
|
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ParsedSshTarget } from '../ssh/target.ts';
|
|
2
|
+
export interface RestartRemoteOptions {
|
|
3
|
+
readonly sshBinary: string;
|
|
4
|
+
readonly strictHostKeyChecking: 'yes' | 'no' | 'ask' | 'accept-new';
|
|
5
|
+
}
|
|
6
|
+
/** Restart the installer-owned remote DSH unit. */
|
|
7
|
+
export declare function restartRemoteAgent(target: ParsedSshTarget, options: RestartRemoteOptions): Promise<void>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC contract shared by the host handler and the browser Settings page.
|
|
3
|
+
*
|
|
4
|
+
* The channel rides DSH's authenticated Connection transport, so it works
|
|
5
|
+
* through the web HTTP carrier and the desktop IPC carrier without a second
|
|
6
|
+
* authentication scheme.
|
|
7
|
+
*
|
|
8
|
+
* @module dsh-remote-local/rpc/contract
|
|
9
|
+
*/
|
|
10
|
+
import type { HostView } from '../hosts/types.ts';
|
|
11
|
+
import type { HostInfo, RemoteSessionSummary, RemoteWorkspace, SessionSnapshot } from '@dsh-remote/protocol';
|
|
12
|
+
/** Absolute Connection RPC channel. */
|
|
13
|
+
export declare const RPC_CHANNEL = "/dsh-remote";
|
|
14
|
+
/** Endpoint names. */
|
|
15
|
+
export type RpcEndpoint = 'state' | 'target/validate' | 'host/add' | 'host/remove' | 'host/connect' | 'host/disconnect' | 'host/refresh' | 'host/workspaces' | 'host/sessions' | 'host/session' | 'host/web-url';
|
|
16
|
+
/** Browser-safe state snapshot. */
|
|
17
|
+
export interface RemoteHostsState {
|
|
18
|
+
readonly protocolVersion: number;
|
|
19
|
+
readonly hosts: readonly HostView[];
|
|
20
|
+
}
|
|
21
|
+
/** Result of parsing a destination. */
|
|
22
|
+
export interface ValidatedTarget {
|
|
23
|
+
readonly canonical: string;
|
|
24
|
+
readonly host: string;
|
|
25
|
+
readonly user: string | null;
|
|
26
|
+
readonly port: number | null;
|
|
27
|
+
}
|
|
28
|
+
/** Result of listing workspaces. */
|
|
29
|
+
export interface WorkspacesResult {
|
|
30
|
+
readonly workspaces: readonly RemoteWorkspace[];
|
|
31
|
+
}
|
|
32
|
+
/** Result of listing sessions. */
|
|
33
|
+
export interface SessionsResult {
|
|
34
|
+
readonly sessions: readonly RemoteSessionSummary[];
|
|
35
|
+
}
|
|
36
|
+
/** Result of resolving the remote Web UI. */
|
|
37
|
+
export interface WebUrlResult {
|
|
38
|
+
readonly url: string;
|
|
39
|
+
}
|
|
40
|
+
/** Success/failure result used by the Connection RPC handler. */
|
|
41
|
+
export type RpcResult<T> = {
|
|
42
|
+
readonly ok: true;
|
|
43
|
+
readonly value: T;
|
|
44
|
+
} | {
|
|
45
|
+
readonly ok: false;
|
|
46
|
+
readonly error: {
|
|
47
|
+
readonly code: string;
|
|
48
|
+
readonly message: string;
|
|
49
|
+
readonly details: Record<string, unknown>;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
/** Payloads accepted by each endpoint. */
|
|
53
|
+
export interface RpcPayloads {
|
|
54
|
+
state: undefined;
|
|
55
|
+
'target/validate': {
|
|
56
|
+
sshTarget: string;
|
|
57
|
+
};
|
|
58
|
+
'host/add': {
|
|
59
|
+
sshTarget: string;
|
|
60
|
+
label?: string;
|
|
61
|
+
token?: string;
|
|
62
|
+
remoteAgentPort?: number;
|
|
63
|
+
autoConnect?: boolean;
|
|
64
|
+
};
|
|
65
|
+
'host/remove': {
|
|
66
|
+
hostId: string;
|
|
67
|
+
};
|
|
68
|
+
'host/connect': {
|
|
69
|
+
hostId: string;
|
|
70
|
+
};
|
|
71
|
+
'host/disconnect': {
|
|
72
|
+
hostId: string;
|
|
73
|
+
};
|
|
74
|
+
'host/refresh': {
|
|
75
|
+
hostId: string;
|
|
76
|
+
};
|
|
77
|
+
'host/workspaces': {
|
|
78
|
+
hostId: string;
|
|
79
|
+
};
|
|
80
|
+
'host/sessions': {
|
|
81
|
+
hostId: string;
|
|
82
|
+
workspaceId?: string;
|
|
83
|
+
};
|
|
84
|
+
'host/session': {
|
|
85
|
+
hostId: string;
|
|
86
|
+
sessionId: string;
|
|
87
|
+
limit?: number;
|
|
88
|
+
};
|
|
89
|
+
'host/web-url': {
|
|
90
|
+
hostId: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Values returned by each endpoint. */
|
|
94
|
+
export interface RpcValues {
|
|
95
|
+
state: RemoteHostsState;
|
|
96
|
+
'target/validate': ValidatedTarget;
|
|
97
|
+
'host/add': HostView;
|
|
98
|
+
'host/remove': {
|
|
99
|
+
removed: true;
|
|
100
|
+
};
|
|
101
|
+
'host/connect': HostView;
|
|
102
|
+
'host/disconnect': HostView;
|
|
103
|
+
'host/refresh': HostView;
|
|
104
|
+
'host/workspaces': WorkspacesResult;
|
|
105
|
+
'host/sessions': SessionsResult;
|
|
106
|
+
'host/session': SessionSnapshot;
|
|
107
|
+
'host/web-url': WebUrlResult;
|
|
108
|
+
}
|
|
109
|
+
/** Host capabilities advertised in the UI. */
|
|
110
|
+
export declare const HOST_CAPABILITIES: readonly ["workspace.list", "session.list", "session.snapshot"];
|
|
111
|
+
/** Informational type for the Settings page. */
|
|
112
|
+
export interface HostSummary extends Pick<HostView, 'id' | 'label' | 'sshTarget' | 'phase'> {
|
|
113
|
+
readonly hostInfo: HostInfo | null;
|
|
114
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side RPC dispatch for the Settings page.
|
|
3
|
+
*
|
|
4
|
+
* @module dsh-remote-local/rpc/handler
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
7
|
+
import type { RemoteHostsService } from '../service.ts';
|
|
8
|
+
import { type RpcEndpoint, type RpcResult, type RpcValues } from './contract.ts';
|
|
9
|
+
/** Register the channel; returns its asynchronous disposer. */
|
|
10
|
+
export declare function registerHostRpc(ctx: Context, service: RemoteHostsService): () => Promise<void>;
|
|
11
|
+
/** Narrow a result for callers that want a compiler-checked endpoint name. */
|
|
12
|
+
export type HostRpcResult<K extends RpcEndpoint> = RpcResult<RpcValues[K]>;
|
package/lib/types/service.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @module dsh-remote-local/service
|
|
10
10
|
*/
|
|
11
11
|
import type { Context } from '@deepseek-ai/cordis';
|
|
12
|
-
import { type AcceptedResult, type ApprovalOutcome, type RemoteApprovalFrame, type CreateSessionRequest, type CreateSessionResult, type CreateWorkspaceRequest, type ListSessionsResult, type PromptDeliveryMode, type RemoteWorkspace, type SessionSnapshot } from '@dsh-remote/protocol';
|
|
12
|
+
import { type AcceptedResult, type ApprovalOutcome, type RemoteApprovalFrame, type RemoteAssistantFrame, type CreateSessionRequest, type CreateSessionResult, type CreateWorkspaceRequest, type ListSessionsResult, type PromptDeliveryMode, type RemoteWorkspace, type SessionSnapshot, type SessionStreamFrame } from '@dsh-remote/protocol';
|
|
13
13
|
import type { ResolvedConfig } from './config.ts';
|
|
14
14
|
import { type AddHostInput, type HostView } from './hosts/types.ts';
|
|
15
15
|
/** Snapshot returned to the Settings page. */
|
|
@@ -55,16 +55,28 @@ export declare class RemoteHostsService {
|
|
|
55
55
|
refresh(id: string): Promise<HostView>;
|
|
56
56
|
/** Force a fresh remote install/restart, then reconnect. */
|
|
57
57
|
provision(id: string): Promise<HostView>;
|
|
58
|
+
/** Restart the remote DSH service and reconnect without reinstalling. */
|
|
59
|
+
restart(id: string): Promise<HostView>;
|
|
58
60
|
/** List remote workspaces. */
|
|
59
61
|
workspaces(id: string): Promise<readonly RemoteWorkspace[]>;
|
|
60
62
|
/** List remote sessions, optionally within one workspace. */
|
|
61
63
|
sessions(id: string, workspaceId?: string): Promise<ListSessionsResult>;
|
|
64
|
+
/** Follow a live remote session from a cursor as an SSE-backed stream. */
|
|
65
|
+
followSessionEvents(id: string, sessionId: string, cursor: number, signal: AbortSignal): AsyncGenerator<SessionStreamFrame>;
|
|
62
66
|
/** Read one session snapshot. */
|
|
63
67
|
snapshot(id: string, sessionId: string, limit?: number): Promise<SessionSnapshot>;
|
|
68
|
+
/** Follow dense remote Assistant frames for one live Session. */
|
|
69
|
+
followAssistantFrames(id: string, sessionId: string, signal: AbortSignal): AsyncGenerator<RemoteAssistantFrame>;
|
|
64
70
|
/** Register a remote workspace. */
|
|
65
71
|
createWorkspace(id: string, request: CreateWorkspaceRequest): Promise<RemoteWorkspace>;
|
|
66
72
|
/** Create a remote session. */
|
|
67
73
|
createSession(id: string, request: CreateSessionRequest): Promise<CreateSessionResult>;
|
|
74
|
+
/** Install a model/reasoning-effort selection on a remote session. */
|
|
75
|
+
selectModel(id: string, sessionId: string, selection: {
|
|
76
|
+
provider: string;
|
|
77
|
+
model: string;
|
|
78
|
+
reasoningEffort?: string;
|
|
79
|
+
}): Promise<void>;
|
|
68
80
|
/** Send a prompt to a remote session. */
|
|
69
81
|
promptSession(id: string, sessionId: string, text: string, mode?: PromptDeliveryMode, selection?: {
|
|
70
82
|
provider: string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/index.tsx"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Context } from '@deepseek-ai/cordis'\nimport { ClientTerminals } from '@deepseek-ai/dsh-api-terminal-controller/client'\n\nexport const inject = ['remote', 'remote.terminal', 'connection']\nconst ROUTE = '/api/dsh-remote-terminal'\n\ninterface Handle extends AsyncIterable<unknown> {\n send(item: unknown): void\n end(): void\n dispose(): void\n}\n\nexport function apply(ctx: Context): void {\n const original = (ctx.remote as any).terminal\n const routed = route(original)\n new ClientTerminals(ctx as any, routed)\n}\n\nfunction route(original: any): any {\n const mirrored = new Map<string, Promise<boolean>>()\n const isMirror = (sessionId: string): Promise<boolean> => {\n let pending = mirrored.get(sessionId)\n if (pending === undefined) {\n pending = post({ action: 'context', sessionId })\n .then(value => (value as { mirrored?: boolean } | undefined)?.mirrored === true)\n .catch(() => false)\n mirrored.set(sessionId, pending)\n }\n return pending\n }\n const unary = (name: string) => async (...args: any[]) => {\n const sessionId = String(args[0])\n if (!await isMirror(sessionId)) return original[name](...args)\n const value = await post({ action: name, sessionId, ...payload(name, args) })\n return value === undefined ? original[name](...args) : { ok: true, value }\n }\n return {\n ...original,\n environment: unary('environment'),\n shells: unary('shells'),\n list: unary('list'),\n create: unary('create'),\n rename: unary('rename'),\n close: unary('close'),\n retain: (sessionId: string, id: string, signal: AbortSignal) => {\n const local = original.retain(sessionId, id, signal)\n return (async function* () {\n if (await isMirror(sessionId)) {\n yield { type: 'retained' }\n return\n }\n yield* local\n })()\n },\n attach: (sessionId: string, id: string, signal: AbortSignal) => new RoutedHandle(original, sessionId, id, signal, isMirror),\n }\n}\n\nfunction payload(name: string, args: any[]): Record<string, unknown> {\n if (name === 'create') {\n const request = args[1] ?? {}\n return { id: request.id, cols: request.cols, rows: request.rows, shellPath: request.shellPath }\n }\n if (name === 'rename') return { id: args[1], title: args[2] }\n if (name === 'close') return { id: args[1] }\n return {}\n}\n\nasync function post(payload: Record<string, unknown>): Promise<any> {\n const response = await fetch(ROUTE, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!response.ok) return undefined\n const body = await response.json() as { ok?: boolean; value?: unknown; mirrored?: boolean }\n if (body.mirrored !== undefined) return body\n return body.ok === true ? body.value : undefined\n}\n\nclass RoutedHandle implements Handle {\n #original: any\n #sessionId: string\n #id: string\n #signal: AbortSignal\n #isMirror: (sessionId: string) => Promise<boolean>\n #handle: Handle | undefined\n #pending: unknown[] = []\n #controller = new AbortController()\n #opening: Promise<Handle> | undefined\n\n constructor(original: any, sessionId: string, id: string, signal: AbortSignal, isMirror: (sessionId: string) => Promise<boolean>) {\n this.#original = original\n this.#sessionId = sessionId\n this.#id = id\n this.#signal = signal\n this.#isMirror = isMirror\n signal.addEventListener('abort', () => this.#controller.abort(), { once: true })\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<unknown> {\n const handle = await this.#open()\n yield* handle\n }\n\n send(item: unknown): void {\n if (this.#handle !== undefined) this.#handle.send(item)\n else this.#pending.push(item)\n }\n\n end(): void { this.#handle?.end() }\n\n dispose(): void {\n this.#controller.abort()\n this.#handle?.dispose()\n }\n\n async #open(): Promise<Handle> {\n if (this.#handle !== undefined) return this.#handle\n this.#opening ??= (async () => {\n const remote = await this.#isMirror(this.#sessionId)\n const handle: Handle = remote\n ? remoteHandle(this.#sessionId, this.#id, this.#controller.signal)\n : this.#original.attach(this.#sessionId, this.#id, this.#signal)\n this.#handle = handle\n for (const item of this.#pending.splice(0)) handle.send(item)\n return handle\n })()\n return this.#opening\n }\n}\n\nfunction remoteHandle(sessionId: string, id: string, signal: AbortSignal): Handle {\n let controller = new AbortController()\n const abort = (): void => controller.abort()\n signal.addEventListener('abort', abort, { once: true })\n return {\n async *[Symbol.asyncIterator]() {\n const response = await fetch(ROUTE, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json', accept: 'text/event-stream' },\n body: JSON.stringify({ action: 'attach', sessionId, id }),\n signal: controller.signal,\n })\n if (!response.ok || response.body === null) throw new Error('remote terminal attach failed')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n try {\n for (;;) {\n const { done, value } = await reader.read()\n buffer += decoder.decode(value, { stream: !done })\n let newline = buffer.indexOf('\\n')\n while (newline >= 0) {\n const line = buffer.slice(0, newline).replace(/\\r$/u, '')\n buffer = buffer.slice(newline + 1)\n if (line.startsWith('data: ')) {\n const parsed = JSON.parse(line.slice(6).trim())\n if (parsed.message !== undefined && parsed.type === undefined) throw new Error(parsed.message)\n yield parsed\n }\n newline = buffer.indexOf('\\n')\n }\n if (done) return\n }\n } finally {\n reader.releaseLock()\n }\n },\n send(item: unknown) {\n const input = item as { type?: string; data?: string; cols?: number; rows?: number; sequence?: number }\n void post(input.type === 'write'\n ? { action: 'input', sessionId, id, data: input.data ?? '', sequence: input.sequence ?? 0 }\n : { action: 'resize', sessionId, id, cols: input.cols ?? 80, rows: input.rows ?? 24, sequence: input.sequence ?? 0 })\n },\n end() {},\n dispose() { controller.abort() },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["payload"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-remote-local-plugin",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "DSH remote-development local plugin: host registry, SSH tunnels, remote workspace/session discovery, an authenticated Connection RPC surface, agent tools, and a Settings page.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
Binary file
|