@blackms/aistack 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 +244 -0
- package/dist/agents/definitions/analyst.d.ts +6 -0
- package/dist/agents/definitions/analyst.d.ts.map +1 -0
- package/dist/agents/definitions/analyst.js +53 -0
- package/dist/agents/definitions/analyst.js.map +1 -0
- package/dist/agents/definitions/architect.d.ts +6 -0
- package/dist/agents/definitions/architect.d.ts.map +1 -0
- package/dist/agents/definitions/architect.js +46 -0
- package/dist/agents/definitions/architect.js.map +1 -0
- package/dist/agents/definitions/coder.d.ts +6 -0
- package/dist/agents/definitions/coder.d.ts.map +1 -0
- package/dist/agents/definitions/coder.js +39 -0
- package/dist/agents/definitions/coder.js.map +1 -0
- package/dist/agents/definitions/coordinator.d.ts +6 -0
- package/dist/agents/definitions/coordinator.d.ts.map +1 -0
- package/dist/agents/definitions/coordinator.js +54 -0
- package/dist/agents/definitions/coordinator.js.map +1 -0
- package/dist/agents/definitions/index.d.ts +11 -0
- package/dist/agents/definitions/index.d.ts.map +1 -0
- package/dist/agents/definitions/index.js +11 -0
- package/dist/agents/definitions/index.js.map +1 -0
- package/dist/agents/definitions/researcher.d.ts +6 -0
- package/dist/agents/definitions/researcher.d.ts.map +1 -0
- package/dist/agents/definitions/researcher.js +39 -0
- package/dist/agents/definitions/researcher.js.map +1 -0
- package/dist/agents/definitions/reviewer.d.ts +6 -0
- package/dist/agents/definitions/reviewer.d.ts.map +1 -0
- package/dist/agents/definitions/reviewer.js +46 -0
- package/dist/agents/definitions/reviewer.js.map +1 -0
- package/dist/agents/definitions/tester.d.ts +6 -0
- package/dist/agents/definitions/tester.d.ts.map +1 -0
- package/dist/agents/definitions/tester.js +44 -0
- package/dist/agents/definitions/tester.js.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +7 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.d.ts +41 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +107 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/spawner.d.ts +62 -0
- package/dist/agents/spawner.d.ts.map +1 -0
- package/dist/agents/spawner.js +169 -0
- package/dist/agents/spawner.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +6 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +144 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/index.d.ts +10 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +10 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +50 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +82 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +6 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +157 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +6 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +146 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +115 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/coordination/index.d.ts +7 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +7 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/message-bus.d.ts +64 -0
- package/dist/coordination/message-bus.d.ts.map +1 -0
- package/dist/coordination/message-bus.js +148 -0
- package/dist/coordination/message-bus.js.map +1 -0
- package/dist/coordination/task-queue.d.ts +71 -0
- package/dist/coordination/task-queue.d.ts.map +1 -0
- package/dist/coordination/task-queue.js +140 -0
- package/dist/coordination/task-queue.js.map +1 -0
- package/dist/coordination/topology.d.ts +68 -0
- package/dist/coordination/topology.d.ts.map +1 -0
- package/dist/coordination/topology.js +195 -0
- package/dist/coordination/topology.js.map +1 -0
- package/dist/github/client.d.ts +56 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +179 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/index.d.ts +5 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +5 -0
- package/dist/github/index.js.map +1 -0
- package/dist/hooks/index.d.ts +29 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +112 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/session.d.ts +16 -0
- package/dist/hooks/session.d.ts.map +1 -0
- package/dist/hooks/session.js +60 -0
- package/dist/hooks/session.js.map +1 -0
- package/dist/hooks/task.d.ts +16 -0
- package/dist/hooks/task.d.ts.map +1 -0
- package/dist/hooks/task.js +82 -0
- package/dist/hooks/task.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +128 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/agent-tools.d.ts +174 -0
- package/dist/mcp/tools/agent-tools.d.ts.map +1 -0
- package/dist/mcp/tools/agent-tools.js +214 -0
- package/dist/mcp/tools/agent-tools.js.map +1 -0
- package/dist/mcp/tools/github-tools.d.ts +229 -0
- package/dist/mcp/tools/github-tools.d.ts.map +1 -0
- package/dist/mcp/tools/github-tools.js +286 -0
- package/dist/mcp/tools/github-tools.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +10 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +10 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +190 -0
- package/dist/mcp/tools/memory-tools.d.ts.map +1 -0
- package/dist/mcp/tools/memory-tools.js +207 -0
- package/dist/mcp/tools/memory-tools.js.map +1 -0
- package/dist/mcp/tools/session-tools.d.ts +116 -0
- package/dist/mcp/tools/session-tools.d.ts.map +1 -0
- package/dist/mcp/tools/session-tools.js +151 -0
- package/dist/mcp/tools/session-tools.js.map +1 -0
- package/dist/mcp/tools/system-tools.d.ts +98 -0
- package/dist/mcp/tools/system-tools.d.ts.map +1 -0
- package/dist/mcp/tools/system-tools.js +165 -0
- package/dist/mcp/tools/system-tools.js.map +1 -0
- package/dist/mcp/tools/task-tools.d.ts +170 -0
- package/dist/mcp/tools/task-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-tools.js +188 -0
- package/dist/mcp/tools/task-tools.js.map +1 -0
- package/dist/memory/fts-search.d.ts +46 -0
- package/dist/memory/fts-search.d.ts.map +1 -0
- package/dist/memory/fts-search.js +136 -0
- package/dist/memory/fts-search.js.map +1 -0
- package/dist/memory/index.d.ts +77 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +203 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/sqlite-store.d.ts +36 -0
- package/dist/memory/sqlite-store.d.ts.map +1 -0
- package/dist/memory/sqlite-store.js +371 -0
- package/dist/memory/sqlite-store.js.map +1 -0
- package/dist/memory/vector-search.d.ts +43 -0
- package/dist/memory/vector-search.d.ts.map +1 -0
- package/dist/memory/vector-search.js +179 -0
- package/dist/memory/vector-search.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +33 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +147 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/registry.d.ts +48 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +72 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +5 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/index.d.ts +49 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +254 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types.d.ts +189 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +32 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +194 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/embeddings.d.ts +23 -0
- package/dist/utils/embeddings.d.ts.map +1 -0
- package/dist/utils/embeddings.js +151 -0
- package/dist/utils/embeddings.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +96 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +264 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +144 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin loader - discover and load plugins
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentStackPlugin, AgentStackConfig } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Load a plugin from a path
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadPlugin(path: string, config: AgentStackConfig): Promise<AgentStackPlugin | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Discover and load plugins from directory
|
|
11
|
+
*/
|
|
12
|
+
export declare function discoverPlugins(config: AgentStackConfig): Promise<number>;
|
|
13
|
+
/**
|
|
14
|
+
* Get a loaded plugin by name
|
|
15
|
+
*/
|
|
16
|
+
export declare function getPlugin(name: string): AgentStackPlugin | null;
|
|
17
|
+
/**
|
|
18
|
+
* List all loaded plugins
|
|
19
|
+
*/
|
|
20
|
+
export declare function listPlugins(): AgentStackPlugin[];
|
|
21
|
+
/**
|
|
22
|
+
* Unload a plugin
|
|
23
|
+
*/
|
|
24
|
+
export declare function unloadPlugin(name: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Get plugin count
|
|
27
|
+
*/
|
|
28
|
+
export declare function getPluginCount(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Clear all plugins (for testing)
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearPlugins(): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAStE;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAuClC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuD/E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,gBAAgB,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBjE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlD"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin loader - discover and load plugins
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readdirSync, statSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { registerAgent } from '../agents/registry.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
const log = logger.child('plugins');
|
|
9
|
+
// Loaded plugins
|
|
10
|
+
const plugins = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Load a plugin from a path
|
|
13
|
+
*/
|
|
14
|
+
export async function loadPlugin(path, config) {
|
|
15
|
+
try {
|
|
16
|
+
// Import the plugin module
|
|
17
|
+
const module = await import(path);
|
|
18
|
+
const plugin = module.default;
|
|
19
|
+
if (!plugin || !plugin.name || !plugin.version) {
|
|
20
|
+
log.error('Invalid plugin format', { path });
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Initialize plugin if it has an init function
|
|
24
|
+
if (plugin.init) {
|
|
25
|
+
await plugin.init(config);
|
|
26
|
+
}
|
|
27
|
+
// Register agents from plugin
|
|
28
|
+
if (plugin.agents) {
|
|
29
|
+
for (const agent of plugin.agents) {
|
|
30
|
+
registerAgent(agent);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
plugins.set(plugin.name, plugin);
|
|
34
|
+
log.info('Loaded plugin', {
|
|
35
|
+
name: plugin.name,
|
|
36
|
+
version: plugin.version,
|
|
37
|
+
agents: plugin.agents?.length ?? 0,
|
|
38
|
+
tools: plugin.tools?.length ?? 0,
|
|
39
|
+
});
|
|
40
|
+
return plugin;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
log.error('Failed to load plugin', {
|
|
44
|
+
path,
|
|
45
|
+
error: error instanceof Error ? error.message : String(error),
|
|
46
|
+
});
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Discover and load plugins from directory
|
|
52
|
+
*/
|
|
53
|
+
export async function discoverPlugins(config) {
|
|
54
|
+
if (!config.plugins.enabled) {
|
|
55
|
+
log.debug('Plugins disabled');
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
const pluginDir = config.plugins.directory;
|
|
59
|
+
if (!existsSync(pluginDir)) {
|
|
60
|
+
log.debug('Plugin directory not found', { path: pluginDir });
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
let loaded = 0;
|
|
64
|
+
const entries = readdirSync(pluginDir);
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
const entryPath = join(pluginDir, entry);
|
|
67
|
+
if (!statSync(entryPath).isDirectory()) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// Look for package.json
|
|
71
|
+
const packagePath = join(entryPath, 'package.json');
|
|
72
|
+
if (!existsSync(packagePath)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
77
|
+
// Determine entry point
|
|
78
|
+
const mainFile = pkg.module ?? pkg.main ?? 'index.js';
|
|
79
|
+
const mainPath = join(entryPath, mainFile);
|
|
80
|
+
if (existsSync(mainPath)) {
|
|
81
|
+
const plugin = await loadPlugin(mainPath, config);
|
|
82
|
+
if (plugin) {
|
|
83
|
+
loaded++;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
log.warn('Failed to read plugin package', {
|
|
89
|
+
path: packagePath,
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
log.info('Discovered plugins', { count: loaded, directory: pluginDir });
|
|
95
|
+
return loaded;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get a loaded plugin by name
|
|
99
|
+
*/
|
|
100
|
+
export function getPlugin(name) {
|
|
101
|
+
return plugins.get(name) ?? null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* List all loaded plugins
|
|
105
|
+
*/
|
|
106
|
+
export function listPlugins() {
|
|
107
|
+
return Array.from(plugins.values());
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Unload a plugin
|
|
111
|
+
*/
|
|
112
|
+
export async function unloadPlugin(name) {
|
|
113
|
+
const plugin = plugins.get(name);
|
|
114
|
+
if (!plugin) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// Call cleanup if defined
|
|
118
|
+
if (plugin.cleanup) {
|
|
119
|
+
try {
|
|
120
|
+
await plugin.cleanup();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
log.warn('Plugin cleanup failed', {
|
|
124
|
+
name,
|
|
125
|
+
error: error instanceof Error ? error.message : String(error),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
plugins.delete(name);
|
|
130
|
+
log.info('Unloaded plugin', { name });
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get plugin count
|
|
135
|
+
*/
|
|
136
|
+
export function getPluginCount() {
|
|
137
|
+
return plugins.size;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Clear all plugins (for testing)
|
|
141
|
+
*/
|
|
142
|
+
export async function clearPlugins() {
|
|
143
|
+
for (const name of plugins.keys()) {
|
|
144
|
+
await unloadPlugin(name);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin registry - track installed plugins
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentStackPlugin } from '../types.js';
|
|
5
|
+
interface PluginEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
installedAt: Date;
|
|
10
|
+
config?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Register a plugin in the registry
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerPluginEntry(plugin: AgentStackPlugin): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get a plugin entry from the registry
|
|
18
|
+
*/
|
|
19
|
+
export declare function getPluginEntry(name: string): PluginEntry | null;
|
|
20
|
+
/**
|
|
21
|
+
* List all registered plugins
|
|
22
|
+
*/
|
|
23
|
+
export declare function listPluginEntries(): PluginEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* Update plugin enabled status
|
|
26
|
+
*/
|
|
27
|
+
export declare function setPluginEnabled(name: string, enabled: boolean): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Update plugin config
|
|
30
|
+
*/
|
|
31
|
+
export declare function setPluginConfig(name: string, config: Record<string, unknown>): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Remove a plugin from the registry
|
|
34
|
+
*/
|
|
35
|
+
export declare function removePluginEntry(name: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a plugin is registered
|
|
38
|
+
*/
|
|
39
|
+
export declare function isPluginRegistered(name: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get the count of registered plugins
|
|
42
|
+
*/
|
|
43
|
+
export declare function getRegisteredPluginCount(): {
|
|
44
|
+
total: number;
|
|
45
|
+
enabled: number;
|
|
46
|
+
};
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,IAAI,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAOlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,EAAE,CAEjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAKxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAKtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM7E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin registry - track installed plugins
|
|
3
|
+
*/
|
|
4
|
+
// In-memory registry (could be persisted to SQLite)
|
|
5
|
+
const registry = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Register a plugin in the registry
|
|
8
|
+
*/
|
|
9
|
+
export function registerPluginEntry(plugin) {
|
|
10
|
+
registry.set(plugin.name, {
|
|
11
|
+
name: plugin.name,
|
|
12
|
+
version: plugin.version,
|
|
13
|
+
enabled: true,
|
|
14
|
+
installedAt: new Date(),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get a plugin entry from the registry
|
|
19
|
+
*/
|
|
20
|
+
export function getPluginEntry(name) {
|
|
21
|
+
return registry.get(name) ?? null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* List all registered plugins
|
|
25
|
+
*/
|
|
26
|
+
export function listPluginEntries() {
|
|
27
|
+
return Array.from(registry.values());
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Update plugin enabled status
|
|
31
|
+
*/
|
|
32
|
+
export function setPluginEnabled(name, enabled) {
|
|
33
|
+
const entry = registry.get(name);
|
|
34
|
+
if (!entry)
|
|
35
|
+
return false;
|
|
36
|
+
entry.enabled = enabled;
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Update plugin config
|
|
41
|
+
*/
|
|
42
|
+
export function setPluginConfig(name, config) {
|
|
43
|
+
const entry = registry.get(name);
|
|
44
|
+
if (!entry)
|
|
45
|
+
return false;
|
|
46
|
+
entry.config = config;
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Remove a plugin from the registry
|
|
51
|
+
*/
|
|
52
|
+
export function removePluginEntry(name) {
|
|
53
|
+
return registry.delete(name);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if a plugin is registered
|
|
57
|
+
*/
|
|
58
|
+
export function isPluginRegistered(name) {
|
|
59
|
+
return registry.has(name);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the count of registered plugins
|
|
63
|
+
*/
|
|
64
|
+
export function getRegisteredPluginCount() {
|
|
65
|
+
let enabled = 0;
|
|
66
|
+
for (const entry of registry.values()) {
|
|
67
|
+
if (entry.enabled)
|
|
68
|
+
enabled++;
|
|
69
|
+
}
|
|
70
|
+
return { total: registry.size, enabled };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,oDAAoD;AACpD,MAAM,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI,IAAI,EAAE;KACxB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAgB;IAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAA+B;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider interface and implementations
|
|
3
|
+
*/
|
|
4
|
+
import type { LLMProvider, ChatMessage, ChatOptions, ChatResponse, AgentStackConfig } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Anthropic Claude provider
|
|
7
|
+
*/
|
|
8
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
9
|
+
name: string;
|
|
10
|
+
private apiKey;
|
|
11
|
+
private defaultModel;
|
|
12
|
+
constructor(apiKey: string, model?: string);
|
|
13
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* OpenAI provider
|
|
17
|
+
*/
|
|
18
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
19
|
+
name: string;
|
|
20
|
+
private apiKey;
|
|
21
|
+
private defaultModel;
|
|
22
|
+
constructor(apiKey: string, model?: string);
|
|
23
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
24
|
+
embed(text: string): Promise<number[]>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Ollama provider (local)
|
|
28
|
+
*/
|
|
29
|
+
export declare class OllamaProvider implements LLMProvider {
|
|
30
|
+
name: string;
|
|
31
|
+
private baseUrl;
|
|
32
|
+
private defaultModel;
|
|
33
|
+
constructor(baseUrl?: string, model?: string);
|
|
34
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
35
|
+
embed(text: string): Promise<number[]>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a provider based on configuration
|
|
39
|
+
*/
|
|
40
|
+
export declare function createProvider(config: AgentStackConfig): LLMProvider;
|
|
41
|
+
/**
|
|
42
|
+
* Register a custom provider
|
|
43
|
+
*/
|
|
44
|
+
export declare function registerProvider(name: string, provider: LLMProvider): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get a provider by name
|
|
47
|
+
*/
|
|
48
|
+
export declare function getProvider(name: string, config: AgentStackConfig): LLMProvider | null;
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKzG;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,IAAI,SAAe;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAKpC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA0DlF;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAKpC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA6C3E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CA6B7C;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAKtC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA8C3E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAwB7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW,CA4BpE;AAKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAG1E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAwBtF"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider interface and implementations
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
const log = logger.child('providers');
|
|
6
|
+
/**
|
|
7
|
+
* Anthropic Claude provider
|
|
8
|
+
*/
|
|
9
|
+
export class AnthropicProvider {
|
|
10
|
+
name = 'anthropic';
|
|
11
|
+
apiKey;
|
|
12
|
+
defaultModel;
|
|
13
|
+
constructor(apiKey, model) {
|
|
14
|
+
this.apiKey = apiKey;
|
|
15
|
+
this.defaultModel = model ?? 'claude-sonnet-4-20250514';
|
|
16
|
+
}
|
|
17
|
+
async chat(messages, options) {
|
|
18
|
+
const model = options?.model ?? this.defaultModel;
|
|
19
|
+
// Convert messages format for Anthropic API
|
|
20
|
+
const systemMessage = messages.find(m => m.role === 'system');
|
|
21
|
+
const otherMessages = messages.filter(m => m.role !== 'system');
|
|
22
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: {
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
'x-api-key': this.apiKey,
|
|
27
|
+
'anthropic-version': '2023-06-01',
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
model,
|
|
31
|
+
max_tokens: options?.maxTokens ?? 4096,
|
|
32
|
+
system: systemMessage?.content,
|
|
33
|
+
messages: otherMessages.map(m => ({
|
|
34
|
+
role: m.role,
|
|
35
|
+
content: m.content,
|
|
36
|
+
})),
|
|
37
|
+
temperature: options?.temperature,
|
|
38
|
+
stop_sequences: options?.stopSequences,
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const error = await response.text();
|
|
43
|
+
throw new Error(`Anthropic API error: ${response.status} - ${error}`);
|
|
44
|
+
}
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
const textContent = data.content.find(c => c.type === 'text');
|
|
47
|
+
return {
|
|
48
|
+
content: textContent?.text ?? '',
|
|
49
|
+
model: data.model,
|
|
50
|
+
usage: {
|
|
51
|
+
inputTokens: data.usage.input_tokens,
|
|
52
|
+
outputTokens: data.usage.output_tokens,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* OpenAI provider
|
|
59
|
+
*/
|
|
60
|
+
export class OpenAIProvider {
|
|
61
|
+
name = 'openai';
|
|
62
|
+
apiKey;
|
|
63
|
+
defaultModel;
|
|
64
|
+
constructor(apiKey, model) {
|
|
65
|
+
this.apiKey = apiKey;
|
|
66
|
+
this.defaultModel = model ?? 'gpt-4o';
|
|
67
|
+
}
|
|
68
|
+
async chat(messages, options) {
|
|
69
|
+
const model = options?.model ?? this.defaultModel;
|
|
70
|
+
const response = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: {
|
|
73
|
+
'Content-Type': 'application/json',
|
|
74
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
75
|
+
},
|
|
76
|
+
body: JSON.stringify({
|
|
77
|
+
model,
|
|
78
|
+
messages,
|
|
79
|
+
max_tokens: options?.maxTokens ?? 4096,
|
|
80
|
+
temperature: options?.temperature,
|
|
81
|
+
stop: options?.stopSequences,
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
const error = await response.text();
|
|
86
|
+
throw new Error(`OpenAI API error: ${response.status} - ${error}`);
|
|
87
|
+
}
|
|
88
|
+
const data = await response.json();
|
|
89
|
+
const choice = data.choices[0];
|
|
90
|
+
return {
|
|
91
|
+
content: choice?.message.content ?? '',
|
|
92
|
+
model: data.model,
|
|
93
|
+
usage: {
|
|
94
|
+
inputTokens: data.usage.prompt_tokens,
|
|
95
|
+
outputTokens: data.usage.completion_tokens,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async embed(text) {
|
|
100
|
+
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: {
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
105
|
+
},
|
|
106
|
+
body: JSON.stringify({
|
|
107
|
+
model: 'text-embedding-3-small',
|
|
108
|
+
input: text,
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
const error = await response.text();
|
|
113
|
+
throw new Error(`OpenAI API error: ${response.status} - ${error}`);
|
|
114
|
+
}
|
|
115
|
+
const data = await response.json();
|
|
116
|
+
const embedding = data.data[0]?.embedding;
|
|
117
|
+
if (!embedding) {
|
|
118
|
+
throw new Error('No embedding returned');
|
|
119
|
+
}
|
|
120
|
+
return embedding;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Ollama provider (local)
|
|
125
|
+
*/
|
|
126
|
+
export class OllamaProvider {
|
|
127
|
+
name = 'ollama';
|
|
128
|
+
baseUrl;
|
|
129
|
+
defaultModel;
|
|
130
|
+
constructor(baseUrl, model) {
|
|
131
|
+
this.baseUrl = baseUrl ?? 'http://localhost:11434';
|
|
132
|
+
this.defaultModel = model ?? 'llama3.2';
|
|
133
|
+
}
|
|
134
|
+
async chat(messages, options) {
|
|
135
|
+
const model = options?.model ?? this.defaultModel;
|
|
136
|
+
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: {
|
|
139
|
+
'Content-Type': 'application/json',
|
|
140
|
+
},
|
|
141
|
+
body: JSON.stringify({
|
|
142
|
+
model,
|
|
143
|
+
messages,
|
|
144
|
+
stream: false,
|
|
145
|
+
options: {
|
|
146
|
+
temperature: options?.temperature,
|
|
147
|
+
num_predict: options?.maxTokens,
|
|
148
|
+
stop: options?.stopSequences,
|
|
149
|
+
},
|
|
150
|
+
}),
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
const error = await response.text();
|
|
154
|
+
throw new Error(`Ollama API error: ${response.status} - ${error}`);
|
|
155
|
+
}
|
|
156
|
+
const data = await response.json();
|
|
157
|
+
return {
|
|
158
|
+
content: data.message.content,
|
|
159
|
+
model: data.model,
|
|
160
|
+
usage: data.eval_count
|
|
161
|
+
? {
|
|
162
|
+
inputTokens: data.prompt_eval_count ?? 0,
|
|
163
|
+
outputTokens: data.eval_count,
|
|
164
|
+
}
|
|
165
|
+
: undefined,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
async embed(text) {
|
|
169
|
+
const response = await fetch(`${this.baseUrl}/api/embeddings`, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: {
|
|
172
|
+
'Content-Type': 'application/json',
|
|
173
|
+
},
|
|
174
|
+
body: JSON.stringify({
|
|
175
|
+
model: 'nomic-embed-text',
|
|
176
|
+
prompt: text,
|
|
177
|
+
}),
|
|
178
|
+
});
|
|
179
|
+
if (!response.ok) {
|
|
180
|
+
const error = await response.text();
|
|
181
|
+
throw new Error(`Ollama API error: ${response.status} - ${error}`);
|
|
182
|
+
}
|
|
183
|
+
const data = await response.json();
|
|
184
|
+
return data.embedding;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create a provider based on configuration
|
|
189
|
+
*/
|
|
190
|
+
export function createProvider(config) {
|
|
191
|
+
const defaultProvider = config.providers.default;
|
|
192
|
+
switch (defaultProvider) {
|
|
193
|
+
case 'anthropic': {
|
|
194
|
+
const anthropicConfig = config.providers.anthropic;
|
|
195
|
+
if (!anthropicConfig?.apiKey) {
|
|
196
|
+
throw new Error('Anthropic API key not configured');
|
|
197
|
+
}
|
|
198
|
+
return new AnthropicProvider(anthropicConfig.apiKey, anthropicConfig.model);
|
|
199
|
+
}
|
|
200
|
+
case 'openai': {
|
|
201
|
+
const openaiConfig = config.providers.openai;
|
|
202
|
+
if (!openaiConfig?.apiKey) {
|
|
203
|
+
throw new Error('OpenAI API key not configured');
|
|
204
|
+
}
|
|
205
|
+
return new OpenAIProvider(openaiConfig.apiKey, openaiConfig.model);
|
|
206
|
+
}
|
|
207
|
+
case 'ollama': {
|
|
208
|
+
const ollamaConfig = config.providers.ollama;
|
|
209
|
+
return new OllamaProvider(ollamaConfig?.baseUrl, ollamaConfig?.model);
|
|
210
|
+
}
|
|
211
|
+
default:
|
|
212
|
+
throw new Error(`Unknown provider: ${defaultProvider}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Provider registry for custom providers
|
|
216
|
+
const customProviders = new Map();
|
|
217
|
+
/**
|
|
218
|
+
* Register a custom provider
|
|
219
|
+
*/
|
|
220
|
+
export function registerProvider(name, provider) {
|
|
221
|
+
customProviders.set(name, provider);
|
|
222
|
+
log.info('Registered custom provider', { name });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get a provider by name
|
|
226
|
+
*/
|
|
227
|
+
export function getProvider(name, config) {
|
|
228
|
+
// Check custom providers first
|
|
229
|
+
const custom = customProviders.get(name);
|
|
230
|
+
if (custom)
|
|
231
|
+
return custom;
|
|
232
|
+
// Check built-in providers
|
|
233
|
+
switch (name) {
|
|
234
|
+
case 'anthropic': {
|
|
235
|
+
const anthropicConfig = config.providers.anthropic;
|
|
236
|
+
if (!anthropicConfig?.apiKey)
|
|
237
|
+
return null;
|
|
238
|
+
return new AnthropicProvider(anthropicConfig.apiKey, anthropicConfig.model);
|
|
239
|
+
}
|
|
240
|
+
case 'openai': {
|
|
241
|
+
const openaiConfig = config.providers.openai;
|
|
242
|
+
if (!openaiConfig?.apiKey)
|
|
243
|
+
return null;
|
|
244
|
+
return new OpenAIProvider(openaiConfig.apiKey, openaiConfig.model);
|
|
245
|
+
}
|
|
246
|
+
case 'ollama': {
|
|
247
|
+
const ollamaConfig = config.providers.ollama;
|
|
248
|
+
return new OllamaProvider(ollamaConfig?.baseUrl, ollamaConfig?.model);
|
|
249
|
+
}
|
|
250
|
+
default:
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
|