@lemoncat7/dsh-ssh 0.1.0-alpha.15

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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/cordis.patch.yml +10 -0
  4. package/lib/api.d.ts +23 -0
  5. package/lib/api.d.ts.map +1 -0
  6. package/lib/api.js +571 -0
  7. package/lib/api.js.map +1 -0
  8. package/lib/client-api.d.ts +174 -0
  9. package/lib/client-api.d.ts.map +1 -0
  10. package/lib/client-api.js +88 -0
  11. package/lib/client-api.js.map +1 -0
  12. package/lib/client.d.ts +4 -0
  13. package/lib/client.d.ts.map +1 -0
  14. package/lib/client.js +8067 -0
  15. package/lib/client.js.map +7 -0
  16. package/lib/config.d.ts +14 -0
  17. package/lib/config.d.ts.map +1 -0
  18. package/lib/config.js +31 -0
  19. package/lib/config.js.map +1 -0
  20. package/lib/connector.d.ts +30 -0
  21. package/lib/connector.d.ts.map +1 -0
  22. package/lib/connector.js +216 -0
  23. package/lib/connector.js.map +1 -0
  24. package/lib/credentials.d.ts +25 -0
  25. package/lib/credentials.d.ts.map +1 -0
  26. package/lib/credentials.js +84 -0
  27. package/lib/credentials.js.map +1 -0
  28. package/lib/directory.d.ts +8 -0
  29. package/lib/directory.d.ts.map +1 -0
  30. package/lib/directory.js +45 -0
  31. package/lib/directory.js.map +1 -0
  32. package/lib/domain.d.ts +121 -0
  33. package/lib/domain.d.ts.map +1 -0
  34. package/lib/domain.js +136 -0
  35. package/lib/domain.js.map +1 -0
  36. package/lib/exec.d.ts +15 -0
  37. package/lib/exec.d.ts.map +1 -0
  38. package/lib/exec.js +82 -0
  39. package/lib/exec.js.map +1 -0
  40. package/lib/forwards.d.ts +26 -0
  41. package/lib/forwards.d.ts.map +1 -0
  42. package/lib/forwards.js +213 -0
  43. package/lib/forwards.js.map +1 -0
  44. package/lib/index.d.ts +9 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +53 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/proxy.d.ts +9 -0
  49. package/lib/proxy.d.ts.map +1 -0
  50. package/lib/proxy.js +116 -0
  51. package/lib/proxy.js.map +1 -0
  52. package/lib/sftp-client.d.ts +12 -0
  53. package/lib/sftp-client.d.ts.map +1 -0
  54. package/lib/sftp-client.js +123 -0
  55. package/lib/sftp-client.js.map +1 -0
  56. package/lib/sftp.d.ts +43 -0
  57. package/lib/sftp.d.ts.map +1 -0
  58. package/lib/sftp.js +251 -0
  59. package/lib/sftp.js.map +1 -0
  60. package/lib/sidebar-anchor.d.ts +8 -0
  61. package/lib/sidebar-anchor.d.ts.map +1 -0
  62. package/lib/sidebar-anchor.js +50 -0
  63. package/lib/sidebar-anchor.js.map +1 -0
  64. package/lib/store.d.ts +20 -0
  65. package/lib/store.d.ts.map +1 -0
  66. package/lib/store.js +154 -0
  67. package/lib/store.js.map +1 -0
  68. package/lib/terminal.d.ts +108 -0
  69. package/lib/terminal.d.ts.map +1 -0
  70. package/lib/terminal.js +384 -0
  71. package/lib/terminal.js.map +1 -0
  72. package/lib/tools.d.ts +7 -0
  73. package/lib/tools.d.ts.map +1 -0
  74. package/lib/tools.js +237 -0
  75. package/lib/tools.js.map +1 -0
  76. package/package.json +107 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-anchor.d.ts","sourceRoot":"","sources":["../src/sidebar-anchor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAuCvE"}
@@ -0,0 +1,50 @@
1
+ import { useEffect } from 'react';
2
+ /**
3
+ * Place the plugin's official footer-slot contribution above Workspace without
4
+ * replacing the single `sidebar.workspaces` slot. If the current sidebar shell
5
+ * cannot be identified, the entry remains in the supported footer slot.
6
+ */
7
+ export function useWorkspaceTopAnchor(ref) {
8
+ useEffect(() => {
9
+ const element = ref.current;
10
+ const originalParent = element?.parentElement;
11
+ if (element === null || element === undefined || originalParent === null || originalParent === undefined)
12
+ return;
13
+ const parent = originalParent;
14
+ let moved = false;
15
+ let observer;
16
+ const place = () => {
17
+ // List-slot entries may be wrapped by the slot renderer. Walk out from
18
+ // the entry until the preceding sibling is the flexible Workspace
19
+ // region, instead of assuming the entry is a direct footer child.
20
+ let ancestor = element.parentElement;
21
+ while (ancestor !== null && ancestor !== document.body) {
22
+ const candidate = ancestor.previousElementSibling;
23
+ if (candidate instanceof HTMLElement) {
24
+ const style = getComputedStyle(candidate);
25
+ const flexGrow = Number.parseFloat(style.flexGrow);
26
+ if (style.display === 'flex' && style.flexDirection === 'column' && flexGrow > 0) {
27
+ candidate.insertBefore(element, candidate.firstChild);
28
+ element.dataset.dshSshAnchored = 'true';
29
+ moved = true;
30
+ return true;
31
+ }
32
+ }
33
+ ancestor = ancestor.parentElement;
34
+ }
35
+ return false;
36
+ };
37
+ if (!place()) {
38
+ observer = new MutationObserver(() => { if (place())
39
+ observer?.disconnect(); });
40
+ observer.observe(document.body, { childList: true, subtree: true });
41
+ }
42
+ return () => {
43
+ observer?.disconnect();
44
+ delete element.dataset.dshSshAnchored;
45
+ if (moved && parent.isConnected)
46
+ parent.append(element);
47
+ };
48
+ }, [ref]);
49
+ }
50
+ //# sourceMappingURL=sidebar-anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-anchor.js","sourceRoot":"","sources":["../src/sidebar-anchor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AAEjD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAA2B;IAC/D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;QAC3B,MAAM,cAAc,GAAG,OAAO,EAAE,aAAa,CAAA;QAC7C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,SAAS;YAAE,OAAM;QAChH,MAAM,MAAM,GAAG,cAAc,CAAA;QAC7B,IAAI,KAAK,GAAG,KAAK,CAAA;QACjB,IAAI,QAAsC,CAAA;QAC1C,MAAM,KAAK,GAAG,GAAY,EAAE;YAC1B,uEAAuE;YACvE,kEAAkE;YAClE,kEAAkE;YAClE,IAAI,QAAQ,GAAuB,OAAO,CAAC,aAAa,CAAA;YACxD,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,sBAAsB,CAAA;gBACjD,IAAI,SAAS,YAAY,WAAW,EAAE,CAAC;oBACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;oBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;oBAClD,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;wBACjF,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;wBACrD,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG,MAAM,CAAA;wBACvC,KAAK,GAAG,IAAI,CAAA;wBACZ,OAAO,IAAI,CAAA;oBACb,CAAC;gBACH,CAAC;gBACD,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAA;YACnC,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAA;QACD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACb,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,EAAE;gBAAE,QAAQ,EAAE,UAAU,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;YAC9E,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,CAAC;QACD,OAAO,GAAG,EAAE;YACV,QAAQ,EAAE,UAAU,EAAE,CAAA;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAA;YACrC,IAAI,KAAK,IAAI,MAAM,CAAC,WAAW;gBAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzD,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AACX,CAAC"}
package/lib/store.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import type { CredentialEntry, ForwardRule, SessionInjection, SshProfile, SshSettings, SshState } from './domain.js';
2
+ export declare class SshStore {
3
+ private readonly path;
4
+ private state;
5
+ private queue;
6
+ private constructor();
7
+ static open(path: string, defaults: SshSettings): Promise<SshStore>;
8
+ snapshot(): SshState;
9
+ profiles(): SshProfile[];
10
+ profile(id: string): SshProfile | undefined;
11
+ credentialEntries(): CredentialEntry[];
12
+ credentialEntry(id: string): CredentialEntry | undefined;
13
+ forwards(): ForwardRule[];
14
+ forward(id: string): ForwardRule | undefined;
15
+ injection(sessionId: string): SessionInjection | undefined;
16
+ settings(): SshSettings;
17
+ update(mutator: (draft: SshState) => void): Promise<SshState>;
18
+ private persist;
19
+ }
20
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEpH,qBAAa,QAAQ;IAIC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHzC,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,KAAK,CAAsC;IAEnD,OAAO;WAIM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAczE,QAAQ,IAAI,QAAQ;IACpB,QAAQ,IAAI,UAAU,EAAE;IACxB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAC3C,iBAAiB,IAAI,eAAe,EAAE;IACtC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IACxD,QAAQ,IAAI,WAAW,EAAE;IACzB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAC5C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAC1D,QAAQ,IAAI,WAAW;IAEvB,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;YAa/C,OAAO;CAwBtB"}
package/lib/store.js ADDED
@@ -0,0 +1,154 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { mkdir, open, readFile, rename, rm } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ export class SshStore {
5
+ path;
6
+ state;
7
+ queue = Promise.resolve();
8
+ constructor(path, initial) {
9
+ this.path = path;
10
+ this.state = initial;
11
+ }
12
+ static async open(path, defaults) {
13
+ await mkdir(dirname(path), { recursive: true });
14
+ let initial = { schemaVersion: 1, profiles: [], credentialEntries: [], forwardRules: [], injections: [], settings: defaults };
15
+ try {
16
+ const parsed = JSON.parse(await readFile(path, 'utf8'));
17
+ initial = parseState(parsed, defaults);
18
+ }
19
+ catch (error) {
20
+ if (error.code !== 'ENOENT')
21
+ throw error;
22
+ }
23
+ const store = new SshStore(path, initial);
24
+ if (!(await fileExists(path)))
25
+ await store.persist(initial);
26
+ return store;
27
+ }
28
+ snapshot() { return structuredClone(this.state); }
29
+ profiles() { return structuredClone(this.state.profiles); }
30
+ profile(id) { return structuredClone(this.state.profiles.find(profile => profile.id === id)); }
31
+ credentialEntries() { return structuredClone(this.state.credentialEntries); }
32
+ credentialEntry(id) { return structuredClone(this.state.credentialEntries.find(entry => entry.id === id)); }
33
+ forwards() { return structuredClone(this.state.forwardRules); }
34
+ forward(id) { return structuredClone(this.state.forwardRules.find(rule => rule.id === id)); }
35
+ injection(sessionId) { return structuredClone(this.state.injections.find(item => item.sessionId === sessionId)); }
36
+ settings() { return structuredClone(this.state.settings); }
37
+ update(mutator) {
38
+ const operation = this.queue.then(async () => {
39
+ const draft = structuredClone(this.state);
40
+ mutator(draft);
41
+ validateReferences(draft);
42
+ await this.persist(draft);
43
+ this.state = draft;
44
+ return this.snapshot();
45
+ });
46
+ this.queue = operation.catch(() => { });
47
+ return operation;
48
+ }
49
+ async persist(state) {
50
+ const directory = dirname(this.path);
51
+ const temporary = `${this.path}.${process.pid}.${randomBytes(5).toString('hex')}.tmp`;
52
+ const handle = await open(temporary, 'w', 0o600);
53
+ try {
54
+ await handle.writeFile(`${JSON.stringify(state, null, 2)}\n`, 'utf8');
55
+ await handle.sync();
56
+ }
57
+ finally {
58
+ await handle.close();
59
+ }
60
+ try {
61
+ await rename(temporary, this.path);
62
+ }
63
+ catch (error) {
64
+ if (process.platform !== 'win32')
65
+ throw error;
66
+ await rm(this.path, { force: true });
67
+ await rename(temporary, this.path);
68
+ }
69
+ finally {
70
+ await rm(temporary, { force: true }).catch(() => { });
71
+ }
72
+ if (process.platform !== 'win32') {
73
+ const directoryHandle = await open(directory, 'r');
74
+ try {
75
+ await directoryHandle.sync();
76
+ }
77
+ finally {
78
+ await directoryHandle.close();
79
+ }
80
+ }
81
+ }
82
+ }
83
+ function parseState(value, defaults) {
84
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
85
+ throw new Error('dsh-ssh state must be an object');
86
+ const state = value;
87
+ if (state.schemaVersion !== 1)
88
+ throw new Error(`unsupported dsh-ssh state version ${String(state.schemaVersion)}`);
89
+ return {
90
+ schemaVersion: 1,
91
+ profiles: Array.isArray(state.profiles) ? state.profiles.map(normalizeStoredProfile) : [],
92
+ credentialEntries: Array.isArray(state.credentialEntries) ? state.credentialEntries : [],
93
+ forwardRules: Array.isArray(state.forwardRules) ? state.forwardRules : [],
94
+ injections: Array.isArray(state.injections) ? state.injections.map(injection => ({
95
+ ...injection,
96
+ workingDirectories: normalizeWorkingDirectories(injection),
97
+ })) : [],
98
+ settings: typeof state.settings === 'object' && state.settings !== null ? { ...defaults, ...state.settings } : defaults,
99
+ };
100
+ }
101
+ function validateReferences(state) {
102
+ const ids = new Set(state.profiles.map(profile => profile.id));
103
+ const credentialIds = new Set(state.credentialEntries.map(entry => entry.id));
104
+ if (ids.size !== state.profiles.length)
105
+ throw new Error('duplicate SSH profile id');
106
+ if (credentialIds.size !== state.credentialEntries.length)
107
+ throw new Error('duplicate SSH credential entry id');
108
+ for (const profile of state.profiles) {
109
+ if (profile.credentialId !== undefined && !credentialIds.has(profile.credentialId))
110
+ throw Object.assign(new Error('SSH profile references a missing credential entry'), { status: 400 });
111
+ if (profile.proxy.type === 'jump' && (profile.proxy.profileIds.length === 0 || profile.proxy.profileIds.some(id => !ids.has(id) || id === profile.id) || new Set(profile.proxy.profileIds).size !== profile.proxy.profileIds.length)) {
112
+ throw Object.assign(new Error('jump proxy chain must reference unique existing profiles other than itself'), { status: 400 });
113
+ }
114
+ }
115
+ for (const rule of state.forwardRules)
116
+ if (!ids.has(rule.profileId))
117
+ throw new Error(`forward rule references missing profile ${rule.profileId}`);
118
+ for (const injection of state.injections) {
119
+ injection.profileIds = [...new Set(injection.profileIds.filter(id => ids.has(id)))];
120
+ injection.workingDirectories = Object.fromEntries(Object.entries(injection.workingDirectories).filter(([profileId]) => injection.profileIds.includes(profileId)));
121
+ }
122
+ }
123
+ function normalizeStoredProfile(profile) {
124
+ const proxy = profile.proxy;
125
+ if (proxy.type !== 'jump')
126
+ return profile;
127
+ const profileIds = Array.isArray(proxy.profileIds)
128
+ ? proxy.profileIds.filter((id) => typeof id === 'string' && id.length > 0)
129
+ : typeof proxy.profileId === 'string' && proxy.profileId.length > 0 ? [proxy.profileId] : [];
130
+ return { ...profile, proxy: { type: 'jump', profileIds: [...new Set(profileIds)] } };
131
+ }
132
+ function normalizeWorkingDirectories(injection) {
133
+ if (typeof injection !== 'object' || injection === null)
134
+ return {};
135
+ const value = injection.workingDirectories;
136
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
137
+ return {};
138
+ return Object.fromEntries(Object.entries(value).filter((entry) => {
139
+ const [profileId, cwd] = entry;
140
+ return profileId.length > 0 && profileId.length <= 100 && typeof cwd === 'string' && cwd.trim().length > 0 && cwd.length <= 4096 && !/[\0\r\n]/.test(cwd);
141
+ }).map(([profileId, cwd]) => [profileId, cwd.trim()]));
142
+ }
143
+ async function fileExists(path) {
144
+ try {
145
+ await readFile(path);
146
+ return true;
147
+ }
148
+ catch (error) {
149
+ if (error.code === 'ENOENT')
150
+ return false;
151
+ throw error;
152
+ }
153
+ }
154
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import type { ClientChannel } from 'ssh2';
2
+ import type { TerminalBackend, TerminalBackendSession, TerminalBackendSpawnSpec, TerminalReadRequest, TerminalReadResult, TerminalSendOperation, TerminalSendRequest, TerminalSendResult, TerminalSessionStatus, TerminalSignal, TerminalSignalResult } from '@deepseek-ai/dsh-terminal';
3
+ import { SshConnector, type ManagedSshConnection } from './connector.js';
4
+ import { SshStore } from './store.js';
5
+ export declare class SshTerminalBackend implements TerminalBackend {
6
+ private readonly connector;
7
+ private readonly store;
8
+ readonly type = "ssh";
9
+ constructor(connector: SshConnector, store: SshStore);
10
+ spawn(spec: TerminalBackendSpawnSpec): Promise<TerminalBackendSession>;
11
+ }
12
+ export declare class SshTerminalSession implements TerminalBackendSession {
13
+ private readonly connection;
14
+ readonly channel: ClientChannel;
15
+ readonly motd: string;
16
+ private scrollback;
17
+ private terminalStatus;
18
+ private active;
19
+ private closing?;
20
+ constructor(connection: ManagedSshConnection, channel: ClientChannel, motd: string);
21
+ startSend(request: TerminalSendRequest): TerminalSendOperation;
22
+ read(request: TerminalReadRequest): TerminalReadResult;
23
+ write(text: string): void;
24
+ resize(cols: number, rows: number): void;
25
+ signal(signal: TerminalSignal): Promise<TerminalSignalResult>;
26
+ status(): TerminalSessionStatus;
27
+ close(_reason: string): Promise<void>;
28
+ receive(text: string): void;
29
+ snapshotStatus(): TerminalSessionStatus;
30
+ }
31
+ export declare class BrowserTerminalManager {
32
+ private readonly connector;
33
+ private readonly sessions;
34
+ constructor(connector: SshConnector);
35
+ create(profileId: string, cols: number, rows: number, signal?: AbortSignal): Promise<{
36
+ id: string;
37
+ profileId: string;
38
+ }>;
39
+ get(id: string): BrowserTerminal;
40
+ closeAll(): Promise<void>;
41
+ }
42
+ /** Owner-scoped AI terminals for Web profiles, whose official Terminal service lives inside each Agent preset realm. */
43
+ export declare class AiTerminalManager {
44
+ private readonly connector;
45
+ private readonly sessions;
46
+ constructor(connector: SshConnector);
47
+ create(ownerId: string, profileId: string, cwd: string, name?: string, signal?: AbortSignal): Promise<{
48
+ terminalId: string;
49
+ profileId: string;
50
+ cwd: string;
51
+ motd: string;
52
+ }>;
53
+ get(ownerId: string, terminalId: string): SshTerminalSession;
54
+ list(ownerId: string): Array<{
55
+ terminalId: string;
56
+ status: TerminalSessionStatus;
57
+ }>;
58
+ send(ownerId: string, terminalId: string, request: TerminalSendRequest): Promise<TerminalSendResult>;
59
+ write(ownerId: string, terminalId: string, text: string): void;
60
+ resize(ownerId: string, terminalId: string, cols: number, rows: number): void;
61
+ activity(ownerId: string): AiTerminalActivity[];
62
+ close(ownerId: string, terminalId: string): Promise<boolean>;
63
+ closeAll(): Promise<void>;
64
+ }
65
+ export interface AiTerminalCommand {
66
+ id: string;
67
+ command: string;
68
+ submitted: boolean;
69
+ startedAt: number;
70
+ completedAt: number;
71
+ output: string;
72
+ waitReason: TerminalSendResult['waitReason'];
73
+ truncated: boolean;
74
+ }
75
+ export interface AiTerminalActivity {
76
+ terminalId: string;
77
+ profileId: string;
78
+ name: string;
79
+ cwd: string;
80
+ createdAt: number;
81
+ status: TerminalSessionStatus;
82
+ scrollback: string;
83
+ commands: AiTerminalCommand[];
84
+ }
85
+ export declare class BrowserTerminal {
86
+ readonly id: string;
87
+ readonly profileId: string;
88
+ private readonly connection;
89
+ private readonly channel;
90
+ private readonly onClose;
91
+ private output;
92
+ private baseCursor;
93
+ private closed;
94
+ private idleTimer;
95
+ constructor(id: string, profileId: string, connection: ManagedSshConnection, channel: ClientChannel, onClose: () => void);
96
+ write(text: string): void;
97
+ resize(cols: number, rows: number): void;
98
+ read(cursor: number): {
99
+ data: string;
100
+ cursor: number;
101
+ truncated: boolean;
102
+ closed: boolean;
103
+ };
104
+ close(): Promise<void>;
105
+ private append;
106
+ private touch;
107
+ }
108
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}