mirror of
https://github.com/EKKOLearnAI/hermes-web-ui.git
synced 2026-07-10 02:30:15 +00:00
f5a292663b
* feat: add workflow builder page * Add workflow schema and editor controls * feat: add workflow builder persistence * feat: add workflow socket and agent skills * feat: complete workflow run execution * test: fix workflow ci coverage failures --------- Co-authored-by: Codex <codex@openai.com>
70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
describe('workflow manager', () => {
|
|
it('returns a server-wide singleton instance', async () => {
|
|
const { WorkflowManager, getWorkflowManager } = await import('../../packages/server/src/services/workflow-manager')
|
|
|
|
const first = getWorkflowManager()
|
|
const second = getWorkflowManager()
|
|
|
|
expect(first).toBe(second)
|
|
expect(first).toBeInstanceOf(WorkflowManager)
|
|
})
|
|
|
|
it('stores and emits workflow runtime status updates', async () => {
|
|
const { WorkflowManager } = await import('../../packages/server/src/services/workflow-manager')
|
|
const manager = new WorkflowManager()
|
|
const updates: unknown[] = []
|
|
const dispose = manager.onRuntimeStatus(status => updates.push(status))
|
|
|
|
const status = manager.setRuntimeStatus('workflow-1', {
|
|
status: 'running',
|
|
runId: 'run-1',
|
|
startedAt: 123,
|
|
})
|
|
|
|
expect(status).toMatchObject({
|
|
workflowId: 'workflow-1',
|
|
status: 'running',
|
|
runId: 'run-1',
|
|
startedAt: 123,
|
|
completedAt: null,
|
|
error: null,
|
|
})
|
|
expect(manager.getRuntimeStatus('workflow-1')).toBe(status)
|
|
expect(manager.listRuntimeStatuses()).toEqual([status])
|
|
expect(updates).toEqual([status])
|
|
|
|
dispose()
|
|
manager.setRuntimeStatus('workflow-1', { status: 'completed', completedAt: 456 })
|
|
expect(updates).toEqual([status])
|
|
})
|
|
|
|
it('maps workflow node agents to the existing run backends', async () => {
|
|
const { resolveWorkflowNodeRunTarget } = await import('../../packages/server/src/services/workflow-manager')
|
|
|
|
expect(resolveWorkflowNodeRunTarget('hermes')).toEqual({
|
|
type: 'workflow',
|
|
source: 'workflow',
|
|
agent: 'hermes',
|
|
})
|
|
expect(resolveWorkflowNodeRunTarget('claude-code')).toEqual({
|
|
type: 'workflow',
|
|
source: 'workflow',
|
|
agent: 'claude',
|
|
codingAgentId: 'claude-code',
|
|
})
|
|
expect(resolveWorkflowNodeRunTarget('codex')).toEqual({
|
|
type: 'workflow',
|
|
source: 'workflow',
|
|
agent: 'codex',
|
|
codingAgentId: 'codex',
|
|
})
|
|
expect(resolveWorkflowNodeRunTarget('unknown')).toEqual({
|
|
type: 'workflow',
|
|
source: 'workflow',
|
|
agent: 'hermes',
|
|
})
|
|
})
|
|
})
|