native.e2e.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /** Opt-in native SDK compatibility check without screenshots, input, or permission prompts. */
  2. import { expect, it } from 'vitest'
  3. import { Context } from '@deepseek-ai/cordis'
  4. import ComputerUseRegistry from '@deepseek-ai/dsh-computer-use'
  5. import { ToolCallId } from '@deepseek-ai/dsh-llm'
  6. import SystemPrompt from '@deepseek-ai/dsh-system-prompt'
  7. import ToolRuntime from '@deepseek-ai/dsh-tools'
  8. import * as NativeProvider from '../src/index.ts'
  9. it.skipIf(process.env.DSH_COMPUTER_USE_NATIVE_E2E !== '1')(
  10. 'loads the installed native SDK, reads permission status without prompting, and shuts down',
  11. { retry: 0 },
  12. async ({ signal }) => {
  13. const ctx = new Context()
  14. try {
  15. await ctx.plugin(ComputerUseRegistry)
  16. await ctx.plugin(SystemPrompt)
  17. await ctx.plugin(ToolRuntime)
  18. const provider = ctx.plugin(NativeProvider)
  19. await provider
  20. expect(ctx.computerUse.providerName).toBe('cua-driver-native')
  21. const names = ctx.tools.schemas().map(tool => tool.name)
  22. expect(names).toContain('cua_driver_native__check_permissions')
  23. expect(names).toContain('cua_driver_native__get_window_state')
  24. expect(names.every(name => name.startsWith('cua_driver_native__'))).toBe(true)
  25. const result = await ctx.tools.execute({
  26. name: 'cua_driver_native__check_permissions',
  27. callId: ToolCallId('native-live-permissions'),
  28. arguments: { prompt: false },
  29. signal,
  30. })
  31. expect(result.isError).toBe(false)
  32. if (result.isError) throw new Error('Native permission-status call failed')
  33. if (result.value === null || typeof result.value !== 'object' || Array.isArray(result.value)) {
  34. throw new Error('Native permission status did not return an MCP result object')
  35. }
  36. expect(Array.isArray(result.value.content)).toBe(true)
  37. expect(result.content.some(block => block.type === 'text')).toBe(true)
  38. expect(result.content.some(block => block.type === 'image')).toBe(false)
  39. await provider.dispose()
  40. expect(ctx.tools.schemas()).toEqual([])
  41. expect(ctx.computerUse.providerName).toBeUndefined()
  42. } finally {
  43. await ctx.fiber.dispose()
  44. }
  45. },
  46. )