@lemoncat7/dsh-ssh 1.2.0 → 1.3.0

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 (90) hide show
  1. package/ARCHITECTURE.md +18 -3
  2. package/README.md +16 -3
  3. package/lib/api.d.ts +8 -0
  4. package/lib/api.d.ts.map +1 -1
  5. package/lib/api.js +218 -13
  6. package/lib/api.js.map +1 -1
  7. package/lib/client-api.d.ts +66 -0
  8. package/lib/client-api.d.ts.map +1 -1
  9. package/lib/client-api.js +14 -0
  10. package/lib/client-api.js.map +1 -1
  11. package/lib/client.d.ts.map +1 -1
  12. package/lib/client.js +467 -97
  13. package/lib/client.js.map +4 -4
  14. package/lib/connector.js +2 -2
  15. package/lib/connector.js.map +1 -1
  16. package/lib/credentials.d.ts +9 -0
  17. package/lib/credentials.d.ts.map +1 -1
  18. package/lib/credentials.js +16 -0
  19. package/lib/credentials.js.map +1 -1
  20. package/lib/domain.d.ts +42 -1
  21. package/lib/domain.d.ts.map +1 -1
  22. package/lib/domain.js +32 -0
  23. package/lib/domain.js.map +1 -1
  24. package/lib/endpoint-session-manager.d.ts +16 -0
  25. package/lib/endpoint-session-manager.d.ts.map +1 -0
  26. package/lib/endpoint-session-manager.js +70 -0
  27. package/lib/endpoint-session-manager.js.map +1 -0
  28. package/lib/file-transfer-manager.d.ts +50 -0
  29. package/lib/file-transfer-manager.d.ts.map +1 -0
  30. package/lib/file-transfer-manager.js +257 -0
  31. package/lib/file-transfer-manager.js.map +1 -0
  32. package/lib/file-transfer-tools.d.ts +6 -0
  33. package/lib/file-transfer-tools.d.ts.map +1 -0
  34. package/lib/file-transfer-tools.js +143 -0
  35. package/lib/file-transfer-tools.js.map +1 -0
  36. package/lib/file-transfer-workspace.d.ts +10 -0
  37. package/lib/file-transfer-workspace.d.ts.map +1 -0
  38. package/lib/file-transfer-workspace.js +299 -0
  39. package/lib/file-transfer-workspace.js.map +1 -0
  40. package/lib/ftp-adapter.d.ts +18 -0
  41. package/lib/ftp-adapter.d.ts.map +1 -0
  42. package/lib/ftp-adapter.js +240 -0
  43. package/lib/ftp-adapter.js.map +1 -0
  44. package/lib/ftp-profile-editor.d.ts +9 -0
  45. package/lib/ftp-profile-editor.d.ts.map +1 -0
  46. package/lib/ftp-profile-editor.js +89 -0
  47. package/lib/ftp-profile-editor.js.map +1 -0
  48. package/lib/index.d.ts.map +1 -1
  49. package/lib/index.js +17 -2
  50. package/lib/index.js.map +1 -1
  51. package/lib/network-dialer.d.ts +12 -0
  52. package/lib/network-dialer.d.ts.map +1 -0
  53. package/lib/network-dialer.js +27 -0
  54. package/lib/network-dialer.js.map +1 -0
  55. package/lib/proxy.d.ts +3 -3
  56. package/lib/proxy.d.ts.map +1 -1
  57. package/lib/proxy.js +11 -7
  58. package/lib/proxy.js.map +1 -1
  59. package/lib/remote-file-systems.d.ts +9 -0
  60. package/lib/remote-file-systems.d.ts.map +1 -0
  61. package/lib/remote-file-systems.js +23 -0
  62. package/lib/remote-file-systems.js.map +1 -0
  63. package/lib/remote-files.d.ts +51 -0
  64. package/lib/remote-files.d.ts.map +1 -0
  65. package/lib/remote-files.js +36 -0
  66. package/lib/remote-files.js.map +1 -0
  67. package/lib/remote-workspace-tree.d.ts.map +1 -1
  68. package/lib/remote-workspace-tree.js +5 -15
  69. package/lib/remote-workspace-tree.js.map +1 -1
  70. package/lib/session-access.d.ts +3 -0
  71. package/lib/session-access.d.ts.map +1 -1
  72. package/lib/session-access.js +4 -1
  73. package/lib/session-access.js.map +1 -1
  74. package/lib/sftp-adapter.d.ts +13 -0
  75. package/lib/sftp-adapter.d.ts.map +1 -0
  76. package/lib/sftp-adapter.js +28 -0
  77. package/lib/sftp-adapter.js.map +1 -0
  78. package/lib/sftp.d.ts +7 -0
  79. package/lib/sftp.d.ts.map +1 -1
  80. package/lib/sftp.js +215 -6
  81. package/lib/sftp.js.map +1 -1
  82. package/lib/store.d.ts +3 -1
  83. package/lib/store.d.ts.map +1 -1
  84. package/lib/store.js +51 -3
  85. package/lib/store.js.map +1 -1
  86. package/lib/tools.d.ts +3 -1
  87. package/lib/tools.d.ts.map +1 -1
  88. package/lib/tools.js +4 -1
  89. package/lib/tools.js.map +1 -1
  90. package/package.json +7 -2
@@ -0,0 +1,257 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { Transform } from 'node:stream';
3
+ import { remoteJoin, remoteName } from './remote-files.js';
4
+ export class FileTransferManager {
5
+ files;
6
+ concurrency;
7
+ historyLimit;
8
+ jobs = new Map();
9
+ queue = [];
10
+ listeners = new Set();
11
+ active = new Set();
12
+ running = 0;
13
+ closed = false;
14
+ constructor(files, concurrency = 2, historyLimit = 250) {
15
+ this.files = files;
16
+ this.concurrency = concurrency;
17
+ this.historyLimit = historyLimit;
18
+ }
19
+ start(ownerId, request) {
20
+ if (this.closed)
21
+ throw Object.assign(new Error('file transfer service is closed'), { status: 503 });
22
+ validateRequest(request);
23
+ this.pruneHistory();
24
+ const id = `transfer-${Date.now().toString(36)}-${randomBytes(4).toString('hex')}`;
25
+ const view = {
26
+ id, ownerId, request: structuredClone(request), state: 'queued', totalFiles: 0, completedFiles: 0,
27
+ skippedFiles: 0, totalBytes: 0, transferredBytes: 0, createdAt: Date.now(),
28
+ };
29
+ this.jobs.set(id, { view, controller: new AbortController() });
30
+ this.queue.push(id);
31
+ this.emit(view);
32
+ this.drain();
33
+ return structuredClone(view);
34
+ }
35
+ list(ownerId) {
36
+ return [...this.jobs.values()].map(job => job.view).filter(job => ownerId === undefined || job.ownerId === ownerId)
37
+ .sort((left, right) => right.createdAt - left.createdAt).map(job => structuredClone(job));
38
+ }
39
+ get(id, ownerId) {
40
+ const job = this.jobs.get(id)?.view;
41
+ if (job === undefined || ownerId !== undefined && job.ownerId !== ownerId)
42
+ throw Object.assign(new Error('transfer job was not found'), { status: 404 });
43
+ return structuredClone(job);
44
+ }
45
+ cancel(id, ownerId) {
46
+ const managed = this.jobs.get(id);
47
+ if (managed === undefined || ownerId !== undefined && managed.view.ownerId !== ownerId)
48
+ throw Object.assign(new Error('transfer job was not found'), { status: 404 });
49
+ if (isTerminal(managed.view.state))
50
+ return false;
51
+ managed.controller.abort(new Error('transfer was cancelled'));
52
+ if (managed.view.state === 'queued') {
53
+ managed.view.state = 'cancelled';
54
+ managed.view.completedAt = Date.now();
55
+ this.queue.splice(this.queue.indexOf(id), 1);
56
+ this.emit(managed.view);
57
+ }
58
+ return true;
59
+ }
60
+ subscribe(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
61
+ async closeAll() {
62
+ this.closed = true;
63
+ for (const id of this.queue.splice(0)) {
64
+ const job = this.jobs.get(id);
65
+ if (job === undefined || job.view.state !== 'queued')
66
+ continue;
67
+ job.controller.abort(new Error('file transfer service is stopping'));
68
+ job.view.state = 'cancelled';
69
+ job.view.error = '传输服务已停止';
70
+ job.view.completedAt = Date.now();
71
+ this.emit(job.view);
72
+ }
73
+ for (const job of this.jobs.values())
74
+ if (!isTerminal(job.view.state))
75
+ job.controller.abort(new Error('file transfer service is stopping'));
76
+ await Promise.allSettled([...this.active]);
77
+ }
78
+ drain() {
79
+ while (!this.closed && this.running < this.concurrency) {
80
+ const id = this.queue.shift();
81
+ if (id === undefined)
82
+ break;
83
+ const job = this.jobs.get(id);
84
+ if (job === undefined || job.view.state !== 'queued')
85
+ continue;
86
+ this.running += 1;
87
+ const operation = this.run(job).finally(() => { this.running -= 1; this.drain(); });
88
+ this.active.add(operation);
89
+ void operation.finally(() => this.active.delete(operation));
90
+ }
91
+ }
92
+ async run(job) {
93
+ const signal = job.controller.signal;
94
+ let source;
95
+ let destination;
96
+ try {
97
+ job.view.state = 'scanning';
98
+ job.view.startedAt = Date.now();
99
+ this.emit(job.view);
100
+ [source, destination] = await Promise.all([
101
+ this.files.connect(job.view.request.sourceEndpointId, signal),
102
+ this.files.connect(job.view.request.destinationEndpointId, signal),
103
+ ]);
104
+ const tasks = await this.scan(source, job.view.request.sourcePaths, job.view.request.destinationDirectory, signal);
105
+ job.view.totalFiles = tasks.filter(task => task.kind === 'file').length;
106
+ job.view.totalBytes = tasks.reduce((sum, task) => sum + (task.kind === 'file' ? task.size : 0), 0);
107
+ job.view.state = 'transferring';
108
+ this.emit(job.view);
109
+ for (const task of tasks) {
110
+ signal.throwIfAborted();
111
+ job.view.currentPath = task.sourcePath;
112
+ this.emit(job.view);
113
+ if (task.kind === 'directory') {
114
+ await destination.ensureDirectory(task.destinationPath, signal);
115
+ continue;
116
+ }
117
+ const target = await resolveConflict(destination, task.destinationPath, job.view.request.conflictPolicy, signal);
118
+ if (target === undefined) {
119
+ job.view.skippedFiles += 1;
120
+ this.emit(job.view);
121
+ continue;
122
+ }
123
+ await destination.ensureDirectory(parentPath(target), signal);
124
+ await transferFile(source, destination, task.sourcePath, target, job, signal);
125
+ job.view.completedFiles += 1;
126
+ this.emit(job.view);
127
+ }
128
+ delete job.view.currentPath;
129
+ job.view.state = 'completed';
130
+ job.view.completedAt = Date.now();
131
+ this.emit(job.view);
132
+ }
133
+ catch (error) {
134
+ delete job.view.currentPath;
135
+ job.view.state = signal.aborted ? 'cancelled' : 'failed';
136
+ job.view.error = signal.aborted ? '传输已取消' : errorMessage(error);
137
+ job.view.completedAt = Date.now();
138
+ this.emit(job.view);
139
+ }
140
+ finally {
141
+ source?.close();
142
+ destination?.close();
143
+ }
144
+ }
145
+ async scan(source, sourcePaths, destinationDirectory, signal) {
146
+ const tasks = [];
147
+ const visit = async (sourcePath, destinationPath, depth, knownEntry) => {
148
+ signal.throwIfAborted();
149
+ if (depth > 64 || tasks.length >= 20_000)
150
+ throw new Error('directory transfer exceeds the safety limit');
151
+ const entry = knownEntry ?? await source.stat(sourcePath, signal);
152
+ if (entry.kind !== 'directory') {
153
+ tasks.push({ sourcePath: entry.path, destinationPath, kind: 'file', size: entry.size });
154
+ return;
155
+ }
156
+ tasks.push({ sourcePath: entry.path, destinationPath, kind: 'directory', size: 0 });
157
+ for (const child of (await source.list(entry.path, signal)).entries) {
158
+ if (child.kind === 'symlink' || child.kind === 'other')
159
+ continue;
160
+ await visit(child.path, remoteJoin(destinationPath, child.name), depth + 1, child);
161
+ }
162
+ };
163
+ for (const sourcePath of sourcePaths)
164
+ await visit(sourcePath, remoteJoin(destinationDirectory, remoteName(sourcePath)), 0);
165
+ return tasks;
166
+ }
167
+ emit(view) { for (const listener of this.listeners)
168
+ listener(structuredClone(view)); }
169
+ pruneHistory() {
170
+ const terminal = [...this.jobs.values()].filter(job => isTerminal(job.view.state)).sort((left, right) => right.view.createdAt - left.view.createdAt);
171
+ for (const job of terminal.slice(this.historyLimit))
172
+ this.jobs.delete(job.view.id);
173
+ }
174
+ }
175
+ async function transferFile(source, destination, sourcePath, destinationPath, job, signal) {
176
+ const meter = new Transform({
177
+ highWaterMark: 1024 * 1024,
178
+ transform(chunk, _encoding, callback) {
179
+ job.view.transferredBytes += chunk.length;
180
+ callback(null, chunk);
181
+ },
182
+ });
183
+ meter.on('error', () => { });
184
+ const abort = () => { meter.destroy(signal.reason instanceof Error ? signal.reason : new Error('transfer was aborted')); };
185
+ signal.addEventListener('abort', abort, { once: true });
186
+ try {
187
+ const sourceTask = source.download(sourcePath, meter, signal).catch(error => {
188
+ const contextual = transferEndpointError('read', sourcePath, error);
189
+ meter.destroy(contextual);
190
+ throw contextual;
191
+ });
192
+ const destinationTask = destination.upload(destinationPath, meter, true, signal).catch(error => {
193
+ const contextual = transferEndpointError('write', destinationPath, error);
194
+ meter.destroy(contextual);
195
+ throw contextual;
196
+ });
197
+ const results = await Promise.allSettled([sourceTask, destinationTask]);
198
+ const failed = results.find((result) => result.status === 'rejected');
199
+ if (failed !== undefined)
200
+ throw failed.reason;
201
+ }
202
+ finally {
203
+ signal.removeEventListener('abort', abort);
204
+ }
205
+ }
206
+ function transferEndpointError(operation, value, cause) {
207
+ const message = cause instanceof Error ? cause.message : String(cause);
208
+ return new Error(`could not ${operation} remote path ${value}: ${message}`, { cause });
209
+ }
210
+ async function resolveConflict(destination, value, policy, signal) {
211
+ const exists = await pathExists(destination, value, signal);
212
+ if (!exists)
213
+ return value;
214
+ if (policy === 'skip')
215
+ return undefined;
216
+ if (policy === 'overwrite')
217
+ return value;
218
+ if (policy === 'fail')
219
+ throw Object.assign(new Error(`destination already contains ${value}`), { status: 409 });
220
+ const name = remoteName(value);
221
+ const directory = parentPath(value);
222
+ const dot = name.lastIndexOf('.');
223
+ const base = dot > 0 ? name.slice(0, dot) : name;
224
+ const extension = dot > 0 ? name.slice(dot) : '';
225
+ for (let index = 1; index <= 999; index += 1) {
226
+ const candidate = remoteJoin(directory, `${base} (${index})${extension}`);
227
+ if (!await pathExists(destination, candidate, signal))
228
+ return candidate;
229
+ }
230
+ throw new Error(`could not choose a unique name for ${value}`);
231
+ }
232
+ async function pathExists(session, value, signal) {
233
+ try {
234
+ await session.stat(value, signal);
235
+ return true;
236
+ }
237
+ catch (error) {
238
+ if (error.status === 404)
239
+ return false;
240
+ throw error;
241
+ }
242
+ }
243
+ function parentPath(value) { return value.replaceAll('\\', '/').replace(/\/[^/]*$/, '') || '/'; }
244
+ function isTerminal(state) { return state === 'completed' || state === 'failed' || state === 'cancelled'; }
245
+ function errorMessage(error) { return error instanceof Error ? error.message : String(error); }
246
+ function validateRequest(value) {
247
+ if (!/^(?:sftp|ftp):[^:\s]{1,100}$/.test(value.sourceEndpointId) || !/^(?:sftp|ftp):[^:\s]{1,100}$/.test(value.destinationEndpointId))
248
+ throw Object.assign(new Error('invalid file endpoint'), { status: 400 });
249
+ if (!Array.isArray(value.sourcePaths) || value.sourcePaths.length < 1 || value.sourcePaths.length > 100)
250
+ throw Object.assign(new Error('sourcePaths must contain 1-100 paths'), { status: 400 });
251
+ for (const path of [...value.sourcePaths, value.destinationDirectory])
252
+ if (typeof path !== 'string' || path.length < 1 || path.length > 4096 || /[\0\r\n]/.test(path))
253
+ throw Object.assign(new Error('invalid remote path'), { status: 400 });
254
+ if (!['fail', 'skip', 'overwrite', 'rename'].includes(value.conflictPolicy))
255
+ throw Object.assign(new Error('invalid conflict policy'), { status: 400 });
256
+ }
257
+ //# sourceMappingURL=file-transfer-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-transfer-manager.js","sourceRoot":"","sources":["../src/file-transfer-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import { FileTransferManager } from './file-transfer-manager.js';
3
+ import { RemoteFileSystems } from './remote-file-systems.js';
4
+ import { SshStore } from './store.js';
5
+ export declare function registerFileTransferTools(ctx: Context, store: SshStore, files: RemoteFileSystems, transfers: FileTransferManager): () => void;
6
+ //# sourceMappingURL=file-transfer-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-transfer-tools.d.ts","sourceRoot":"","sources":["../src/file-transfer-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAMrC,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAW7I"}
@@ -0,0 +1,143 @@
1
+ const FILE_TOOL_NAMES = new Set(['file_endpoint_list', 'file_directory_list', 'file_transfer_start', 'file_transfer_status', 'file_transfer_cancel']);
2
+ const TRANSFER_TOOL_NAMES = new Set(['file_transfer_start', 'file_transfer_cancel']);
3
+ const output = { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: String(value) }] };
4
+ export function registerFileTransferTools(ctx, store, files, transfers) {
5
+ const definitions = [endpointListTool(store, files), directoryListTool(store, files), transferStartTool(store, transfers), transferStatusTool(store, transfers), transferCancelTool(store, transfers)];
6
+ const disposers = definitions.map(definition => ctx.tools.register(definition));
7
+ const disposeApproval = ctx.on('tools/pre-execute', async (exec, next) => {
8
+ if (exec.name !== 'file_transfer_start')
9
+ return next();
10
+ const injection = exec.agent === undefined ? undefined : store.injection(exec.agent.session.id);
11
+ if (injection?.requireFileApproval !== true)
12
+ return next();
13
+ return { kind: 'ask', reason: 'The conversation requested a remote file transfer between authorized endpoints.' };
14
+ });
15
+ const disposeVisibility = installVisibility(ctx, store);
16
+ return () => { disposeVisibility(); disposeApproval(); for (const dispose of disposers.reverse())
17
+ dispose(); };
18
+ }
19
+ function endpointListTool(store, files) {
20
+ return tool('file_endpoint_list', 'List remote file endpoints explicitly authorized for this DSH conversation. Credentials and unauthorized endpoints are never returned.', {}, async (_raw, exec) => {
21
+ const injection = requireFileInjection(store, exec);
22
+ return json({ permission: injection.filePermission, endpoints: injection.fileEndpointIds.map(id => files.endpoint(id)).filter(Boolean) });
23
+ }, true);
24
+ }
25
+ function directoryListTool(store, files) {
26
+ return tool('file_directory_list', 'List one directory on an authorized FTP, FTPS, or SFTP endpoint.', {
27
+ endpointId: { type: 'string', required: true, description: 'Exact endpoint id returned by file_endpoint_list.' },
28
+ path: { type: 'string', required: true, description: 'Remote directory path.' },
29
+ }, async (raw, exec) => {
30
+ const args = object(raw);
31
+ const endpointId = text(args.endpointId, 'endpointId', 110);
32
+ requireEndpoint(store, exec, endpointId, false);
33
+ const session = await files.connect(endpointId, exec.signal);
34
+ try {
35
+ return json(await session.list(rawText(args.path, 'path', 4096), exec.signal));
36
+ }
37
+ finally {
38
+ session.close();
39
+ }
40
+ }, true);
41
+ }
42
+ function transferStartTool(store, transfers) {
43
+ return tool('file_transfer_start', 'Start an asynchronous server-side transfer between two authorized FTP, FTPS, or SFTP endpoints. Use fail as the default conflict policy unless the user explicitly chose another policy.', {
44
+ sourceEndpointId: { type: 'string', required: true },
45
+ sourcePaths: { type: 'array', required: true, items: { type: 'string' }, minItems: 1, maxItems: 100 },
46
+ destinationEndpointId: { type: 'string', required: true },
47
+ destinationDirectory: { type: 'string', required: true },
48
+ conflictPolicy: { type: 'string', enum: ['fail', 'skip', 'overwrite', 'rename'], description: 'Defaults to fail.' },
49
+ }, async (raw, exec) => {
50
+ const args = object(raw);
51
+ const sourceEndpointId = text(args.sourceEndpointId, 'sourceEndpointId', 110);
52
+ const destinationEndpointId = text(args.destinationEndpointId, 'destinationEndpointId', 110);
53
+ const owner = requireEndpoint(store, exec, sourceEndpointId, true);
54
+ requireEndpoint(store, exec, destinationEndpointId, true);
55
+ if (!Array.isArray(args.sourcePaths) || args.sourcePaths.length < 1 || args.sourcePaths.length > 100)
56
+ throw new Error('sourcePaths must contain 1-100 paths');
57
+ const conflict = args.conflictPolicy === undefined ? 'fail' : text(args.conflictPolicy, 'conflictPolicy', 16);
58
+ if (conflict !== 'fail' && conflict !== 'skip' && conflict !== 'overwrite' && conflict !== 'rename')
59
+ throw new Error('invalid conflictPolicy');
60
+ return json(transfers.start(owner.session.id, {
61
+ sourceEndpointId, sourcePaths: args.sourcePaths.map((value, index) => rawText(value, `sourcePaths[${index}]`, 4096)),
62
+ destinationEndpointId, destinationDirectory: rawText(args.destinationDirectory, 'destinationDirectory', 4096), conflictPolicy: conflict,
63
+ }));
64
+ });
65
+ }
66
+ function transferStatusTool(store, transfers) {
67
+ return tool('file_transfer_status', 'Read the current state and progress of a file transfer owned by this conversation.', {
68
+ jobId: { type: 'string', required: true },
69
+ }, async (raw, exec) => json(transfers.get(text(object(raw).jobId, 'jobId', 200), requireFileInjection(store, exec).sessionId)), true);
70
+ }
71
+ function transferCancelTool(store, transfers) {
72
+ return tool('file_transfer_cancel', 'Cancel a queued or running file transfer owned by this conversation.', {
73
+ jobId: { type: 'string', required: true },
74
+ }, async (raw, exec) => {
75
+ const injection = requireFileInjection(store, exec);
76
+ if (injection.filePermission !== 'transfer')
77
+ throw new Error('This session only permits remote file browsing');
78
+ return json({ cancelled: transfers.cancel(text(object(raw).jobId, 'jobId', 200), injection.sessionId) });
79
+ });
80
+ }
81
+ function tool(name, description, properties, execute, concurrencySafe = false) {
82
+ const required = Object.entries(properties).filter(([, schema]) => schema.required === true).map(([key]) => key);
83
+ const schemaProperties = Object.fromEntries(Object.entries(properties).map(([key, schema]) => { const { required: _required, ...rest } = schema; return [key, rest]; }));
84
+ return {
85
+ name, description, parameters: { type: 'object', additionalProperties: false, properties: schemaProperties, required }, output, execute,
86
+ isConcurrencySafe: () => concurrencySafe, presentCall: args => ({ card: 'terminal', title: presentTitle(name, args) }),
87
+ };
88
+ }
89
+ function requireFileInjection(store, exec) {
90
+ const sessionId = exec.agent?.session.id;
91
+ if (sessionId === undefined)
92
+ throw new Error('Remote file tools require an owning DSH session');
93
+ const injection = store.injection(sessionId);
94
+ if (injection === undefined || injection.fileEndpointIds.length === 0)
95
+ throw new Error('No remote file endpoint is authorized for this DSH session');
96
+ return injection;
97
+ }
98
+ function requireEndpoint(store, exec, endpointId, transfer) {
99
+ const injection = requireFileInjection(store, exec);
100
+ if (!injection.fileEndpointIds.includes(endpointId))
101
+ throw new Error('The requested file endpoint is not authorized for this DSH session');
102
+ if (transfer && injection.filePermission !== 'transfer')
103
+ throw new Error('This session only permits remote file browsing');
104
+ if (exec.agent === undefined)
105
+ throw new Error('Remote file tools require an owning agent');
106
+ return exec.agent;
107
+ }
108
+ function installVisibility(ctx, store) {
109
+ const attached = new Map();
110
+ const attach = (agent) => {
111
+ if (attached.has(agent))
112
+ return;
113
+ attached.set(agent, agent.ctx.on('system-prompt/assemble', async (_assembly, _context, next) => {
114
+ const result = await next();
115
+ applyVisibility(result, store.injection(agent.session.id));
116
+ return result;
117
+ }));
118
+ };
119
+ for (const agent of ctx.agents.list())
120
+ attach(agent);
121
+ const created = ctx.on('agent/created', ({ agent }) => attach(agent));
122
+ const disposed = ctx.on('agent/disposed', ({ agent }) => { attached.get(agent)?.(); attached.delete(agent); });
123
+ return () => { disposed(); created(); for (const dispose of attached.values())
124
+ dispose(); attached.clear(); };
125
+ }
126
+ function applyVisibility(assembly, injection) {
127
+ if (injection === undefined || (injection.fileEndpointIds ?? []).length === 0) {
128
+ assembly.tools = assembly.tools.filter(schema => !FILE_TOOL_NAMES.has(schema.name));
129
+ return;
130
+ }
131
+ if (injection.filePermission === 'browse')
132
+ assembly.tools = assembly.tools.filter(schema => !TRANSFER_TOOL_NAMES.has(schema.name));
133
+ assembly.contexts.push({ name: 'dsh-ssh:file-access', text: `Remote file access is limited to explicitly authorized endpoints. Permission: ${injection.filePermission}. Use file_endpoint_list before selecting FTP/SFTP endpoints. Never guess endpoint ids or paths.` });
134
+ }
135
+ function presentTitle(name, value) { const args = typeof value === 'object' && value !== null ? value : {}; return typeof args.sourceEndpointId === 'string' ? `${name} · ${args.sourceEndpointId}` : name; }
136
+ function object(value) { if (typeof value !== 'object' || value === null || Array.isArray(value))
137
+ throw new Error('arguments must be an object'); return value; }
138
+ function text(value, name, max) { if (typeof value !== 'string' || value.trim().length === 0 || value.length > max)
139
+ throw new Error(`${name} is invalid`); return value.trim(); }
140
+ function rawText(value, name, max) { if (typeof value !== 'string' || value.length < 1 || value.length > max || /[\0\r\n]/.test(value))
141
+ throw new Error(`${name} is invalid`); return value; }
142
+ function json(value) { return JSON.stringify(value, null, 2); }
143
+ //# sourceMappingURL=file-transfer-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-transfer-tools.js","sourceRoot":"","sources":["../src/file-transfer-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type FtpProfileView, type ProxyEntryView, type VaultEntryView } from './client-api.js';
2
+ import type { SessionAccessState } from './session-access.js';
3
+ export declare function FileTransferWorkspace({ ftpProfiles, vaultEntries, proxyEntries, access, onProfilesChanged }: {
4
+ ftpProfiles: FtpProfileView[];
5
+ vaultEntries: VaultEntryView[];
6
+ proxyEntries: ProxyEntryView[];
7
+ access: SessionAccessState;
8
+ onProfilesChanged(): void;
9
+ }): JSX.Element;
10
+ //# sourceMappingURL=file-transfer-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-transfer-workspace.d.ts","sourceRoot":"","sources":["../src/file-transfer-workspace.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEkB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAoE,KAAK,cAAc,EACvJ,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAS7D,wBAAgB,qBAAqB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE;IAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAAC,YAAY,EAAE,cAAc,EAAE,CAAC;IAAC,YAAY,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,iBAAiB,IAAI,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAiFnR"}