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,99 @@
1
+ /**
2
+ * Tool registration and execution framework with retry support
3
+ */
4
+ import { EventEmitter } from "events";
5
+ /**
6
+ * Tool parameter definition
7
+ */
8
+ export interface ToolParameter {
9
+ name: string;
10
+ type: "string" | "number" | "boolean" | "array" | "object";
11
+ description: string;
12
+ required?: boolean;
13
+ default?: unknown;
14
+ enum?: string[];
15
+ }
16
+ /**
17
+ * Tool handler function
18
+ */
19
+ export type ToolHandler = (params: Record<string, unknown>) => Promise<string>;
20
+ /**
21
+ * Tool definition
22
+ */
23
+ export interface ToolDefinition {
24
+ name: string;
25
+ description: string;
26
+ parameters?: ToolParameter[];
27
+ handler?: ToolHandler;
28
+ maxRetries?: number;
29
+ retryDelay?: number;
30
+ dangerous?: boolean;
31
+ cacheable?: boolean;
32
+ timeout?: number;
33
+ }
34
+ /**
35
+ * Tool execution result
36
+ */
37
+ export interface ToolResult {
38
+ success: boolean;
39
+ result: string;
40
+ error?: string;
41
+ retries?: number;
42
+ duration?: number;
43
+ }
44
+ /**
45
+ * Tool registry and executor
46
+ */
47
+ export declare class ToolRegistry extends EventEmitter {
48
+ private tools;
49
+ private breakers;
50
+ /**
51
+ * Register a tool
52
+ */
53
+ register(def: ToolDefinition): void;
54
+ /**
55
+ * Unregister a tool
56
+ */
57
+ unregister(toolName: string): void;
58
+ /**
59
+ * Get a tool definition
60
+ */
61
+ get(toolName: string): ToolDefinition | undefined;
62
+ /**
63
+ * List all registered tools
64
+ */
65
+ list(): ToolDefinition[];
66
+ /**
67
+ * Check if tool is registered
68
+ */
69
+ has(toolName: string): boolean;
70
+ /**
71
+ * Validate tool parameters
72
+ */
73
+ validateParameters(toolName: string, params: Record<string, unknown>): [boolean, string];
74
+ /**
75
+ * Execute a tool with retry support
76
+ */
77
+ execute(toolName: string, params: Record<string, unknown>): Promise<ToolResult>;
78
+ /**
79
+ * Get all tools (alias for list, used by agent code)
80
+ */
81
+ getTools(): ToolDefinition[];
82
+ /**
83
+ * List all registered tool names
84
+ */
85
+ listNames(): string[];
86
+ /**
87
+ * Merge tools from another registry into this one.
88
+ */
89
+ merge(other: ToolRegistry): void;
90
+ /**
91
+ * Clear result cache for a tool or all tools
92
+ */
93
+ clearCache(toolName?: string): void;
94
+ }
95
+ /**
96
+ * Get the global tool registry
97
+ */
98
+ export declare function getToolRegistry(): ToolRegistry;
99
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4GD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,QAAQ,CAA0C;IAE1D;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAuBnC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMlC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIjD;;OAEG;IACH,IAAI,IAAI,cAAc,EAAE;IAIxB;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;IA0BxF;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA2HrF;;OAEG;IACH,QAAQ,IAAI,cAAc,EAAE;IAI5B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAMhC;;OAEG;IACH,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;CAQpC;AAOD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ /**
3
+ * Tool registration and execution framework with retry support
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ToolRegistry = void 0;
7
+ exports.getToolRegistry = getToolRegistry;
8
+ const events_1 = require("events");
9
+ const logger_1 = require("./logger");
10
+ const circuit_breaker_1 = require("./circuit_breaker");
11
+ const log = (0, logger_1.getLogger)("tool");
12
+ const CACHE_MAXSIZE = 128;
13
+ const DEFAULT_TIMEOUT = 30000; // 30 seconds
14
+ const DEFAULT_RETRIES = 2;
15
+ const DEFAULT_RETRY_DELAY = 0.5; // seconds
16
+ /**
17
+ * Tool result cache
18
+ */
19
+ class ToolResultStore {
20
+ constructor() {
21
+ this.store = new Map();
22
+ }
23
+ get(toolName, key) {
24
+ const bucket = this.store.get(toolName);
25
+ if (!bucket)
26
+ return undefined;
27
+ const value = bucket.get(key);
28
+ if (value) {
29
+ // Move to end (LRU)
30
+ bucket.delete(key);
31
+ bucket.set(key, value);
32
+ }
33
+ return value;
34
+ }
35
+ set(toolName, key, value) {
36
+ let bucket = this.store.get(toolName);
37
+ if (!bucket) {
38
+ bucket = new Map();
39
+ this.store.set(toolName, bucket);
40
+ }
41
+ bucket.set(key, value);
42
+ // Evict oldest if over limit
43
+ if (bucket.size > CACHE_MAXSIZE) {
44
+ const firstKey = bucket.keys().next().value;
45
+ if (firstKey !== undefined)
46
+ bucket.delete(firstKey);
47
+ }
48
+ }
49
+ clear(toolName) {
50
+ if (toolName) {
51
+ this.store.delete(toolName);
52
+ }
53
+ else {
54
+ this.store.clear();
55
+ }
56
+ }
57
+ }
58
+ const resultStore = new ToolResultStore();
59
+ /**
60
+ * Type coercion for tool parameters
61
+ */
62
+ function coerceValue(value, targetType) {
63
+ if (value === null || value === undefined) {
64
+ return [true, value];
65
+ }
66
+ // Already correct type
67
+ if (targetType === "string" && typeof value === "string") {
68
+ return [true, value];
69
+ }
70
+ if (targetType === "number" && typeof value === "number") {
71
+ return [true, value];
72
+ }
73
+ if (targetType === "boolean" && typeof value === "boolean") {
74
+ return [true, value];
75
+ }
76
+ if (targetType === "array" && Array.isArray(value)) {
77
+ return [true, value];
78
+ }
79
+ if (targetType === "object" && typeof value === "object") {
80
+ return [true, value];
81
+ }
82
+ // Lenient coercion from string
83
+ if (typeof value === "string") {
84
+ const stripped = value.trim();
85
+ if (targetType === "integer" || targetType === "number") {
86
+ const num = parseInt(stripped, 10);
87
+ if (!isNaN(num))
88
+ return [true, num];
89
+ const float = parseFloat(stripped);
90
+ if (!isNaN(float))
91
+ return [true, float];
92
+ return [false, value];
93
+ }
94
+ if (targetType === "boolean") {
95
+ const lower = stripped.toLowerCase();
96
+ if (["true", "1", "yes", "y"].includes(lower))
97
+ return [true, true];
98
+ if (["false", "0", "no", "n"].includes(lower))
99
+ return [true, false];
100
+ return [false, value];
101
+ }
102
+ if (targetType === "array") {
103
+ if (stripped.includes(",")) {
104
+ return [true, stripped.split(",").map((s) => s.trim())];
105
+ }
106
+ return [true, [value]];
107
+ }
108
+ }
109
+ return [false, value];
110
+ }
111
+ /**
112
+ * Tool registry and executor
113
+ */
114
+ class ToolRegistry extends events_1.EventEmitter {
115
+ constructor() {
116
+ super(...arguments);
117
+ this.tools = new Map();
118
+ this.breakers = new Map();
119
+ }
120
+ /**
121
+ * Register a tool
122
+ */
123
+ register(def) {
124
+ if (!def.name || !def.description) {
125
+ throw new Error("Tool must have name and description");
126
+ }
127
+ this.tools.set(def.name, def);
128
+ // Create circuit breaker for the tool
129
+ if (!this.breakers.has(def.name)) {
130
+ this.breakers.set(def.name, new circuit_breaker_1.CircuitBreaker({
131
+ name: `tool_${def.name}`,
132
+ failureThreshold: 5,
133
+ resetTimeout: 60000,
134
+ }));
135
+ }
136
+ log.info("Tool registered", { tool: def.name });
137
+ this.emit("registered", def.name);
138
+ }
139
+ /**
140
+ * Unregister a tool
141
+ */
142
+ unregister(toolName) {
143
+ this.tools.delete(toolName);
144
+ this.emit("unregistered", toolName);
145
+ log.info("Tool unregistered", { tool: toolName });
146
+ }
147
+ /**
148
+ * Get a tool definition
149
+ */
150
+ get(toolName) {
151
+ return this.tools.get(toolName);
152
+ }
153
+ /**
154
+ * List all registered tools
155
+ */
156
+ list() {
157
+ return Array.from(this.tools.values());
158
+ }
159
+ /**
160
+ * Check if tool is registered
161
+ */
162
+ has(toolName) {
163
+ return this.tools.has(toolName);
164
+ }
165
+ /**
166
+ * Validate tool parameters
167
+ */
168
+ validateParameters(toolName, params) {
169
+ const tool = this.tools.get(toolName);
170
+ if (!tool) {
171
+ return [false, `Tool ${toolName} not found`];
172
+ }
173
+ if (!tool.parameters) {
174
+ return [true, ""];
175
+ }
176
+ for (const param of tool.parameters) {
177
+ if (param.required && !(param.name in params)) {
178
+ return [false, `Missing required parameter: ${param.name}`];
179
+ }
180
+ if (param.name in params) {
181
+ const [valid] = coerceValue(params[param.name], param.type);
182
+ if (!valid) {
183
+ return [false, `Invalid type for parameter ${param.name}: expected ${param.type}`];
184
+ }
185
+ }
186
+ }
187
+ return [true, ""];
188
+ }
189
+ /**
190
+ * Execute a tool with retry support
191
+ */
192
+ async execute(toolName, params) {
193
+ const tool = this.tools.get(toolName);
194
+ if (!tool) {
195
+ return {
196
+ success: false,
197
+ result: "",
198
+ error: `Tool ${toolName} not found`,
199
+ };
200
+ }
201
+ // Check circuit breaker
202
+ const breaker = this.breakers.get(toolName);
203
+ if (breaker && !breaker.canExecute()) {
204
+ return {
205
+ success: false,
206
+ result: "",
207
+ error: `Tool ${toolName} is temporarily unavailable (circuit breaker open)`,
208
+ };
209
+ }
210
+ // Check cache
211
+ if (tool.cacheable) {
212
+ const cacheKey = JSON.stringify(params);
213
+ const cached = resultStore.get(toolName, cacheKey);
214
+ if (cached) {
215
+ log.debug("Tool cache hit", { tool: toolName });
216
+ return {
217
+ success: true,
218
+ result: cached,
219
+ };
220
+ }
221
+ }
222
+ // Validate parameters
223
+ const [valid, error] = this.validateParameters(toolName, params);
224
+ if (!valid) {
225
+ return {
226
+ success: false,
227
+ result: "",
228
+ error,
229
+ };
230
+ }
231
+ // Execute with retries
232
+ const maxRetries = tool.maxRetries ?? DEFAULT_RETRIES;
233
+ const retryDelay = (tool.retryDelay ?? DEFAULT_RETRY_DELAY) * 1000;
234
+ const timeout = tool.timeout ?? DEFAULT_TIMEOUT;
235
+ let lastError = null;
236
+ let retries = 0;
237
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
238
+ try {
239
+ if (attempt > 0) {
240
+ await new Promise((resolve) => setTimeout(resolve, retryDelay * attempt));
241
+ }
242
+ if (!tool.handler) {
243
+ throw new Error(`No handler for tool ${toolName}`);
244
+ }
245
+ const startTime = Date.now();
246
+ // Execute with timeout
247
+ const promise = tool.handler(params);
248
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Tool execution timeout")), timeout));
249
+ const result = await Promise.race([promise, timeoutPromise]);
250
+ const duration = Date.now() - startTime;
251
+ // Cache result
252
+ if (tool.cacheable) {
253
+ const cacheKey = JSON.stringify(params);
254
+ resultStore.set(toolName, cacheKey, result);
255
+ }
256
+ breaker?.recordSuccess();
257
+ log.info("Tool executed successfully", {
258
+ tool: toolName,
259
+ duration,
260
+ retries: attempt,
261
+ });
262
+ return {
263
+ success: true,
264
+ result,
265
+ duration,
266
+ retries: attempt,
267
+ };
268
+ }
269
+ catch (error) {
270
+ lastError = error;
271
+ retries = attempt;
272
+ if (attempt < maxRetries) {
273
+ log.warn("Tool execution failed, retrying", {
274
+ tool: toolName,
275
+ attempt: attempt + 1,
276
+ error: lastError.message,
277
+ });
278
+ }
279
+ }
280
+ }
281
+ breaker?.recordFailure();
282
+ log.error("Tool execution failed after retries", {
283
+ tool: toolName,
284
+ retries,
285
+ error: lastError?.message,
286
+ });
287
+ return {
288
+ success: false,
289
+ result: "",
290
+ error: lastError?.message || "Tool execution failed",
291
+ retries,
292
+ };
293
+ }
294
+ /**
295
+ * Get all tools (alias for list, used by agent code)
296
+ */
297
+ getTools() {
298
+ return this.list();
299
+ }
300
+ /**
301
+ * List all registered tool names
302
+ */
303
+ listNames() {
304
+ return Array.from(this.tools.keys());
305
+ }
306
+ /**
307
+ * Merge tools from another registry into this one.
308
+ */
309
+ merge(other) {
310
+ for (const tool of other.list()) {
311
+ this.tools.set(tool.name, tool);
312
+ }
313
+ }
314
+ /**
315
+ * Clear result cache for a tool or all tools
316
+ */
317
+ clearCache(toolName) {
318
+ resultStore.clear(toolName);
319
+ if (toolName) {
320
+ log.info("Tool cache cleared", { tool: toolName });
321
+ }
322
+ else {
323
+ log.info("All tool caches cleared");
324
+ }
325
+ }
326
+ }
327
+ exports.ToolRegistry = ToolRegistry;
328
+ /**
329
+ * Global tool registry
330
+ */
331
+ let globalRegistry = null;
332
+ /**
333
+ * Get the global tool registry
334
+ */
335
+ function getToolRegistry() {
336
+ if (!globalRegistry) {
337
+ globalRegistry = new ToolRegistry();
338
+ }
339
+ return globalRegistry;
340
+ }
341
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Tool-subset selection for LLM calls.
3
+ *
4
+ * Without filtering, every chat turn ships ~50 tool schemas (built-ins + MCP +
5
+ * skill-required + delegation) to the model. That dilutes attention (the LLM
6
+ * picks plausible-but-wrong tools more often) and burns 8-15k input tokens per
7
+ * turn. This module narrows the active tool set to ~12 by lightweight scoring
8
+ * against the user's latest message.
9
+ *
10
+ * The router intentionally avoids embeddings / LLM calls — it must run in <1ms
11
+ * on every turn, before the real LLM call. A coarse keyword/substring score is
12
+ * good enough to keep the right tools in and bad enough to be cheap.
13
+ */
14
+ import type { ToolRegistry } from './tool';
15
+ /**
16
+ * Return up to ~topK tool names ordered by relevance to the query.
17
+ *
18
+ * Always-included infrastructure tools and mustInclude (e.g. active
19
+ * skill required_tools) are appended regardless of score. When the candidate
20
+ * set is already small (<= topK + |mustInclude|), no filtering is applied.
21
+ *
22
+ * A short or empty query means we have no signal to filter — returning the
23
+ * full candidate set is correct in that case.
24
+ */
25
+ export declare function selectRelevantTools(registry: ToolRegistry, candidateNames: string[], query: string, options?: {
26
+ topK?: number;
27
+ mustInclude?: Set<string>;
28
+ }): string[];
29
+ //# sourceMappingURL=tool_router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_router.d.ts","sourceRoot":"","sources":["../../src/core/tool_router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,QAAQ,CAAC;AAqG3D;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B,GACA,MAAM,EAAE,CA2DV"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /**
3
+ * Tool-subset selection for LLM calls.
4
+ *
5
+ * Without filtering, every chat turn ships ~50 tool schemas (built-ins + MCP +
6
+ * skill-required + delegation) to the model. That dilutes attention (the LLM
7
+ * picks plausible-but-wrong tools more often) and burns 8-15k input tokens per
8
+ * turn. This module narrows the active tool set to ~12 by lightweight scoring
9
+ * against the user's latest message.
10
+ *
11
+ * The router intentionally avoids embeddings / LLM calls — it must run in <1ms
12
+ * on every turn, before the real LLM call. A coarse keyword/substring score is
13
+ * good enough to keep the right tools in and bad enough to be cheap.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.selectRelevantTools = selectRelevantTools;
17
+ // Infrastructure tools that are useful on most turns.
18
+ const INFRA_TOOLS = new Set([
19
+ 'delegate_to',
20
+ 'list_skills',
21
+ 'use_skill',
22
+ 'recall_facts',
23
+ 'remember_fact',
24
+ ]);
25
+ const MUTATING_TOOLS = new Set([
26
+ 'write_file',
27
+ 'edit_file',
28
+ 'move_file',
29
+ 'copy_file',
30
+ 'delete_file',
31
+ 'git_add',
32
+ 'git_commit',
33
+ 'git_checkout',
34
+ 'shell_exec',
35
+ 'http_post',
36
+ 'mcp_add_server',
37
+ 'mcp_remove_server',
38
+ 'mcp_scaffold_server',
39
+ 'kill_process',
40
+ 'package_manager',
41
+ 'service_control',
42
+ ]);
43
+ const TOKEN_RE = /[A-Za-z][A-Za-z0-9_]*|[一-鿿]+/g;
44
+ const STOPWORDS = new Set([
45
+ 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'and', 'or', 'but',
46
+ 'to', 'for', 'of', 'in', 'on', 'at', 'with', 'by', 'do', 'did',
47
+ 'does', 'i', 'me', 'my', 'you', 'your', 'it', 'this', 'that',
48
+ 'what', 'how', 'can', 'could', 'would', 'should', 'please',
49
+ 'tell', 'show', 'help', 'ok', 'yes', 'no',
50
+ '好', '的', '是', '我', '你', '他', '她', '它', '这', '那',
51
+ '什么', '怎么', '请', '帮', '麻烦',
52
+ ]);
53
+ function tokenize(text) {
54
+ const tokens = new Set();
55
+ const matches = text?.toLowerCase().match(TOKEN_RE) || [];
56
+ for (const t of matches) {
57
+ if (t.length >= 2 && !STOPWORDS.has(t)) {
58
+ tokens.add(t);
59
+ }
60
+ }
61
+ return tokens;
62
+ }
63
+ function scoreTool(tool, queryTokens, queryLc) {
64
+ if (queryTokens.size === 0)
65
+ return 0;
66
+ let score = 0;
67
+ // Tool name tokens carry the strongest signal
68
+ const nameTokens = tokenize(tool.name.replace(/_/g, ' '));
69
+ for (const qt of queryTokens) {
70
+ if (nameTokens.has(qt)) {
71
+ score += 5;
72
+ }
73
+ else if (tool.name.toLowerCase().includes(qt)) {
74
+ score += 3;
75
+ }
76
+ }
77
+ // Description tokens are weaker
78
+ const descTokens = tokenize(tool.description);
79
+ for (const qt of queryTokens) {
80
+ if (descTokens.has(qt)) {
81
+ score += 1;
82
+ }
83
+ }
84
+ // Intent boosts for common Chinese/English tasks
85
+ const name = tool.name;
86
+ if (['read_file', 'list_directory', 'tree', 'file_search', 'code_search', 'grep'].includes(name) &&
87
+ ['read', 'file', 'inspect', 'search', 'grep', '看', '读', '查', '搜索', '文件', '代码'].some(k => queryLc.includes(k))) {
88
+ score += 4;
89
+ }
90
+ if (['write_file', 'edit_file', 'move_file', 'copy_file', 'delete_file'].includes(name) &&
91
+ ['write', 'edit', 'modify', 'fix', 'save', '生成', '写', '改', '修复', '保存', '删除'].some(k => queryLc.includes(k))) {
92
+ score += 4;
93
+ }
94
+ if (name.startsWith('git_') &&
95
+ ['git', 'commit', 'diff', 'branch', '提交', '分支', '差异'].some(k => queryLc.includes(k))) {
96
+ score += 4;
97
+ }
98
+ if (['web_search', 'fetch_page', 'http_get'].includes(name) &&
99
+ ['web', 'url', 'http', 'research', '搜索', '网页', '联网', '资料'].some(k => queryLc.includes(k))) {
100
+ score += 4;
101
+ }
102
+ if (['list_skills', 'use_skill'].includes(name) &&
103
+ ['skill', '能力', '技能', 'ppt', 'pdf', 'excel', 'xlsx', 'docx'].some(k => queryLc.includes(k))) {
104
+ score += 4;
105
+ }
106
+ return score;
107
+ }
108
+ /**
109
+ * Return up to ~topK tool names ordered by relevance to the query.
110
+ *
111
+ * Always-included infrastructure tools and mustInclude (e.g. active
112
+ * skill required_tools) are appended regardless of score. When the candidate
113
+ * set is already small (<= topK + |mustInclude|), no filtering is applied.
114
+ *
115
+ * A short or empty query means we have no signal to filter — returning the
116
+ * full candidate set is correct in that case.
117
+ */
118
+ function selectRelevantTools(registry, candidateNames, query, options) {
119
+ const topK = options?.topK ?? 12;
120
+ const explicitMust = new Set(options?.mustInclude ?? []);
121
+ const infraPresent = candidateNames.filter(n => INFRA_TOOLS.has(n) && !explicitMust.has(n));
122
+ const mustPresent = candidateNames.filter(n => explicitMust.has(n));
123
+ const remaining = candidateNames.filter(n => !explicitMust.has(n) && !INFRA_TOOLS.has(n));
124
+ const queryTokens = tokenize(query);
125
+ const queryLc = (query || '').toLowerCase();
126
+ const smallSurface = candidateNames.length <= topK + mustPresent.length + infraPresent.length;
127
+ const lowSignal = queryTokens.size < 2 && queryLc.length < 8;
128
+ // No filtering when the set is already small or the query is too short
129
+ if (smallSurface || lowSignal) {
130
+ return [...mustPresent, ...infraPresent, ...remaining];
131
+ }
132
+ const scored = [];
133
+ const allScoredNames = [...infraPresent, ...remaining];
134
+ for (const name of allScoredNames) {
135
+ const tool = registry.get(name);
136
+ if (!tool)
137
+ continue;
138
+ const score = scoreTool(tool, queryTokens, queryLc);
139
+ const penalty = MUTATING_TOOLS.has(name) && score === 0 ? 1 : 0;
140
+ scored.push({ name, score, penalty });
141
+ }
142
+ // Stable sort by descending score; zero-score tools only fill spare slots
143
+ scored.sort((a, b) => {
144
+ if (a.score !== b.score)
145
+ return b.score - a.score;
146
+ return a.penalty - b.penalty;
147
+ });
148
+ const budget = Math.max(0, topK - mustPresent.length);
149
+ const picked = [];
150
+ const pickedSet = new Set();
151
+ for (const item of scored) {
152
+ if (picked.length >= budget)
153
+ break;
154
+ if (item.score > 0) {
155
+ picked.push(item.name);
156
+ pickedSet.add(item.name);
157
+ }
158
+ }
159
+ // Fill remaining slots with zero-score tools
160
+ if (picked.length < budget) {
161
+ for (const item of scored) {
162
+ if (picked.length >= budget)
163
+ break;
164
+ if (!pickedSet.has(item.name)) {
165
+ picked.push(item.name);
166
+ pickedSet.add(item.name);
167
+ }
168
+ }
169
+ }
170
+ return [...mustPresent, ...picked];
171
+ }
172
+ //# sourceMappingURL=tool_router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_router.js","sourceRoot":"","sources":["../../src/core/tool_router.ts"],"names":[],"mappings":"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"}