agent-nuvira 1.14.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/LICENSE +21 -0
- package/README.md +891 -0
- package/dist/agent-sdk/src/agent.d.ts +118 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -0
- package/dist/agent-sdk/src/agent.js +88 -0
- package/dist/agent-sdk/src/agent.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +33 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -0
- package/dist/agent-sdk/src/index.js +32 -0
- package/dist/agent-sdk/src/index.js.map +1 -0
- package/dist/agent-sdk/src/register.d.ts +70 -0
- package/dist/agent-sdk/src/register.d.ts.map +1 -0
- package/dist/agent-sdk/src/register.js +181 -0
- package/dist/agent-sdk/src/register.js.map +1 -0
- package/dist/agent-sdk/src/scaffold.d.ts +50 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
- package/dist/agent-sdk/src/scaffold.js +291 -0
- package/dist/agent-sdk/src/scaffold.js.map +1 -0
- package/dist/agent-sdk/src/testing.d.ts +187 -0
- package/dist/agent-sdk/src/testing.d.ts.map +1 -0
- package/dist/agent-sdk/src/testing.js +243 -0
- package/dist/agent-sdk/src/testing.js.map +1 -0
- package/dist/agent-sdk/src/types.d.ts +202 -0
- package/dist/agent-sdk/src/types.d.ts.map +1 -0
- package/dist/agent-sdk/src/types.js +11 -0
- package/dist/agent-sdk/src/types.js.map +1 -0
- package/dist/agents/agent.d.ts +132 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +19 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agents/context-gatherer.d.ts +42 -0
- package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
- package/dist/agents/agents/context-gatherer.js +366 -0
- package/dist/agents/agents/context-gatherer.js.map +1 -0
- package/dist/agents/agents/debugger.d.ts +58 -0
- package/dist/agents/agents/debugger.d.ts.map +1 -0
- package/dist/agents/agents/debugger.js +257 -0
- package/dist/agents/agents/debugger.js.map +1 -0
- package/dist/agents/agents/git-agent.d.ts +34 -0
- package/dist/agents/agents/git-agent.d.ts.map +1 -0
- package/dist/agents/agents/git-agent.js +200 -0
- package/dist/agents/agents/git-agent.js.map +1 -0
- package/dist/agents/agents/github-release-agent.d.ts +65 -0
- package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
- package/dist/agents/agents/github-release-agent.js +439 -0
- package/dist/agents/agents/github-release-agent.js.map +1 -0
- package/dist/agents/agents/package-agent.d.ts +33 -0
- package/dist/agents/agents/package-agent.d.ts.map +1 -0
- package/dist/agents/agents/package-agent.js +233 -0
- package/dist/agents/agents/package-agent.js.map +1 -0
- package/dist/agents/agents/planner.d.ts +26 -0
- package/dist/agents/agents/planner.d.ts.map +1 -0
- package/dist/agents/agents/planner.js +222 -0
- package/dist/agents/agents/planner.js.map +1 -0
- package/dist/agents/agents/reviewer.d.ts +34 -0
- package/dist/agents/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/agents/reviewer.js +159 -0
- package/dist/agents/agents/reviewer.js.map +1 -0
- package/dist/agents/agents/runner.d.ts +73 -0
- package/dist/agents/agents/runner.d.ts.map +1 -0
- package/dist/agents/agents/runner.js +299 -0
- package/dist/agents/agents/runner.js.map +1 -0
- package/dist/agents/agents/security-agent.d.ts +33 -0
- package/dist/agents/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/agents/security-agent.js +184 -0
- package/dist/agents/agents/security-agent.js.map +1 -0
- package/dist/agents/agents/tester.d.ts +96 -0
- package/dist/agents/agents/tester.d.ts.map +1 -0
- package/dist/agents/agents/tester.js +410 -0
- package/dist/agents/agents/tester.js.map +1 -0
- package/dist/agents/agents/writer.d.ts +51 -0
- package/dist/agents/agents/writer.d.ts.map +1 -0
- package/dist/agents/agents/writer.js +384 -0
- package/dist/agents/agents/writer.js.map +1 -0
- package/dist/agents/context-vault.d.ts +49 -0
- package/dist/agents/context-vault.d.ts.map +1 -0
- package/dist/agents/context-vault.js +134 -0
- package/dist/agents/context-vault.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +97 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +696 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/utils/file-tree.d.ts +28 -0
- package/dist/agents/utils/file-tree.d.ts.map +1 -0
- package/dist/agents/utils/file-tree.js +93 -0
- package/dist/agents/utils/file-tree.js.map +1 -0
- package/dist/cli/agent.d.ts +25 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +374 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/benchmark.d.ts +24 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +235 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/cache.d.ts +12 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +58 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/chat.d.ts +37 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +393 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands.d.ts +24 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +18 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +162 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +34 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +126 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +68 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +585 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit.d.ts +11 -0
- package/dist/cli/edit.d.ts.map +1 -0
- package/dist/cli/edit.js +86 -0
- package/dist/cli/edit.js.map +1 -0
- package/dist/cli/execute.d.ts +25 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/execute.js +186 -0
- package/dist/cli/execute.js.map +1 -0
- package/dist/cli/federation.d.ts +31 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +387 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/history.d.ts +22 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +140 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/init.d.ts +49 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +423 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/learn.d.ts +31 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +320 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/memory.d.ts +38 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +295 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model-picker.d.ts +18 -0
- package/dist/cli/model-picker.d.ts.map +1 -0
- package/dist/cli/model-picker.js +225 -0
- package/dist/cli/model-picker.js.map +1 -0
- package/dist/cli/models.d.ts +11 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +132 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +11 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +94 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/plugins.d.ts +15 -0
- package/dist/cli/plugins.d.ts.map +1 -0
- package/dist/cli/plugins.js +123 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/router.d.ts +20 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +142 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +110 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +27 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +264 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sdk.d.ts +27 -0
- package/dist/cli/sdk.d.ts.map +1 -0
- package/dist/cli/sdk.js +204 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli/stats.d.ts +18 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +78 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/team.d.ts +42 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +473 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/cli/workflow.d.ts +27 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +347 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/config/manager.d.ts +37 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/cache.d.ts +27 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js +116 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/history.d.ts +87 -0
- package/dist/context/history.d.ts.map +1 -0
- package/dist/context/history.js +249 -0
- package/dist/context/history.js.map +1 -0
- package/dist/context/parser.d.ts +61 -0
- package/dist/context/parser.d.ts.map +1 -0
- package/dist/context/parser.js +194 -0
- package/dist/context/parser.js.map +1 -0
- package/dist/federation/client.d.ts +49 -0
- package/dist/federation/client.d.ts.map +1 -0
- package/dist/federation/client.js +239 -0
- package/dist/federation/client.js.map +1 -0
- package/dist/federation/protocol.d.ts +155 -0
- package/dist/federation/protocol.d.ts.map +1 -0
- package/dist/federation/protocol.js +57 -0
- package/dist/federation/protocol.js.map +1 -0
- package/dist/federation/server.d.ts +25 -0
- package/dist/federation/server.d.ts.map +1 -0
- package/dist/federation/server.js +401 -0
- package/dist/federation/server.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/factory.d.ts +20 -0
- package/dist/inference/factory.d.ts.map +1 -0
- package/dist/inference/factory.js +46 -0
- package/dist/inference/factory.js.map +1 -0
- package/dist/inference/gemini-adapter.d.ts +17 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -0
- package/dist/inference/gemini-adapter.js +176 -0
- package/dist/inference/gemini-adapter.js.map +1 -0
- package/dist/inference/groq-adapter.d.ts +17 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -0
- package/dist/inference/groq-adapter.js +103 -0
- package/dist/inference/groq-adapter.js.map +1 -0
- package/dist/inference/interface.d.ts +49 -0
- package/dist/inference/interface.d.ts.map +1 -0
- package/dist/inference/interface.js +2 -0
- package/dist/inference/interface.js.map +1 -0
- package/dist/inference/local-adapter.d.ts +35 -0
- package/dist/inference/local-adapter.d.ts.map +1 -0
- package/dist/inference/local-adapter.js +311 -0
- package/dist/inference/local-adapter.js.map +1 -0
- package/dist/inference/model-catalog.d.ts +53 -0
- package/dist/inference/model-catalog.d.ts.map +1 -0
- package/dist/inference/model-catalog.js +306 -0
- package/dist/inference/model-catalog.js.map +1 -0
- package/dist/inference/nim-adapter.d.ts +17 -0
- package/dist/inference/nim-adapter.d.ts.map +1 -0
- package/dist/inference/nim-adapter.js +103 -0
- package/dist/inference/nim-adapter.js.map +1 -0
- package/dist/inference/openrouter-adapter.d.ts +17 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -0
- package/dist/inference/openrouter-adapter.js +105 -0
- package/dist/inference/openrouter-adapter.js.map +1 -0
- package/dist/inference/sse.d.ts +20 -0
- package/dist/inference/sse.d.ts.map +1 -0
- package/dist/inference/sse.js +91 -0
- package/dist/inference/sse.js.map +1 -0
- package/dist/learning/agent-stats.d.ts +109 -0
- package/dist/learning/agent-stats.d.ts.map +1 -0
- package/dist/learning/agent-stats.js +240 -0
- package/dist/learning/agent-stats.js.map +1 -0
- package/dist/learning/benchmark.d.ts +161 -0
- package/dist/learning/benchmark.d.ts.map +1 -0
- package/dist/learning/benchmark.js +589 -0
- package/dist/learning/benchmark.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +101 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -0
- package/dist/learning/cost-tracker.js +224 -0
- package/dist/learning/cost-tracker.js.map +1 -0
- package/dist/learning/feedback.d.ts +88 -0
- package/dist/learning/feedback.d.ts.map +1 -0
- package/dist/learning/feedback.js +169 -0
- package/dist/learning/feedback.js.map +1 -0
- package/dist/learning/hybrid-router.d.ts +201 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -0
- package/dist/learning/hybrid-router.js +450 -0
- package/dist/learning/hybrid-router.js.map +1 -0
- package/dist/learning/model-compare.d.ts +76 -0
- package/dist/learning/model-compare.d.ts.map +1 -0
- package/dist/learning/model-compare.js +252 -0
- package/dist/learning/model-compare.js.map +1 -0
- package/dist/learning/model-router.d.ts +68 -0
- package/dist/learning/model-router.d.ts.map +1 -0
- package/dist/learning/model-router.js +140 -0
- package/dist/learning/model-router.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +99 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +310 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/scorer.d.ts +51 -0
- package/dist/learning/scorer.d.ts.map +1 -0
- package/dist/learning/scorer.js +64 -0
- package/dist/learning/scorer.js.map +1 -0
- package/dist/learning/self-improver.d.ts +48 -0
- package/dist/learning/self-improver.d.ts.map +1 -0
- package/dist/learning/self-improver.js +161 -0
- package/dist/learning/self-improver.js.map +1 -0
- package/dist/memory/embedder.d.ts +65 -0
- package/dist/memory/embedder.d.ts.map +1 -0
- package/dist/memory/embedder.js +424 -0
- package/dist/memory/embedder.js.map +1 -0
- package/dist/memory/memory-integration.d.ts +56 -0
- package/dist/memory/memory-integration.d.ts.map +1 -0
- package/dist/memory/memory-integration.js +95 -0
- package/dist/memory/memory-integration.js.map +1 -0
- package/dist/memory/trajectory-store.d.ts +149 -0
- package/dist/memory/trajectory-store.d.ts.map +1 -0
- package/dist/memory/trajectory-store.js +476 -0
- package/dist/memory/trajectory-store.js.map +1 -0
- package/dist/memory/vector-store.d.ts +78 -0
- package/dist/memory/vector-store.d.ts.map +1 -0
- package/dist/memory/vector-store.js +186 -0
- package/dist/memory/vector-store.js.map +1 -0
- package/dist/plugins/agent-plugin.d.ts +73 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -0
- package/dist/plugins/agent-plugin.js +199 -0
- package/dist/plugins/agent-plugin.js.map +1 -0
- package/dist/plugins/registry.d.ts +61 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +67 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/sandbox/images.d.ts +31 -0
- package/dist/sandbox/images.d.ts.map +1 -0
- package/dist/sandbox/images.js +129 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/manager.d.ts +134 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +470 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/types.d.ts +113 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +107 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/security/scanner.d.ts +53 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +271 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/team/config.d.ts +50 -0
- package/dist/team/config.d.ts.map +1 -0
- package/dist/team/config.js +108 -0
- package/dist/team/config.js.map +1 -0
- package/dist/team/memory.d.ts +63 -0
- package/dist/team/memory.d.ts.map +1 -0
- package/dist/team/memory.js +282 -0
- package/dist/team/memory.js.map +1 -0
- package/dist/team/review.d.ts +123 -0
- package/dist/team/review.d.ts.map +1 -0
- package/dist/team/review.js +293 -0
- package/dist/team/review.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +250 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +59 -0
- package/dist/web-dashboard/server.d.ts.map +1 -0
- package/dist/web-dashboard/server.js +418 -0
- package/dist/web-dashboard/server.js.map +1 -0
- package/dist/workflow/registry.d.ts +127 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +482 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +93 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +481 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +78 -0
- package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
- package/src/web-dashboard/public/index.html +13 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VectorStore — A lightweight, JSON-based vector index with cosine similarity search.
|
|
3
|
+
*
|
|
4
|
+
* Stores embeddings as `{ id, vector, metadata }` entries in a single JSON file.
|
|
5
|
+
* No external dependencies — uses only Node.js built-in fs and crypto.
|
|
6
|
+
*
|
|
7
|
+
* File location: ~/.buff/memory/vectors.json
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
13
|
+
const MEMORY_DIR = join(homedir(), '.buff', 'memory');
|
|
14
|
+
const INDEX_PATH = join(MEMORY_DIR, 'vectors.json');
|
|
15
|
+
/**
|
|
16
|
+
* Schema version for the vector index.
|
|
17
|
+
* Version 2: Increased embedding dimensionality from 64 to 384 (all-MiniLM-L6-v2).
|
|
18
|
+
* Old version 1 entries (64-dim) are incompatible and will be cleared.
|
|
19
|
+
*/
|
|
20
|
+
const CURRENT_VERSION = 2;
|
|
21
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
22
|
+
function ensureDir() {
|
|
23
|
+
if (!existsSync(MEMORY_DIR)) {
|
|
24
|
+
mkdirSync(MEMORY_DIR, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function readIndex() {
|
|
28
|
+
try {
|
|
29
|
+
ensureDir();
|
|
30
|
+
if (!existsSync(INDEX_PATH)) {
|
|
31
|
+
return { entries: {}, version: CURRENT_VERSION };
|
|
32
|
+
}
|
|
33
|
+
const raw = readFileSync(INDEX_PATH, 'utf-8');
|
|
34
|
+
const data = JSON.parse(raw);
|
|
35
|
+
// Version migration: if the on-disk version doesn't match the current
|
|
36
|
+
// schema version, clear old entries to prevent incompatible vectors
|
|
37
|
+
// (e.g., 64-dim → 384-dim migration) from returning similarity=0 silently.
|
|
38
|
+
if (data.version !== CURRENT_VERSION) {
|
|
39
|
+
return { entries: {}, version: CURRENT_VERSION };
|
|
40
|
+
}
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { entries: {}, version: CURRENT_VERSION };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function writeIndex(data) {
|
|
48
|
+
ensureDir();
|
|
49
|
+
writeFileSync(INDEX_PATH, JSON.stringify(data, null, 2), 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
// ─── Vector Math ────────────────────────────────────────────────────────────
|
|
52
|
+
/** Compute the dot product of two vectors */
|
|
53
|
+
function dotProduct(a, b) {
|
|
54
|
+
let sum = 0;
|
|
55
|
+
for (let i = 0; i < a.length; i++) {
|
|
56
|
+
sum += a[i] * b[i];
|
|
57
|
+
}
|
|
58
|
+
return sum;
|
|
59
|
+
}
|
|
60
|
+
/** Compute the L2 norm (magnitude) of a vector */
|
|
61
|
+
function magnitude(v) {
|
|
62
|
+
let sum = 0;
|
|
63
|
+
for (const val of v) {
|
|
64
|
+
sum += val * val;
|
|
65
|
+
}
|
|
66
|
+
return Math.sqrt(sum);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Compute cosine similarity between two vectors.
|
|
70
|
+
* Returns a value between -1 and 1 (higher = more similar).
|
|
71
|
+
*/
|
|
72
|
+
export function cosineSimilarity(a, b) {
|
|
73
|
+
if (a.length !== b.length)
|
|
74
|
+
return 0;
|
|
75
|
+
const dot = dotProduct(a, b);
|
|
76
|
+
const magA = magnitude(a);
|
|
77
|
+
const magB = magnitude(b);
|
|
78
|
+
if (magA === 0 || magB === 0)
|
|
79
|
+
return 0;
|
|
80
|
+
return dot / (magA * magB);
|
|
81
|
+
}
|
|
82
|
+
// ─── VectorStore ────────────────────────────────────────────────────────────
|
|
83
|
+
/**
|
|
84
|
+
* Lightweight vector store for semantic search.
|
|
85
|
+
*
|
|
86
|
+
* Usage:
|
|
87
|
+
* ```ts
|
|
88
|
+
* const store = new VectorStore();
|
|
89
|
+
* await store.insert("traj-001", [0.1, 0.2, ...], { goal: "add auth" });
|
|
90
|
+
* const results = await store.search([0.15, 0.25, ...], 3);
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export class VectorStore {
|
|
94
|
+
/**
|
|
95
|
+
* Insert a vector entry into the index.
|
|
96
|
+
* If an entry with the same `id` already exists, it is overwritten.
|
|
97
|
+
*/
|
|
98
|
+
async insert(id, vector, metadata = {}) {
|
|
99
|
+
const data = readIndex();
|
|
100
|
+
data.entries[id] = {
|
|
101
|
+
id,
|
|
102
|
+
vector,
|
|
103
|
+
metadata,
|
|
104
|
+
createdAt: Date.now(),
|
|
105
|
+
};
|
|
106
|
+
writeIndex(data);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Retrieve a single entry by ID.
|
|
110
|
+
*/
|
|
111
|
+
async get(id) {
|
|
112
|
+
const data = readIndex();
|
|
113
|
+
return data.entries[id] || null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Remove an entry from the index.
|
|
117
|
+
*/
|
|
118
|
+
async delete(id) {
|
|
119
|
+
const data = readIndex();
|
|
120
|
+
if (!data.entries[id])
|
|
121
|
+
return false;
|
|
122
|
+
delete data.entries[id];
|
|
123
|
+
writeIndex(data);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Search for the top-k most similar entries to the query vector.
|
|
128
|
+
* Returns results sorted by similarity (highest first).
|
|
129
|
+
*/
|
|
130
|
+
async search(queryVector, k = 5, filterFn) {
|
|
131
|
+
const data = readIndex();
|
|
132
|
+
const entries = Object.values(data.entries);
|
|
133
|
+
// Compute similarities
|
|
134
|
+
const scored = [];
|
|
135
|
+
for (const entry of entries) {
|
|
136
|
+
if (filterFn && !filterFn(entry))
|
|
137
|
+
continue;
|
|
138
|
+
const sim = cosineSimilarity(queryVector, entry.vector);
|
|
139
|
+
scored.push({ entry, similarity: sim });
|
|
140
|
+
}
|
|
141
|
+
// Sort by similarity descending, take top-k
|
|
142
|
+
scored.sort((a, b) => b.similarity - a.similarity);
|
|
143
|
+
return scored.slice(0, k);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the total number of stored entries.
|
|
147
|
+
*/
|
|
148
|
+
async count() {
|
|
149
|
+
const data = readIndex();
|
|
150
|
+
return Object.keys(data.entries).length;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Clear all entries from the index.
|
|
154
|
+
*/
|
|
155
|
+
async clear() {
|
|
156
|
+
writeIndex({ entries: {}, version: CURRENT_VERSION });
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get all entries (for iteration/export).
|
|
160
|
+
*/
|
|
161
|
+
async getAll() {
|
|
162
|
+
const data = readIndex();
|
|
163
|
+
return Object.values(data.entries);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get vector store statistics.
|
|
167
|
+
*/
|
|
168
|
+
stats() {
|
|
169
|
+
const data = readIndex();
|
|
170
|
+
const entries = Object.values(data.entries);
|
|
171
|
+
const dimensions = entries.length > 0 ? entries[0].vector.length : 0;
|
|
172
|
+
return {
|
|
173
|
+
totalEntries: entries.length,
|
|
174
|
+
dimensions,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Singleton instance
|
|
179
|
+
let storeInstance = null;
|
|
180
|
+
export function getVectorStore() {
|
|
181
|
+
if (!storeInstance) {
|
|
182
|
+
storeInstance = new VectorStore();
|
|
183
|
+
}
|
|
184
|
+
return storeInstance;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/memory/vector-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentPlugin — Interface for third-party agent plugins and auto-discovery.
|
|
3
|
+
*
|
|
4
|
+
* Users can place agent plugin files in ~/.buff/agents/ and they will be
|
|
5
|
+
* automatically discovered and registered with the orchestrator at startup.
|
|
6
|
+
*
|
|
7
|
+
* Provider plugins (inference providers):
|
|
8
|
+
* - Any .js file in ~/.buff/plugins/
|
|
9
|
+
* - Must export a default object matching the ProviderPlugin interface
|
|
10
|
+
*
|
|
11
|
+
* Agent plugins (agent extensions):
|
|
12
|
+
* - Any .js file in ~/.buff/agents/
|
|
13
|
+
* - Must export a default object matching the AgentPlugin interface
|
|
14
|
+
*
|
|
15
|
+
* Workflow plugins:
|
|
16
|
+
* - Any .yaml, .yml, or .json file in ~/.buff/workflows/
|
|
17
|
+
* - Defines a sequence of agent steps as a reusable workflow template
|
|
18
|
+
*/
|
|
19
|
+
import type { AgentContext, AgentResult } from '../agents/agent.js';
|
|
20
|
+
import type { WorkflowTemplate } from '../workflow/templates.js';
|
|
21
|
+
export interface AgentPluginMetadata {
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
description: string;
|
|
25
|
+
author?: string;
|
|
26
|
+
/** Which agent types this plugin can act as (e.g., ['writer', 'reviewer']) */
|
|
27
|
+
agentTypes: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface AgentPlugin {
|
|
30
|
+
metadata: AgentPluginMetadata;
|
|
31
|
+
execute(context: AgentContext, callLLM: (prompt: string) => Promise<string>): Promise<AgentResult>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Scan ~/.buff/plugins/ for provider plugin .js files and register them
|
|
35
|
+
* with the global PluginRegistry.
|
|
36
|
+
*
|
|
37
|
+
* Each file must export a default object matching the ProviderPlugin interface
|
|
38
|
+
* from ./registry.js. Upon discovery, the plugin is automatically registered
|
|
39
|
+
* so it can be used with: buff chat --provider <plugin-type>
|
|
40
|
+
*
|
|
41
|
+
* Returns the number of successfully loaded provider plugins.
|
|
42
|
+
*/
|
|
43
|
+
export declare function discoverProviderPlugins(): Promise<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Scan ~/.buff/agents/ for plugin .js files and load them.
|
|
46
|
+
* Returns a map of agent type → AgentPlugin.
|
|
47
|
+
*/
|
|
48
|
+
export declare function discoverAgentPlugins(): Promise<Map<string, AgentPlugin>>;
|
|
49
|
+
/**
|
|
50
|
+
* Scan ~/.buff/workflows/ for custom workflow template files.
|
|
51
|
+
* Supports .json, .yaml, and .yml files.
|
|
52
|
+
*/
|
|
53
|
+
export declare function discoverWorkflowPlugins(): WorkflowTemplate[];
|
|
54
|
+
/**
|
|
55
|
+
* Get plugin statistics.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getPluginStats(): {
|
|
58
|
+
providerPlugins: number;
|
|
59
|
+
agentPlugins: number;
|
|
60
|
+
workflowPlugins: number;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Run all auto-discovery scanners at startup.
|
|
64
|
+
* Called once when the CLI boots up.
|
|
65
|
+
*
|
|
66
|
+
* @returns Summary of discovered plugins
|
|
67
|
+
*/
|
|
68
|
+
export declare function runAutoDiscovery(): Promise<{
|
|
69
|
+
providerPlugins: number;
|
|
70
|
+
agentPlugins: number;
|
|
71
|
+
workflowPlugins: number;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=agent-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/agent-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQjE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACpG;AAmBD;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiC/D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAiC9E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,EAAE,CAkC5D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CA0B3G;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAWD"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentPlugin — Interface for third-party agent plugins and auto-discovery.
|
|
3
|
+
*
|
|
4
|
+
* Users can place agent plugin files in ~/.buff/agents/ and they will be
|
|
5
|
+
* automatically discovered and registered with the orchestrator at startup.
|
|
6
|
+
*
|
|
7
|
+
* Provider plugins (inference providers):
|
|
8
|
+
* - Any .js file in ~/.buff/plugins/
|
|
9
|
+
* - Must export a default object matching the ProviderPlugin interface
|
|
10
|
+
*
|
|
11
|
+
* Agent plugins (agent extensions):
|
|
12
|
+
* - Any .js file in ~/.buff/agents/
|
|
13
|
+
* - Must export a default object matching the AgentPlugin interface
|
|
14
|
+
*
|
|
15
|
+
* Workflow plugins:
|
|
16
|
+
* - Any .yaml, .yml, or .json file in ~/.buff/workflows/
|
|
17
|
+
* - Defines a sequence of agent steps as a reusable workflow template
|
|
18
|
+
*/
|
|
19
|
+
import { readdirSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { homedir } from 'node:os';
|
|
22
|
+
import { isValidWorkflowTemplate } from '../workflow/templates.js';
|
|
23
|
+
import { getPluginRegistry } from './registry.js';
|
|
24
|
+
import { logger } from '../utils/logger.js';
|
|
25
|
+
// ─── Paths ──────────────────────────────────────────────────────────────────
|
|
26
|
+
const BUFF_DIR = join(homedir(), '.buff');
|
|
27
|
+
const PLUGINS_DIR = join(BUFF_DIR, 'plugins');
|
|
28
|
+
const AGENTS_DIR = join(BUFF_DIR, 'agents');
|
|
29
|
+
const WORKFLOWS_DIR = join(BUFF_DIR, 'workflows');
|
|
30
|
+
function ensureDirectories() {
|
|
31
|
+
for (const dir of [PLUGINS_DIR, AGENTS_DIR, WORKFLOWS_DIR]) {
|
|
32
|
+
if (!existsSync(dir)) {
|
|
33
|
+
try {
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
catch { /* best-effort */ }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ─── Auto-Discovery ─────────────────────────────────────────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Scan ~/.buff/plugins/ for provider plugin .js files and register them
|
|
43
|
+
* with the global PluginRegistry.
|
|
44
|
+
*
|
|
45
|
+
* Each file must export a default object matching the ProviderPlugin interface
|
|
46
|
+
* from ./registry.js. Upon discovery, the plugin is automatically registered
|
|
47
|
+
* so it can be used with: buff chat --provider <plugin-type>
|
|
48
|
+
*
|
|
49
|
+
* Returns the number of successfully loaded provider plugins.
|
|
50
|
+
*/
|
|
51
|
+
export async function discoverProviderPlugins() {
|
|
52
|
+
ensureDirectories();
|
|
53
|
+
let loaded = 0;
|
|
54
|
+
try {
|
|
55
|
+
const files = readdirSync(PLUGINS_DIR).filter((f) => f.endsWith('.js'));
|
|
56
|
+
for (const file of files) {
|
|
57
|
+
try {
|
|
58
|
+
const pluginPath = join(PLUGINS_DIR, file);
|
|
59
|
+
// Dynamic import for ESM compatibility
|
|
60
|
+
const mod = await import(pluginPath);
|
|
61
|
+
if (!mod.default || !mod.default.metadata || !mod.default.getProviderType) {
|
|
62
|
+
logger.debug(`Skipping ${file}: missing ProviderPlugin interface (need metadata + getProviderType)`);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const plugin = mod.default;
|
|
66
|
+
const type = plugin.getProviderType();
|
|
67
|
+
const registry = getPluginRegistry();
|
|
68
|
+
registry.register(plugin);
|
|
69
|
+
loaded++;
|
|
70
|
+
logger.success(`Auto-discovered provider plugin: ${plugin.metadata.name} v${plugin.metadata.version} (${type})`);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
logger.debug(`Failed to load provider plugin ${file}: ${err}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
logger.debug(`Failed to scan ${PLUGINS_DIR}: ${err}`);
|
|
79
|
+
}
|
|
80
|
+
return loaded;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Scan ~/.buff/agents/ for plugin .js files and load them.
|
|
84
|
+
* Returns a map of agent type → AgentPlugin.
|
|
85
|
+
*/
|
|
86
|
+
export async function discoverAgentPlugins() {
|
|
87
|
+
const plugins = new Map();
|
|
88
|
+
ensureDirectories();
|
|
89
|
+
try {
|
|
90
|
+
const files = readdirSync(AGENTS_DIR).filter((f) => f.endsWith('.js'));
|
|
91
|
+
for (const file of files) {
|
|
92
|
+
try {
|
|
93
|
+
const pluginPath = join(AGENTS_DIR, file);
|
|
94
|
+
// Dynamic import for ESM compatibility
|
|
95
|
+
const plugin = await import(pluginPath);
|
|
96
|
+
if (!plugin.default || !plugin.default.metadata) {
|
|
97
|
+
logger.debug(`Skipping ${file}: missing metadata or default export`);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const agentPlugin = plugin.default;
|
|
101
|
+
for (const agentType of agentPlugin.metadata.agentTypes) {
|
|
102
|
+
plugins.set(agentType, agentPlugin);
|
|
103
|
+
logger.success(`Discovered agent plugin: ${agentPlugin.metadata.name} v${agentPlugin.metadata.version} (${agentType})`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger.debug(`Failed to load plugin ${file}: ${err}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
logger.debug(`Failed to scan ${AGENTS_DIR}: ${err}`);
|
|
113
|
+
}
|
|
114
|
+
return plugins;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Scan ~/.buff/workflows/ for custom workflow template files.
|
|
118
|
+
* Supports .json, .yaml, and .yml files.
|
|
119
|
+
*/
|
|
120
|
+
export function discoverWorkflowPlugins() {
|
|
121
|
+
const workflows = [];
|
|
122
|
+
ensureDirectories();
|
|
123
|
+
try {
|
|
124
|
+
const files = readdirSync(WORKFLOWS_DIR).filter((f) => f.endsWith('.json') || f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
125
|
+
for (const file of files) {
|
|
126
|
+
try {
|
|
127
|
+
const filePath = join(WORKFLOWS_DIR, file);
|
|
128
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
129
|
+
if (file.endsWith('.json')) {
|
|
130
|
+
const parsed = JSON.parse(content);
|
|
131
|
+
if (isValidWorkflowTemplate(parsed)) {
|
|
132
|
+
workflows.push(parsed);
|
|
133
|
+
logger.success(`Discovered workflow template: ${parsed.id} (${file})`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// YAML not available as dependency — skip, or use Node.js built-in
|
|
138
|
+
logger.debug(`YAML workflow files not yet supported (${file}). Use .json format instead.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
logger.debug(`Failed to load workflow ${file}: ${err}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
logger.debug(`Failed to scan ${WORKFLOWS_DIR}: ${err}`);
|
|
148
|
+
}
|
|
149
|
+
return workflows;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get plugin statistics.
|
|
153
|
+
*/
|
|
154
|
+
export function getPluginStats() {
|
|
155
|
+
let providerPlugins = 0;
|
|
156
|
+
let agentPlugins = 0;
|
|
157
|
+
let workflowPlugins = 0;
|
|
158
|
+
try {
|
|
159
|
+
if (existsSync(PLUGINS_DIR)) {
|
|
160
|
+
providerPlugins = readdirSync(PLUGINS_DIR).filter((f) => f.endsWith('.js')).length;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch { /* */ }
|
|
164
|
+
try {
|
|
165
|
+
if (existsSync(AGENTS_DIR)) {
|
|
166
|
+
agentPlugins = readdirSync(AGENTS_DIR).filter((f) => f.endsWith('.js')).length;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch { /* */ }
|
|
170
|
+
try {
|
|
171
|
+
if (existsSync(WORKFLOWS_DIR)) {
|
|
172
|
+
workflowPlugins = readdirSync(WORKFLOWS_DIR).filter((f) => f.endsWith('.json') || f.endsWith('.yaml') || f.endsWith('.yml')).length;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch { /* */ }
|
|
176
|
+
return { providerPlugins, agentPlugins, workflowPlugins };
|
|
177
|
+
}
|
|
178
|
+
// ─── Startup Integration ────────────────────────────────────────────────────
|
|
179
|
+
/**
|
|
180
|
+
* Run all auto-discovery scanners at startup.
|
|
181
|
+
* Called once when the CLI boots up.
|
|
182
|
+
*
|
|
183
|
+
* @returns Summary of discovered plugins
|
|
184
|
+
*/
|
|
185
|
+
export async function runAutoDiscovery() {
|
|
186
|
+
const providerCount = await discoverProviderPlugins();
|
|
187
|
+
await discoverAgentPlugins(); // Agent plugins stored in map, not counted here
|
|
188
|
+
const workflowPlugins = discoverWorkflowPlugins();
|
|
189
|
+
const stats = getPluginStats();
|
|
190
|
+
return {
|
|
191
|
+
providerPlugins: stats.providerPlugins,
|
|
192
|
+
agentPlugins: stats.agentPlugins,
|
|
193
|
+
workflowPlugins: stats.workflowPlugins,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// ─── Validation ─────────────────────────────────────────────────────────────
|
|
197
|
+
// Note: isValidWorkflowTemplate is imported from '../workflow/templates.js'
|
|
198
|
+
// to avoid duplicating the validation logic.
|
|
199
|
+
//# sourceMappingURL=agent-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-plugin.js","sourceRoot":"","sources":["../../src/plugins/agent-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { InferenceProvider } from '../inference/interface.js';
|
|
2
|
+
import { ProviderConfig } from '../config/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Plugin metadata
|
|
5
|
+
*/
|
|
6
|
+
export interface PluginMetadata {
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
description: string;
|
|
10
|
+
author?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Plugin interface for extending Buff with custom providers
|
|
14
|
+
*/
|
|
15
|
+
export interface ProviderPlugin {
|
|
16
|
+
metadata: PluginMetadata;
|
|
17
|
+
/**
|
|
18
|
+
* Create an inference provider instance from this plugin
|
|
19
|
+
*/
|
|
20
|
+
createProvider(config: ProviderConfig): InferenceProvider;
|
|
21
|
+
/**
|
|
22
|
+
* Get the provider type identifier (e.g., 'my-custom-provider')
|
|
23
|
+
*/
|
|
24
|
+
getProviderType(): string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Plugin registry for managing provider plugins
|
|
28
|
+
*/
|
|
29
|
+
export declare class PluginRegistry {
|
|
30
|
+
private plugins;
|
|
31
|
+
/**
|
|
32
|
+
* Register a new provider plugin
|
|
33
|
+
*/
|
|
34
|
+
register(plugin: ProviderPlugin): void;
|
|
35
|
+
/**
|
|
36
|
+
* Unregister a plugin
|
|
37
|
+
*/
|
|
38
|
+
unregister(providerType: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Get a plugin by provider type
|
|
41
|
+
*/
|
|
42
|
+
getPlugin(providerType: string): ProviderPlugin | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Get all registered plugins
|
|
45
|
+
*/
|
|
46
|
+
getAllPlugins(): ProviderPlugin[];
|
|
47
|
+
/**
|
|
48
|
+
* Check if a provider type has a registered plugin
|
|
49
|
+
*/
|
|
50
|
+
hasPlugin(providerType: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Create an inference provider from a plugin
|
|
53
|
+
*/
|
|
54
|
+
createProviderFromPlugin(providerType: string, config: ProviderConfig): InferenceProvider;
|
|
55
|
+
/**
|
|
56
|
+
* List all registered plugins with their metadata
|
|
57
|
+
*/
|
|
58
|
+
listPlugins(): PluginMetadata[];
|
|
59
|
+
}
|
|
60
|
+
export declare function getPluginRegistry(): PluginRegistry;
|
|
61
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAAC;IAE1D;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA0C;IAEzD;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAWtC;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAIzC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3D;;OAEG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,iBAAiB;IAQzF;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;CAGhC;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Plugin registry for managing provider plugins
|
|
4
|
+
*/
|
|
5
|
+
export class PluginRegistry {
|
|
6
|
+
plugins = new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Register a new provider plugin
|
|
9
|
+
*/
|
|
10
|
+
register(plugin) {
|
|
11
|
+
const type = plugin.getProviderType();
|
|
12
|
+
if (this.plugins.has(type)) {
|
|
13
|
+
logger.warn(`Overwriting existing plugin for provider type: ${type}`);
|
|
14
|
+
}
|
|
15
|
+
this.plugins.set(type, plugin);
|
|
16
|
+
logger.success(`Registered plugin: ${plugin.metadata.name} v${plugin.metadata.version}`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Unregister a plugin
|
|
20
|
+
*/
|
|
21
|
+
unregister(providerType) {
|
|
22
|
+
return this.plugins.delete(providerType);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get a plugin by provider type
|
|
26
|
+
*/
|
|
27
|
+
getPlugin(providerType) {
|
|
28
|
+
return this.plugins.get(providerType);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get all registered plugins
|
|
32
|
+
*/
|
|
33
|
+
getAllPlugins() {
|
|
34
|
+
return Array.from(this.plugins.values());
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a provider type has a registered plugin
|
|
38
|
+
*/
|
|
39
|
+
hasPlugin(providerType) {
|
|
40
|
+
return this.plugins.has(providerType);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create an inference provider from a plugin
|
|
44
|
+
*/
|
|
45
|
+
createProviderFromPlugin(providerType, config) {
|
|
46
|
+
const plugin = this.plugins.get(providerType);
|
|
47
|
+
if (!plugin) {
|
|
48
|
+
throw new Error(`No plugin registered for provider type: ${providerType}`);
|
|
49
|
+
}
|
|
50
|
+
return plugin.createProvider(config);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* List all registered plugins with their metadata
|
|
54
|
+
*/
|
|
55
|
+
listPlugins() {
|
|
56
|
+
return this.getAllPlugins().map((p) => p.metadata);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Singleton registry
|
|
60
|
+
let registryInstance = null;
|
|
61
|
+
export function getPluginRegistry() {
|
|
62
|
+
if (!registryInstance) {
|
|
63
|
+
registryInstance = new PluginRegistry();
|
|
64
|
+
}
|
|
65
|
+
return registryInstance;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA6B5C;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEzD;;OAEG;IACH,QAAQ,CAAC,MAAsB;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,sBAAsB,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,YAAoB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,YAAoB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,YAAoB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,YAAoB,EAAE,MAAsB;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,gBAAgB,GAA0B,IAAI,CAAC;AAEnD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,cAAc,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox images — Pre-defined Docker images for common programming languages.
|
|
3
|
+
*
|
|
4
|
+
* These are used as base images for sandbox containers. Each image definition
|
|
5
|
+
* includes the Docker image name, language/runtime details, and default
|
|
6
|
+
* install/test commands.
|
|
7
|
+
*
|
|
8
|
+
* Images are pulled on first use if not present locally.
|
|
9
|
+
*/
|
|
10
|
+
import type { SandboxImage } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Pre-defined sandbox images for common runtimes.
|
|
13
|
+
*/
|
|
14
|
+
export declare const BUILTIN_SANDBOX_IMAGES: SandboxImage[];
|
|
15
|
+
/**
|
|
16
|
+
* Find a built-in sandbox image by language/runtime name (case-insensitive).
|
|
17
|
+
*
|
|
18
|
+
* Examples:
|
|
19
|
+
* resolveSandboxImage('node') → node:20-slim
|
|
20
|
+
* resolveSandboxImage('python') → python:3.12-slim
|
|
21
|
+
* resolveSandboxImage('go') → golang:1.22
|
|
22
|
+
* resolveSandboxImage('golang') → golang:1.22
|
|
23
|
+
* resolveSandboxImage('rust') → rust:1.77-slim
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveSandboxImage(runtime: string): SandboxImage | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Get the default sandbox image based on detected project type.
|
|
28
|
+
* Checks for common project files to determine runtime.
|
|
29
|
+
*/
|
|
30
|
+
export declare function detectProjectImage(projectDir: string): SandboxImage;
|
|
31
|
+
//# sourceMappingURL=images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/sandbox/images.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,YAAY,EA0EhD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAsB7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CASnE"}
|