diff options
| author | Adam Malczewski <[email protected]> | 2026-05-20 15:04:26 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-05-20 15:04:26 +0900 |
| commit | adc8bd185b54935e7a31aae04da3175b7989927a (patch) | |
| tree | 031fa53009a4708ce0cc15c0e3dcb2f2a73cf2d9 /packages/api/tests | |
| parent | 52af4ca33b1f83b8f863a6267d447944f55e729d (diff) | |
| download | dispatch-adc8bd185b54935e7a31aae04da3175b7989927a.tar.gz dispatch-adc8bd185b54935e7a31aae04da3175b7989927a.zip | |
feat: phase 3 — config, skills, model groups, task list, and sidebar UI
- Config system: TOML-based dispatch.toml with hot-reload via chokidar
- Model/key resolution: tag-based model selection, key fallback chains
- Skills system: directory loader with TOML frontmatter, agent mappings
- Task list tool: add/update/list/get operations with WebSocket events
- API routes: GET /config, /skills, /skills/:name, /models, /models/resolve
- Frontend: sidebar with model status, task list, config viewer, skills browser, permission log
- Sliding sidebar animation using CSS transitions (not Svelte transitions)
Diffstat (limited to 'packages/api/tests')
| -rw-r--r-- | packages/api/tests/agent-manager.test.ts | 43 | ||||
| -rw-r--r-- | packages/api/tests/routes.test.ts | 43 |
2 files changed, 86 insertions, 0 deletions
diff --git a/packages/api/tests/agent-manager.test.ts b/packages/api/tests/agent-manager.test.ts index 2111b0e..1a9f1e2 100644 --- a/packages/api/tests/agent-manager.test.ts +++ b/packages/api/tests/agent-manager.test.ts @@ -65,6 +65,49 @@ vi.mock("@dispatch/core", () => ({ configToRuleset(_config: unknown) { return []; }, + validateConfig(_config: unknown) { + return { config: _config, errors: [] }; + }, + createConfigWatcher(_dir: string, _onChange: unknown) { + return { close() {} }; + }, + loadSkills(_dir: string) { + return { skills: [], mappings: [] }; + }, + createSkillsWatcher(_dir: string, _onChange: unknown) { + return { close() {} }; + }, + ModelRegistry: class MockModelRegistry { + getModels() { return []; } + getKeys() { return []; } + getModelsByTag(_tag: string) { return []; } + getAllTags() { return []; } + hasAvailableKey(_provider: string) { return false; } + allKeysExhausted() { return true; } + markKeyExhausted() {} + markKeyActive() {} + updateConfig() {} + }, + ModelResolver: class MockModelResolver { + resolve(_tag: string) { return null; } + waitForKey() { return Promise.resolve(null); } + }, + TaskList: class MockTaskList { + getTasks() { return []; } + getTask() { return undefined; } + addTask() { return { id: "task-1", title: "", description: "", status: "pending" }; } + updateTask() { return undefined; } + removeTask() { return false; } + onChange(_cb: unknown) { return () => {}; } + }, + createTaskListTool(_taskList: unknown) { + return { + name: "task_list", + description: "task list", + parameters: { _type: "z.ZodObject", shape: {} }, + execute: async () => "mock", + }; + }, })); // Import after mock is defined (Vitest hoists vi.mock automatically) diff --git a/packages/api/tests/routes.test.ts b/packages/api/tests/routes.test.ts index 87ff436..5ecfcb0 100644 --- a/packages/api/tests/routes.test.ts +++ b/packages/api/tests/routes.test.ts @@ -66,6 +66,49 @@ vi.mock("@dispatch/core", () => ({ configToRuleset(_config: unknown) { return []; }, + validateConfig(_config: unknown) { + return { config: _config, errors: [] }; + }, + createConfigWatcher(_dir: string, _onChange: unknown) { + return { close() {} }; + }, + loadSkills(_dir: string) { + return { skills: [], mappings: [] }; + }, + createSkillsWatcher(_dir: string, _onChange: unknown) { + return { close() {} }; + }, + ModelRegistry: class MockModelRegistry { + getModels() { return []; } + getKeys() { return []; } + getModelsByTag(_tag: string) { return []; } + getAllTags() { return []; } + hasAvailableKey(_provider: string) { return false; } + allKeysExhausted() { return true; } + markKeyExhausted() {} + markKeyActive() {} + updateConfig() {} + }, + ModelResolver: class MockModelResolver { + resolve(_tag: string) { return null; } + waitForKey() { return Promise.resolve(null); } + }, + TaskList: class MockTaskList { + getTasks() { return []; } + getTask() { return undefined; } + addTask() { return { id: "task-1", title: "", description: "", status: "pending" }; } + updateTask() { return undefined; } + removeTask() { return false; } + onChange(_cb: unknown) { return () => {}; } + }, + createTaskListTool(_taskList: unknown) { + return { + name: "task_list", + description: "task list", + parameters: { _type: "z.ZodObject", shape: {} }, + execute: async () => "mock", + }; + }, })); const { app } = await import("../src/app.js"); |
