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.
- package/README.md +228 -0
- package/README.zh.md +228 -0
- package/dist/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/agent-kexkkI13.d.cts +197 -0
- package/dist/browser/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/browser/chunk-7W2JJCSS.js +276 -0
- package/dist/browser/chunk-7W2JJCSS.js.map +1 -0
- package/dist/browser/chunk-BHRFRGR7.js +144 -0
- package/dist/browser/chunk-BHRFRGR7.js.map +1 -0
- package/dist/browser/chunk-CLP6UNSV.js +285 -0
- package/dist/browser/chunk-CLP6UNSV.js.map +1 -0
- package/dist/browser/chunk-HXLRBB7S.js +1569 -0
- package/dist/browser/chunk-HXLRBB7S.js.map +1 -0
- package/dist/browser/chunk-VJEFLRZT.js +1720 -0
- package/dist/browser/chunk-VJEFLRZT.js.map +1 -0
- package/dist/browser/index.d.ts +842 -0
- package/dist/browser/index.js +3293 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/llm/index.d.ts +235 -0
- package/dist/browser/llm/index.js +29 -0
- package/dist/browser/llm/index.js.map +1 -0
- package/dist/browser/mcp/index.d.ts +63 -0
- package/dist/browser/mcp/index.js +9 -0
- package/dist/browser/mcp/index.js.map +1 -0
- package/dist/browser/provider-Dna36xA-.d.ts +105 -0
- package/dist/browser/skills/index.d.ts +401 -0
- package/dist/browser/skills/index.js +31 -0
- package/dist/browser/skills/index.js.map +1 -0
- package/dist/browser/storage/index.d.ts +64 -0
- package/dist/browser/storage/index.js +15 -0
- package/dist/browser/storage/index.js.map +1 -0
- package/dist/browser/tools/index.d.ts +45 -0
- package/dist/browser/tools/index.js +15 -0
- package/dist/browser/tools/index.js.map +1 -0
- package/dist/browser/types-CG5I-byI.d.ts +30 -0
- package/dist/chunk-56J3IBXZ.js +144 -0
- package/dist/chunk-56J3IBXZ.js.map +1 -0
- package/dist/chunk-5XTVS5MB.js +1720 -0
- package/dist/chunk-5XTVS5MB.js.map +1 -0
- package/dist/chunk-6AYIRBGI.js +166 -0
- package/dist/chunk-6AYIRBGI.js.map +1 -0
- package/dist/chunk-C2EYJHXW.cjs +276 -0
- package/dist/chunk-C2EYJHXW.cjs.map +1 -0
- package/dist/chunk-HOZQ445W.cjs +166 -0
- package/dist/chunk-HOZQ445W.cjs.map +1 -0
- package/dist/chunk-KZNZ6CGD.cjs +144 -0
- package/dist/chunk-KZNZ6CGD.cjs.map +1 -0
- package/dist/chunk-XFMT5ZA4.js +276 -0
- package/dist/chunk-XFMT5ZA4.js.map +1 -0
- package/dist/chunk-XPGICLEJ.cjs +1720 -0
- package/dist/chunk-XPGICLEJ.cjs.map +1 -0
- package/dist/index.cjs +1311 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +395 -0
- package/dist/index.d.ts +395 -0
- package/dist/index.js +1311 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.cjs +29 -0
- package/dist/llm/index.cjs.map +1 -0
- package/dist/llm/index.d.cts +235 -0
- package/dist/llm/index.d.ts +235 -0
- package/dist/llm/index.js +29 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/index.cjs +9 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +63 -0
- package/dist/mcp/index.d.ts +63 -0
- package/dist/mcp/index.js +9 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/node/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/node/agent-kexkkI13.d.cts +197 -0
- package/dist/node/chunk-7W2JJCSS.js +276 -0
- package/dist/node/chunk-7W2JJCSS.js.map +1 -0
- package/dist/node/chunk-BHRFRGR7.js +144 -0
- package/dist/node/chunk-BHRFRGR7.js.map +1 -0
- package/dist/node/chunk-CLP6UNSV.js +285 -0
- package/dist/node/chunk-CLP6UNSV.js.map +1 -0
- package/dist/node/chunk-HXLRBB7S.js +1569 -0
- package/dist/node/chunk-HXLRBB7S.js.map +1 -0
- package/dist/node/chunk-IYG37UN3.cjs +144 -0
- package/dist/node/chunk-IYG37UN3.cjs.map +1 -0
- package/dist/node/chunk-JF33ZOMB.cjs +285 -0
- package/dist/node/chunk-JF33ZOMB.cjs.map +1 -0
- package/dist/node/chunk-KXXS33G3.cjs +276 -0
- package/dist/node/chunk-KXXS33G3.cjs.map +1 -0
- package/dist/node/chunk-MTFOABGC.cjs +1720 -0
- package/dist/node/chunk-MTFOABGC.cjs.map +1 -0
- package/dist/node/chunk-VJEFLRZT.js +1720 -0
- package/dist/node/chunk-VJEFLRZT.js.map +1 -0
- package/dist/node/chunk-YDHQCPSN.cjs +1569 -0
- package/dist/node/chunk-YDHQCPSN.cjs.map +1 -0
- package/dist/node/index.cjs +3293 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +842 -0
- package/dist/node/index.d.ts +842 -0
- package/dist/node/index.js +3293 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/llm/index.cjs +29 -0
- package/dist/node/llm/index.cjs.map +1 -0
- package/dist/node/llm/index.d.cts +235 -0
- package/dist/node/llm/index.d.ts +235 -0
- package/dist/node/llm/index.js +29 -0
- package/dist/node/llm/index.js.map +1 -0
- package/dist/node/mcp/index.cjs +9 -0
- package/dist/node/mcp/index.cjs.map +1 -0
- package/dist/node/mcp/index.d.cts +63 -0
- package/dist/node/mcp/index.d.ts +63 -0
- package/dist/node/mcp/index.js +9 -0
- package/dist/node/mcp/index.js.map +1 -0
- package/dist/node/provider-Dna36xA-.d.cts +105 -0
- package/dist/node/provider-Dna36xA-.d.ts +105 -0
- package/dist/node/skills/index.cjs +31 -0
- package/dist/node/skills/index.cjs.map +1 -0
- package/dist/node/skills/index.d.cts +401 -0
- package/dist/node/skills/index.d.ts +401 -0
- package/dist/node/skills/index.js +31 -0
- package/dist/node/skills/index.js.map +1 -0
- package/dist/node/storage/index.cjs +15 -0
- package/dist/node/storage/index.cjs.map +1 -0
- package/dist/node/storage/index.d.cts +64 -0
- package/dist/node/storage/index.d.ts +64 -0
- package/dist/node/storage/index.js +15 -0
- package/dist/node/storage/index.js.map +1 -0
- package/dist/node/tools/index.cjs +15 -0
- package/dist/node/tools/index.cjs.map +1 -0
- package/dist/node/tools/index.d.cts +45 -0
- package/dist/node/tools/index.d.ts +45 -0
- package/dist/node/tools/index.js +15 -0
- package/dist/node/tools/index.js.map +1 -0
- package/dist/node/types-CG5I-byI.d.cts +30 -0
- package/dist/node/types-CG5I-byI.d.ts +30 -0
- package/dist/provider-Dna36xA-.d.cts +105 -0
- package/dist/provider-Dna36xA-.d.ts +105 -0
- package/dist/skills/index.cjs +15 -0
- package/dist/skills/index.cjs.map +1 -0
- package/dist/skills/index.d.cts +43 -0
- package/dist/skills/index.d.ts +43 -0
- package/dist/skills/index.js +15 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/tools/index.cjs +15 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +45 -0
- package/dist/tools/index.d.ts +45 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +150 -0
|
@@ -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":[]}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// src/storage/browser-adapter.ts
|
|
2
|
+
var BrowserStorageAdapter = class {
|
|
3
|
+
name = "browser";
|
|
4
|
+
isAvailable = typeof window !== "undefined";
|
|
5
|
+
dbName;
|
|
6
|
+
dbVersion = 1;
|
|
7
|
+
storeName = "files";
|
|
8
|
+
db = null;
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.dbName = config.prefix ? `${config.prefix}_agent_storage` : "agent_storage";
|
|
11
|
+
}
|
|
12
|
+
async getDB() {
|
|
13
|
+
if (this.db) return this.db;
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const request = indexedDB.open(this.dbName, this.dbVersion);
|
|
16
|
+
request.onerror = () => reject(request.error);
|
|
17
|
+
request.onsuccess = () => {
|
|
18
|
+
this.db = request.result;
|
|
19
|
+
resolve(this.db);
|
|
20
|
+
};
|
|
21
|
+
request.onupgradeneeded = () => {
|
|
22
|
+
const db = request.result;
|
|
23
|
+
if (!db.objectStoreNames.contains(this.storeName)) {
|
|
24
|
+
const store = db.createObjectStore(this.storeName, { keyPath: "path" });
|
|
25
|
+
store.createIndex("path", "path", { unique: true });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async readFile(path) {
|
|
31
|
+
try {
|
|
32
|
+
const db = await this.getDB();
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
35
|
+
const store = transaction.objectStore(this.storeName);
|
|
36
|
+
const request = store.get(path);
|
|
37
|
+
request.onerror = () => reject(request.error);
|
|
38
|
+
request.onsuccess = () => {
|
|
39
|
+
const file = request.result;
|
|
40
|
+
resolve(file ? file.content : null);
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
} catch {
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(path);
|
|
46
|
+
if (!response.ok) return null;
|
|
47
|
+
return await response.text();
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async writeFile(path, content) {
|
|
54
|
+
const db = await this.getDB();
|
|
55
|
+
const file = {
|
|
56
|
+
path,
|
|
57
|
+
content,
|
|
58
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
59
|
+
modifiedAt: /* @__PURE__ */ new Date(),
|
|
60
|
+
size: new Blob([content]).size
|
|
61
|
+
};
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const transaction = db.transaction([this.storeName], "readwrite");
|
|
64
|
+
const store = transaction.objectStore(this.storeName);
|
|
65
|
+
const request = store.put(file);
|
|
66
|
+
request.onerror = () => reject(request.error);
|
|
67
|
+
request.onsuccess = () => resolve();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async deleteFile(path) {
|
|
71
|
+
const db = await this.getDB();
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const transaction = db.transaction([this.storeName], "readwrite");
|
|
74
|
+
const store = transaction.objectStore(this.storeName);
|
|
75
|
+
const request = store.delete(path);
|
|
76
|
+
request.onerror = () => reject(request.error);
|
|
77
|
+
request.onsuccess = () => resolve();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async exists(path) {
|
|
81
|
+
try {
|
|
82
|
+
const db = await this.getDB();
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
85
|
+
const store = transaction.objectStore(this.storeName);
|
|
86
|
+
const request = store.count(path);
|
|
87
|
+
request.onerror = () => reject(request.error);
|
|
88
|
+
request.onsuccess = () => resolve(request.result > 0);
|
|
89
|
+
});
|
|
90
|
+
} catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async listDirectory(path) {
|
|
95
|
+
try {
|
|
96
|
+
const db = await this.getDB();
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
99
|
+
const store = transaction.objectStore(this.storeName);
|
|
100
|
+
const request = store.getAll();
|
|
101
|
+
request.onerror = () => reject(request.error);
|
|
102
|
+
request.onsuccess = () => {
|
|
103
|
+
const files = request.result;
|
|
104
|
+
const filtered = files.filter((file) => file.path.startsWith(path)).map((file) => file.path.replace(path, "").replace(/^\//, "")).filter((name) => !name.includes("/"));
|
|
105
|
+
resolve(filtered);
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
} catch {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async createDirectory(path) {
|
|
113
|
+
await this.writeFile(`${path}/.directory`, "");
|
|
114
|
+
}
|
|
115
|
+
async deleteDirectory(path) {
|
|
116
|
+
try {
|
|
117
|
+
const db = await this.getDB();
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const transaction = db.transaction([this.storeName], "readwrite");
|
|
120
|
+
const store = transaction.objectStore(this.storeName);
|
|
121
|
+
const request = store.getAll();
|
|
122
|
+
request.onerror = () => reject(request.error);
|
|
123
|
+
request.onsuccess = () => {
|
|
124
|
+
const files = request.result;
|
|
125
|
+
const toDelete = files.filter((file) => file.path.startsWith(path));
|
|
126
|
+
Promise.all(toDelete.map(
|
|
127
|
+
(file) => new Promise((res, rej) => {
|
|
128
|
+
const delReq = store.delete(file.path);
|
|
129
|
+
delReq.onerror = () => rej(delReq.error);
|
|
130
|
+
delReq.onsuccess = () => res();
|
|
131
|
+
})
|
|
132
|
+
)).then(() => resolve()).catch(reject);
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
} catch {
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async getMetadata(path) {
|
|
139
|
+
try {
|
|
140
|
+
const db = await this.getDB();
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
143
|
+
const store = transaction.objectStore(this.storeName);
|
|
144
|
+
const request = store.get(path);
|
|
145
|
+
request.onerror = () => reject(request.error);
|
|
146
|
+
request.onsuccess = () => {
|
|
147
|
+
const file = request.result;
|
|
148
|
+
if (!file) {
|
|
149
|
+
resolve(null);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
resolve({
|
|
153
|
+
path: file.path,
|
|
154
|
+
size: file.size,
|
|
155
|
+
createdAt: file.createdAt,
|
|
156
|
+
modifiedAt: file.modifiedAt,
|
|
157
|
+
isDirectory: path.endsWith("/.directory") || path.endsWith("/")
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
} catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// src/storage/node-adapter.ts
|
|
168
|
+
var NodeStorageAdapter = class {
|
|
169
|
+
constructor(config = {}) {
|
|
170
|
+
this.config = config;
|
|
171
|
+
}
|
|
172
|
+
name = "node";
|
|
173
|
+
isAvailable = typeof window === "undefined";
|
|
174
|
+
resolvePath(path) {
|
|
175
|
+
if (this.config.basePath) {
|
|
176
|
+
return `${this.config.basePath}/${path}`.replace(/\/+/g, "/");
|
|
177
|
+
}
|
|
178
|
+
return path;
|
|
179
|
+
}
|
|
180
|
+
async readFile(path) {
|
|
181
|
+
try {
|
|
182
|
+
const fs = await import("fs/promises");
|
|
183
|
+
const resolvedPath = this.resolvePath(path);
|
|
184
|
+
return await fs.readFile(resolvedPath, "utf-8");
|
|
185
|
+
} catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async writeFile(path, content) {
|
|
190
|
+
const fs = await import("fs/promises");
|
|
191
|
+
const resolvedPath = this.resolvePath(path);
|
|
192
|
+
const dir = resolvedPath.substring(0, resolvedPath.lastIndexOf("/"));
|
|
193
|
+
if (dir) {
|
|
194
|
+
await fs.mkdir(dir, { recursive: true });
|
|
195
|
+
}
|
|
196
|
+
await fs.writeFile(resolvedPath, content, "utf-8");
|
|
197
|
+
}
|
|
198
|
+
async deleteFile(path) {
|
|
199
|
+
try {
|
|
200
|
+
const fs = await import("fs/promises");
|
|
201
|
+
const resolvedPath = this.resolvePath(path);
|
|
202
|
+
await fs.unlink(resolvedPath);
|
|
203
|
+
} catch {
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async exists(path) {
|
|
207
|
+
try {
|
|
208
|
+
const fs = await import("fs/promises");
|
|
209
|
+
const resolvedPath = this.resolvePath(path);
|
|
210
|
+
await fs.access(resolvedPath);
|
|
211
|
+
return true;
|
|
212
|
+
} catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async listDirectory(path) {
|
|
217
|
+
try {
|
|
218
|
+
const fs = await import("fs/promises");
|
|
219
|
+
const resolvedPath = this.resolvePath(path);
|
|
220
|
+
const entries = await fs.readdir(resolvedPath, { withFileTypes: true });
|
|
221
|
+
return entries.filter((e) => e.isFile()).map((e) => e.name);
|
|
222
|
+
} catch {
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async createDirectory(path) {
|
|
227
|
+
try {
|
|
228
|
+
const fs = await import("fs/promises");
|
|
229
|
+
const resolvedPath = this.resolvePath(path);
|
|
230
|
+
await fs.mkdir(resolvedPath, { recursive: true });
|
|
231
|
+
} catch {
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async deleteDirectory(path) {
|
|
235
|
+
try {
|
|
236
|
+
const fs = await import("fs/promises");
|
|
237
|
+
const resolvedPath = this.resolvePath(path);
|
|
238
|
+
await fs.rm(resolvedPath, { recursive: true, force: true });
|
|
239
|
+
} catch {
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async getMetadata(path) {
|
|
243
|
+
try {
|
|
244
|
+
const fs = await import("fs/promises");
|
|
245
|
+
const resolvedPath = this.resolvePath(path);
|
|
246
|
+
const stats = await fs.stat(resolvedPath);
|
|
247
|
+
return {
|
|
248
|
+
path: resolvedPath,
|
|
249
|
+
size: stats.size,
|
|
250
|
+
createdAt: stats.birthtime,
|
|
251
|
+
modifiedAt: stats.mtime,
|
|
252
|
+
isDirectory: stats.isDirectory()
|
|
253
|
+
};
|
|
254
|
+
} catch {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
// src/storage/index.ts
|
|
261
|
+
function createStorage(config) {
|
|
262
|
+
if (typeof window !== "undefined") {
|
|
263
|
+
return new BrowserStorageAdapter(config);
|
|
264
|
+
}
|
|
265
|
+
return new NodeStorageAdapter(config);
|
|
266
|
+
}
|
|
267
|
+
var defaultStorage = null;
|
|
268
|
+
function getDefaultStorage(config) {
|
|
269
|
+
if (!defaultStorage) {
|
|
270
|
+
defaultStorage = createStorage(config);
|
|
271
|
+
}
|
|
272
|
+
return defaultStorage;
|
|
273
|
+
}
|
|
274
|
+
function resetDefaultStorage() {
|
|
275
|
+
defaultStorage = null;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export {
|
|
279
|
+
BrowserStorageAdapter,
|
|
280
|
+
NodeStorageAdapter,
|
|
281
|
+
createStorage,
|
|
282
|
+
getDefaultStorage,
|
|
283
|
+
resetDefaultStorage
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=chunk-CLP6UNSV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/storage/browser-adapter.ts","../../src/storage/node-adapter.ts","../../src/storage/index.ts"],"sourcesContent":["/**\r\n * Browser Storage Adapter\r\n * Uses IndexedDB for file-like storage and fetch for remote resources\r\n */\r\n\r\nimport { StorageAdapter, FileMetadata, StorageConfig } from './types';\r\n\r\ninterface IndexedDBFile {\r\n path: string;\r\n content: string;\r\n createdAt: Date;\r\n modifiedAt: Date;\r\n size: number;\r\n}\r\n\r\nexport class BrowserStorageAdapter implements StorageAdapter {\r\n readonly name = 'browser';\r\n readonly isAvailable = typeof window !== 'undefined';\r\n \r\n private dbName: string;\r\n private dbVersion = 1;\r\n private storeName = 'files';\r\n private db: IDBDatabase | null = null;\r\n\r\n constructor(config: StorageConfig = {}) {\r\n this.dbName = config.prefix ? `${config.prefix}_agent_storage` : 'agent_storage';\r\n }\r\n\r\n private async getDB(): Promise<IDBDatabase> {\r\n if (this.db) return this.db;\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.dbName, this.dbVersion);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve(this.db);\r\n };\r\n \r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(this.storeName)) {\r\n const store = db.createObjectStore(this.storeName, { keyPath: 'path' });\r\n store.createIndex('path', 'path', { unique: true });\r\n }\r\n };\r\n });\r\n }\r\n\r\n async readFile(path: string): Promise<string | null> {\r\n try {\r\n // Try local storage first\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.get(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const file = request.result as IndexedDBFile | undefined;\r\n resolve(file ? file.content : null);\r\n };\r\n });\r\n } catch {\r\n // Fallback to fetch for remote resources\r\n try {\r\n const response = await fetch(path);\r\n if (!response.ok) return null;\r\n return await response.text();\r\n } catch {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n async writeFile(path: string, content: string): Promise<void> {\r\n const db = await this.getDB();\r\n const file: IndexedDBFile = {\r\n path,\r\n content,\r\n createdAt: new Date(),\r\n modifiedAt: new Date(),\r\n size: new Blob([content]).size,\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.put(file);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve();\r\n });\r\n }\r\n\r\n async deleteFile(path: string): Promise<void> {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.delete(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve();\r\n });\r\n }\r\n\r\n async exists(path: string): Promise<boolean> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.count(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve(request.result > 0);\r\n });\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async listDirectory(path: string): Promise<string[]> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.getAll();\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const files = request.result as IndexedDBFile[];\r\n const filtered = files\r\n .filter(file => file.path.startsWith(path))\r\n .map(file => file.path.replace(path, '').replace(/^\\//, ''))\r\n .filter(name => !name.includes('/'));\r\n resolve(filtered);\r\n };\r\n });\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async createDirectory(path: string): Promise<void> {\r\n // In IndexedDB, directories are implicit from file paths\r\n // We create a placeholder file to mark the directory\r\n await this.writeFile(`${path}/.directory`, '');\r\n }\r\n\r\n async deleteDirectory(path: string): Promise<void> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.getAll();\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const files = request.result as IndexedDBFile[];\r\n const toDelete = files.filter(file => file.path.startsWith(path));\r\n \r\n Promise.all(toDelete.map(file => \r\n new Promise<void>((res, rej) => {\r\n const delReq = store.delete(file.path);\r\n delReq.onerror = () => rej(delReq.error);\r\n delReq.onsuccess = () => res();\r\n })\r\n )).then(() => resolve()).catch(reject);\r\n };\r\n });\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async getMetadata(path: string): Promise<FileMetadata | null> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.get(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const file = request.result as IndexedDBFile | undefined;\r\n if (!file) {\r\n resolve(null);\r\n return;\r\n }\r\n \r\n resolve({\r\n path: file.path,\r\n size: file.size,\r\n createdAt: file.createdAt,\r\n modifiedAt: file.modifiedAt,\r\n isDirectory: path.endsWith('/.directory') || path.endsWith('/'),\r\n });\r\n };\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }\r\n}","/**\r\n * Node.js Storage Adapter\r\n * Uses native fs module for file operations\r\n */\r\n\r\nimport { StorageAdapter, FileMetadata, StorageConfig } from './types';\r\n\r\nexport class NodeStorageAdapter implements StorageAdapter {\r\n readonly name = 'node';\r\n readonly isAvailable = typeof window === 'undefined';\r\n\r\n constructor(private config: StorageConfig = {}) {}\r\n\r\n private resolvePath(path: string): string {\r\n if (this.config.basePath) {\r\n return `${this.config.basePath}/${path}`.replace(/\\/+/g, '/');\r\n }\r\n return path;\r\n }\r\n\r\n async readFile(path: string): Promise<string | null> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n return await fs.readFile(resolvedPath, 'utf-8');\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async writeFile(path: string, content: string): Promise<void> {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n \r\n // Ensure directory exists\r\n const dir = resolvedPath.substring(0, resolvedPath.lastIndexOf('/'));\r\n if (dir) {\r\n await fs.mkdir(dir, { recursive: true });\r\n }\r\n \r\n await fs.writeFile(resolvedPath, content, 'utf-8');\r\n }\r\n\r\n async deleteFile(path: string): Promise<void> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.unlink(resolvedPath);\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async exists(path: string): Promise<boolean> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.access(resolvedPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async listDirectory(path: string): Promise<string[]> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n const entries = await fs.readdir(resolvedPath, { withFileTypes: true });\r\n return entries.filter(e => e.isFile()).map(e => e.name);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async createDirectory(path: string): Promise<void> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.mkdir(resolvedPath, { recursive: true });\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async deleteDirectory(path: string): Promise<void> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.rm(resolvedPath, { recursive: true, force: true });\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async getMetadata(path: string): Promise<FileMetadata | null> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n const stats = await fs.stat(resolvedPath);\r\n \r\n return {\r\n path: resolvedPath,\r\n size: stats.size,\r\n createdAt: stats.birthtime,\r\n modifiedAt: stats.mtime,\r\n isDirectory: stats.isDirectory(),\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * Storage Module\r\n * Unified storage interface for browser and Node.js environments\r\n */\r\n\r\nimport { StorageAdapter, StorageConfig } from './types';\r\nimport { BrowserStorageAdapter } from './browser-adapter';\r\nimport { NodeStorageAdapter } from './node-adapter';\r\n\r\nexport * from './types';\r\nexport { BrowserStorageAdapter } from './browser-adapter';\r\nexport { NodeStorageAdapter } from './node-adapter';\r\n\r\n/**\r\n * Create the appropriate storage adapter for the current environment\r\n */\r\nexport function createStorage(config?: StorageConfig): StorageAdapter {\r\n if (typeof window !== 'undefined') {\r\n return new BrowserStorageAdapter(config);\r\n }\r\n return new NodeStorageAdapter(config);\r\n}\r\n\r\n/**\r\n * Get the default storage adapter singleton\r\n */\r\nlet defaultStorage: StorageAdapter | null = null;\r\n\r\nexport function getDefaultStorage(config?: StorageConfig): StorageAdapter {\r\n if (!defaultStorage) {\r\n defaultStorage = createStorage(config);\r\n }\r\n return defaultStorage;\r\n}\r\n\r\n/**\r\n * Reset the default storage adapter (useful for testing)\r\n */\r\nexport function resetDefaultStorage(): void {\r\n defaultStorage = null;\r\n}\r\n"],"mappings":"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","names":[]}
|