mirror of
https://github.com/stablyai/orca.git
synced 2026-10-07 08:02:21 +00:00
116 lines
4.2 KiB
TypeScript
116 lines
4.2 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { isDshNonInteractiveCommand } from './dsh-launch-command'
|
|
import { recognizeAgentProcessFromCommandLine } from './agent-process-recognition'
|
|
|
|
function tokens(commandLine: string): string[] {
|
|
return commandLine.split(' ')
|
|
}
|
|
|
|
describe('isDshNonInteractiveCommand', () => {
|
|
it.each([
|
|
'dsh web',
|
|
'dsh headless "run the tests"',
|
|
'dsh sdk',
|
|
'dsh sdk-minimal',
|
|
'dsh acp',
|
|
'dsh desktop',
|
|
'dsh dsh-tui --dump-config',
|
|
'dsh dsh-tui --dump-default-config',
|
|
'dsh dsh-tui --dump-config-schema',
|
|
'dsh --profile web',
|
|
'dsh --profile=web --port 8080',
|
|
'dsh --profile headless "run the tests"',
|
|
'dsh --profile sdk',
|
|
'dsh --profile sdk-minimal',
|
|
'dsh --profile acp',
|
|
'dsh plugin --profile dsh-tui add some-plugin',
|
|
'dsh --profile dsh-tui --dump-config'
|
|
])('rejects %s', (commandLine) => {
|
|
expect(isDshNonInteractiveCommand(tokens(commandLine))).toBe(true)
|
|
})
|
|
|
|
it.each([
|
|
'dsh --profile dsh-tui',
|
|
'dsh dsh-tui',
|
|
'dsh tui --resume web',
|
|
'dsh tui --patch web --resume sdk',
|
|
'dsh tui --patch=web --resume sdk',
|
|
'dsh --profile tui --patch headless --resume sdk',
|
|
'dsh tui --from-default-profile web --resume sdk',
|
|
'dsh tui --resume session --dump-config',
|
|
'dsh --profile tui --resume session --dump-config',
|
|
'dsh --profile=dsh-tui',
|
|
'dsh --profile dsh-tui --resume 9478e2d8-29bc-4009-ab32-657efa2bd763',
|
|
'dsh-tui',
|
|
'dsh-tui --resume',
|
|
'dst'
|
|
])('accepts %s', (commandLine) => {
|
|
expect(isDshNonInteractiveCommand(tokens(commandLine))).toBe(false)
|
|
})
|
|
|
|
it('reads only the first --profile, so app arguments cannot retarget it', () => {
|
|
// `--resume web` belongs to the terminal app, not the launcher.
|
|
expect(isDshNonInteractiveCommand(tokens('dsh --profile dsh-tui --resume web'))).toBe(false)
|
|
})
|
|
|
|
it.each([
|
|
'dsh-tui web',
|
|
'dst web',
|
|
'dsh-tui plugin',
|
|
'dsh-tui --continue web',
|
|
'dsh-tui /home/dev/projects/web',
|
|
'node /usr/local/lib/node_modules/.bin/dsh-tui web',
|
|
'C:\\Users\\dev\\AppData\\npm\\dsh-tui.cmd web'
|
|
])('keeps %s interactive: the launcher already chose the TUI profile', (commandLine) => {
|
|
// Everything after `dsh-tui`/`dst` is the terminal app's argv — a workspace target or a
|
|
// resume id — so a folder named `web` or `plugin` is a directory name, not a subcommand.
|
|
expect(isDshNonInteractiveCommand(tokens(commandLine))).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('dsh foreground process recognition', () => {
|
|
it.each([
|
|
'dsh-tui',
|
|
'dst',
|
|
'/opt/homebrew/bin/dsh --profile dsh-tui',
|
|
'node /usr/local/lib/node_modules/.bin/dsh-tui',
|
|
'node /home/dev/.dsh/profiles/dsh-tui/node_modules/@deepseek-harness-tui/dsh-tui/bin/dsh-tui.js',
|
|
'node /usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js --profile dsh-tui'
|
|
])('recognizes %s as dsh', (commandLine) => {
|
|
expect(recognizeAgentProcessFromCommandLine(commandLine)?.agent).toBe('dsh')
|
|
})
|
|
|
|
it.each([
|
|
'dsh web',
|
|
'dsh headless "summarize the diff"',
|
|
'dsh sdk',
|
|
'dsh sdk-minimal',
|
|
'dsh acp',
|
|
'node /usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js headless "go"',
|
|
'node /usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js sdk',
|
|
'node --no-warnings /usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js sdk',
|
|
'C:\\Tools\\dsh.cmd headless go',
|
|
'dsh --profile headless "summarize the diff"',
|
|
'node /usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js --profile acp'
|
|
])('does not claim %s as an interactive agent pane', (commandLine) => {
|
|
expect(recognizeAgentProcessFromCommandLine(commandLine)).toBeNull()
|
|
})
|
|
|
|
it.each(['dsh-tui web', 'dst plugin'])(
|
|
'still recognizes %s as the dsh agent pane',
|
|
(commandLine) => {
|
|
expect(recognizeAgentProcessFromCommandLine(commandLine)?.agent).toBe('dsh')
|
|
}
|
|
)
|
|
|
|
it('still reports non-interactive dsh when headless one-shots are included', () => {
|
|
// Non-interactivity guards ask for the wider set: a `dsh web` pane is not a shell
|
|
// either, so callers that protect agent panes from reuse must still see it.
|
|
expect(
|
|
recognizeAgentProcessFromCommandLine('dsh --profile headless "go"', {
|
|
includeHeadlessOneShot: true
|
|
})?.agent
|
|
).toBe('dsh')
|
|
})
|
|
})
|