feat: Pro 买断门禁、SFTP 精简与批量多机改造

新增 entitlement/license IPC 与 Waffo 一次性结账服务骨架,挂载 AI/转发/代理/串口/广播/批量导入导出门禁;批量执行改为结果矩阵并复用连接池,SFTP 工具栏图标化并去掉已连接条,同时完善跨平台本地终端与窗口配置。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Logan.LiandCursor committed 2026-08-07 11:38:30 +08:00
1 parent 101d2164b4
commit fea6d8db04
72 files changed
+3307 -396

No files matched your search

@@ -70,7 +70,7 @@ describe('SFTP basic transfer acceptance', () => {
})
render(<SFTPView tabId="sftp-tab" sessionId={session.id} />)
await screen.findByText('已连接')
await screen.findByRole('button', { name: '上传' })
await user.click(screen.getByRole('button', { name: '上传' }))
await waitFor(() => {
@@ -86,7 +86,7 @@ describe('SFTP basic transfer acceptance', () => {
const user = userEvent.setup()
render(<SFTPView tabId="sftp-tab" sessionId={session.id} />)
await screen.findByText('已连接')
await screen.findByRole('button', { name: '上传' })
await user.click(await screen.findByText('remote.txt'))
await user.click(screen.getByRole('button', { name: '下载' }))
@@ -115,7 +115,7 @@ describe('SFTP basic transfer acceptance', () => {
})
render(<SFTPView tabId="sftp-tab" sessionId={session.id} />)
await screen.findByText('已连接')
await screen.findByRole('button', { name: '上传' })
await user.click(screen.getByRole('button', { name: '上传' }))
expect(await screen.findByText(/Permission denied/)).toBeVisible()
@@ -127,7 +127,7 @@ describe('SFTP basic transfer acceptance', () => {
files: [{ name: 'local.txt', path: '/Users/test/local.txt', type: 'file', size: 8, modified: 1_700_000_000 }],
})
render(<SFTPView tabId="sftp-tab" sessionId={session.id} />)
await screen.findByText('已连接')
await screen.findByRole('button', { name: '上传' })
const transfer = createDataTransfer()
fireEvent.dragStart(await screen.findByText('local.txt'), { dataTransfer: transfer })
@@ -144,7 +144,7 @@ describe('SFTP basic transfer acceptance', () => {
it('downloads by dragging a remote row onto the local panel', async () => {
render(<SFTPView tabId="sftp-tab" sessionId={session.id} />)
await screen.findByText('已连接')
await screen.findByRole('button', { name: '上传' })
const transfer = createDataTransfer()
fireEvent.dragStart(await screen.findByText('remote.txt'), { dataTransfer: transfer })