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,482 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Registry — GitHub-hosted marketplace for community workflow templates.
|
|
3
|
+
*
|
|
4
|
+
* The registry is a GitHub repo (agent-nuvira/workflows) that contains:
|
|
5
|
+
* index.json — Master index of all available templates
|
|
6
|
+
* templates/ — Directory of individual template files
|
|
7
|
+
* quick-fix.json
|
|
8
|
+
* security-audit.json
|
|
9
|
+
* ...
|
|
10
|
+
*
|
|
11
|
+
* Each template file is a JSON document matching the WorkflowTemplate interface
|
|
12
|
+
* extended with version, author, and source metadata.
|
|
13
|
+
*
|
|
14
|
+
* Commands:
|
|
15
|
+
* buff workflow search <query> — Search the GitHub registry
|
|
16
|
+
* buff workflow install <name> — Install a template from the registry
|
|
17
|
+
* buff workflow publish — Publish a local template to the registry
|
|
18
|
+
* buff workflow info <name> — Show template details from the registry
|
|
19
|
+
*/
|
|
20
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { homedir } from 'node:os';
|
|
23
|
+
import { getWorkflowTemplate, isValidWorkflowTemplate, } from './templates.js';
|
|
24
|
+
import { logger } from '../utils/logger.js';
|
|
25
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
26
|
+
/** GitHub raw content base URL for the workflow registry */
|
|
27
|
+
const REGISTRY_RAW_BASE = 'https://raw.githubusercontent.com/imdheerajKube/agent-nuvira/main';
|
|
28
|
+
/** GitHub API URL for the registry */
|
|
29
|
+
const REGISTRY_API_BASE = 'https://api.github.com/repos/imdheerajKube/agent-nuvira';
|
|
30
|
+
/** Local storage for installed registry templates */
|
|
31
|
+
const BUFF_DIR = join(homedir(), '.buff');
|
|
32
|
+
const INSTALLED_REGISTRY_DIR = join(BUFF_DIR, 'workflows', 'registry');
|
|
33
|
+
/** Cache file for the registry index */
|
|
34
|
+
const REGISTRY_CACHE_PATH = join(BUFF_DIR, 'workflows', 'registry-cache.json');
|
|
35
|
+
/** How long to cache the registry index (1 hour in ms) */
|
|
36
|
+
const REGISTRY_CACHE_TTL = 60 * 60 * 1000;
|
|
37
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
38
|
+
function ensureDirs() {
|
|
39
|
+
for (const dir of [INSTALLED_REGISTRY_DIR, join(BUFF_DIR, 'workflows')]) {
|
|
40
|
+
if (!existsSync(dir)) {
|
|
41
|
+
try {
|
|
42
|
+
mkdirSync(dir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
catch { /* best-effort */ }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ─── Registry Index ─────────────────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Fetch the registry index from GitHub (with TTL caching).
|
|
51
|
+
*/
|
|
52
|
+
export async function fetchRegistryIndex() {
|
|
53
|
+
// Check cache first
|
|
54
|
+
const cached = readRegistryCache();
|
|
55
|
+
if (cached)
|
|
56
|
+
return cached;
|
|
57
|
+
try {
|
|
58
|
+
const response = await fetch(`${REGISTRY_RAW_BASE}/index.json`, {
|
|
59
|
+
headers: {
|
|
60
|
+
'User-Agent': 'agent-nuvira/2.0',
|
|
61
|
+
'Accept': 'application/json',
|
|
62
|
+
},
|
|
63
|
+
signal: AbortSignal.timeout(10000), // 10s timeout
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
logger.debug(`Registry index fetch failed (${response.status}), using cache`);
|
|
67
|
+
return cached || [];
|
|
68
|
+
}
|
|
69
|
+
const index = await response.json();
|
|
70
|
+
if (!index.templates || !Array.isArray(index.templates)) {
|
|
71
|
+
logger.debug('Invalid registry index format');
|
|
72
|
+
return cached || [];
|
|
73
|
+
}
|
|
74
|
+
// Update cache
|
|
75
|
+
writeRegistryCache(index.templates);
|
|
76
|
+
return index.templates;
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
logger.debug(`Failed to fetch registry index: ${err}`);
|
|
80
|
+
return cached || [];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Search the registry for templates matching a query.
|
|
85
|
+
*/
|
|
86
|
+
export async function searchRegistry(query) {
|
|
87
|
+
const templates = await fetchRegistryIndex();
|
|
88
|
+
const q = query.toLowerCase();
|
|
89
|
+
return templates.filter((t) => {
|
|
90
|
+
const searchable = `${t.id} ${t.name} ${t.description} ${t.tags.join(' ')}`.toLowerCase();
|
|
91
|
+
return searchable.includes(q);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get a specific template entry from the registry by ID.
|
|
96
|
+
*/
|
|
97
|
+
export async function getRegistryEntry(id) {
|
|
98
|
+
const templates = await fetchRegistryIndex();
|
|
99
|
+
return templates.find((t) => t.id === id) || null;
|
|
100
|
+
}
|
|
101
|
+
// ─── Install ────────────────────────────────────────────────────────────────
|
|
102
|
+
/**
|
|
103
|
+
* Install a workflow template from the registry.
|
|
104
|
+
*
|
|
105
|
+
* Downloads the template JSON file from GitHub and saves it to
|
|
106
|
+
* ~/.buff/workflows/registry/<id>.json where the workflow system
|
|
107
|
+
* can auto-discover it.
|
|
108
|
+
*
|
|
109
|
+
* @param templateId The template ID to install
|
|
110
|
+
* @returns The installed WorkflowTemplate, or null if failed
|
|
111
|
+
*/
|
|
112
|
+
export async function installTemplate(templateId) {
|
|
113
|
+
// First check if it exists in the registry index
|
|
114
|
+
const entry = await getRegistryEntry(templateId);
|
|
115
|
+
if (!entry) {
|
|
116
|
+
logger.error(`Template '${templateId}' not found in the registry.`);
|
|
117
|
+
logger.info('Search available templates: buff workflow search <query>');
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
// Check if already installed
|
|
121
|
+
const localPath = join(INSTALLED_REGISTRY_DIR, `${templateId}.json`);
|
|
122
|
+
if (existsSync(localPath)) {
|
|
123
|
+
logger.info(`Template '${templateId}' is already installed.`);
|
|
124
|
+
logger.info('To reinstall, first remove it: rm ~/.buff/workflows/registry/<id>.json');
|
|
125
|
+
// Still return the existing one so it can be used
|
|
126
|
+
return readLocalTemplate(templateId);
|
|
127
|
+
}
|
|
128
|
+
// Download the template file
|
|
129
|
+
try {
|
|
130
|
+
const url = `${REGISTRY_RAW_BASE}/templates/${templateId}.json`;
|
|
131
|
+
const response = await fetch(url, {
|
|
132
|
+
headers: {
|
|
133
|
+
'User-Agent': 'agent-nuvira/2.0',
|
|
134
|
+
'Accept': 'application/json',
|
|
135
|
+
},
|
|
136
|
+
signal: AbortSignal.timeout(15000),
|
|
137
|
+
});
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
logger.error(`Failed to download template '${templateId}' (${response.status})`);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const template = await response.json();
|
|
143
|
+
// Validate the template
|
|
144
|
+
if (!isValidWorkflowTemplate(template)) {
|
|
145
|
+
logger.error(`Downloaded template '${templateId}' is not a valid workflow template.`);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
// Save locally
|
|
149
|
+
ensureDirs();
|
|
150
|
+
const enriched = {
|
|
151
|
+
...template,
|
|
152
|
+
_registryVersion: entry.version,
|
|
153
|
+
_registryAuthor: entry.author,
|
|
154
|
+
_installedAt: new Date().toISOString(),
|
|
155
|
+
};
|
|
156
|
+
writeFileSync(localPath, JSON.stringify(enriched, null, 2), 'utf-8');
|
|
157
|
+
logger.success(`Installed workflow template: ${template.name} v${entry.version}`);
|
|
158
|
+
return template;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
logger.error(`Failed to install template '${templateId}': ${err instanceof Error ? err.message : String(err)}`);
|
|
162
|
+
logger.info('Check your internet connection or try again later.');
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Read an installed template from local storage.
|
|
168
|
+
*/
|
|
169
|
+
function readLocalTemplate(templateId) {
|
|
170
|
+
const localPath = join(INSTALLED_REGISTRY_DIR, `${templateId}.json`);
|
|
171
|
+
try {
|
|
172
|
+
if (!existsSync(localPath))
|
|
173
|
+
return null;
|
|
174
|
+
const content = readFileSync(localPath, 'utf-8');
|
|
175
|
+
const template = JSON.parse(content);
|
|
176
|
+
// Strip internal metadata before returning
|
|
177
|
+
delete template._registryVersion;
|
|
178
|
+
delete template._registryAuthor;
|
|
179
|
+
delete template._installedAt;
|
|
180
|
+
return template;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get all locally installed registry templates.
|
|
188
|
+
*/
|
|
189
|
+
export function getInstalledTemplates() {
|
|
190
|
+
ensureDirs();
|
|
191
|
+
const templates = [];
|
|
192
|
+
try {
|
|
193
|
+
const files = readdirSync(INSTALLED_REGISTRY_DIR).filter((f) => f.endsWith('.json'));
|
|
194
|
+
for (const file of files) {
|
|
195
|
+
const template = readLocalTemplate(file.replace('.json', ''));
|
|
196
|
+
if (template) {
|
|
197
|
+
templates.push(template);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Directory might not exist yet
|
|
203
|
+
}
|
|
204
|
+
return templates;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Validate a local workflow template for publishing.
|
|
208
|
+
* Checks for required fields, valid steps, etc.
|
|
209
|
+
*/
|
|
210
|
+
export function validateForPublish(templateId) {
|
|
211
|
+
// Find the template in local workflows
|
|
212
|
+
const localPath = join(BUFF_DIR, 'workflows', `${templateId}.json`);
|
|
213
|
+
if (!existsSync(localPath)) {
|
|
214
|
+
// Also check .buff/workflows/registry/
|
|
215
|
+
const registryPath = join(INSTALLED_REGISTRY_DIR, `${templateId}.json`);
|
|
216
|
+
if (!existsSync(registryPath)) {
|
|
217
|
+
return {
|
|
218
|
+
valid: false,
|
|
219
|
+
errors: [`Template '${templateId}' not found in ~/.buff/workflows/ or ~/.buff/workflows/registry/`],
|
|
220
|
+
warnings: [],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
const filePath = existsSync(join(BUFF_DIR, 'workflows', `${templateId}.json`))
|
|
226
|
+
? join(BUFF_DIR, 'workflows', `${templateId}.json`)
|
|
227
|
+
: join(INSTALLED_REGISTRY_DIR, `${templateId}.json`);
|
|
228
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
229
|
+
const template = JSON.parse(content);
|
|
230
|
+
const errors = [];
|
|
231
|
+
const warnings = [];
|
|
232
|
+
// Required fields
|
|
233
|
+
if (!template.id || typeof template.id !== 'string')
|
|
234
|
+
errors.push('Missing or invalid: id (string)');
|
|
235
|
+
if (!template.name || typeof template.name !== 'string')
|
|
236
|
+
errors.push('Missing or invalid: name (string)');
|
|
237
|
+
if (!template.description || typeof template.description !== 'string')
|
|
238
|
+
errors.push('Missing or invalid: description (string)');
|
|
239
|
+
if (!Array.isArray(template.steps) || template.steps.length === 0)
|
|
240
|
+
errors.push('Missing or invalid: steps (non-empty array)');
|
|
241
|
+
// Validate steps
|
|
242
|
+
if (Array.isArray(template.steps)) {
|
|
243
|
+
for (let i = 0; i < template.steps.length; i++) {
|
|
244
|
+
const step = template.steps[i];
|
|
245
|
+
if (!step.agentType || typeof step.agentType !== 'string') {
|
|
246
|
+
errors.push(`steps[${i}]: missing or invalid agentType`);
|
|
247
|
+
}
|
|
248
|
+
if (!step.description || typeof step.description !== 'string') {
|
|
249
|
+
errors.push(`steps[${i}]: missing or invalid description`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// ID format
|
|
254
|
+
if (template.id && typeof template.id === 'string' && !/^[a-z0-9-]+$/.test(template.id)) {
|
|
255
|
+
errors.push('Template ID must be lowercase alphanumeric with hyphens only');
|
|
256
|
+
}
|
|
257
|
+
// Warnings
|
|
258
|
+
if (!template.recommendedModels)
|
|
259
|
+
warnings.push('No recommendedModels defined — agents will use default provider');
|
|
260
|
+
if (!template.useMemory && template.useMemory !== false)
|
|
261
|
+
warnings.push('useMemory not set — defaulting to false');
|
|
262
|
+
if (template.description && typeof template.description === 'string' && template.description.length > 200) {
|
|
263
|
+
warnings.push('Description is longer than 200 characters — consider shortening');
|
|
264
|
+
}
|
|
265
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
return {
|
|
269
|
+
valid: false,
|
|
270
|
+
errors: [`Failed to read template: ${err instanceof Error ? err.message : String(err)}`],
|
|
271
|
+
warnings: [],
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Prepare a local template for publishing.
|
|
277
|
+
* Returns a JSON string that can be submitted as a PR to the registry.
|
|
278
|
+
*/
|
|
279
|
+
export function prepareForPublish(templateId) {
|
|
280
|
+
const validation = validateForPublish(templateId);
|
|
281
|
+
if (!validation.valid) {
|
|
282
|
+
logger.error('Validation failed. Fix these issues:');
|
|
283
|
+
for (const err of validation.errors) {
|
|
284
|
+
logger.error(` ${err}`);
|
|
285
|
+
}
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
// Find and read the template
|
|
289
|
+
const localPath = join(BUFF_DIR, 'workflows', `${templateId}.json`);
|
|
290
|
+
const filePath = existsSync(localPath)
|
|
291
|
+
? localPath
|
|
292
|
+
: join(INSTALLED_REGISTRY_DIR, `${templateId}.json`);
|
|
293
|
+
try {
|
|
294
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
295
|
+
const template = JSON.parse(content);
|
|
296
|
+
// Add/update metadata for publishing
|
|
297
|
+
const publishData = {
|
|
298
|
+
id: template.id,
|
|
299
|
+
name: template.name,
|
|
300
|
+
description: template.description,
|
|
301
|
+
version: template.version || '1.0.0',
|
|
302
|
+
author: template.author || 'anonymous',
|
|
303
|
+
steps: template.steps,
|
|
304
|
+
recommendedModels: template.recommendedModels || {},
|
|
305
|
+
useMemory: template.useMemory || false,
|
|
306
|
+
tags: template.tags || [],
|
|
307
|
+
};
|
|
308
|
+
return JSON.stringify(publishData, null, 2);
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
logger.error(`Failed to prepare template for publish: ${err}`);
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get the URL for submitting a new template to the registry.
|
|
317
|
+
*/
|
|
318
|
+
export function getPublishUrl() {
|
|
319
|
+
return 'https://github.com/imdheerajKube/agent-nuvira/issues/new?template=template-submission.md';
|
|
320
|
+
}
|
|
321
|
+
// ─── Version & Dependency Resolution ────────────────────────────────────────
|
|
322
|
+
/**
|
|
323
|
+
* Compare two semantic version strings.
|
|
324
|
+
* Returns 1 if a > b, -1 if a < b, 0 if equal.
|
|
325
|
+
*/
|
|
326
|
+
export function compareVersions(a, b) {
|
|
327
|
+
const aParts = a.split('.').map(Number);
|
|
328
|
+
const bParts = b.split('.').map(Number);
|
|
329
|
+
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
330
|
+
const aVal = aParts[i] || 0;
|
|
331
|
+
const bVal = bParts[i] || 0;
|
|
332
|
+
if (aVal > bVal)
|
|
333
|
+
return 1;
|
|
334
|
+
if (aVal < bVal)
|
|
335
|
+
return -1;
|
|
336
|
+
}
|
|
337
|
+
return 0;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Check if a version satisfies a semver constraint (e.g., ">=1.0.0", "^2.0.0").
|
|
341
|
+
*/
|
|
342
|
+
export function versionSatisfies(version, constraint) {
|
|
343
|
+
// Simple prefix-based constraint check
|
|
344
|
+
if (constraint.startsWith('>=')) {
|
|
345
|
+
return compareVersions(version, constraint.slice(2)) >= 0;
|
|
346
|
+
}
|
|
347
|
+
if (constraint.startsWith('<=')) {
|
|
348
|
+
return compareVersions(version, constraint.slice(2)) <= 0;
|
|
349
|
+
}
|
|
350
|
+
if (constraint.startsWith('^')) {
|
|
351
|
+
// ^1.2.3 means >=1.2.3 and <2.0.0
|
|
352
|
+
const target = constraint.slice(1).split('.').map(Number);
|
|
353
|
+
const current = version.split('.').map(Number);
|
|
354
|
+
if (compareVersions(version, constraint.slice(1)) < 0)
|
|
355
|
+
return false;
|
|
356
|
+
if (target[0] !== undefined && (current[0] || 0) > target[0])
|
|
357
|
+
return false;
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
if (constraint.startsWith('~')) {
|
|
361
|
+
// ~1.2.3 means >=1.2.3 and <1.3.0
|
|
362
|
+
const target = constraint.slice(1).split('.').map(Number);
|
|
363
|
+
const current = version.split('.').map(Number);
|
|
364
|
+
if (compareVersions(version, constraint.slice(1)) < 0)
|
|
365
|
+
return false;
|
|
366
|
+
if (target[0] !== undefined && (current[0] || 0) !== target[0])
|
|
367
|
+
return false;
|
|
368
|
+
if (target[1] !== undefined && (current[1] || 0) > target[1])
|
|
369
|
+
return false;
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
// Exact match or bare number
|
|
373
|
+
return compareVersions(version, constraint) === 0;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Check if an installed template has a newer version available in the registry.
|
|
377
|
+
*/
|
|
378
|
+
export async function checkForUpgrades() {
|
|
379
|
+
const installed = getInstalledTemplates();
|
|
380
|
+
if (installed.length === 0)
|
|
381
|
+
return [];
|
|
382
|
+
const registry = await fetchRegistryIndex();
|
|
383
|
+
const upgrades = [];
|
|
384
|
+
for (const t of installed) {
|
|
385
|
+
if (!t.version || !t.id)
|
|
386
|
+
continue;
|
|
387
|
+
const entry = registry.find((e) => e.id === t.id);
|
|
388
|
+
if (entry && compareVersions(entry.version, t.version) > 0) {
|
|
389
|
+
upgrades.push({ id: t.id, currentVersion: t.version, latestVersion: entry.version });
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return upgrades;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Resolve dependencies for a template.
|
|
396
|
+
* Returns any missing dependencies that need to be installed.
|
|
397
|
+
*/
|
|
398
|
+
export async function resolveDependencies(template) {
|
|
399
|
+
const deps = template.dependencies || [];
|
|
400
|
+
const met = [];
|
|
401
|
+
const missing = [];
|
|
402
|
+
for (const dep of deps) {
|
|
403
|
+
switch (dep.type) {
|
|
404
|
+
case 'template': {
|
|
405
|
+
// Check if the dependency template exists (built-in or installed)
|
|
406
|
+
const builtin = getWorkflowTemplate(dep.name);
|
|
407
|
+
if (builtin) {
|
|
408
|
+
met.push(dep);
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
const localPath = join(INSTALLED_REGISTRY_DIR, `${dep.name}.json`);
|
|
412
|
+
if (existsSync(localPath)) {
|
|
413
|
+
met.push(dep);
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
// Check registry
|
|
417
|
+
const entry = await getRegistryEntry(dep.name);
|
|
418
|
+
if (entry) {
|
|
419
|
+
missing.push(dep);
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
missing.push({ ...dep, description: `${dep.description || dep.name} (not found in registry)` });
|
|
423
|
+
}
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case 'npm':
|
|
427
|
+
case 'cli':
|
|
428
|
+
// For npm/cli dependencies, we can't easily verify during a template install
|
|
429
|
+
// Just record them as met-with-caveats
|
|
430
|
+
met.push(dep);
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return { met, missing };
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Validate that all dependencies of a template are satisfied.
|
|
438
|
+
* Returns true if all dependencies are met or optional.
|
|
439
|
+
*/
|
|
440
|
+
export function dependenciesMet(deps) {
|
|
441
|
+
return deps.every((d) => d.optional);
|
|
442
|
+
}
|
|
443
|
+
// ─── Registry Cache ─────────────────────────────────────────────────────────
|
|
444
|
+
function readRegistryCache() {
|
|
445
|
+
try {
|
|
446
|
+
if (!existsSync(REGISTRY_CACHE_PATH))
|
|
447
|
+
return null;
|
|
448
|
+
const raw = readFileSync(REGISTRY_CACHE_PATH, 'utf-8');
|
|
449
|
+
const cached = JSON.parse(raw);
|
|
450
|
+
// Check TTL
|
|
451
|
+
if (Date.now() - cached.timestamp > REGISTRY_CACHE_TTL)
|
|
452
|
+
return null;
|
|
453
|
+
return cached.templates;
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function writeRegistryCache(templates) {
|
|
460
|
+
try {
|
|
461
|
+
ensureDirs();
|
|
462
|
+
const data = { timestamp: Date.now(), templates };
|
|
463
|
+
writeFileSync(REGISTRY_CACHE_PATH, JSON.stringify(data, null, 2), 'utf-8');
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// Non-critical
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Clear the registry index cache.
|
|
471
|
+
*/
|
|
472
|
+
export function clearRegistryCache() {
|
|
473
|
+
try {
|
|
474
|
+
if (existsSync(REGISTRY_CACHE_PATH)) {
|
|
475
|
+
writeFileSync(REGISTRY_CACHE_PATH, JSON.stringify({ timestamp: 0, templates: [] }), 'utf-8');
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
// Non-critical
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/workflow/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Templates — Pre-built agent pipeline templates.
|
|
3
|
+
*
|
|
4
|
+
* Each template defines a sequence of agent steps for common tasks.
|
|
5
|
+
* The WorkflowEngine uses these to pre-fill the orchestrator's task plan,
|
|
6
|
+
* bypassing the PlannerAgent when a fixed workflow is desired.
|
|
7
|
+
*
|
|
8
|
+
* Built-in templates:
|
|
9
|
+
* - quick-fix: gather context → edit → run → review (small, fast changes)
|
|
10
|
+
* - feature-implement: plan → gather → write → test → review (new features)
|
|
11
|
+
* - create-and-run: write → run → review (create from scratch + execute)
|
|
12
|
+
* - publish-release: test → build → version → publish (release pipeline)
|
|
13
|
+
*/
|
|
14
|
+
import type { TaskStep } from '../agents/agent.js';
|
|
15
|
+
import type { OrchestratorOptions } from '../agents/orchestrator.js';
|
|
16
|
+
export interface WorkflowTemplate {
|
|
17
|
+
/** Template identifier (used in CLI: `buff workflow run quick-fix`) */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Human-readable name */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Short description */
|
|
22
|
+
description: string;
|
|
23
|
+
/** Ordered agent steps that form the pipeline */
|
|
24
|
+
steps: WorkflowStep[];
|
|
25
|
+
/** Recommended model routing for this workflow */
|
|
26
|
+
recommendedModels?: Partial<Record<string, string>>;
|
|
27
|
+
/** Whether to use memory for this workflow type */
|
|
28
|
+
useMemory?: boolean;
|
|
29
|
+
/** Semantic version (for registry-published templates) */
|
|
30
|
+
version?: string;
|
|
31
|
+
/** Author name or GitHub handle (for registry-published templates) */
|
|
32
|
+
author?: string;
|
|
33
|
+
/** Tags for categorization (e.g., ['test', 'release', 'security']) */
|
|
34
|
+
tags?: string[];
|
|
35
|
+
/**
|
|
36
|
+
* Template and package dependencies required by this template.
|
|
37
|
+
* Used for version resolution and dependency checking during install.
|
|
38
|
+
*/
|
|
39
|
+
dependencies?: WorkflowDependency[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A dependency declaration for a workflow template.
|
|
43
|
+
* Can reference other templates, npm packages, or CLI tools.
|
|
44
|
+
*/
|
|
45
|
+
export interface WorkflowDependency {
|
|
46
|
+
/** Type of dependency: 'template' | 'npm' | 'cli' */
|
|
47
|
+
type: 'template' | 'npm' | 'cli';
|
|
48
|
+
/** Name/identifier of the dependency */
|
|
49
|
+
name: string;
|
|
50
|
+
/** Semantic version constraint (e.g., ">=1.0.0", "^2.0.0") */
|
|
51
|
+
version?: string;
|
|
52
|
+
/** Whether this dependency is optional */
|
|
53
|
+
optional?: boolean;
|
|
54
|
+
/** Description of why this dependency is needed */
|
|
55
|
+
description?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface WorkflowStep {
|
|
58
|
+
/** Agent type (must be registered in Orchestrator's createAgent) */
|
|
59
|
+
agentType: string;
|
|
60
|
+
/** Description of what this step does (becomes the task description) */
|
|
61
|
+
description: string;
|
|
62
|
+
/** IDs of steps this step depends on (index-based: ['step-0', 'step-1']) */
|
|
63
|
+
dependsOn: string[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get all available workflow templates.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getWorkflowTemplates(): WorkflowTemplate[];
|
|
69
|
+
/**
|
|
70
|
+
* Get a specific workflow template by ID.
|
|
71
|
+
*/
|
|
72
|
+
export declare function getWorkflowTemplate(id: string): WorkflowTemplate | undefined;
|
|
73
|
+
/**
|
|
74
|
+
* Build a task plan from a workflow template, filling in the user's goal.
|
|
75
|
+
* Each step gets a stable ID (step-0, step-1, etc.) and the dependsOn
|
|
76
|
+
* references are translated from index-based to ID-based.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildTaskPlanFromTemplate(template: WorkflowTemplate, goal: string): TaskStep[];
|
|
79
|
+
/**
|
|
80
|
+
* Build OrchestratorOptions from a workflow template.
|
|
81
|
+
* Merges the template's recommended models with user overrides.
|
|
82
|
+
*/
|
|
83
|
+
/**
|
|
84
|
+
* Validate that an object is a valid WorkflowTemplate.
|
|
85
|
+
* Used by the workflow registry when installing templates.
|
|
86
|
+
*/
|
|
87
|
+
export declare function isValidWorkflowTemplate(obj: unknown): obj is WorkflowTemplate;
|
|
88
|
+
/**
|
|
89
|
+
* Build OrchestratorOptions from a workflow template.
|
|
90
|
+
* Merges the template's recommended models with user overrides.
|
|
91
|
+
*/
|
|
92
|
+
export declare function buildWorkflowOptions(template: WorkflowTemplate, userOptions?: Partial<OrchestratorOptions>): OrchestratorOptions;
|
|
93
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/workflow/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,IAAI,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;IACjC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AA0ZD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,GACX,QAAQ,EAAE,CAQZ;AAED;;;GAGG;AACH;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAgB7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC7C,mBAAmB,CAUrB"}
|