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.
Files changed (225) hide show
  1. package/.github/workflows/ci.yml +36 -0
  2. package/CONVERSION_PLAN.md +191 -0
  3. package/README.md +67 -0
  4. package/dist/agents/dew.d.ts +15 -0
  5. package/dist/agents/dew.d.ts.map +1 -0
  6. package/dist/agents/dew.js +74 -0
  7. package/dist/agents/dew.js.map +1 -0
  8. package/dist/agents/fair.d.ts +15 -0
  9. package/dist/agents/fair.d.ts.map +1 -0
  10. package/dist/agents/fair.js +106 -0
  11. package/dist/agents/fair.js.map +1 -0
  12. package/dist/agents/fog.d.ts +15 -0
  13. package/dist/agents/fog.d.ts.map +1 -0
  14. package/dist/agents/fog.js +52 -0
  15. package/dist/agents/fog.js.map +1 -0
  16. package/dist/agents/frost.d.ts +15 -0
  17. package/dist/agents/frost.d.ts.map +1 -0
  18. package/dist/agents/frost.js +54 -0
  19. package/dist/agents/frost.js.map +1 -0
  20. package/dist/agents/rain.d.ts +15 -0
  21. package/dist/agents/rain.d.ts.map +1 -0
  22. package/dist/agents/rain.js +54 -0
  23. package/dist/agents/rain.js.map +1 -0
  24. package/dist/agents/snow.d.ts +27 -0
  25. package/dist/agents/snow.d.ts.map +1 -0
  26. package/dist/agents/snow.js +226 -0
  27. package/dist/agents/snow.js.map +1 -0
  28. package/dist/cli/main.d.ts +7 -0
  29. package/dist/cli/main.d.ts.map +1 -0
  30. package/dist/cli/main.js +402 -0
  31. package/dist/cli/main.js.map +1 -0
  32. package/dist/cli/mode.d.ts +17 -0
  33. package/dist/cli/mode.d.ts.map +1 -0
  34. package/dist/cli/mode.js +56 -0
  35. package/dist/cli/mode.js.map +1 -0
  36. package/dist/core/agent.d.ts +174 -0
  37. package/dist/core/agent.d.ts.map +1 -0
  38. package/dist/core/agent.js +1332 -0
  39. package/dist/core/agent.js.map +1 -0
  40. package/dist/core/agent_helpers.d.ts +51 -0
  41. package/dist/core/agent_helpers.d.ts.map +1 -0
  42. package/dist/core/agent_helpers.js +477 -0
  43. package/dist/core/agent_helpers.js.map +1 -0
  44. package/dist/core/bus.d.ts +99 -0
  45. package/dist/core/bus.d.ts.map +1 -0
  46. package/dist/core/bus.js +191 -0
  47. package/dist/core/bus.js.map +1 -0
  48. package/dist/core/cache.d.ts +63 -0
  49. package/dist/core/cache.d.ts.map +1 -0
  50. package/dist/core/cache.js +121 -0
  51. package/dist/core/cache.js.map +1 -0
  52. package/dist/core/checkpoint.d.ts +19 -0
  53. package/dist/core/checkpoint.d.ts.map +1 -0
  54. package/dist/core/checkpoint.js +120 -0
  55. package/dist/core/checkpoint.js.map +1 -0
  56. package/dist/core/circuit_breaker.d.ts +46 -0
  57. package/dist/core/circuit_breaker.d.ts.map +1 -0
  58. package/dist/core/circuit_breaker.js +99 -0
  59. package/dist/core/circuit_breaker.js.map +1 -0
  60. package/dist/core/config.d.ts +97 -0
  61. package/dist/core/config.d.ts.map +1 -0
  62. package/dist/core/config.js +281 -0
  63. package/dist/core/config.js.map +1 -0
  64. package/dist/core/constants.d.ts +78 -0
  65. package/dist/core/constants.d.ts.map +1 -0
  66. package/dist/core/constants.js +84 -0
  67. package/dist/core/constants.js.map +1 -0
  68. package/dist/core/factory.d.ts +63 -0
  69. package/dist/core/factory.d.ts.map +1 -0
  70. package/dist/core/factory.js +537 -0
  71. package/dist/core/factory.js.map +1 -0
  72. package/dist/core/icons.d.ts +28 -0
  73. package/dist/core/icons.d.ts.map +1 -0
  74. package/dist/core/icons.js +86 -0
  75. package/dist/core/icons.js.map +1 -0
  76. package/dist/core/index.d.ts +29 -0
  77. package/dist/core/index.d.ts.map +1 -0
  78. package/dist/core/index.js +54 -0
  79. package/dist/core/index.js.map +1 -0
  80. package/dist/core/llm.d.ts +121 -0
  81. package/dist/core/llm.d.ts.map +1 -0
  82. package/dist/core/llm.js +532 -0
  83. package/dist/core/llm.js.map +1 -0
  84. package/dist/core/logger.d.ts +57 -0
  85. package/dist/core/logger.d.ts.map +1 -0
  86. package/dist/core/logger.js +122 -0
  87. package/dist/core/logger.js.map +1 -0
  88. package/dist/core/mcp.d.ts +190 -0
  89. package/dist/core/mcp.d.ts.map +1 -0
  90. package/dist/core/mcp.js +822 -0
  91. package/dist/core/mcp.js.map +1 -0
  92. package/dist/core/mcp_server.d.ts +26 -0
  93. package/dist/core/mcp_server.d.ts.map +1 -0
  94. package/dist/core/mcp_server.js +211 -0
  95. package/dist/core/mcp_server.js.map +1 -0
  96. package/dist/core/memory.d.ts +190 -0
  97. package/dist/core/memory.d.ts.map +1 -0
  98. package/dist/core/memory.js +988 -0
  99. package/dist/core/memory.js.map +1 -0
  100. package/dist/core/middleware.d.ts +114 -0
  101. package/dist/core/middleware.d.ts.map +1 -0
  102. package/dist/core/middleware.js +248 -0
  103. package/dist/core/middleware.js.map +1 -0
  104. package/dist/core/pipelines.d.ts +87 -0
  105. package/dist/core/pipelines.d.ts.map +1 -0
  106. package/dist/core/pipelines.js +301 -0
  107. package/dist/core/pipelines.js.map +1 -0
  108. package/dist/core/profile.d.ts +23 -0
  109. package/dist/core/profile.d.ts.map +1 -0
  110. package/dist/core/profile.js +289 -0
  111. package/dist/core/profile.js.map +1 -0
  112. package/dist/core/router.d.ts +24 -0
  113. package/dist/core/router.d.ts.map +1 -0
  114. package/dist/core/router.js +111 -0
  115. package/dist/core/router.js.map +1 -0
  116. package/dist/core/schemas.d.ts +82 -0
  117. package/dist/core/schemas.d.ts.map +1 -0
  118. package/dist/core/schemas.js +200 -0
  119. package/dist/core/schemas.js.map +1 -0
  120. package/dist/core/semantic.d.ts +92 -0
  121. package/dist/core/semantic.d.ts.map +1 -0
  122. package/dist/core/semantic.js +175 -0
  123. package/dist/core/semantic.js.map +1 -0
  124. package/dist/core/skill.d.ts +68 -0
  125. package/dist/core/skill.d.ts.map +1 -0
  126. package/dist/core/skill.js +350 -0
  127. package/dist/core/skill.js.map +1 -0
  128. package/dist/core/tool.d.ts +99 -0
  129. package/dist/core/tool.d.ts.map +1 -0
  130. package/dist/core/tool.js +341 -0
  131. package/dist/core/tool.js.map +1 -0
  132. package/dist/core/tool_router.d.ts +29 -0
  133. package/dist/core/tool_router.d.ts.map +1 -0
  134. package/dist/core/tool_router.js +172 -0
  135. package/dist/core/tool_router.js.map +1 -0
  136. package/dist/core/workspace.d.ts +48 -0
  137. package/dist/core/workspace.d.ts.map +1 -0
  138. package/dist/core/workspace.js +179 -0
  139. package/dist/core/workspace.js.map +1 -0
  140. package/dist/plugins/loader.d.ts +17 -0
  141. package/dist/plugins/loader.d.ts.map +1 -0
  142. package/dist/plugins/loader.js +96 -0
  143. package/dist/plugins/loader.js.map +1 -0
  144. package/dist/skills/loader.d.ts +9 -0
  145. package/dist/skills/loader.d.ts.map +1 -0
  146. package/dist/skills/loader.js +78 -0
  147. package/dist/skills/loader.js.map +1 -0
  148. package/dist/tools/builtin.d.ts +10 -0
  149. package/dist/tools/builtin.d.ts.map +1 -0
  150. package/dist/tools/builtin.js +414 -0
  151. package/dist/tools/builtin.js.map +1 -0
  152. package/dist/tools/computer.d.ts +12 -0
  153. package/dist/tools/computer.d.ts.map +1 -0
  154. package/dist/tools/computer.js +326 -0
  155. package/dist/tools/computer.js.map +1 -0
  156. package/dist/tools/delegate.d.ts +10 -0
  157. package/dist/tools/delegate.d.ts.map +1 -0
  158. package/dist/tools/delegate.js +45 -0
  159. package/dist/tools/delegate.js.map +1 -0
  160. package/dist/web/server.d.ts +5 -0
  161. package/dist/web/server.d.ts.map +1 -0
  162. package/dist/web/server.js +647 -0
  163. package/dist/web/server.js.map +1 -0
  164. package/dist/web/tts.d.ts +33 -0
  165. package/dist/web/tts.d.ts.map +1 -0
  166. package/dist/web/tts.js +69 -0
  167. package/dist/web/tts.js.map +1 -0
  168. package/package.json +60 -0
  169. package/scripts/install.js +48 -0
  170. package/scripts/link.js +10 -0
  171. package/setup.bat +79 -0
  172. package/skill-test-ty2fOA/test.md +10 -0
  173. package/src/agents/dew.ts +70 -0
  174. package/src/agents/fair.ts +102 -0
  175. package/src/agents/fog.ts +48 -0
  176. package/src/agents/frost.ts +50 -0
  177. package/src/agents/rain.ts +50 -0
  178. package/src/agents/snow.ts +239 -0
  179. package/src/cli/main.ts +405 -0
  180. package/src/cli/mode.ts +58 -0
  181. package/src/core/agent.ts +1506 -0
  182. package/src/core/agent_helpers.ts +461 -0
  183. package/src/core/bus.ts +221 -0
  184. package/src/core/cache.ts +153 -0
  185. package/src/core/checkpoint.ts +94 -0
  186. package/src/core/circuit_breaker.ts +119 -0
  187. package/src/core/config.ts +341 -0
  188. package/src/core/constants.ts +95 -0
  189. package/src/core/factory.ts +627 -0
  190. package/src/core/icons.ts +53 -0
  191. package/src/core/index.ts +31 -0
  192. package/src/core/llm.ts +724 -0
  193. package/src/core/logger.ts +144 -0
  194. package/src/core/mcp.ts +953 -0
  195. package/src/core/mcp_server.ts +176 -0
  196. package/src/core/memory.ts +1169 -0
  197. package/src/core/middleware.ts +350 -0
  198. package/src/core/pipelines.ts +424 -0
  199. package/src/core/profile.ts +255 -0
  200. package/src/core/router.ts +124 -0
  201. package/src/core/schemas.ts +282 -0
  202. package/src/core/semantic.ts +211 -0
  203. package/src/core/skill.ts +342 -0
  204. package/src/core/tool.ts +427 -0
  205. package/src/core/tool_router.ts +193 -0
  206. package/src/core/workspace.ts +150 -0
  207. package/src/plugins/loader.ts +66 -0
  208. package/src/skills/loader.ts +46 -0
  209. package/src/sql.js.d.ts +29 -0
  210. package/src/tools/builtin.ts +382 -0
  211. package/src/tools/computer.ts +269 -0
  212. package/src/tools/delegate.ts +49 -0
  213. package/src/web/server.ts +634 -0
  214. package/src/web/tts.ts +93 -0
  215. package/tests/bus.test.ts +121 -0
  216. package/tests/icons.test.ts +45 -0
  217. package/tests/router.test.ts +86 -0
  218. package/tests/schemas.test.ts +51 -0
  219. package/tests/semantic.test.ts +83 -0
  220. package/tests/setup.ts +10 -0
  221. package/tests/skill.test.ts +172 -0
  222. package/tests/tool.test.ts +108 -0
  223. package/tests/tool_router.test.ts +71 -0
  224. package/tsconfig.json +37 -0
  225. package/vitest.config.ts +17 -0
@@ -0,0 +1,176 @@
1
+ /**
2
+ * MCP server — expose Skyloom agents as tools for external MCP clients.
3
+ *
4
+ * Runs over stdio (JSON-RPC 2.0). Any MCP-compatible client (Claude Desktop,
5
+ * Zed, Continue, etc.) can connect and call Skyloom agents as tools.
6
+ *
7
+ * Registered tools:
8
+ * - mcp_chat — single-turn question to any agent
9
+ * - mcp_task — multi-agent orchestration
10
+ * - list_agents — return available agent names + specialties
11
+ */
12
+
13
+ import * as readline from 'readline';
14
+ import { createSystemContext, orchestrateTask } from './factory';
15
+
16
+ const MCP_VERSION = '2025-03-26';
17
+ const SERVER_INFO = { name: 'skyloom', version: '1.4.0' };
18
+
19
+ const TOOL_DEFS = [
20
+ {
21
+ name: 'mcp_chat',
22
+ description: 'Ask a Skyloom agent a question. Use fair for companionship, fog for research, rain for code, frost for review, dew for ops, snow for planning.',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ agent: { type: 'string', description: 'Agent name: fog/rain/frost/snow/dew/fair (default: fair)' },
27
+ message: { type: 'string', description: 'What to ask the agent' },
28
+ },
29
+ required: ['message'],
30
+ },
31
+ },
32
+ {
33
+ name: 'mcp_task',
34
+ description: 'Run multi-agent orchestration. Snow plans, then agents collaborate. Use for complex multi-step goals.',
35
+ inputSchema: {
36
+ type: 'object',
37
+ properties: {
38
+ goal: { type: 'string', description: 'The goal to accomplish' },
39
+ },
40
+ required: ['goal'],
41
+ },
42
+ },
43
+ {
44
+ name: 'list_agents',
45
+ description: 'List available Skyloom agents and their specialties.',
46
+ inputSchema: { type: 'object', properties: {}, required: [] },
47
+ },
48
+ ];
49
+
50
+ export class MCPServer {
51
+ private initialized = false;
52
+ private ctx: any = null;
53
+ private agents: Map<string, any> = new Map();
54
+
55
+ async run(): Promise<void> {
56
+ const rl = readline.createInterface({ input: process.stdin });
57
+ for await (const line of rl) {
58
+ const trimmed = line.trim();
59
+ if (!trimmed) continue;
60
+ try {
61
+ const msg = JSON.parse(trimmed);
62
+ const resp = await this.handle(msg);
63
+ if (resp !== null) {
64
+ process.stdout.write(JSON.stringify(resp) + '\n');
65
+ }
66
+ } catch {
67
+ // Ignore parse errors
68
+ }
69
+ }
70
+ }
71
+
72
+ private async handle(msg: Record<string, any>): Promise<Record<string, any> | null> {
73
+ const mid = msg.id;
74
+ const method = msg.method || '';
75
+ const params = msg.params || {};
76
+
77
+ // Notifications — no response
78
+ if (method.startsWith('notifications/')) return null;
79
+
80
+ try {
81
+ let result: any;
82
+ if (method === 'initialize') {
83
+ result = await this.init();
84
+ } else if (method === 'tools/list') {
85
+ result = { tools: TOOL_DEFS };
86
+ } else if (method === 'tools/call') {
87
+ result = await this.toolsCall(params);
88
+ } else {
89
+ return { jsonrpc: '2.0', id: mid, error: { code: -32601, message: `unknown method: ${method}` } };
90
+ }
91
+ return { jsonrpc: '2.0', id: mid, result };
92
+ } catch (e: any) {
93
+ return { jsonrpc: '2.0', id: mid, error: { code: -32603, message: e.message || String(e) } };
94
+ }
95
+ }
96
+
97
+ private async init(): Promise<Record<string, any>> {
98
+ this.initialized = true;
99
+ return { protocolVersion: MCP_VERSION, capabilities: { tools: {} }, serverInfo: SERVER_INFO };
100
+ }
101
+
102
+ private async ensureCtx(): Promise<void> {
103
+ if (!this.ctx) {
104
+ this.ctx = createSystemContext();
105
+ await this.ctx.initAll();
106
+ this.agents = this.ctx.agentMap;
107
+ }
108
+ }
109
+
110
+ private async toolsCall(params: Record<string, any>): Promise<Record<string, any>> {
111
+ const name = params.name || '';
112
+ const args = params.arguments || {};
113
+
114
+ if (name === 'list_agents') return this.handleListAgents();
115
+ if (name === 'mcp_chat') return this.handleChat(args);
116
+ if (name === 'mcp_task') return this.handleTask(args);
117
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
118
+ }
119
+
120
+ private async handleListAgents(): Promise<Record<string, any>> {
121
+ await this.ensureCtx();
122
+ const lines = ['Available agents:'];
123
+ for (const [name, agent] of this.agents) {
124
+ lines.push(`- ${name} (${agent.displayName}): ${agent.specialty}`);
125
+ }
126
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
127
+ }
128
+
129
+ private async handleChat(args: Record<string, any>): Promise<Record<string, any>> {
130
+ const agentName = String(args.agent || 'fair').trim().toLowerCase();
131
+ const message = String(args.message || '').trim();
132
+ if (!message) {
133
+ return { content: [{ type: 'text', text: 'Error: message is required' }], isError: true };
134
+ }
135
+
136
+ await this.ensureCtx();
137
+ const agent = this.agents.get(agentName);
138
+ if (!agent) {
139
+ return { content: [{ type: 'text', text: `Unknown agent '${agentName}'. Available: ${[...this.agents.keys()].join(', ')}` }], isError: true };
140
+ }
141
+
142
+ try {
143
+ const reply = await agent.chat(message);
144
+ return { content: [{ type: 'text', text: reply }] };
145
+ } catch (e: any) {
146
+ return { content: [{ type: 'text', text: `Agent error: ${e.message || e}` }], isError: true };
147
+ }
148
+ }
149
+
150
+ private async handleTask(args: Record<string, any>): Promise<Record<string, any>> {
151
+ const goal = String(args.goal || '').trim();
152
+ if (!goal) {
153
+ return { content: [{ type: 'text', text: 'Error: goal is required' }], isError: true };
154
+ }
155
+
156
+ await this.ensureCtx();
157
+ try {
158
+ const [_tasks, results, summary] = await orchestrateTask(goal, this.agents);
159
+ const ok = results.filter(r => r.success).length;
160
+ const total = results.length;
161
+ const contentLines = [`[${ok}/${total} tasks completed]`];
162
+ for (const r of results) {
163
+ contentLines.push(`## ${r.agent}: ${r.description}\n${r.content || '(no content)'}`);
164
+ }
165
+ if (summary) contentLines.push(`\n${summary}`);
166
+ return { content: [{ type: 'text', text: contentLines.join('\n') }] };
167
+ } catch (e: any) {
168
+ return { content: [{ type: 'text', text: `Task error: ${e.message || e}` }], isError: true };
169
+ }
170
+ }
171
+ }
172
+
173
+ export async function startMCPServer(): Promise<void> {
174
+ const server = new MCPServer();
175
+ await server.run();
176
+ }