sdkwork-browser-agent 1.0.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 (146) hide show
  1. package/README.md +228 -0
  2. package/README.zh.md +228 -0
  3. package/dist/agent-Bpxmkz8W.d.ts +197 -0
  4. package/dist/agent-kexkkI13.d.cts +197 -0
  5. package/dist/browser/agent-Bpxmkz8W.d.ts +197 -0
  6. package/dist/browser/chunk-7W2JJCSS.js +276 -0
  7. package/dist/browser/chunk-7W2JJCSS.js.map +1 -0
  8. package/dist/browser/chunk-BHRFRGR7.js +144 -0
  9. package/dist/browser/chunk-BHRFRGR7.js.map +1 -0
  10. package/dist/browser/chunk-CLP6UNSV.js +285 -0
  11. package/dist/browser/chunk-CLP6UNSV.js.map +1 -0
  12. package/dist/browser/chunk-HXLRBB7S.js +1569 -0
  13. package/dist/browser/chunk-HXLRBB7S.js.map +1 -0
  14. package/dist/browser/chunk-VJEFLRZT.js +1720 -0
  15. package/dist/browser/chunk-VJEFLRZT.js.map +1 -0
  16. package/dist/browser/index.d.ts +842 -0
  17. package/dist/browser/index.js +3293 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/browser/llm/index.d.ts +235 -0
  20. package/dist/browser/llm/index.js +29 -0
  21. package/dist/browser/llm/index.js.map +1 -0
  22. package/dist/browser/mcp/index.d.ts +63 -0
  23. package/dist/browser/mcp/index.js +9 -0
  24. package/dist/browser/mcp/index.js.map +1 -0
  25. package/dist/browser/provider-Dna36xA-.d.ts +105 -0
  26. package/dist/browser/skills/index.d.ts +401 -0
  27. package/dist/browser/skills/index.js +31 -0
  28. package/dist/browser/skills/index.js.map +1 -0
  29. package/dist/browser/storage/index.d.ts +64 -0
  30. package/dist/browser/storage/index.js +15 -0
  31. package/dist/browser/storage/index.js.map +1 -0
  32. package/dist/browser/tools/index.d.ts +45 -0
  33. package/dist/browser/tools/index.js +15 -0
  34. package/dist/browser/tools/index.js.map +1 -0
  35. package/dist/browser/types-CG5I-byI.d.ts +30 -0
  36. package/dist/chunk-56J3IBXZ.js +144 -0
  37. package/dist/chunk-56J3IBXZ.js.map +1 -0
  38. package/dist/chunk-5XTVS5MB.js +1720 -0
  39. package/dist/chunk-5XTVS5MB.js.map +1 -0
  40. package/dist/chunk-6AYIRBGI.js +166 -0
  41. package/dist/chunk-6AYIRBGI.js.map +1 -0
  42. package/dist/chunk-C2EYJHXW.cjs +276 -0
  43. package/dist/chunk-C2EYJHXW.cjs.map +1 -0
  44. package/dist/chunk-HOZQ445W.cjs +166 -0
  45. package/dist/chunk-HOZQ445W.cjs.map +1 -0
  46. package/dist/chunk-KZNZ6CGD.cjs +144 -0
  47. package/dist/chunk-KZNZ6CGD.cjs.map +1 -0
  48. package/dist/chunk-XFMT5ZA4.js +276 -0
  49. package/dist/chunk-XFMT5ZA4.js.map +1 -0
  50. package/dist/chunk-XPGICLEJ.cjs +1720 -0
  51. package/dist/chunk-XPGICLEJ.cjs.map +1 -0
  52. package/dist/index.cjs +1311 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.cts +395 -0
  55. package/dist/index.d.ts +395 -0
  56. package/dist/index.js +1311 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/llm/index.cjs +29 -0
  59. package/dist/llm/index.cjs.map +1 -0
  60. package/dist/llm/index.d.cts +235 -0
  61. package/dist/llm/index.d.ts +235 -0
  62. package/dist/llm/index.js +29 -0
  63. package/dist/llm/index.js.map +1 -0
  64. package/dist/mcp/index.cjs +9 -0
  65. package/dist/mcp/index.cjs.map +1 -0
  66. package/dist/mcp/index.d.cts +63 -0
  67. package/dist/mcp/index.d.ts +63 -0
  68. package/dist/mcp/index.js +9 -0
  69. package/dist/mcp/index.js.map +1 -0
  70. package/dist/node/agent-Bpxmkz8W.d.ts +197 -0
  71. package/dist/node/agent-kexkkI13.d.cts +197 -0
  72. package/dist/node/chunk-7W2JJCSS.js +276 -0
  73. package/dist/node/chunk-7W2JJCSS.js.map +1 -0
  74. package/dist/node/chunk-BHRFRGR7.js +144 -0
  75. package/dist/node/chunk-BHRFRGR7.js.map +1 -0
  76. package/dist/node/chunk-CLP6UNSV.js +285 -0
  77. package/dist/node/chunk-CLP6UNSV.js.map +1 -0
  78. package/dist/node/chunk-HXLRBB7S.js +1569 -0
  79. package/dist/node/chunk-HXLRBB7S.js.map +1 -0
  80. package/dist/node/chunk-IYG37UN3.cjs +144 -0
  81. package/dist/node/chunk-IYG37UN3.cjs.map +1 -0
  82. package/dist/node/chunk-JF33ZOMB.cjs +285 -0
  83. package/dist/node/chunk-JF33ZOMB.cjs.map +1 -0
  84. package/dist/node/chunk-KXXS33G3.cjs +276 -0
  85. package/dist/node/chunk-KXXS33G3.cjs.map +1 -0
  86. package/dist/node/chunk-MTFOABGC.cjs +1720 -0
  87. package/dist/node/chunk-MTFOABGC.cjs.map +1 -0
  88. package/dist/node/chunk-VJEFLRZT.js +1720 -0
  89. package/dist/node/chunk-VJEFLRZT.js.map +1 -0
  90. package/dist/node/chunk-YDHQCPSN.cjs +1569 -0
  91. package/dist/node/chunk-YDHQCPSN.cjs.map +1 -0
  92. package/dist/node/index.cjs +3293 -0
  93. package/dist/node/index.cjs.map +1 -0
  94. package/dist/node/index.d.cts +842 -0
  95. package/dist/node/index.d.ts +842 -0
  96. package/dist/node/index.js +3293 -0
  97. package/dist/node/index.js.map +1 -0
  98. package/dist/node/llm/index.cjs +29 -0
  99. package/dist/node/llm/index.cjs.map +1 -0
  100. package/dist/node/llm/index.d.cts +235 -0
  101. package/dist/node/llm/index.d.ts +235 -0
  102. package/dist/node/llm/index.js +29 -0
  103. package/dist/node/llm/index.js.map +1 -0
  104. package/dist/node/mcp/index.cjs +9 -0
  105. package/dist/node/mcp/index.cjs.map +1 -0
  106. package/dist/node/mcp/index.d.cts +63 -0
  107. package/dist/node/mcp/index.d.ts +63 -0
  108. package/dist/node/mcp/index.js +9 -0
  109. package/dist/node/mcp/index.js.map +1 -0
  110. package/dist/node/provider-Dna36xA-.d.cts +105 -0
  111. package/dist/node/provider-Dna36xA-.d.ts +105 -0
  112. package/dist/node/skills/index.cjs +31 -0
  113. package/dist/node/skills/index.cjs.map +1 -0
  114. package/dist/node/skills/index.d.cts +401 -0
  115. package/dist/node/skills/index.d.ts +401 -0
  116. package/dist/node/skills/index.js +31 -0
  117. package/dist/node/skills/index.js.map +1 -0
  118. package/dist/node/storage/index.cjs +15 -0
  119. package/dist/node/storage/index.cjs.map +1 -0
  120. package/dist/node/storage/index.d.cts +64 -0
  121. package/dist/node/storage/index.d.ts +64 -0
  122. package/dist/node/storage/index.js +15 -0
  123. package/dist/node/storage/index.js.map +1 -0
  124. package/dist/node/tools/index.cjs +15 -0
  125. package/dist/node/tools/index.cjs.map +1 -0
  126. package/dist/node/tools/index.d.cts +45 -0
  127. package/dist/node/tools/index.d.ts +45 -0
  128. package/dist/node/tools/index.js +15 -0
  129. package/dist/node/tools/index.js.map +1 -0
  130. package/dist/node/types-CG5I-byI.d.cts +30 -0
  131. package/dist/node/types-CG5I-byI.d.ts +30 -0
  132. package/dist/provider-Dna36xA-.d.cts +105 -0
  133. package/dist/provider-Dna36xA-.d.ts +105 -0
  134. package/dist/skills/index.cjs +15 -0
  135. package/dist/skills/index.cjs.map +1 -0
  136. package/dist/skills/index.d.cts +43 -0
  137. package/dist/skills/index.d.ts +43 -0
  138. package/dist/skills/index.js +15 -0
  139. package/dist/skills/index.js.map +1 -0
  140. package/dist/tools/index.cjs +15 -0
  141. package/dist/tools/index.cjs.map +1 -0
  142. package/dist/tools/index.d.cts +45 -0
  143. package/dist/tools/index.d.ts +45 -0
  144. package/dist/tools/index.js +15 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/package.json +150 -0
@@ -0,0 +1,197 @@
1
+ import { L as LLMProvider, a as LLMMessage, b as LLMRequest, c as LLMResponse, d as LLMStreamChunk, T as ToolDefinition } from './provider-Dna36xA-.cjs';
2
+
3
+ /**
4
+ * Core Agent Architecture
5
+ * High cohesion, low coupling design
6
+ * Compatible with https://agentskills.io/specification
7
+ */
8
+
9
+ interface Skill {
10
+ name: string;
11
+ description: string;
12
+ parameters: ParameterSchema;
13
+ handler: SkillHandler;
14
+ metadata?: SkillMetadata;
15
+ }
16
+ interface ParameterSchema {
17
+ type: 'object';
18
+ properties: Record<string, ParameterProperty>;
19
+ required?: string[];
20
+ }
21
+ interface ParameterProperty {
22
+ type: string;
23
+ description: string;
24
+ enum?: string[];
25
+ default?: unknown;
26
+ }
27
+ interface SkillMetadata {
28
+ category?: string;
29
+ tags?: string[];
30
+ version?: string;
31
+ author?: string;
32
+ deprecated?: boolean;
33
+ }
34
+ type SkillHandler = (params: Record<string, unknown>, context: ExecutionContext) => Promise<SkillResult>;
35
+ interface ExecutionContext {
36
+ agent: Agent;
37
+ skillName: string;
38
+ timestamp: Date;
39
+ metadata?: Record<string, unknown>;
40
+ }
41
+ interface SkillResult {
42
+ success: boolean;
43
+ data?: unknown;
44
+ error?: string;
45
+ metadata?: Record<string, unknown>;
46
+ }
47
+ interface Tool {
48
+ name: string;
49
+ description: string;
50
+ parameters?: ParameterSchema;
51
+ execute: ToolExecutor;
52
+ metadata?: ToolMetadata;
53
+ }
54
+ interface ToolMetadata {
55
+ category?: string;
56
+ tags?: string[];
57
+ version?: string;
58
+ requiresConfirmation?: boolean;
59
+ }
60
+ type ToolExecutor = (input: unknown, context: ExecutionContext) => Promise<ToolOutput>;
61
+ interface ToolOutput {
62
+ content: Array<{
63
+ type: string;
64
+ text?: string;
65
+ data?: unknown;
66
+ }>;
67
+ isError?: boolean;
68
+ metadata?: Record<string, unknown>;
69
+ }
70
+ interface MCPResource {
71
+ uri: string;
72
+ name: string;
73
+ description?: string;
74
+ mimeType?: string;
75
+ read: () => Promise<MCPResourceContent>;
76
+ metadata?: MCPResourceMetadata;
77
+ }
78
+ interface MCPResourceContent {
79
+ uri: string;
80
+ mimeType: string;
81
+ text?: string;
82
+ blob?: string;
83
+ metadata?: Record<string, unknown>;
84
+ }
85
+ interface MCPResourceMetadata {
86
+ size?: number;
87
+ lastModified?: Date;
88
+ etag?: string;
89
+ }
90
+ interface MCPTool {
91
+ name: string;
92
+ description: string;
93
+ inputSchema: unknown;
94
+ execute: (args: unknown, context: ExecutionContext) => Promise<MCPToolResult>;
95
+ metadata?: ToolMetadata;
96
+ }
97
+ interface MCPToolResult {
98
+ content: Array<{
99
+ type: string;
100
+ text?: string;
101
+ data?: unknown;
102
+ }>;
103
+ isError?: boolean;
104
+ metadata?: Record<string, unknown>;
105
+ }
106
+ interface Plugin {
107
+ name: string;
108
+ version: string;
109
+ description?: string;
110
+ initialize: (context: PluginContext) => Promise<void>;
111
+ destroy?: () => Promise<void>;
112
+ metadata?: PluginMetadata;
113
+ }
114
+ interface PluginMetadata {
115
+ author?: string;
116
+ homepage?: string;
117
+ repository?: string;
118
+ license?: string;
119
+ dependencies?: string[];
120
+ }
121
+ interface PluginContext {
122
+ agent: Agent;
123
+ registerSkill: (skill: Skill) => void;
124
+ registerTool: (tool: Tool) => void;
125
+ registerMCPResource: (resource: MCPResource) => void;
126
+ registerMCPTool: (tool: MCPTool) => void;
127
+ getLLMProvider: () => LLMProvider | undefined;
128
+ config: Record<string, unknown>;
129
+ }
130
+ interface AgentConfig {
131
+ name: string;
132
+ description?: string;
133
+ version?: string;
134
+ llmProvider?: LLMProvider;
135
+ systemPrompt?: string;
136
+ maxIterations?: number;
137
+ skills?: Skill[];
138
+ tools?: Tool[];
139
+ plugins?: Plugin[];
140
+ mcpResources?: MCPResource[];
141
+ mcpTools?: MCPTool[];
142
+ middlewares?: AgentMiddleware[];
143
+ hooks?: AgentHooks;
144
+ }
145
+ interface AgentHooks {
146
+ beforeSkillExecution?: (skillName: string, params: Record<string, unknown>) => Promise<void>;
147
+ afterSkillExecution?: (skillName: string, result: SkillResult) => Promise<void>;
148
+ onError?: (error: Error, context: ExecutionContext) => Promise<void>;
149
+ onToolCall?: (toolName: string, args: unknown) => Promise<void>;
150
+ }
151
+ type AgentMiddleware = (context: ExecutionContext, next: () => Promise<SkillResult>) => Promise<SkillResult>;
152
+ declare class Agent {
153
+ private config;
154
+ private _skills;
155
+ private _tools;
156
+ private _plugins;
157
+ private _mcpResources;
158
+ private _mcpTools;
159
+ private _middlewares;
160
+ private _initialized;
161
+ readonly name: string;
162
+ readonly description?: string;
163
+ readonly version?: string;
164
+ llmProvider?: LLMProvider;
165
+ systemPrompt?: string;
166
+ maxIterations: number;
167
+ hooks?: AgentHooks;
168
+ constructor(config: AgentConfig);
169
+ initialize(): Promise<void>;
170
+ registerSkill(skill: Skill): void;
171
+ registerTool(tool: Tool): void;
172
+ registerMCPResource(resource: MCPResource): void;
173
+ registerMCPTool(tool: MCPTool): void;
174
+ use(middleware: AgentMiddleware): void;
175
+ executeSkill(name: string, params?: Record<string, unknown>): Promise<SkillResult>;
176
+ executeTool(name: string, input: unknown): Promise<ToolOutput>;
177
+ readMCPResource(uri: string): Promise<MCPResourceContent | null>;
178
+ executeMCPTool(name: string, args: unknown): Promise<MCPToolResult>;
179
+ chat(messages: LLMMessage[], options?: Partial<LLMRequest>): Promise<LLMResponse>;
180
+ streamChat(messages: LLMMessage[], options?: Partial<LLMRequest>): AsyncIterableIterator<LLMStreamChunk>;
181
+ executeWithTools(messages: LLMMessage[], tools?: ToolDefinition[]): Promise<LLMResponse>;
182
+ getSkill(name: string): Skill | undefined;
183
+ getTool(name: string): Tool | undefined;
184
+ getMCPResource(uri: string): MCPResource | undefined;
185
+ getMCPTool(name: string): MCPTool | undefined;
186
+ getPlugin(name: string): Plugin | undefined;
187
+ getSkillNames(): string[];
188
+ getToolNames(): string[];
189
+ getMCPResourceURIs(): string[];
190
+ getMCPToolNames(): string[];
191
+ getPluginNames(): string[];
192
+ getAllSkills(): Skill[];
193
+ getAllTools(): Tool[];
194
+ destroy(): Promise<void>;
195
+ }
196
+
197
+ export { Agent as A, type ExecutionContext as E, type MCPResource as M, type Plugin as P, type Skill as S, type Tool as T, type SkillResult as a, type AgentConfig as b, type PluginContext as c, type AgentHooks as d, type AgentMiddleware as e, type MCPResourceContent as f, type MCPResourceMetadata as g, type MCPTool as h, type MCPToolResult as i, type ParameterProperty as j, type ParameterSchema as k, type PluginMetadata as l, type SkillHandler as m, type SkillMetadata as n, type ToolExecutor as o, type ToolMetadata as p, type ToolOutput as q };
@@ -0,0 +1,276 @@
1
+ // src/tools/registry.ts
2
+ var ToolRegistry = class {
3
+ tools = /* @__PURE__ */ new Map();
4
+ categories = /* @__PURE__ */ new Map();
5
+ constructor(_config = {}) {
6
+ void _config;
7
+ }
8
+ register(tool) {
9
+ this.tools.set(tool.name, tool);
10
+ if (tool.metadata?.category) {
11
+ const category = tool.metadata.category;
12
+ if (!this.categories.has(category)) {
13
+ this.categories.set(category, /* @__PURE__ */ new Set());
14
+ }
15
+ this.categories.get(category).add(tool.name);
16
+ }
17
+ }
18
+ unregister(name) {
19
+ const tool = this.tools.get(name);
20
+ if (!tool) return false;
21
+ if (tool.metadata?.category) {
22
+ this.categories.get(tool.metadata.category)?.delete(name);
23
+ }
24
+ return this.tools.delete(name);
25
+ }
26
+ get(name) {
27
+ return this.tools.get(name);
28
+ }
29
+ has(name) {
30
+ return this.tools.has(name);
31
+ }
32
+ list() {
33
+ return Array.from(this.tools.values());
34
+ }
35
+ listNames() {
36
+ return Array.from(this.tools.keys());
37
+ }
38
+ findByCategory(category) {
39
+ const names = this.categories.get(category);
40
+ if (!names) return [];
41
+ return Array.from(names).map((name) => this.tools.get(name)).filter((tool) => tool !== void 0);
42
+ }
43
+ findByTag(tag) {
44
+ return this.list().filter((tool) => tool.metadata?.tags?.includes(tag));
45
+ }
46
+ findByConfirmation(needsConfirmation) {
47
+ return this.list().filter(
48
+ (tool) => (tool.metadata?.requiresConfirmation ?? false) === needsConfirmation
49
+ );
50
+ }
51
+ search(query) {
52
+ const lowerQuery = query.toLowerCase();
53
+ return this.list().filter(
54
+ (tool) => tool.name.toLowerCase().includes(lowerQuery) || tool.description.toLowerCase().includes(lowerQuery) || tool.metadata?.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery))
55
+ );
56
+ }
57
+ async execute(name, input, context) {
58
+ const tool = this.tools.get(name);
59
+ if (!tool) {
60
+ return {
61
+ content: [{ type: "error", text: `Tool '${name}' not found in registry` }],
62
+ isError: true
63
+ };
64
+ }
65
+ return tool.execute(input, context);
66
+ }
67
+ clear() {
68
+ this.tools.clear();
69
+ this.categories.clear();
70
+ }
71
+ getCategories() {
72
+ return Array.from(this.categories.keys());
73
+ }
74
+ getStats() {
75
+ return {
76
+ total: this.tools.size,
77
+ categories: this.categories.size,
78
+ requireConfirmation: this.list().filter((t) => t.metadata?.requiresConfirmation).length
79
+ };
80
+ }
81
+ };
82
+
83
+ // src/tools/builtin.ts
84
+ var fileReadTool = {
85
+ name: "file_read",
86
+ description: "Read content from a file (Node.js only)",
87
+ parameters: {
88
+ type: "object",
89
+ properties: {
90
+ path: {
91
+ type: "string",
92
+ description: "Path to the file"
93
+ },
94
+ encoding: {
95
+ type: "string",
96
+ description: "File encoding",
97
+ default: "utf-8"
98
+ }
99
+ },
100
+ required: ["path"]
101
+ },
102
+ execute: async (input) => {
103
+ if (typeof window !== "undefined") {
104
+ return {
105
+ content: [{ type: "error", text: "File operations not supported in browser" }],
106
+ isError: true
107
+ };
108
+ }
109
+ try {
110
+ const fs = await import("fs/promises");
111
+ const { path, encoding = "utf-8" } = input;
112
+ const content = await fs.readFile(path, { encoding });
113
+ return {
114
+ content: [{ type: "text", text: content }]
115
+ };
116
+ } catch (error) {
117
+ return {
118
+ content: [
119
+ {
120
+ type: "error",
121
+ text: error instanceof Error ? error.message : "Failed to read file"
122
+ }
123
+ ],
124
+ isError: true
125
+ };
126
+ }
127
+ },
128
+ metadata: {
129
+ category: "filesystem",
130
+ tags: ["file", "read"],
131
+ version: "1.0.0"
132
+ }
133
+ };
134
+ var fileWriteTool = {
135
+ name: "file_write",
136
+ description: "Write content to a file (Node.js only)",
137
+ parameters: {
138
+ type: "object",
139
+ properties: {
140
+ path: {
141
+ type: "string",
142
+ description: "Path to the file"
143
+ },
144
+ content: {
145
+ type: "string",
146
+ description: "Content to write"
147
+ },
148
+ encoding: {
149
+ type: "string",
150
+ description: "File encoding",
151
+ default: "utf-8"
152
+ }
153
+ },
154
+ required: ["path", "content"]
155
+ },
156
+ execute: async (input) => {
157
+ if (typeof window !== "undefined") {
158
+ return {
159
+ content: [{ type: "error", text: "File operations not supported in browser" }],
160
+ isError: true
161
+ };
162
+ }
163
+ try {
164
+ const fs = await import("fs/promises");
165
+ const {
166
+ path,
167
+ content,
168
+ encoding = "utf-8"
169
+ } = input;
170
+ await fs.writeFile(path, content, { encoding });
171
+ return {
172
+ content: [{ type: "text", text: `Successfully wrote to ${path}` }]
173
+ };
174
+ } catch (error) {
175
+ return {
176
+ content: [
177
+ {
178
+ type: "error",
179
+ text: error instanceof Error ? error.message : "Failed to write file"
180
+ }
181
+ ],
182
+ isError: true
183
+ };
184
+ }
185
+ },
186
+ metadata: {
187
+ category: "filesystem",
188
+ tags: ["file", "write"],
189
+ requiresConfirmation: true,
190
+ version: "1.0.0"
191
+ }
192
+ };
193
+ var httpRequestTool = {
194
+ name: "http_request",
195
+ description: "Make HTTP requests",
196
+ parameters: {
197
+ type: "object",
198
+ properties: {
199
+ url: {
200
+ type: "string",
201
+ description: "URL to request"
202
+ },
203
+ method: {
204
+ type: "string",
205
+ description: "HTTP method",
206
+ enum: ["GET", "POST", "PUT", "DELETE", "PATCH"],
207
+ default: "GET"
208
+ },
209
+ headers: {
210
+ type: "object",
211
+ description: "Request headers"
212
+ },
213
+ body: {
214
+ type: "string",
215
+ description: "Request body"
216
+ }
217
+ },
218
+ required: ["url"]
219
+ },
220
+ execute: async (input) => {
221
+ try {
222
+ const {
223
+ url,
224
+ method = "GET",
225
+ headers,
226
+ body
227
+ } = input;
228
+ const response = await fetch(url, {
229
+ method,
230
+ headers,
231
+ body
232
+ });
233
+ const text = await response.text();
234
+ return {
235
+ content: [
236
+ {
237
+ type: "text",
238
+ text: `Status: ${response.status}
239
+
240
+ ${text}`
241
+ }
242
+ ],
243
+ metadata: {
244
+ status: response.status,
245
+ statusText: response.statusText,
246
+ headers: Object.fromEntries(response.headers.entries())
247
+ }
248
+ };
249
+ } catch (error) {
250
+ return {
251
+ content: [
252
+ {
253
+ type: "error",
254
+ text: error instanceof Error ? error.message : "HTTP request failed"
255
+ }
256
+ ],
257
+ isError: true
258
+ };
259
+ }
260
+ },
261
+ metadata: {
262
+ category: "network",
263
+ tags: ["http", "request", "api"],
264
+ version: "1.0.0"
265
+ }
266
+ };
267
+ var builtInTools = [fileReadTool, fileWriteTool, httpRequestTool];
268
+
269
+ export {
270
+ ToolRegistry,
271
+ fileReadTool,
272
+ fileWriteTool,
273
+ httpRequestTool,
274
+ builtInTools
275
+ };
276
+ //# sourceMappingURL=chunk-7W2JJCSS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/tools/registry.ts","../../src/tools/builtin.ts"],"sourcesContent":["/**\n * Tool Registry for managing and discovering tools\n */\n\nimport { Tool, ToolOutput, ExecutionContext } from '../core/agent';\n\nexport interface ToolRegistryConfig {\n autoDiscover?: boolean;\n toolDirectory?: string;\n}\n\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n private categories = new Map<string, Set<string>>();\n\n constructor(_config: ToolRegistryConfig = {}) {\n // Config stored for future use\n void _config;\n }\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n\n // Categorize tool\n if (tool.metadata?.category) {\n const category = tool.metadata.category;\n if (!this.categories.has(category)) {\n this.categories.set(category, new Set());\n }\n this.categories.get(category)!.add(tool.name);\n }\n }\n\n unregister(name: string): boolean {\n const tool = this.tools.get(name);\n if (!tool) return false;\n\n // Remove from categories\n if (tool.metadata?.category) {\n this.categories.get(tool.metadata.category)?.delete(name);\n }\n\n return this.tools.delete(name);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n listNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n findByCategory(category: string): Tool[] {\n const names = this.categories.get(category);\n if (!names) return [];\n return Array.from(names)\n .map(name => this.tools.get(name))\n .filter((tool): tool is Tool => tool !== undefined);\n }\n\n findByTag(tag: string): Tool[] {\n return this.list().filter(tool => tool.metadata?.tags?.includes(tag));\n }\n\n findByConfirmation(needsConfirmation: boolean): Tool[] {\n return this.list().filter(\n tool => (tool.metadata?.requiresConfirmation ?? false) === needsConfirmation\n );\n }\n\n search(query: string): Tool[] {\n const lowerQuery = query.toLowerCase();\n return this.list().filter(\n tool =>\n tool.name.toLowerCase().includes(lowerQuery) ||\n tool.description.toLowerCase().includes(lowerQuery) ||\n tool.metadata?.tags?.some(tag => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n async execute(name: string, input: unknown, context: ExecutionContext): Promise<ToolOutput> {\n const tool = this.tools.get(name);\n if (!tool) {\n return {\n content: [{ type: 'error', text: `Tool '${name}' not found in registry` }],\n isError: true,\n };\n }\n return tool.execute(input, context);\n }\n\n clear(): void {\n this.tools.clear();\n this.categories.clear();\n }\n\n getCategories(): string[] {\n return Array.from(this.categories.keys());\n }\n\n getStats(): { total: number; categories: number; requireConfirmation: number } {\n return {\n total: this.tools.size,\n categories: this.categories.size,\n requireConfirmation: this.list().filter(t => t.metadata?.requiresConfirmation).length,\n };\n }\n}\n","/**\n * Built-in Tools\n */\n\nimport { Tool } from '../core/agent';\n\nexport const fileReadTool: Tool = {\n name: 'file_read',\n description: 'Read content from a file (Node.js only)',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file',\n },\n encoding: {\n type: 'string',\n description: 'File encoding',\n default: 'utf-8',\n },\n },\n required: ['path'],\n },\n execute: async input => {\n // Check if running in Node.js\n if (typeof window !== 'undefined') {\n return {\n content: [{ type: 'error', text: 'File operations not supported in browser' }],\n isError: true,\n };\n }\n\n try {\n // Dynamic import to avoid browser bundling issues\n const fs = await import('fs/promises');\n const { path, encoding = 'utf-8' } = input as { path: string; encoding?: string };\n const content = await fs.readFile(path, { encoding: encoding as BufferEncoding });\n return {\n content: [{ type: 'text', text: content }],\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'error',\n text: error instanceof Error ? error.message : 'Failed to read file',\n },\n ],\n isError: true,\n };\n }\n },\n metadata: {\n category: 'filesystem',\n tags: ['file', 'read'],\n version: '1.0.0',\n },\n};\n\nexport const fileWriteTool: Tool = {\n name: 'file_write',\n description: 'Write content to a file (Node.js only)',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file',\n },\n content: {\n type: 'string',\n description: 'Content to write',\n },\n encoding: {\n type: 'string',\n description: 'File encoding',\n default: 'utf-8',\n },\n },\n required: ['path', 'content'],\n },\n execute: async input => {\n if (typeof window !== 'undefined') {\n return {\n content: [{ type: 'error', text: 'File operations not supported in browser' }],\n isError: true,\n };\n }\n\n try {\n const fs = await import('fs/promises');\n const {\n path,\n content,\n encoding = 'utf-8',\n } = input as {\n path: string;\n content: string;\n encoding?: string;\n };\n await fs.writeFile(path, content, { encoding: encoding as BufferEncoding });\n return {\n content: [{ type: 'text', text: `Successfully wrote to ${path}` }],\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'error',\n text: error instanceof Error ? error.message : 'Failed to write file',\n },\n ],\n isError: true,\n };\n }\n },\n metadata: {\n category: 'filesystem',\n tags: ['file', 'write'],\n requiresConfirmation: true,\n version: '1.0.0',\n },\n};\n\nexport const httpRequestTool: Tool = {\n name: 'http_request',\n description: 'Make HTTP requests',\n parameters: {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description: 'URL to request',\n },\n method: {\n type: 'string',\n description: 'HTTP method',\n enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],\n default: 'GET',\n },\n headers: {\n type: 'object',\n description: 'Request headers',\n },\n body: {\n type: 'string',\n description: 'Request body',\n },\n },\n required: ['url'],\n },\n execute: async input => {\n try {\n const {\n url,\n method = 'GET',\n headers,\n body,\n } = input as {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n };\n\n const response = await fetch(url, {\n method,\n headers,\n body,\n });\n\n const text = await response.text();\n\n return {\n content: [\n {\n type: 'text',\n text: `Status: ${response.status}\\n\\n${text}`,\n },\n ],\n metadata: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'error',\n text: error instanceof Error ? error.message : 'HTTP request failed',\n },\n ],\n isError: true,\n };\n }\n },\n metadata: {\n category: 'network',\n tags: ['http', 'request', 'api'],\n version: '1.0.0',\n },\n};\n\nexport const builtInTools = [fileReadTool, fileWriteTool, httpRequestTool];\n"],"mappings":"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","names":[]}
@@ -0,0 +1,144 @@
1
+ // src/mcp/protocol.ts
2
+ var MCPClient = class {
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ resources = /* @__PURE__ */ new Map();
7
+ tools = /* @__PURE__ */ new Map();
8
+ async connect() {
9
+ const headers = {
10
+ "Content-Type": "application/json"
11
+ };
12
+ if (this.config.auth?.type === "bearer") {
13
+ headers["Authorization"] = `Bearer ${this.config.auth.token}`;
14
+ } else if (this.config.auth?.type === "apiKey") {
15
+ headers["X-API-Key"] = this.config.auth.token;
16
+ }
17
+ const response = await fetch(`${this.config.url}/capabilities`, { headers });
18
+ if (!response.ok) {
19
+ throw new Error(`Failed to connect to MCP server: ${response.status}`);
20
+ }
21
+ const capabilities = await response.json();
22
+ for (const resource of capabilities.resources || []) {
23
+ this.resources.set(resource.uri, this.createRemoteResource(resource, headers));
24
+ }
25
+ for (const tool of capabilities.tools || []) {
26
+ this.tools.set(tool.name, this.createRemoteTool(tool, headers));
27
+ }
28
+ }
29
+ createRemoteResource(resource, headers) {
30
+ return {
31
+ uri: resource.uri,
32
+ name: resource.name,
33
+ description: resource.description,
34
+ mimeType: resource.mimeType,
35
+ read: async () => {
36
+ const response = await fetch(
37
+ `${this.config.url}/resources/${encodeURIComponent(resource.uri)}`,
38
+ {
39
+ headers
40
+ }
41
+ );
42
+ if (!response.ok) {
43
+ throw new Error(`Failed to read resource: ${response.status}`);
44
+ }
45
+ const content = await response.json();
46
+ return content;
47
+ }
48
+ };
49
+ }
50
+ createRemoteTool(tool, headers) {
51
+ return {
52
+ name: tool.name,
53
+ description: tool.description,
54
+ inputSchema: tool.inputSchema,
55
+ execute: async (args) => {
56
+ const response = await fetch(
57
+ `${this.config.url}/tools/${encodeURIComponent(tool.name)}`,
58
+ {
59
+ method: "POST",
60
+ headers,
61
+ body: JSON.stringify(args)
62
+ }
63
+ );
64
+ if (!response.ok) {
65
+ throw new Error(`Failed to execute tool: ${response.status}`);
66
+ }
67
+ const result = await response.json();
68
+ return result;
69
+ }
70
+ };
71
+ }
72
+ getResources() {
73
+ return Array.from(this.resources.values());
74
+ }
75
+ getTools() {
76
+ return Array.from(this.tools.values());
77
+ }
78
+ getResource(uri) {
79
+ return this.resources.get(uri);
80
+ }
81
+ getTool(name) {
82
+ return this.tools.get(name);
83
+ }
84
+ };
85
+ var MCPServer = class {
86
+ constructor(config) {
87
+ this.config = config;
88
+ config.resources?.forEach((resource) => this.registerResource(resource));
89
+ config.tools?.forEach((tool) => this.registerTool(tool));
90
+ }
91
+ resources = /* @__PURE__ */ new Map();
92
+ tools = /* @__PURE__ */ new Map();
93
+ registerResource(resource) {
94
+ this.resources.set(resource.uri, resource);
95
+ }
96
+ registerTool(tool) {
97
+ this.tools.set(tool.name, tool);
98
+ }
99
+ unregisterResource(uri) {
100
+ return this.resources.delete(uri);
101
+ }
102
+ unregisterTool(name) {
103
+ return this.tools.delete(name);
104
+ }
105
+ getCapabilities() {
106
+ return {
107
+ name: this.config.name,
108
+ version: this.config.version,
109
+ resources: Array.from(this.resources.values()).map((r) => ({
110
+ uri: r.uri,
111
+ name: r.name,
112
+ description: r.description,
113
+ mimeType: r.mimeType
114
+ })),
115
+ tools: Array.from(this.tools.values()).map((t) => ({
116
+ name: t.name,
117
+ description: t.description,
118
+ inputSchema: t.inputSchema
119
+ }))
120
+ };
121
+ }
122
+ async readResource(uri) {
123
+ const resource = this.resources.get(uri);
124
+ if (!resource) return null;
125
+ return resource.read();
126
+ }
127
+ async executeTool(name, args) {
128
+ const tool = this.tools.get(name);
129
+ if (!tool) return null;
130
+ const context = {
131
+ agent: {},
132
+ // Placeholder, should be provided by caller
133
+ skillName: name,
134
+ timestamp: /* @__PURE__ */ new Date()
135
+ };
136
+ return tool.execute(args, context);
137
+ }
138
+ };
139
+
140
+ export {
141
+ MCPClient,
142
+ MCPServer
143
+ };
144
+ //# sourceMappingURL=chunk-BHRFRGR7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mcp/protocol.ts"],"sourcesContent":["/**\n * MCP (Model Context Protocol) Implementation\n * https://modelcontextprotocol.io\n */\n\nimport {\n MCPResource,\n MCPResourceContent,\n MCPTool,\n MCPToolResult,\n ExecutionContext,\n} from '../core/agent';\n\n// MCP Server Configuration\nexport interface MCPServerConfig {\n name: string;\n version: string;\n resources?: MCPResource[];\n tools?: MCPTool[];\n}\n\n// MCP Client for connecting to external MCP servers\nexport interface MCPClientConfig {\n url: string;\n auth?: {\n type: 'bearer' | 'apiKey';\n token: string;\n };\n}\n\nexport class MCPClient {\n private resources = new Map<string, MCPResource>();\n private tools = new Map<string, MCPTool>();\n\n constructor(private config: MCPClientConfig) {}\n\n async connect(): Promise<void> {\n // Fetch server capabilities\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.auth?.type === 'bearer') {\n headers['Authorization'] = `Bearer ${this.config.auth.token}`;\n } else if (this.config.auth?.type === 'apiKey') {\n headers['X-API-Key'] = this.config.auth.token;\n }\n\n const response = await fetch(`${this.config.url}/capabilities`, { headers });\n\n if (!response.ok) {\n throw new Error(`Failed to connect to MCP server: ${response.status}`);\n }\n\n const capabilities = await response.json();\n\n // Register remote resources\n for (const resource of capabilities.resources || []) {\n this.resources.set(resource.uri, this.createRemoteResource(resource, headers));\n }\n\n // Register remote tools\n for (const tool of capabilities.tools || []) {\n this.tools.set(tool.name, this.createRemoteTool(tool, headers));\n }\n }\n\n private createRemoteResource(\n resource: Record<string, unknown>,\n headers: Record<string, string>\n ): MCPResource {\n return {\n uri: resource.uri as string,\n name: resource.name as string,\n description: resource.description as string,\n mimeType: resource.mimeType as string,\n read: async () => {\n const response = await fetch(\n `${this.config.url}/resources/${encodeURIComponent(resource.uri as string)}`,\n {\n headers,\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to read resource: ${response.status}`);\n }\n\n const content = await response.json();\n return content as MCPResourceContent;\n },\n };\n }\n\n private createRemoteTool(\n tool: Record<string, unknown>,\n headers: Record<string, string>\n ): MCPTool {\n return {\n name: tool.name as string,\n description: tool.description as string,\n inputSchema: tool.inputSchema,\n execute: async args => {\n const response = await fetch(\n `${this.config.url}/tools/${encodeURIComponent(tool.name as string)}`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(args),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to execute tool: ${response.status}`);\n }\n\n const result = await response.json();\n return result as MCPToolResult;\n },\n };\n }\n\n getResources(): MCPResource[] {\n return Array.from(this.resources.values());\n }\n\n getTools(): MCPTool[] {\n return Array.from(this.tools.values());\n }\n\n getResource(uri: string): MCPResource | undefined {\n return this.resources.get(uri);\n }\n\n getTool(name: string): MCPTool | undefined {\n return this.tools.get(name);\n }\n}\n\n// MCP Server for exposing local resources and tools\nexport class MCPServer {\n private resources = new Map<string, MCPResource>();\n private tools = new Map<string, MCPTool>();\n\n constructor(private config: MCPServerConfig) {\n // Register initial resources and tools\n config.resources?.forEach(resource => this.registerResource(resource));\n config.tools?.forEach(tool => this.registerTool(tool));\n }\n\n registerResource(resource: MCPResource): void {\n this.resources.set(resource.uri, resource);\n }\n\n registerTool(tool: MCPTool): void {\n this.tools.set(tool.name, tool);\n }\n\n unregisterResource(uri: string): boolean {\n return this.resources.delete(uri);\n }\n\n unregisterTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getCapabilities(): {\n name: string;\n version: string;\n resources: Array<{ uri: string; name: string; description?: string; mimeType?: string }>;\n tools: Array<{ name: string; description: string; inputSchema: unknown }>;\n } {\n return {\n name: this.config.name,\n version: this.config.version,\n resources: Array.from(this.resources.values()).map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n })),\n tools: Array.from(this.tools.values()).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n };\n }\n\n async readResource(uri: string): Promise<MCPResourceContent | null> {\n const resource = this.resources.get(uri);\n if (!resource) return null;\n return resource.read();\n }\n\n async executeTool(name: string, args: unknown): Promise<MCPToolResult | null> {\n const tool = this.tools.get(name);\n if (!tool) return null;\n\n const context: ExecutionContext = {\n agent: {} as any, // Placeholder, should be provided by caller\n skillName: name,\n timestamp: new Date(),\n };\n\n return tool.execute(args, context);\n }\n}\n"],"mappings":"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","names":[]}