summaryrefslogtreecommitdiffhomepage
path: root/packages/api/tests
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-20 15:04:26 +0900
committerAdam Malczewski <[email protected]>2026-05-20 15:04:26 +0900
commitadc8bd185b54935e7a31aae04da3175b7989927a (patch)
tree031fa53009a4708ce0cc15c0e3dcb2f2a73cf2d9 /packages/api/tests
parent52af4ca33b1f83b8f863a6267d447944f55e729d (diff)
downloaddispatch-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.ts43
-rw-r--r--packages/api/tests/routes.test.ts43
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");