Files
orca/src/shared/agent-session-resume.test.ts
T
0c0367ea88 feat(agents): native Xiaomi MiMo Code support (#6239)
* feat(agents): native Xiaomi MiMo Code support

Add mimo-code TUI agent (detect mimo, --prompt, --session resume).
Inject MIMOCODE_HOME overlay and /hook/mimo-code status plugin on mimo
launch when agent status hooks are enabled; restore via shell-ready
wrappers. Reuse OpenCode-family hook normalization in the listener.

SSH remote MiMo hook overlays are not included (local/daemon first).

Closes #6220

* fix(mimo): remirror overlay config idempotently

rmSync overlay config before mirror so a second mimo launch does not
hit EEXIST in mirrorEntry and fall back to the user MIMOCODE_HOME.

* review: harden mimo code support

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Doan Bac Tam <24356000+doanbactam@users.noreply.github.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-24 00:17:49 -07:00

61 lines
3.0 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
extractAgentProviderSession,
getAgentResumeArgv,
isResumableTuiAgent,
normalizeAgentProviderSession
} from './agent-session-resume'
describe('agent session resume metadata', () => {
it('treats devin as a resumable TUI agent', () => {
expect(isResumableTuiAgent('devin')).toBe(true)
})
it.each([
['claude', { session_id: 'claude-session' }, { key: 'session_id', id: 'claude-session' }],
['codex', { session_id: 'codex-session' }, { key: 'session_id', id: 'codex-session' }],
['gemini', { session_id: 'gemini-session' }, { key: 'session_id', id: 'gemini-session' }],
[
'antigravity',
{ conversationId: 'agy-conversation' },
{ key: 'conversation_id', id: 'agy-conversation' }
],
['opencode', { sessionID: 'opencode-session' }, { key: 'session_id', id: 'opencode-session' }],
['mimo-code', { sessionID: 'mimo-session' }, { key: 'session_id', id: 'mimo-session' }],
['droid', { session_id: 'droid-session' }, { key: 'session_id', id: 'droid-session' }],
['grok', { sessionId: 'grok-session' }, { key: 'session_id', id: 'grok-session' }],
['devin', { session_id: 'devin-session' }, { key: 'session_id', id: 'devin-session' }]
] as const)('extracts %s provider session ids', (source, payload, expected) => {
expect(extractAgentProviderSession(source, payload)).toEqual(expected)
})
it.each([
['claude', { key: 'session_id', id: 's1' }, ['claude', '--resume', 's1']],
['codex', { key: 'session_id', id: 's1' }, ['codex', 'resume', 's1']],
['gemini', { key: 'session_id', id: 's1' }, ['gemini', '--resume', 's1']],
['antigravity', { key: 'conversation_id', id: 's1' }, ['agy', '--conversation', 's1']],
['opencode', { key: 'session_id', id: 's1' }, ['opencode', '--session', 's1']],
['mimo-code', { key: 'session_id', id: 's1' }, ['mimo', '--session', 's1']],
['droid', { key: 'session_id', id: 's1' }, ['droid', '--resume', 's1']],
['grok', { key: 'session_id', id: 's1' }, ['grok', '--resume', 's1']],
['devin', { key: 'session_id', id: 'abc12345' }, ['devin', '--resume', 'abc12345']]
] as const)('builds %s resume argv', (agent, providerSession, expected) => {
expect(getAgentResumeArgv(agent, providerSession)).toEqual(expected)
})
it('rejects unsupported sources and unsafe ids', () => {
expect(extractAgentProviderSession('pi', { session_id: 'pi-session' })).toBeNull()
expect(normalizeAgentProviderSession({ key: 'session_id', id: 'bad\nid' })).toBeNull()
expect(normalizeAgentProviderSession({ key: 'session_id', id: '--last' })).toBeNull()
expect(extractAgentProviderSession('codex', { session_id: '--last' })).toBeNull()
expect(normalizeAgentProviderSession({ key: 'session_id', id: 'ok' })).toEqual({
key: 'session_id',
id: 'ok'
})
})
it('rejects devin resume when provider session key is not session_id', () => {
expect(getAgentResumeArgv('devin', { key: 'conversation_id', id: 'x' })).toBeNull()
})
})