skyloom 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +36 -0
- package/CONVERSION_PLAN.md +191 -0
- package/README.md +67 -0
- package/dist/agents/dew.d.ts +15 -0
- package/dist/agents/dew.d.ts.map +1 -0
- package/dist/agents/dew.js +74 -0
- package/dist/agents/dew.js.map +1 -0
- package/dist/agents/fair.d.ts +15 -0
- package/dist/agents/fair.d.ts.map +1 -0
- package/dist/agents/fair.js +106 -0
- package/dist/agents/fair.js.map +1 -0
- package/dist/agents/fog.d.ts +15 -0
- package/dist/agents/fog.d.ts.map +1 -0
- package/dist/agents/fog.js +52 -0
- package/dist/agents/fog.js.map +1 -0
- package/dist/agents/frost.d.ts +15 -0
- package/dist/agents/frost.d.ts.map +1 -0
- package/dist/agents/frost.js +54 -0
- package/dist/agents/frost.js.map +1 -0
- package/dist/agents/rain.d.ts +15 -0
- package/dist/agents/rain.d.ts.map +1 -0
- package/dist/agents/rain.js +54 -0
- package/dist/agents/rain.js.map +1 -0
- package/dist/agents/snow.d.ts +27 -0
- package/dist/agents/snow.d.ts.map +1 -0
- package/dist/agents/snow.js +226 -0
- package/dist/agents/snow.js.map +1 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +402 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mode.d.ts +17 -0
- package/dist/cli/mode.d.ts.map +1 -0
- package/dist/cli/mode.js +56 -0
- package/dist/cli/mode.js.map +1 -0
- package/dist/core/agent.d.ts +174 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1332 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agent_helpers.d.ts +51 -0
- package/dist/core/agent_helpers.d.ts.map +1 -0
- package/dist/core/agent_helpers.js +477 -0
- package/dist/core/agent_helpers.js.map +1 -0
- package/dist/core/bus.d.ts +99 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +191 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/cache.d.ts +63 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +121 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/checkpoint.d.ts +19 -0
- package/dist/core/checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint.js +120 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/circuit_breaker.d.ts +46 -0
- package/dist/core/circuit_breaker.d.ts.map +1 -0
- package/dist/core/circuit_breaker.js +99 -0
- package/dist/core/circuit_breaker.js.map +1 -0
- package/dist/core/config.d.ts +97 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +281 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +78 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +84 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/factory.d.ts +63 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +537 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/icons.d.ts +28 -0
- package/dist/core/icons.d.ts.map +1 -0
- package/dist/core/icons.js +86 -0
- package/dist/core/icons.js.map +1 -0
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +54 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/llm.d.ts +121 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +532 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/logger.d.ts +57 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +122 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp.d.ts +190 -0
- package/dist/core/mcp.d.ts.map +1 -0
- package/dist/core/mcp.js +822 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/mcp_server.d.ts +26 -0
- package/dist/core/mcp_server.d.ts.map +1 -0
- package/dist/core/mcp_server.js +211 -0
- package/dist/core/mcp_server.js.map +1 -0
- package/dist/core/memory.d.ts +190 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +988 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/middleware.d.ts +114 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +248 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/pipelines.d.ts +87 -0
- package/dist/core/pipelines.d.ts.map +1 -0
- package/dist/core/pipelines.js +301 -0
- package/dist/core/pipelines.js.map +1 -0
- package/dist/core/profile.d.ts +23 -0
- package/dist/core/profile.d.ts.map +1 -0
- package/dist/core/profile.js +289 -0
- package/dist/core/profile.js.map +1 -0
- package/dist/core/router.d.ts +24 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +111 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/schemas.d.ts +82 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +200 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/semantic.d.ts +92 -0
- package/dist/core/semantic.d.ts.map +1 -0
- package/dist/core/semantic.js +175 -0
- package/dist/core/semantic.js.map +1 -0
- package/dist/core/skill.d.ts +68 -0
- package/dist/core/skill.d.ts.map +1 -0
- package/dist/core/skill.js +350 -0
- package/dist/core/skill.js.map +1 -0
- package/dist/core/tool.d.ts +99 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +341 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/tool_router.d.ts +29 -0
- package/dist/core/tool_router.d.ts.map +1 -0
- package/dist/core/tool_router.js +172 -0
- package/dist/core/tool_router.js.map +1 -0
- package/dist/core/workspace.d.ts +48 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +179 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/plugins/loader.d.ts +17 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +96 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/skills/loader.d.ts +9 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +78 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/tools/builtin.d.ts +10 -0
- package/dist/tools/builtin.d.ts.map +1 -0
- package/dist/tools/builtin.js +414 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/computer.d.ts +12 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +326 -0
- package/dist/tools/computer.js.map +1 -0
- package/dist/tools/delegate.d.ts +10 -0
- package/dist/tools/delegate.d.ts.map +1 -0
- package/dist/tools/delegate.js +45 -0
- package/dist/tools/delegate.js.map +1 -0
- package/dist/web/server.d.ts +5 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +647 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/tts.d.ts +33 -0
- package/dist/web/tts.d.ts.map +1 -0
- package/dist/web/tts.js +69 -0
- package/dist/web/tts.js.map +1 -0
- package/package.json +60 -0
- package/scripts/install.js +48 -0
- package/scripts/link.js +10 -0
- package/setup.bat +79 -0
- package/skill-test-ty2fOA/test.md +10 -0
- package/src/agents/dew.ts +70 -0
- package/src/agents/fair.ts +102 -0
- package/src/agents/fog.ts +48 -0
- package/src/agents/frost.ts +50 -0
- package/src/agents/rain.ts +50 -0
- package/src/agents/snow.ts +239 -0
- package/src/cli/main.ts +405 -0
- package/src/cli/mode.ts +58 -0
- package/src/core/agent.ts +1506 -0
- package/src/core/agent_helpers.ts +461 -0
- package/src/core/bus.ts +221 -0
- package/src/core/cache.ts +153 -0
- package/src/core/checkpoint.ts +94 -0
- package/src/core/circuit_breaker.ts +119 -0
- package/src/core/config.ts +341 -0
- package/src/core/constants.ts +95 -0
- package/src/core/factory.ts +627 -0
- package/src/core/icons.ts +53 -0
- package/src/core/index.ts +31 -0
- package/src/core/llm.ts +724 -0
- package/src/core/logger.ts +144 -0
- package/src/core/mcp.ts +953 -0
- package/src/core/mcp_server.ts +176 -0
- package/src/core/memory.ts +1169 -0
- package/src/core/middleware.ts +350 -0
- package/src/core/pipelines.ts +424 -0
- package/src/core/profile.ts +255 -0
- package/src/core/router.ts +124 -0
- package/src/core/schemas.ts +282 -0
- package/src/core/semantic.ts +211 -0
- package/src/core/skill.ts +342 -0
- package/src/core/tool.ts +427 -0
- package/src/core/tool_router.ts +193 -0
- package/src/core/workspace.ts +150 -0
- package/src/plugins/loader.ts +66 -0
- package/src/skills/loader.ts +46 -0
- package/src/sql.js.d.ts +29 -0
- package/src/tools/builtin.ts +382 -0
- package/src/tools/computer.ts +269 -0
- package/src/tools/delegate.ts +49 -0
- package/src/web/server.ts +634 -0
- package/src/web/tts.ts +93 -0
- package/tests/bus.test.ts +121 -0
- package/tests/icons.test.ts +45 -0
- package/tests/router.test.ts +86 -0
- package/tests/schemas.test.ts +51 -0
- package/tests/semantic.test.ts +83 -0
- package/tests/setup.ts +10 -0
- package/tests/skill.test.ts +172 -0
- package/tests/tool.test.ts +108 -0
- package/tests/tool_router.test.ts +71 -0
- package/tsconfig.json +37 -0
- package/vitest.config.ts +17 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for tool system.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
+
import { ToolRegistry, type ToolDefinition } from '../src/core/tool';
|
|
6
|
+
|
|
7
|
+
function makeTool(overrides: Partial<ToolDefinition> & { name: string }): ToolDefinition {
|
|
8
|
+
return {
|
|
9
|
+
name: overrides.name,
|
|
10
|
+
description: overrides.description ?? 'Test tool',
|
|
11
|
+
parameters: overrides.parameters ?? [],
|
|
12
|
+
handler: overrides.handler ?? vi.fn().mockResolvedValue('ok'),
|
|
13
|
+
dangerous: overrides.dangerous,
|
|
14
|
+
cacheable: overrides.cacheable,
|
|
15
|
+
maxRetries: overrides.maxRetries,
|
|
16
|
+
retryDelay: overrides.retryDelay,
|
|
17
|
+
timeout: overrides.timeout,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('ToolRegistry', () => {
|
|
22
|
+
let registry: ToolRegistry;
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
registry = new ToolRegistry();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('register and get tool', () => {
|
|
29
|
+
const tool = makeTool({ name: 'test_tool' });
|
|
30
|
+
registry.register(tool);
|
|
31
|
+
expect(registry.get('test_tool')).toBe(tool);
|
|
32
|
+
expect(registry.get('nonexistent')).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('list returns all tools', () => {
|
|
36
|
+
registry.register(makeTool({ name: 'a', description: 'A' }));
|
|
37
|
+
registry.register(makeTool({ name: 'b', description: 'B' }));
|
|
38
|
+
expect(registry.list()).toHaveLength(2);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('listNames returns all names', () => {
|
|
42
|
+
registry.register(makeTool({ name: 'alpha', description: 'Alpha' }));
|
|
43
|
+
registry.register(makeTool({ name: 'beta', description: 'Beta' }));
|
|
44
|
+
const names = registry.listNames();
|
|
45
|
+
expect(names).toContain('alpha');
|
|
46
|
+
expect(names).toContain('beta');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('getTools returns all tools', () => {
|
|
50
|
+
registry.register(makeTool({ name: 'x', description: 'X' }));
|
|
51
|
+
expect(registry.getTools()).toHaveLength(1);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('reregister overrides existing', () => {
|
|
55
|
+
const t1 = makeTool({ name: 't', description: 'v1' });
|
|
56
|
+
const t2 = makeTool({ name: 't', description: 'v2' });
|
|
57
|
+
registry.register(t1);
|
|
58
|
+
registry.register(t2);
|
|
59
|
+
expect(registry.get('t')?.description).toBe('v2');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('unregister removes tool', () => {
|
|
63
|
+
registry.register(makeTool({ name: 'temp', description: 'Temp' }));
|
|
64
|
+
expect(registry.get('temp')).toBeDefined();
|
|
65
|
+
registry.unregister('temp');
|
|
66
|
+
expect(registry.get('temp')).toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('has checks existence', () => {
|
|
70
|
+
registry.register(makeTool({ name: 'exists' }));
|
|
71
|
+
expect(registry.has('exists')).toBe(true);
|
|
72
|
+
expect(registry.has('missing')).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('merge copies tools', () => {
|
|
76
|
+
const r2 = new ToolRegistry();
|
|
77
|
+
r2.register(makeTool({ name: 't2', description: 'T2' }));
|
|
78
|
+
registry.merge(r2);
|
|
79
|
+
expect(registry.get('t2')).toBeDefined();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('execute returns result from handler', async () => {
|
|
83
|
+
const handler = vi.fn().mockResolvedValue('hello world');
|
|
84
|
+
registry.register(makeTool({ name: 'greet', handler }));
|
|
85
|
+
const result = await registry.execute('greet', { name: 'world' });
|
|
86
|
+
expect(result.success).toBe(true);
|
|
87
|
+
expect(result.result).toBe('hello world');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('execute returns error for unknown tool', async () => {
|
|
91
|
+
const result = await registry.execute('unknown', {});
|
|
92
|
+
expect(result.success).toBe(false);
|
|
93
|
+
expect(result.error).toContain('not found');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('execute validates required parameters', async () => {
|
|
97
|
+
const handler = vi.fn().mockResolvedValue('ok');
|
|
98
|
+
registry.register(makeTool({
|
|
99
|
+
name: 'needs_path',
|
|
100
|
+
parameters: [{ name: 'path', type: 'string', description: 'File path', required: true }],
|
|
101
|
+
handler,
|
|
102
|
+
}));
|
|
103
|
+
const result = await registry.execute('needs_path', {});
|
|
104
|
+
expect(result.success).toBe(false);
|
|
105
|
+
expect(result.error).toContain('required');
|
|
106
|
+
expect(handler).not.toHaveBeenCalled();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for tool subset routing.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { selectRelevantTools } from '../src/core/tool_router';
|
|
6
|
+
import { ToolRegistry } from '../src/core/tool';
|
|
7
|
+
|
|
8
|
+
function makeRegistry(toolSpecs: Array<[string, string]>): ToolRegistry {
|
|
9
|
+
const r = new ToolRegistry();
|
|
10
|
+
for (const [name, desc] of toolSpecs) {
|
|
11
|
+
r.register({
|
|
12
|
+
name,
|
|
13
|
+
description: desc,
|
|
14
|
+
parameters: [{ name: 'x', type: 'string', description: 'x' }],
|
|
15
|
+
handler: async () => 'ok',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return r;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('selectRelevantTools', () => {
|
|
22
|
+
it('short query returns full set', () => {
|
|
23
|
+
const r = makeRegistry(Array.from({ length: 20 }, (_, i) => [`tool_${i}`, `desc ${i}`]));
|
|
24
|
+
const names = r.listNames();
|
|
25
|
+
const selected = selectRelevantTools(r, names, 'ok', { topK: 5 });
|
|
26
|
+
expect(new Set(selected)).toEqual(new Set(names));
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('small catalog returns full set', () => {
|
|
30
|
+
const r = makeRegistry([['a', 'alpha'], ['b', 'beta']]);
|
|
31
|
+
const names = r.listNames();
|
|
32
|
+
const selected = selectRelevantTools(r, names, 'anything goes here', { topK: 12 });
|
|
33
|
+
expect(new Set(selected)).toEqual(new Set(names));
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('caps at topK for large catalog', () => {
|
|
37
|
+
const r = makeRegistry(Array.from({ length: 50 }, (_, i) => [`tool_${i}`, `desc ${i}`]));
|
|
38
|
+
const names = r.listNames();
|
|
39
|
+
const selected = selectRelevantTools(r, names, 'find weather data', { topK: 10 });
|
|
40
|
+
expect(selected.length).toBeLessThanOrEqual(10);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('relevant tools score higher', () => {
|
|
44
|
+
const r = makeRegistry([
|
|
45
|
+
['read_file', 'read a file from disk'],
|
|
46
|
+
['write_file', 'write content to a file'],
|
|
47
|
+
['send_email', 'send an email message'],
|
|
48
|
+
['fetch_url', 'fetch a web URL'],
|
|
49
|
+
['query_db', 'query the database'],
|
|
50
|
+
]);
|
|
51
|
+
const names = r.listNames();
|
|
52
|
+
const selected = selectRelevantTools(r, names, 'read this config file', { topK: 3 });
|
|
53
|
+
expect(selected).toContain('read_file');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('mustInclude always present', () => {
|
|
57
|
+
const r = makeRegistry(Array.from({ length: 20 }, (_, i) => [`random_${i}`, `unrelated tool ${i}`]));
|
|
58
|
+
r.register({
|
|
59
|
+
name: 'critical_tool',
|
|
60
|
+
description: 'must always be available',
|
|
61
|
+
parameters: [{ name: 'x', type: 'string', description: 'x' }],
|
|
62
|
+
handler: async () => 'ok',
|
|
63
|
+
});
|
|
64
|
+
const names = r.listNames();
|
|
65
|
+
const selected = selectRelevantTools(r, names, 'totally unrelated query', {
|
|
66
|
+
topK: 3,
|
|
67
|
+
mustInclude: new Set(['critical_tool']),
|
|
68
|
+
});
|
|
69
|
+
expect(selected).toContain('critical_tool');
|
|
70
|
+
});
|
|
71
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"module": "CommonJS",
|
|
4
|
+
"target": "ES2020",
|
|
5
|
+
"lib": ["ES2020"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"declaration": true,
|
|
14
|
+
"declarationMap": true,
|
|
15
|
+
"sourceMap": true,
|
|
16
|
+
"noImplicitAny": true,
|
|
17
|
+
"strictNullChecks": true,
|
|
18
|
+
"strictFunctionTypes": true,
|
|
19
|
+
"strictBindCallApply": true,
|
|
20
|
+
"strictPropertyInitialization": true,
|
|
21
|
+
"noImplicitThis": true,
|
|
22
|
+
"alwaysStrict": true,
|
|
23
|
+
"noUnusedLocals": false,
|
|
24
|
+
"noUnusedParameters": false,
|
|
25
|
+
"noImplicitReturns": true,
|
|
26
|
+
"noFallthroughCasesInSwitch": true,
|
|
27
|
+
"allowSyntheticDefaultImports": true,
|
|
28
|
+
"moduleResolution": "node",
|
|
29
|
+
"baseUrl": ".",
|
|
30
|
+
"paths": {
|
|
31
|
+
"@skyloom/*": ["src/*"],
|
|
32
|
+
"@/*": ["src/*"]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"include": ["src/**/*.ts"],
|
|
36
|
+
"exclude": ["node_modules", "dist", "tests"]
|
|
37
|
+
}
|
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
test: {
|
|
6
|
+
globals: true,
|
|
7
|
+
environment: 'node',
|
|
8
|
+
include: ['tests/**/*.test.ts'],
|
|
9
|
+
setupFiles: ['tests/setup.ts'],
|
|
10
|
+
},
|
|
11
|
+
resolve: {
|
|
12
|
+
alias: {
|
|
13
|
+
'@skyloom': path.resolve(__dirname, 'src'),
|
|
14
|
+
'@': path.resolve(__dirname, 'src'),
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
});
|