@lemoncat7/dsh-ssh 1.11.2 → 1.11.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"temporary-access.d.ts","sourceRoot":"","sources":["../src/temporary-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAIlD,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAQvF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,GAAG,MAAM,IAAI,CA8D1G"}
1
+ {"version":3,"file":"temporary-access.d.ts","sourceRoot":"","sources":["../src/temporary-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAMlD,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAQvF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,GAAG,MAAM,IAAI,CAyF1G"}
@@ -1,6 +1,8 @@
1
1
  import { defineTool } from '@deepseek-ai/dsh-tools';
2
2
  import { executeSshCommand } from './exec.js';
3
3
  import { normalizeRemoteDirectory } from './directory.js';
4
+ import { currentHumanText, consentMatches, confirmsPending } from './temporary-consent.js';
5
+ import { TemporaryTaskAccess } from './temporary-task-access.js';
4
6
  /** Resolve only explicit identifiers; ambiguous numeric shortcuts never pick a host. */
5
7
  export function resolveTemporaryHost(profiles, target) {
6
8
  const key = target.trim().toLowerCase();
@@ -15,8 +17,10 @@ export function resolveTemporaryHost(profiles, target) {
15
17
  return matches[0];
16
18
  }
17
19
  export function registerTemporaryAccess(ctx, store, connector) {
18
- // No durable injection is changed, and grants are never copied to child agents.
20
+ // No durable injection is changed. Cross-session leases require an exact board task.
19
21
  const turns = new Map();
22
+ const pending = new Map();
23
+ const tasks = new TemporaryTaskAccess(id => store.profile(id));
20
24
  const fingerprint = (profile) => JSON.stringify(profile);
21
25
  const disposers = [
22
26
  ctx.on('agent/pre-step', async ({ agent, turn, signal }, next) => {
@@ -26,19 +30,31 @@ export function registerTemporaryAccess(ctx, store, connector) {
26
30
  return next();
27
31
  }),
28
32
  ctx.on('session/event', (session, event) => {
29
- if (event.type === 'turn/end')
33
+ if (event.type === 'user/message' && event.data.source.kind === 'user' && event.data.content.some(b => b.type === 'text' && /(?:撤销|取消|停止|不要|禁止).*(?:SSH|临时|授权|访问)/iu.test(b.text))) {
34
+ turns.get(session.id)?.grants.clear();
35
+ pending.delete(session.id);
36
+ tasks.revokeSession(session.id, true);
37
+ }
38
+ if (event.type === 'turn/end') {
30
39
  turns.delete(session.id);
40
+ tasks.revokeSession(session.id, event.data.reason.kind !== 'completed');
41
+ if (event.data.reason.kind !== 'completed')
42
+ pending.delete(session.id);
43
+ }
31
44
  }),
32
- ctx.on('agent/status', ({ agent, status }) => { if (status === 'idle')
33
- turns.delete(agent.session.id); }),
34
- ctx.on('agent/error', ({ agent }) => { turns.delete(agent.session.id); }),
35
- ctx.on('agent/disposed', ({ agent }) => { turns.delete(agent.session.id); }),
45
+ ctx.on('agent/status', ({ agent, status }) => { if (status === 'idle') {
46
+ turns.delete(agent.session.id);
47
+ tasks.revokeSession(agent.session.id);
48
+ } }),
49
+ ctx.on('agent/error', ({ agent }) => { turns.delete(agent.session.id); pending.delete(agent.session.id); tasks.revokeSession(agent.session.id, true); }),
50
+ ctx.on('agent/disposed', ({ agent }) => { turns.delete(agent.session.id); pending.delete(agent.session.id); tasks.revokeSession(agent.session.id, true); }),
51
+ ctx.provide('dshSshTemporaryAccess', { bind: tasks.bind.bind(tasks) }),
36
52
  ];
37
53
  const output = { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: String(value) }] };
38
54
  disposers.push(ctx.tools.register(defineTool({
39
55
  name: 'ssh_request_temporary_access',
40
- description: 'When the user asks you to work on a saved SSH host by name, full IP, or unique IPv4 last octet (e.g. 78), request temporary command access here. Always state the actual task. A user confirmation dialog is mandatory. On approval use ssh_temporary_exec with the returned profileId. Access expires automatically at the end of this agent turn, cancellation, or error; it is not a permanent host mount. Never request access speculatively or retry a rejection without user direction.',
41
- parameters: { target: { type: 'string', required: true }, task: { type: 'string', required: true, description: 'The concrete task requested by the user.' } },
56
+ description: 'Request temporary SSH command access to a saved host explicitly authorized in the CURRENT HUMAN message. The plugin verifies the real message, not your claim of consent; no approval popup is needed. If consent is unclear, show the returned scope and ask the user in chat, then retry only after their reply. For delegation, FIRST create the board task with autoRun=false and an assignee, then pass taskId here; the user must authorize that recipient, or confirm the returned scope. Only after granted=true submit that same task. Without taskId access expires at this turn end. Task grants apply to one execution, at most 60 minutes, never to other tasks or reviewers. Use ssh_temporary_exec; do not change permanent mounts.',
57
+ parameters: { target: { type: 'string', required: true }, task: { type: 'string', required: true, description: 'The concrete task requested by the user.' }, taskId: { type: 'string', description: 'Optional exact planned board task ID for a designated executor. Create it with autoRun=false before requesting access.' } },
42
58
  output,
43
59
  isConcurrencySafe: () => false,
44
60
  presentCall: args => ({ card: 'terminal', title: `SSH 临时授权 · ${args.target}` }),
@@ -52,25 +68,46 @@ export function registerTemporaryAccess(ctx, store, connector) {
52
68
  throw new Error('请提供主机和明确的任务说明。');
53
69
  const profile = resolveTemporaryHost(store.profiles(), args.target);
54
70
  const identity = fingerprint(profile);
55
- const approval = ctx.get('approval');
56
- if (!approval)
57
- throw new Error('当前环境无法显示授权确认,未授予权限。');
58
- const reason = `临时授权 SSH:${profile.name}(${profile.username}@${profile.host}:${profile.port})\n任务:${args.task.trim()}\n允许 Agent 在本轮任务中执行远程命令(可修改远端文件);任务结束、停止或出错后自动撤销,不会永久挂载。`;
59
- const result = await approval.request({ agent: exec.agent, toolName: exec.name, callId: exec.callId, reason, signal: AbortSignal.any([exec.signal, current.signal]) });
60
- if (result !== 'allowed-once')
61
- throw new Error('用户未确认临时授权,不能访问该主机。');
71
+ let target;
72
+ if (args.taskId !== undefined) {
73
+ if (typeof args.taskId !== 'string' || !args.taskId.trim() || args.taskId.length > 200)
74
+ throw new Error('无效的看板任务 ID');
75
+ const resolver = ctx.get('dshPartnerSshTaskAccess');
76
+ if (!resolver)
77
+ throw new Error('伙伴任务授权桥接尚未就绪,不能将当前会话权限传给其他伙伴');
78
+ target = resolver.resolve(args.taskId, id);
79
+ }
80
+ for (const [key, item] of pending)
81
+ if (item.expiresAt <= Date.now())
82
+ pending.delete(key);
83
+ const human = currentHumanText(exec.agent.session.snapshotEvents(), current.turn);
84
+ const previous = pending.get(id);
85
+ const confirmation = confirmsPending(human) && previous && previous.expiresAt > Date.now() && previous.turn < current.turn
86
+ && previous.identity === identity && previous.taskId === target?.taskId && previous.scope === target?.scope && previous.text === args.task.trim();
87
+ if (!confirmation && !consentMatches(human, profile, target?.companionName)) {
88
+ if (pending.size >= 256 && !pending.has(id))
89
+ throw new Error('待确认申请过多,请稍后重试');
90
+ pending.set(id, { identity, ...(target ? { taskId: target.taskId, scope: target.scope } : {}), text: args.task.trim(), turn: current.turn, expiresAt: Date.now() + 10 * 60_000 });
91
+ return JSON.stringify({ granted: false, code: 'SSH_USER_CONSENT_REQUIRED', profileId: profile.id,
92
+ scope: `临时 SSH:${profile.name}(${profile.username}@${profile.host}:${profile.port});${target ? `执行伙伴:${target.companionName};看板任务:${target.title}(${target.taskId});` : '仅当前会话;'}任务:${args.task.trim()}。允许远程命令修改文件,不永久挂载。`,
93
+ instruction: '未授予权限。向用户完整展示上述范围;用户回复“确认临时访问”后,以完全相同的 target、task 和 taskId 重试。不需要弹窗,禁止自行伪造确认或改换目标。确认有效期 10 分钟。' });
94
+ }
62
95
  if (turns.get(id) !== current || current.signal.aborted || exec.signal.aborted)
63
96
  throw new Error('任务已结束,授权未生效。');
64
97
  const latest = store.profile(profile.id);
65
98
  if (!latest || fingerprint(latest) !== identity)
66
99
  throw new Error('主机配置已改变,请重新确认授权。');
67
- current.grants.set(profile.id, identity);
68
- return JSON.stringify({ profileId: profile.id, name: profile.name, host: profile.host, expires: 'current-agent-turn-end', tool: 'ssh_temporary_exec' });
100
+ pending.delete(id);
101
+ if (target)
102
+ tasks.grant(target, profile, id);
103
+ else
104
+ current.grants.set(profile.id, identity);
105
+ return JSON.stringify({ granted: true, authorization: confirmation ? 'human-confirmed-request' : 'current-human-message', profileId: profile.id, name: profile.name, host: profile.host, ...(target ? { taskId: target.taskId, companion: target.companionName } : {}), expires: target ? 'one-task-execution-max-60-minutes' : 'current-agent-turn-end', tool: 'ssh_temporary_exec' });
69
106
  },
70
107
  })));
71
108
  disposers.push(ctx.tools.register(defineTool({
72
109
  name: 'ssh_temporary_exec',
73
- description: 'Execute a command on a host explicitly approved through ssh_request_temporary_access during this agent turn. Does not use or change permanent session mounts. Use cwd for a working directory. Approval is required again in later turns.',
110
+ description: 'Execute a command using temporary SSH access verified from a human message, or a task-bound grant injected by the partner runtime. Does not change permanent mounts. Use cwd for the working directory. Expired grants must be authorized again; never assume another session shares access.',
74
111
  parameters: { profileId: { type: 'string', required: true }, command: { type: 'string', required: true }, cwd: { type: 'string' }, timeoutMs: { type: 'integer' } },
75
112
  output,
76
113
  isConcurrencySafe: () => false,
@@ -78,17 +115,18 @@ export function registerTemporaryAccess(ctx, store, connector) {
78
115
  execute: async (args, exec) => {
79
116
  const current = exec.agent ? turns.get(exec.agent.session.id) : undefined;
80
117
  const profile = typeof args.profileId === 'string' ? store.profile(args.profileId) : undefined;
81
- if (!current || current.signal.aborted || exec.signal.aborted || !profile || current.grants.get(profile.id) !== fingerprint(profile))
82
- throw new Error('没有有效的本轮临时授权,请先请求用户确认。');
118
+ const taskSignal = exec.agent && profile ? tasks.signal(exec.agent.session.id, profile) : undefined;
119
+ if (!current || current.signal.aborted || exec.signal.aborted || !profile || (current.grants.get(profile.id) !== fingerprint(profile) && !taskSignal))
120
+ throw new Error('没有有效的本轮或本任务临时授权,请先通过 ssh_request_temporary_access 核验用户授意。');
83
121
  if (typeof args.command !== 'string' || !args.command.trim() || args.command.length > 100000)
84
122
  throw new Error('无效命令。');
85
123
  const settings = store.settings(), timeout = args.timeoutMs ?? settings.defaultCommandTimeoutMs;
86
124
  if (typeof timeout !== 'number' || !Number.isInteger(timeout) || timeout < 1000 || timeout > 300000)
87
125
  throw new Error('timeoutMs 必须为 1000–300000。');
88
- return JSON.stringify(await executeSshCommand(connector, profile.id, args.command, timeout, settings.maxOutputChars, AbortSignal.any([exec.signal, current.signal]), normalizeRemoteDirectory(args.cwd ?? '~')));
126
+ return JSON.stringify(await executeSshCommand(connector, profile.id, args.command, timeout, settings.maxOutputChars, AbortSignal.any([exec.signal, current.signal, ...(taskSignal ? [taskSignal] : [])]), normalizeRemoteDirectory(args.cwd ?? '~')));
89
127
  },
90
128
  })));
91
- return () => { turns.clear(); for (const dispose of disposers.reverse())
129
+ return () => { turns.clear(); pending.clear(); tasks.clear(); for (const dispose of disposers.reverse())
92
130
  dispose(); };
93
131
  }
94
132
  //# sourceMappingURL=temporary-access.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"temporary-access.js","sourceRoot":"","sources":["../src/temporary-access.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"temporary-access.js","sourceRoot":"","sources":["../src/temporary-access.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
2
+ import type { SshProfile } from './domain.js';
3
+ /** Only human messages entered in this turn count; plugin notices and old chats do not. */
4
+ export declare function currentHumanText(events: readonly SessionEvent[], turn: number): string | undefined;
5
+ export declare function hasName(text: string, name: string): boolean;
6
+ /** Deliberately conservative. Ambiguity asks for a short human confirmation, not an LLM attestation. */
7
+ export declare function consentMatches(text: string | undefined, profile: SshProfile, recipient?: string): boolean;
8
+ export declare function confirmsPending(text: string | undefined): boolean;
9
+ //# sourceMappingURL=temporary-consent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-consent.d.ts","sourceRoot":"","sources":["../src/temporary-consent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYlG;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED,wGAAwG;AACxG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CASzG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,48 @@
1
+ /** Only human messages entered in this turn count; plugin notices and old chats do not. */
2
+ export function currentHumanText(events, turn) {
3
+ let start = -1;
4
+ for (let i = events.length - 1; i >= 0; i--) {
5
+ const e = events[i];
6
+ if (e?.type === 'turn/start' && e.data.turn === turn) {
7
+ start = i;
8
+ break;
9
+ }
10
+ }
11
+ if (start < 0)
12
+ return undefined;
13
+ const entered = events.slice(start + 1).filter(e => {
14
+ if (e.type !== 'user/message')
15
+ return false;
16
+ const source = e.data.source;
17
+ return source.kind !== 'runtime-context' && source.form !== 'recall';
18
+ });
19
+ const latest = entered.at(-1);
20
+ if (latest?.type !== 'user/message' || latest.data.source.kind !== 'user')
21
+ return undefined;
22
+ return latest.data.content.flatMap(block => block.type === 'text' ? [block.text] : []).join('\n').trim();
23
+ }
24
+ export function hasName(text, name) {
25
+ if (!name.trim())
26
+ return false;
27
+ const escaped = name.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
28
+ return new RegExp(`(?<![a-z0-9_.-])${escaped}(?![a-z0-9_.-])`, 'iu').test(text);
29
+ }
30
+ /** Deliberately conservative. Ambiguity asks for a short human confirmation, not an LLM attestation. */
31
+ export function consentMatches(text, profile, recipient) {
32
+ if (!text || text.length > 4000)
33
+ return false;
34
+ // Do not treat quotations, questions, conditional statements or prohibitions as consent.
35
+ if (/[??`<>“”「」"'\n]|(?:不|没|未|勿|禁止|拒绝|撤销|取消|别|如果|假如|假设|是否|能否|为什么|如何|怎么|他说|原文|例如|比如|解释|说明|翻译|讨论|示例|举例|告诉我|请问|会不会|据说|声称)|\b(?:not|never|don't|if|example|said|revoke|cancel)\b/iu.test(text))
36
+ return false;
37
+ if (!/^(?:(?:我(?:明确)?(?:授权|允许|同意|让你|要你))|(?:请|麻烦|你|让|帮我|帮忙|到|去|授权|允许|同意|确认|可以)|临时(?:访问|授权|使用))/u.test(text.trim()))
38
+ return false;
39
+ const host = [profile.name, profile.host, profile.id].some(name => hasName(text, name))
40
+ || (/^(?:\d{1,3}\.){3}\d{1,3}$/.test(profile.host) && new RegExp(`(?:到|去|连接|访问|主机)\\s*${profile.host.split('.').at(-1)}(?![0-9])`, 'u').test(text));
41
+ if (!host || (recipient && !hasName(text, recipient)))
42
+ return false;
43
+ return /(?:授权|允许|同意|确认|可以|临时访问|临时使用|帮我|请|去|到).*(?:SSH|访问|连接|执行|检查|查看|看看|操作|排查|安装|部署|运行|下载|修复|配置|更新|重启)|(?:授权|允许|同意|确认).*临时|^临时(?:授权|访问|使用)/iu.test(text);
44
+ }
45
+ export function confirmsPending(text) {
46
+ return !!text && /^(?:确认|同意|允许)(?:本次|这次)?(?:SSH\s*)?临时(?:访问|授权)(?:[,, ](?:按上述范围|仅限本次任务))?[。.!!\s]*$/iu.test(text.trim());
47
+ }
48
+ //# sourceMappingURL=temporary-consent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-consent.js","sourceRoot":"","sources":["../src/temporary-consent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { SshProfile } from './domain.js';
2
+ export interface TaskTarget {
3
+ taskId: string;
4
+ companionId: string;
5
+ companionName: string;
6
+ title: string;
7
+ scope: string;
8
+ valid(): boolean;
9
+ }
10
+ export interface PartnerTaskResolver {
11
+ resolve(taskId: string, requesterSessionId: string): TaskTarget;
12
+ }
13
+ /** In-memory, one-execution leases. Never changes mounts or exposes credentials. */
14
+ export declare class TemporaryTaskAccess {
15
+ private readonly profile;
16
+ private readonly now;
17
+ private tickets;
18
+ constructor(profile: (id: string) => SshProfile | undefined, now?: () => number);
19
+ grant(target: TaskTarget, profile: SshProfile, owner: string): void;
20
+ bind(input: {
21
+ taskId: string;
22
+ companionId: string;
23
+ sessionId: string;
24
+ signal?: AbortSignal;
25
+ }): {
26
+ prompt: string;
27
+ dispose(): void;
28
+ };
29
+ has(sessionId: string, profile: SshProfile): boolean;
30
+ signal(sessionId: string, profile: SshProfile): AbortSignal | undefined;
31
+ revokeSession(sessionId: string, owner?: boolean): void;
32
+ clear(): void;
33
+ private remove;
34
+ private prune;
35
+ }
36
+ //# sourceMappingURL=temporary-task-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-task-access.d.ts","sourceRoot":"","sources":["../src/temporary-task-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;IACxF,KAAK,IAAI,OAAO,CAAA;CACjB;AACD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,UAAU,CAAA;CAChE;AAGD,oFAAoF;AACpF,qBAAa,mBAAmB;IAElB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA0C,OAAO,CAAC,QAAQ,CAAC,GAAG;IADlG,OAAO,CAAC,OAAO,CAA4B;gBACd,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,EAAmB,GAAG,eAAW;IAC7G,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUnE,IAAI,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,IAAI,IAAI,CAAA;KAAE;IASlI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO;IAGpD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS;IAIvE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,IAAI;IAGrD,KAAK,IAAI,IAAI;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,61 @@
1
+ /** In-memory, one-execution leases. Never changes mounts or exposes credentials. */
2
+ export class TemporaryTaskAccess {
3
+ profile;
4
+ now;
5
+ tickets = new Map();
6
+ constructor(profile, now = Date.now) {
7
+ this.profile = profile;
8
+ this.now = now;
9
+ }
10
+ grant(target, profile, owner) {
11
+ this.prune();
12
+ const key = `${target.taskId}:${profile.id}`;
13
+ if (this.tickets.get(key)?.sessionId)
14
+ throw new Error('任务已经使用临时授权,请先结束当前执行');
15
+ if (this.tickets.size >= 256)
16
+ throw new Error('临时授权数量已达上限,请先结束已有任务');
17
+ this.remove(key);
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => this.remove(key), 60 * 60_000);
20
+ timer.unref?.();
21
+ this.tickets.set(key, { target, profile, fingerprint: JSON.stringify(profile), owner, expiresAt: this.now() + 60 * 60_000, controller, timer });
22
+ }
23
+ bind(input) {
24
+ this.prune();
25
+ const selected = [...this.tickets.entries()].filter(([, t]) => t.target.taskId === input.taskId && t.target.companionId === input.companionId && !t.sessionId);
26
+ if (input.signal?.aborted)
27
+ return { prompt: '', dispose() { } };
28
+ for (const [, t] of selected)
29
+ t.sessionId = input.sessionId;
30
+ const dispose = () => { for (const [key, ticket] of selected)
31
+ if (this.tickets.get(key) === ticket)
32
+ this.remove(key); input.signal?.removeEventListener('abort', dispose); };
33
+ input.signal?.addEventListener('abort', dispose, { once: true });
34
+ return { prompt: selected.length ? '\n本次看板任务已取得用户临时 SSH 授权,仅本次执行有效;不要重新申请或永久挂载。使用 ssh_temporary_exec,主机:' + selected.map(([, t]) => `${t.profile.name}(profileId=${t.profile.id})`).join('、') : '', dispose };
35
+ }
36
+ has(sessionId, profile) {
37
+ return !!this.signal(sessionId, profile);
38
+ }
39
+ signal(sessionId, profile) {
40
+ this.prune();
41
+ return [...this.tickets.values()].find(t => t.sessionId === sessionId && t.profile.id === profile.id && t.fingerprint === JSON.stringify(profile))?.controller.signal;
42
+ }
43
+ revokeSession(sessionId, owner = false) {
44
+ for (const [key, t] of this.tickets)
45
+ if (t.sessionId === sessionId || (owner && t.owner === sessionId))
46
+ this.remove(key);
47
+ }
48
+ clear() { for (const key of this.tickets.keys())
49
+ this.remove(key); }
50
+ remove(key) { const t = this.tickets.get(key); if (t) {
51
+ clearTimeout(t.timer);
52
+ t.controller.abort();
53
+ this.tickets.delete(key);
54
+ } }
55
+ prune() {
56
+ for (const [key, t] of this.tickets)
57
+ if (t.expiresAt <= this.now() || !t.target.valid() || JSON.stringify(this.profile(t.profile.id)) !== t.fingerprint)
58
+ this.remove(key);
59
+ }
60
+ }
61
+ //# sourceMappingURL=temporary-task-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-task-access.js","sourceRoot":"","sources":["../src/temporary-task-access.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncat7/dsh-ssh",
3
- "version": "1.11.2",
3
+ "version": "1.11.4",
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",
@@ -32,6 +32,7 @@
32
32
  "./package.json": "./package.json"
33
33
  },
34
34
  "files": [
35
+ "docs/releases/1.11.3.md",
35
36
  "docs/releases/1.11.2.md",
36
37
  "docs/releases/1.11.1.md",
37
38
  "docs/releases/1.10.5.md",
@@ -43,7 +44,9 @@
43
44
  "ARCHITECTURE.md",
44
45
  "docs/**/*.md",
45
46
  "LICENSE",
46
- "docs/releases/1.10.4.md"
47
+ "docs/releases/1.10.4.md",
48
+ "docs/dsh-021-compatibility.md",
49
+ "docs/releases/1.11.4.md"
47
50
  ],
48
51
  "dsh": {
49
52
  "bundle": {
@@ -65,7 +68,8 @@
65
68
  }
66
69
  },
67
70
  "engines": {
68
- "node": "^22.19.0 || >=24.0.0"
71
+ "node": "^22.19.0 || >=24.0.0",
72
+ "dsh": "^0.2.1-rc.2"
69
73
  },
70
74
  "scripts": {
71
75
  "clean": "node -e \"require('node:fs').rmSync('lib', { recursive: true, force: true })\"",
@@ -75,7 +79,7 @@
75
79
  "pack:check": "npm pack --dry-run"
76
80
  },
77
81
  "dependencies": {
78
- "@deepseek-ai/schemastery": "~3.18.4",
82
+ "@deepseek-ai/schemastery": "~3.18.5",
79
83
  "@gsap/react": "^2.1.2",
80
84
  "basic-ftp": "6.2.1",
81
85
  "gsap": "^3.15.0",
@@ -86,34 +90,33 @@
86
90
  "undici": "^6.28.0"
87
91
  },
88
92
  "peerDependencies": {
89
- "@deepseek-ai/cordis": "^4.0.4",
90
- "@deepseek-ai/dsh-agent": "^0.2.0-rc.2",
91
- "@deepseek-ai/dsh-credentials": "^0.2.0-rc.2",
92
- "@deepseek-ai/dsh-system-prompt": "^0.2.0-rc.2",
93
- "@deepseek-ai/dsh-tools": "^0.2.0-rc.2"
93
+ "@deepseek-ai/cordis": "^4.0.5",
94
+ "@deepseek-ai/dsh-agent": "^0.2.1-rc.2",
95
+ "@deepseek-ai/dsh-credentials": "^0.2.1-rc.2",
96
+ "@deepseek-ai/dsh-system-prompt": "^0.2.1-rc.2",
97
+ "@deepseek-ai/dsh-tools": "^0.2.1-rc.2"
94
98
  },
95
99
  "devDependencies": {
96
- "@deepseek-ai/cordis": "~4.0.4",
97
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
98
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
99
- "@deepseek-ai/dsh-api-workspace-controller": "0.2.0-rc.2",
100
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
101
- "@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
102
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
103
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
104
- "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
105
- "@deepseek-ai/dsh-client-ui-sidebar": "0.2.0-rc.2",
106
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
107
- "@deepseek-ai/dsh-client-ui-theme": "0.2.0-rc.2",
108
- "@deepseek-ai/dsh-credentials": "0.2.0-rc.2",
109
- "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
110
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
111
- "@deepseek-ai/dsh-scope": "0.2.0-rc.2",
112
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
113
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
114
- "@deepseek-ai/dsh-terminal": "0.2.0-rc.2",
115
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
116
- "@deepseek-ai/dsh-user-approval": "0.2.0-rc.2",
100
+ "@deepseek-ai/cordis": "~4.0.5",
101
+ "@deepseek-ai/dsh-agent": "0.2.1-rc.2",
102
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.2",
103
+ "@deepseek-ai/dsh-api-workspace-controller": "0.2.1-rc.2",
104
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.2",
105
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-rc.2",
106
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.2",
107
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.2",
108
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.2",
109
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-rc.2",
110
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.2",
111
+ "@deepseek-ai/dsh-client-ui-theme": "0.2.1-rc.2",
112
+ "@deepseek-ai/dsh-credentials": "0.2.1-rc.2",
113
+ "@deepseek-ai/dsh-llm": "0.2.1-rc.2",
114
+ "@deepseek-ai/dsh-scope": "0.2.1-rc.2",
115
+ "@deepseek-ai/dsh-session": "0.2.1-rc.2",
116
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
117
+ "@deepseek-ai/dsh-terminal": "0.2.1-rc.2",
118
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.2",
119
+ "@deepseek-ai/dsh-user-approval": "0.2.1-rc.2",
117
120
  "@tiptap/core": "^3.30.5",
118
121
  "@tiptap/extension-image": "^3.30.5",
119
122
  "@tiptap/extension-table": "^3.30.5",
@@ -130,10 +133,10 @@
130
133
  "esbuild": "^0.25.0",
131
134
  "react": "18.3.1",
132
135
  "typescript": "^5.9.3",
133
- "@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
134
- "@deepseek-ai/dsh-sandbox": "0.2.0-rc.2",
135
- "@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.2",
136
- "@deepseek-ai/dsh-ptc-runtime": "0.2.0-rc.2"
136
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.1-rc.2",
137
+ "@deepseek-ai/dsh-sandbox": "0.2.1-rc.2",
138
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.2",
139
+ "@deepseek-ai/dsh-ptc-runtime": "0.2.1-rc.2"
137
140
  },
138
141
  "publishConfig": {
139
142
  "access": "public"