mirror of
https://github.com/stablyai/orca.git
synced 2026-10-26 16:02:42 +00:00
* docs: design SSH relay PTY backpressure * fix(ssh): bound relay frame decoding * fix(relay): bound PTY output publication * fix(ssh): bound PTY model admission * fix(ssh): settle closed model admissions * feat(ssh): negotiate bounded PTY consumer sessions * fix(ssh): fence exit on renderer settlement * feat(ssh): track PTY source credit end to end * fix(ssh): recover bounded PTY output across reconnect * feat(ssh): complete relay PTY output backpressure * fix(ssh): close final PTY source credit races * docs(ssh): record final backpressure validation * feat(ssh): complete relay PTY source-credit lifecycle * test(ssh): complete provider notification fixture * fix(ssh): preserve terminal source credit across rotation * fix(ssh): fail closed on recovery cancellation * fix(ssh): prioritize mux control writes after drain * fix(ssh): retire canceled relay restore deliveries * fix(ssh): order exit cancellation cleanup * fix(ssh): gate provisional source activation * test(ssh): register mux drain-priority coverage * fix(ssh): type stale owner recovery mismatches * fix(ssh): close projection replacement races * fix(relay): contain streaming edge failures * fix(ssh): secure relay endpoint credentials * docs(ssh): reconcile final backpressure lifecycle * fix(ssh): bound main IPC output lifecycle * fix(ssh): close recovery ownership gaps * docs(ssh): record exact artifact validation * fix(ssh): reject reclaimed snapshot replacements * fix(ssh): fence model admission across reconnect * fix(ssh): contain migration failure per PTY * docs(ssh): record final exact-head validation * test(ssh): align deploy fixtures with credential publication * feat(ssh): add per-target bounded output setting * fix(ssh): close source recovery review gaps * fix(ssh): latch source credit environment override * feat(ssh): make PTY source credit the default * docs(ssh): record always-on relay validation * docs(ssh): bind validation to current main * test(ssh): grant source credit in IPC fixture * test(ssh): grant source credit in fake relay --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
242 lines
9.2 KiB
TypeScript
242 lines
9.2 KiB
TypeScript
import { Buffer } from 'node:buffer'
|
|
import { spawnSync } from 'node:child_process'
|
|
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
import { tmpdir } from 'node:os'
|
|
import { dirname, join } from 'node:path'
|
|
import { describe, expect, it } from 'vitest'
|
|
import { createRemoteCliInstallPlan } from './ssh-remote-cli-launcher'
|
|
import { getRemoteHostPlatform } from './ssh-remote-platform'
|
|
|
|
// Why: cold csc.exe startup exceeds Vitest's 5s unit budget on hosted Windows;
|
|
// keep the larger allowance scoped to the real compiler integration test.
|
|
function itWindows(name: string, test: () => void): void {
|
|
const runner = process.platform === 'win32' ? it : it.skip
|
|
runner(name, { timeout: 15_000 }, test)
|
|
}
|
|
|
|
function decodePowerShellCommand(command: string): string {
|
|
const encoded = command.match(/-EncodedCommand\s+([A-Za-z0-9+/=]+)/)?.[1]
|
|
if (!encoded) {
|
|
throw new Error(`Expected an encoded PowerShell command: ${command}`)
|
|
}
|
|
return Buffer.from(encoded, 'base64').toString('utf16le')
|
|
}
|
|
|
|
describe('SSH remote Orca CLI launcher', () => {
|
|
function windowsInstallPlan(): ReturnType<typeof createRemoteCliInstallPlan> {
|
|
return createRemoteCliInstallPlan({
|
|
binDir: 'C:/Users/me user/.orca-relay/bin',
|
|
relayDir: 'C:/Users/me user/.orca-remote/relay-v1',
|
|
nodePath: 'C:/Program Files/nodejs/node.exe',
|
|
sockPath: '\\\\.\\pipe\\orca-relay-123',
|
|
credentialFile: 'C:/Users/me user/.orca-remote/relay-v1/relay.sock.credential',
|
|
hostPlatform: getRemoteHostPlatform('win32-x64')
|
|
})
|
|
}
|
|
|
|
it('compiles a native Windows launcher without a cmd.exe argument bridge', () => {
|
|
const plan = windowsInstallPlan()
|
|
|
|
expect(plan.launcherPath).toBe('C:/Users/me user/.orca-relay/bin/orca.exe')
|
|
expect(plan.files).toHaveLength(1)
|
|
expect(plan.files[0]?.path).toBe('C:/Users/me user/.orca-relay/bin/orca-launcher.cs')
|
|
expect(plan.files[0]?.contents).toContain('ProcessStartInfo')
|
|
expect(plan.files[0]?.contents).toContain('"--orca-cli"')
|
|
expect(plan.files[0]?.contents).toContain('socketPath + ".credential"')
|
|
expect(plan.files[0]?.contents).toContain("value[index] == '\"'")
|
|
expect(plan.files[0]?.contents).toContain("character == '\\\\'")
|
|
expect(plan.files[0]?.contents).not.toContain('cmd.exe')
|
|
expect(plan.files[0]?.contents).not.toContain('%*')
|
|
|
|
expect(plan.postWriteCommands).toHaveLength(1)
|
|
const compileScript = decodePowerShellCommand(plan.postWriteCommands[0] ?? '')
|
|
expect(compileScript).toContain('v4.0.30319\\csc.exe')
|
|
// Why: legacy csc.exe is invoked from the bin directory with bare, space-free
|
|
// file names so PowerShell 5.1 never mangles a space-bearing absolute path.
|
|
expect(compileScript).toContain(
|
|
"Set-Location -ErrorAction Stop -LiteralPath 'C:/Users/me user/.orca-relay/bin'"
|
|
)
|
|
expect(compileScript).toContain('/out:orca.exe')
|
|
expect(compileScript).toContain('C:/Users/me user/.orca-relay/bin/orca-launcher.cs')
|
|
expect(compileScript).toContain('C:/Users/me user/.orca-relay/bin/orca.cmd')
|
|
})
|
|
|
|
it('removes the legacy orca.cmd only after every compile guard has passed', () => {
|
|
const script = decodePowerShellCommand(windowsInstallPlan().postWriteCommands[0] ?? '')
|
|
const legacyShimRemoval =
|
|
"Remove-Item -LiteralPath 'C:/Users/me user/.orca-relay/bin/orca.cmd' -Force -ErrorAction SilentlyContinue"
|
|
// Why: a host missing csc.exe or failing the compile must keep its existing
|
|
// CLI, so every fail-closed guard precedes the legacy %* shim removal.
|
|
const guards = [
|
|
"if (-not $compiler) { Write-Error 'Unable to find the .NET Framework C# compiler required for the Orca SSH CLI launcher.'; exit 1 }",
|
|
'if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }',
|
|
"if (-not (Test-Path -LiteralPath 'C:/Users/me user/.orca-relay/bin/orca.exe' -PathType Leaf))"
|
|
]
|
|
expect(script).toContain(legacyShimRemoval)
|
|
for (const guard of guards) {
|
|
expect(script).toContain(guard)
|
|
expect(script.indexOf(guard)).toBeLessThan(script.indexOf(legacyShimRemoval))
|
|
}
|
|
})
|
|
|
|
itWindows('preserves a multiline argument through the compiled remote launcher', () => {
|
|
const root = mkdtempSync(join(tmpdir(), 'orca remote cli '))
|
|
try {
|
|
const binDir = join(root, 'bin').replaceAll('\\', '/')
|
|
const relayDir = join(root, 'relay').replaceAll('\\', '/')
|
|
const sockPath = '\\\\.\\pipe\\orca-relay-test'
|
|
const credentialFile = `${relayDir}/relay.sock.credential`
|
|
const plan = createRemoteCliInstallPlan({
|
|
binDir,
|
|
relayDir,
|
|
nodePath: process.execPath,
|
|
sockPath,
|
|
credentialFile,
|
|
hostPlatform: getRemoteHostPlatform('win32-x64')
|
|
})
|
|
for (const file of plan.files) {
|
|
mkdirSync(dirname(file.path), { recursive: true })
|
|
writeFileSync(file.path, file.contents, 'utf8')
|
|
}
|
|
|
|
const encoded = plan.postWriteCommands[0]?.match(/-EncodedCommand\s+(\S+)/)?.[1]
|
|
expect(encoded).toBeTruthy()
|
|
const compile = spawnSync(
|
|
'powershell.exe',
|
|
[
|
|
'-NoProfile',
|
|
'-NonInteractive',
|
|
'-ExecutionPolicy',
|
|
'Bypass',
|
|
'-EncodedCommand',
|
|
encoded!
|
|
],
|
|
{ encoding: 'utf8' }
|
|
)
|
|
expect(compile.status, `${compile.stdout}\n${compile.stderr}`).toBe(0)
|
|
|
|
mkdirSync(relayDir, { recursive: true })
|
|
writeFileSync(
|
|
join(relayDir, 'relay.js'),
|
|
'process.stdout.write(JSON.stringify(process.argv.slice(2)))\n',
|
|
'utf8'
|
|
)
|
|
const body = 'line one\nline two & whoami\n"quoted" C:\\tail\\'
|
|
const launched = spawnSync(
|
|
plan.launcherPath,
|
|
['orchestration', 'send', '--body', body, '--json'],
|
|
{
|
|
encoding: 'utf8',
|
|
env: {
|
|
...process.env,
|
|
ORCA_RELAY_NODE_PATH: process.execPath,
|
|
ORCA_RELAY_DIR: relayDir,
|
|
ORCA_RELAY_SOCKET_PATH: sockPath,
|
|
ORCA_RELAY_CREDENTIAL_FILE: credentialFile
|
|
}
|
|
}
|
|
)
|
|
|
|
expect(launched.status, launched.stderr).toBe(0)
|
|
expect(JSON.parse(launched.stdout)).toEqual([
|
|
'--sock-path',
|
|
sockPath,
|
|
'--credential-file',
|
|
credentialFile,
|
|
'--orca-cli',
|
|
'orchestration',
|
|
'send',
|
|
'--body',
|
|
body,
|
|
'--json'
|
|
])
|
|
|
|
const defaulted = spawnSync(plan.launcherPath, ['status'], {
|
|
encoding: 'utf8',
|
|
env: {
|
|
...process.env,
|
|
ORCA_RELAY_NODE_PATH: process.execPath,
|
|
ORCA_RELAY_DIR: relayDir,
|
|
ORCA_RELAY_SOCKET_PATH: sockPath,
|
|
ORCA_RELAY_CREDENTIAL_FILE: ''
|
|
}
|
|
})
|
|
expect(defaulted.status, defaulted.stderr).toBe(0)
|
|
expect(JSON.parse(defaulted.stdout)).toEqual([
|
|
'--sock-path',
|
|
sockPath,
|
|
'--credential-file',
|
|
`${sockPath}.credential`,
|
|
'--orca-cli',
|
|
'status'
|
|
])
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true })
|
|
}
|
|
})
|
|
|
|
itWindows('preserves the existing orca.cmd when the compiler is missing', () => {
|
|
const root = mkdtempSync(join(tmpdir(), 'orca remote cli '))
|
|
try {
|
|
const binDir = join(root, 'bin').replaceAll('\\', '/')
|
|
mkdirSync(binDir, { recursive: true })
|
|
const legacyShimPath = join(binDir, 'orca.cmd')
|
|
writeFileSync(legacyShimPath, '@echo legacy orca cli\r\n', 'utf8')
|
|
|
|
const plan = createRemoteCliInstallPlan({
|
|
binDir,
|
|
relayDir: join(root, 'relay').replaceAll('\\', '/'),
|
|
nodePath: process.execPath,
|
|
sockPath: '\\\\.\\pipe\\orca-relay-test',
|
|
credentialFile: join(root, 'relay', 'relay.sock.credential').replaceAll('\\', '/'),
|
|
hostPlatform: getRemoteHostPlatform('win32-x64')
|
|
})
|
|
for (const file of plan.files) {
|
|
mkdirSync(dirname(file.path), { recursive: true })
|
|
writeFileSync(file.path, file.contents, 'utf8')
|
|
}
|
|
|
|
const encoded = plan.postWriteCommands[0]?.match(/-EncodedCommand\s+(\S+)/)?.[1]
|
|
expect(encoded).toBeTruthy()
|
|
// Point WINDIR at a directory with no csc.exe so compiler discovery fails.
|
|
const compile = spawnSync(
|
|
'powershell.exe',
|
|
[
|
|
'-NoProfile',
|
|
'-NonInteractive',
|
|
'-ExecutionPolicy',
|
|
'Bypass',
|
|
'-EncodedCommand',
|
|
encoded!
|
|
],
|
|
{ encoding: 'utf8', env: { ...process.env, WINDIR: root, SystemRoot: root } }
|
|
)
|
|
|
|
expect(compile.status).not.toBe(0)
|
|
expect(existsSync(legacyShimPath), 'existing orca.cmd must survive a failed install').toBe(
|
|
true
|
|
)
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true })
|
|
}
|
|
})
|
|
|
|
it('keeps the POSIX launcher as an argv-preserving shell exec', () => {
|
|
const plan = createRemoteCliInstallPlan({
|
|
binDir: '/home/me/.orca-relay/bin',
|
|
relayDir: '/home/me/.orca-remote/relay-v1',
|
|
nodePath: '/usr/bin/node',
|
|
sockPath: '/home/me/.orca-remote/relay-v1/relay.sock',
|
|
hostPlatform: getRemoteHostPlatform('linux-x64')
|
|
})
|
|
|
|
expect(plan.launcherPath).toBe('/home/me/.orca-relay/bin/orca')
|
|
expect(plan.files).toEqual([
|
|
expect.objectContaining({
|
|
path: '/home/me/.orca-relay/bin/orca',
|
|
contents: expect.stringContaining('--orca-cli "$@"')
|
|
})
|
|
])
|
|
})
|
|
})
|