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,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternExtractor — Extracts reusable coding patterns from high-scoring
|
|
3
|
+
* execution trajectories and stores them for future prompting.
|
|
4
|
+
*
|
|
5
|
+
* A "pattern" is a concise description of how a particular type of task
|
|
6
|
+
* was successfully completed: which files were involved, what steps were
|
|
7
|
+
* taken, what conventions were followed.
|
|
8
|
+
*
|
|
9
|
+
* These patterns are injected alongside trajectory few-shot examples
|
|
10
|
+
* when the PlannerAgent decomposes a new goal.
|
|
11
|
+
*
|
|
12
|
+
* Patterns are stored in ~/.buff/memory/patterns.json
|
|
13
|
+
*/
|
|
14
|
+
import type { LLMCallFn } from '../agents/agent.js';
|
|
15
|
+
import type { Trajectory } from '../memory/trajectory-store.js';
|
|
16
|
+
/** A reusable coding pattern extracted from successful trajectories */
|
|
17
|
+
export interface CodingPattern {
|
|
18
|
+
/** Unique identifier */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Short descriptive title (e.g., "Adding CLI commands") */
|
|
21
|
+
title: string;
|
|
22
|
+
/** Which project types this applies to (e.g., "typescript, node") */
|
|
23
|
+
applicableDomains: string[];
|
|
24
|
+
/** The pattern description — steps, conventions, file structure */
|
|
25
|
+
description: string;
|
|
26
|
+
/** File paths commonly involved (pattern-based, not absolute) */
|
|
27
|
+
commonFiles: string[];
|
|
28
|
+
/** Agent types commonly used */
|
|
29
|
+
commonAgentSequence: string[];
|
|
30
|
+
/** How many trajectories this was distilled from */
|
|
31
|
+
sourceCount: number;
|
|
32
|
+
/** Average score of source trajectories */
|
|
33
|
+
avgSourceScore: number;
|
|
34
|
+
/** When this pattern was created */
|
|
35
|
+
createdAt: number;
|
|
36
|
+
/** When this pattern was last used (for decay scoring) */
|
|
37
|
+
lastUsedAt: number;
|
|
38
|
+
/** How many times this pattern has been used */
|
|
39
|
+
usageCount: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Manages storage and retrieval of reusable coding patterns.
|
|
43
|
+
* Patterns are extracted from high-scoring trajectories via LLM.
|
|
44
|
+
*/
|
|
45
|
+
export declare class PatternStore {
|
|
46
|
+
private patterns;
|
|
47
|
+
constructor();
|
|
48
|
+
/**
|
|
49
|
+
* Get all stored patterns, optionally filtered by minimum quality score.
|
|
50
|
+
*/
|
|
51
|
+
getAll(minQualityScore?: number): CodingPattern[];
|
|
52
|
+
/**
|
|
53
|
+
* Get patterns relevant to a specific project domain.
|
|
54
|
+
*/
|
|
55
|
+
getByDomain(domainTags: string[]): CodingPattern[];
|
|
56
|
+
/**
|
|
57
|
+
* Format patterns as a prompt string for agent injection.
|
|
58
|
+
*/
|
|
59
|
+
formatAsPrompt(domainTags?: string[]): string;
|
|
60
|
+
/**
|
|
61
|
+
* Extract patterns from high-scoring trajectories using the LLM.
|
|
62
|
+
* Newly extracted patterns are merged with existing ones (keeping the best).
|
|
63
|
+
*/
|
|
64
|
+
extractFromTrajectories(trajectories: Trajectory[], callLLM: LLMCallFn): Promise<number>;
|
|
65
|
+
/**
|
|
66
|
+
* Mark a pattern as used (for decay tracking).
|
|
67
|
+
*/
|
|
68
|
+
markUsed(patternId: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Compute a decay score for a pattern based on age and usage.
|
|
71
|
+
* Returns a score from 0 (expired) to 1 (fresh).
|
|
72
|
+
*/
|
|
73
|
+
computeDecayScore(pattern: CodingPattern): number;
|
|
74
|
+
/**
|
|
75
|
+
* Garbage collect low-quality patterns.
|
|
76
|
+
* Returns the number of patterns removed.
|
|
77
|
+
*/
|
|
78
|
+
garbageCollect(verbose?: boolean): number;
|
|
79
|
+
/**
|
|
80
|
+
* Get decay quality statistics for all patterns.
|
|
81
|
+
*/
|
|
82
|
+
getQualityReport(): Array<{
|
|
83
|
+
id: string;
|
|
84
|
+
title: string;
|
|
85
|
+
decayScore: number;
|
|
86
|
+
usageCount: number;
|
|
87
|
+
ageDays: number;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Clear all patterns.
|
|
91
|
+
*/
|
|
92
|
+
clear(): void;
|
|
93
|
+
private load;
|
|
94
|
+
private save;
|
|
95
|
+
private buildExtractionPrompt;
|
|
96
|
+
private parsePatterns;
|
|
97
|
+
}
|
|
98
|
+
export declare function getPatternStore(): PatternStore;
|
|
99
|
+
//# sourceMappingURL=pattern-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-extractor.d.ts","sourceRoot":"","sources":["../../src/learning/pattern-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAKhE,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gCAAgC;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAmDD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAuB;;IAQvC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAQjD;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE;IAWlD;;OAEG;IACH,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAqB7C;;;OAGG;IACG,uBAAuB,CAC3B,YAAY,EAAE,UAAU,EAAE,EAC1B,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,CAAC;IAqDlB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASjC;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM;IAqBjD;;;OAGG;IACH,cAAc,CAAC,OAAO,GAAE,OAAe,GAAG,MAAM;IA0BhD;;OAEG;IACH,gBAAgB,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAWjH;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,IAAI;IAoBZ,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;CAiCtB;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternExtractor — Extracts reusable coding patterns from high-scoring
|
|
3
|
+
* execution trajectories and stores them for future prompting.
|
|
4
|
+
*
|
|
5
|
+
* A "pattern" is a concise description of how a particular type of task
|
|
6
|
+
* was successfully completed: which files were involved, what steps were
|
|
7
|
+
* taken, what conventions were followed.
|
|
8
|
+
*
|
|
9
|
+
* These patterns are injected alongside trajectory few-shot examples
|
|
10
|
+
* when the PlannerAgent decomposes a new goal.
|
|
11
|
+
*
|
|
12
|
+
* Patterns are stored in ~/.buff/memory/patterns.json
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { logger } from '../utils/logger.js';
|
|
18
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
19
|
+
const MEMORY_DIR = join(homedir(), '.buff', 'memory');
|
|
20
|
+
const PATTERNS_PATH = join(MEMORY_DIR, 'patterns.json');
|
|
21
|
+
const CURRENT_VERSION = 2;
|
|
22
|
+
const MAX_PATTERNS = 30;
|
|
23
|
+
const MIN_SCORE_FOR_EXTRACTION = 0.7; // Only extract from high-quality trajectories
|
|
24
|
+
const MAX_TRAJECTORIES_FOR_EXTRACTION = 5;
|
|
25
|
+
// Pattern decay: patterns lose relevance over time
|
|
26
|
+
const PATTERN_TTL_DAYS = 90; // Expire after 90 days without use
|
|
27
|
+
const DECAY_DAYS_FOR_HALF_SCORE = 30; // Score halves after 30 days of no use
|
|
28
|
+
const MIN_PATTERN_SCORE = 0.2; // Prune patterns below this score
|
|
29
|
+
const EXTRACTION_PROMPT = `You are a senior software architect analyzing successful task executions. Given a set of execution trajectories, identify reusable patterns that would help complete similar tasks in the future.
|
|
30
|
+
|
|
31
|
+
For each distinct pattern you identify, provide:
|
|
32
|
+
1. A short title (max 60 chars)
|
|
33
|
+
2. Which tech stacks/domains it applies to (comma-separated)
|
|
34
|
+
3. A concise description of the approach/structure (2-4 sentences)
|
|
35
|
+
4. The file paths typically involved (as glob-like patterns)
|
|
36
|
+
5. The agent sequence that works well for this task type
|
|
37
|
+
|
|
38
|
+
Focus on structural patterns, not specific code. What matters is:
|
|
39
|
+
- Which files tend to be touched together?
|
|
40
|
+
- What's the right order of operations?
|
|
41
|
+
- What conventions should be followed?
|
|
42
|
+
|
|
43
|
+
Return a JSON array of patterns. Example:
|
|
44
|
+
[
|
|
45
|
+
{
|
|
46
|
+
"title": "Adding new CLI commands",
|
|
47
|
+
"applicableDomains": ["typescript", "node", "cli"],
|
|
48
|
+
"description": "When adding a new CLI command, first update the command registration in the router, then create the implementation module, then update help text and exports.",
|
|
49
|
+
"commonFiles": ["src/cli/router.ts", "src/cli/*.ts", "src/index.ts"],
|
|
50
|
+
"commonAgentSequence": ["context-gatherer", "writer", "reviewer"]
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
Extract up to 3 patterns from the provided trajectories.`;
|
|
55
|
+
// ─── PatternStore ───────────────────────────────────────────────────────────
|
|
56
|
+
/**
|
|
57
|
+
* Manages storage and retrieval of reusable coding patterns.
|
|
58
|
+
* Patterns are extracted from high-scoring trajectories via LLM.
|
|
59
|
+
*/
|
|
60
|
+
export class PatternStore {
|
|
61
|
+
patterns = [];
|
|
62
|
+
constructor() {
|
|
63
|
+
this.patterns = this.load();
|
|
64
|
+
}
|
|
65
|
+
// ── Public API ──────────────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Get all stored patterns, optionally filtered by minimum quality score.
|
|
68
|
+
*/
|
|
69
|
+
getAll(minQualityScore) {
|
|
70
|
+
const patterns = [...this.patterns];
|
|
71
|
+
if (minQualityScore !== undefined) {
|
|
72
|
+
return patterns.filter((p) => this.computeDecayScore(p) >= minQualityScore);
|
|
73
|
+
}
|
|
74
|
+
return patterns;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get patterns relevant to a specific project domain.
|
|
78
|
+
*/
|
|
79
|
+
getByDomain(domainTags) {
|
|
80
|
+
if (domainTags.length === 0)
|
|
81
|
+
return this.getAll().slice(0, 3);
|
|
82
|
+
return this.patterns
|
|
83
|
+
.filter((p) => p.applicableDomains.some((d) => domainTags.some((tag) => d.toLowerCase().includes(tag.toLowerCase()))))
|
|
84
|
+
.slice(0, 3);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format patterns as a prompt string for agent injection.
|
|
88
|
+
*/
|
|
89
|
+
formatAsPrompt(domainTags) {
|
|
90
|
+
const relevant = domainTags ? this.getByDomain(domainTags) : this.getAll().slice(0, 3);
|
|
91
|
+
if (relevant.length === 0)
|
|
92
|
+
return '';
|
|
93
|
+
const parts = relevant.map((p, i) => `## Pattern ${i + 1}: ${p.title}\n` +
|
|
94
|
+
`Domains: ${p.applicableDomains.join(', ')}\n` +
|
|
95
|
+
`Approach: ${p.description}\n` +
|
|
96
|
+
`Common files: ${p.commonFiles.join(', ')}\n` +
|
|
97
|
+
`Agent sequence: ${p.commonAgentSequence.join(' → ')}`);
|
|
98
|
+
return (`\n---\n` +
|
|
99
|
+
`Here are reusable patterns learned from past successful executions similar to this project:\n\n` +
|
|
100
|
+
parts.join('\n\n') +
|
|
101
|
+
`\n---\n`);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Extract patterns from high-scoring trajectories using the LLM.
|
|
105
|
+
* Newly extracted patterns are merged with existing ones (keeping the best).
|
|
106
|
+
*/
|
|
107
|
+
async extractFromTrajectories(trajectories, callLLM) {
|
|
108
|
+
const highScoring = trajectories
|
|
109
|
+
.filter((t) => t.score >= MIN_SCORE_FOR_EXTRACTION)
|
|
110
|
+
.slice(0, MAX_TRAJECTORIES_FOR_EXTRACTION);
|
|
111
|
+
if (highScoring.length < 2)
|
|
112
|
+
return 0; // Need at least 2 for pattern extraction
|
|
113
|
+
const prompt = this.buildExtractionPrompt(highScoring);
|
|
114
|
+
let response;
|
|
115
|
+
try {
|
|
116
|
+
response = await callLLM(prompt, {
|
|
117
|
+
temperature: 0.3,
|
|
118
|
+
maxTokens: 4096,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
logger.debug(`Pattern extraction failed: ${err}`);
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
const newPatterns = this.parsePatterns(response);
|
|
126
|
+
if (newPatterns.length === 0)
|
|
127
|
+
return 0;
|
|
128
|
+
// Merge: replace existing patterns with same title, add new ones
|
|
129
|
+
for (const pattern of newPatterns) {
|
|
130
|
+
pattern.id = `pattern-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
131
|
+
pattern.sourceCount = highScoring.length;
|
|
132
|
+
pattern.avgSourceScore =
|
|
133
|
+
highScoring.reduce((sum, t) => sum + t.score, 0) / highScoring.length;
|
|
134
|
+
pattern.createdAt = Date.now();
|
|
135
|
+
pattern.lastUsedAt = Date.now();
|
|
136
|
+
pattern.usageCount = 0;
|
|
137
|
+
const existing = this.patterns.findIndex((p) => p.title.toLowerCase() === pattern.title.toLowerCase());
|
|
138
|
+
if (existing >= 0) {
|
|
139
|
+
this.patterns[existing] = pattern;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.patterns.push(pattern);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Keep only the best ones
|
|
146
|
+
if (this.patterns.length > MAX_PATTERNS) {
|
|
147
|
+
this.patterns.sort((a, b) => b.avgSourceScore - a.avgSourceScore);
|
|
148
|
+
this.patterns = this.patterns.slice(0, MAX_PATTERNS);
|
|
149
|
+
}
|
|
150
|
+
this.save();
|
|
151
|
+
return newPatterns.length;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Mark a pattern as used (for decay tracking).
|
|
155
|
+
*/
|
|
156
|
+
markUsed(patternId) {
|
|
157
|
+
const pattern = this.patterns.find((p) => p.id === patternId);
|
|
158
|
+
if (pattern) {
|
|
159
|
+
pattern.lastUsedAt = Date.now();
|
|
160
|
+
pattern.usageCount++;
|
|
161
|
+
this.save();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compute a decay score for a pattern based on age and usage.
|
|
166
|
+
* Returns a score from 0 (expired) to 1 (fresh).
|
|
167
|
+
*/
|
|
168
|
+
computeDecayScore(pattern) {
|
|
169
|
+
const now = Date.now();
|
|
170
|
+
const ageMs = now - pattern.createdAt;
|
|
171
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
172
|
+
// Hard expiry: pattern too old
|
|
173
|
+
if (ageDays > PATTERN_TTL_DAYS)
|
|
174
|
+
return 0;
|
|
175
|
+
// Time-based decay: score halves after DECAY_DAYS_FOR_HALF_SCORE
|
|
176
|
+
const timeScore = Math.pow(0.5, ageDays / DECAY_DAYS_FOR_HALF_SCORE);
|
|
177
|
+
// Usage bonus: patterns used more often are worth keeping
|
|
178
|
+
const usageBonus = Math.min(pattern.usageCount * 0.05, 0.3);
|
|
179
|
+
// Last-used bonus: recently used patterns get a boost
|
|
180
|
+
const daysSinceLastUse = (now - pattern.lastUsedAt) / (1000 * 60 * 60 * 24);
|
|
181
|
+
const recencyBonus = Math.max(0, 0.2 - daysSinceLastUse * 0.01);
|
|
182
|
+
return Math.min(1, timeScore + usageBonus + recencyBonus);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Garbage collect low-quality patterns.
|
|
186
|
+
* Returns the number of patterns removed.
|
|
187
|
+
*/
|
|
188
|
+
garbageCollect(verbose = false) {
|
|
189
|
+
const before = this.patterns.length;
|
|
190
|
+
// Remove patterns below minimum score
|
|
191
|
+
this.patterns = this.patterns.filter((p) => {
|
|
192
|
+
const score = this.computeDecayScore(p);
|
|
193
|
+
if (score < MIN_PATTERN_SCORE) {
|
|
194
|
+
if (verbose) {
|
|
195
|
+
logger.debug(`Pruning pattern '${p.title}' (decay score: ${(score * 100).toFixed(0)}%)`);
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
});
|
|
201
|
+
// Also enforce max patterns
|
|
202
|
+
if (this.patterns.length > MAX_PATTERNS) {
|
|
203
|
+
this.patterns.sort((a, b) => this.computeDecayScore(b) - this.computeDecayScore(a));
|
|
204
|
+
this.patterns = this.patterns.slice(0, MAX_PATTERNS);
|
|
205
|
+
}
|
|
206
|
+
const removed = before - this.patterns.length;
|
|
207
|
+
if (removed > 0)
|
|
208
|
+
this.save();
|
|
209
|
+
return removed;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get decay quality statistics for all patterns.
|
|
213
|
+
*/
|
|
214
|
+
getQualityReport() {
|
|
215
|
+
const now = Date.now();
|
|
216
|
+
return this.patterns.map((p) => ({
|
|
217
|
+
id: p.id,
|
|
218
|
+
title: p.title,
|
|
219
|
+
decayScore: this.computeDecayScore(p),
|
|
220
|
+
usageCount: p.usageCount,
|
|
221
|
+
ageDays: Math.floor((now - p.createdAt) / (1000 * 60 * 60 * 24)),
|
|
222
|
+
})).sort((a, b) => a.decayScore - b.decayScore); // Worst first
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Clear all patterns.
|
|
226
|
+
*/
|
|
227
|
+
clear() {
|
|
228
|
+
this.patterns = [];
|
|
229
|
+
this.save();
|
|
230
|
+
}
|
|
231
|
+
// ── Private ────────────────────────────────────────────────────────────
|
|
232
|
+
load() {
|
|
233
|
+
try {
|
|
234
|
+
ensureDir();
|
|
235
|
+
if (!existsSync(PATTERNS_PATH))
|
|
236
|
+
return [];
|
|
237
|
+
const raw = readFileSync(PATTERNS_PATH, 'utf-8');
|
|
238
|
+
const data = JSON.parse(raw);
|
|
239
|
+
// Migrate old-format patterns (version 1 → 2) that may lack lastUsedAt/usageCount
|
|
240
|
+
const patterns = (data.patterns || []).map((p) => ({
|
|
241
|
+
...p,
|
|
242
|
+
lastUsedAt: p.lastUsedAt ?? p.createdAt ?? Date.now(),
|
|
243
|
+
usageCount: p.usageCount ?? 0,
|
|
244
|
+
}));
|
|
245
|
+
return patterns;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
save() {
|
|
252
|
+
ensureDir();
|
|
253
|
+
const data = { patterns: this.patterns, version: CURRENT_VERSION };
|
|
254
|
+
writeFileSync(PATTERNS_PATH, JSON.stringify(data, null, 2), 'utf-8');
|
|
255
|
+
}
|
|
256
|
+
buildExtractionPrompt(trajectories) {
|
|
257
|
+
const trajText = trajectories
|
|
258
|
+
.map((t, i) => `Trajectory ${i + 1} (score: ${t.score.toFixed(2)}):\n` +
|
|
259
|
+
`Goal: ${t.goal}\n` +
|
|
260
|
+
`Project: ${t.projectFingerprint}\n` +
|
|
261
|
+
`Steps: ${t.taskPlan.map((s) => `[${s.agentType}] ${s.description}`).join('\n')}\n` +
|
|
262
|
+
`Files: ${t.fileChanges.map((fc) => fc.path).join(', ')}\n`)
|
|
263
|
+
.join('\n---\n');
|
|
264
|
+
return `${EXTRACTION_PROMPT}\n\n## Execution Trajectories\n\n${trajText}`;
|
|
265
|
+
}
|
|
266
|
+
parsePatterns(response) {
|
|
267
|
+
// Try direct JSON parse first
|
|
268
|
+
try {
|
|
269
|
+
const trimmed = response.trim();
|
|
270
|
+
// Strip code block wrappers if present
|
|
271
|
+
const jsonStr = trimmed.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
|
|
272
|
+
const parsed = JSON.parse(jsonStr);
|
|
273
|
+
if (Array.isArray(parsed)) {
|
|
274
|
+
return parsed.filter((p) => p.title && p.description && Array.isArray(p.applicableDomains));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Fall through
|
|
279
|
+
}
|
|
280
|
+
// Try extracting JSON array from the response
|
|
281
|
+
const arrayMatch = response.match(/\[[\s\S]*?\]/);
|
|
282
|
+
if (arrayMatch) {
|
|
283
|
+
try {
|
|
284
|
+
const parsed = JSON.parse(arrayMatch[0]);
|
|
285
|
+
if (Array.isArray(parsed)) {
|
|
286
|
+
return parsed.filter((p) => p.title && p.description && Array.isArray(p.applicableDomains));
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// Fall through
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return [];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Singleton
|
|
297
|
+
let storeInstance = null;
|
|
298
|
+
export function getPatternStore() {
|
|
299
|
+
if (!storeInstance) {
|
|
300
|
+
storeInstance = new PatternStore();
|
|
301
|
+
}
|
|
302
|
+
return storeInstance;
|
|
303
|
+
}
|
|
304
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
305
|
+
function ensureDir() {
|
|
306
|
+
if (!existsSync(MEMORY_DIR)) {
|
|
307
|
+
mkdirSync(MEMORY_DIR, { recursive: true });
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=pattern-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-extractor.js","sourceRoot":"","sources":["../../src/learning/pattern-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoC5C,+EAA+E;AAE/E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACtD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AACxD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,wBAAwB,GAAG,GAAG,CAAC,CAAC,8CAA8C;AACpF,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAE1C,mDAAmD;AACnD,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAY,mCAAmC;AAC3E,MAAM,yBAAyB,GAAG,EAAE,CAAC,CAAG,uCAAuC;AAC/E,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAU,kCAAkC;AAE1E,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;yDAyB+B,CAAC;AAE1D,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,YAAY;IACf,QAAQ,GAAoB,EAAE,CAAC;IAEvC;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,2EAA2E;IAE3E;;OAEG;IACH,MAAM,CAAC,eAAwB;QAC7B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,UAAoB;QAC9B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,QAAQ;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CACtE,CACF;aACA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,UAAqB;QAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CACxB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI;YACnC,YAAY,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC9C,aAAa,CAAC,CAAC,WAAW,IAAI;YAC9B,iBAAiB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC7C,mBAAmB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACzD,CAAC;QAEF,OAAO,CACL,SAAS;YACT,iGAAiG;YACjG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YAClB,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAC3B,YAA0B,EAC1B,OAAkB;QAElB,MAAM,WAAW,GAAG,YAAY;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,wBAAwB,CAAC;aAClD,KAAK,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAE7C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,yCAAyC;QAE/E,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,QAAgB,CAAC;QAErB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;gBAC/B,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEvC,iEAAiE;QACjE,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,OAAO,CAAC,EAAE,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/E,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;YACzC,OAAO,CAAC,cAAc;gBACpB,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;YACxE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAC7D,CAAC;YACF,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC9D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,OAAsB;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAE9C,+BAA+B;QAC/B,IAAI,OAAO,GAAG,gBAAgB;YAAE,OAAO,CAAC,CAAC;QAEzC,iEAAiE;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,yBAAyB,CAAC,CAAC;QAErE,0DAA0D;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QAE5D,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC;QAEhE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,UAAmB,KAAK;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAEpC,sCAAsC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,GAAG,iBAAiB,EAAE,CAAC;gBAC9B,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK,mBAAmB,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC3F,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9C,IAAI,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACrC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;SACjE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;IACjE,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,0EAA0E;IAElE,IAAI;QACV,IAAI,CAAC;YACH,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;YAE5C,kFAAkF;YAClF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjD,GAAG,CAAC;gBACJ,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;gBACrD,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;aAC9B,CAAC,CAAC,CAAC;YAEJ,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,IAAI;QACV,SAAS,EAAE,CAAC;QACZ,MAAM,IAAI,GAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAChF,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAEO,qBAAqB,CAAC,YAA0B;QACtD,MAAM,QAAQ,GAAG,YAAY;aAC1B,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACvD,SAAS,CAAC,CAAC,IAAI,IAAI;YACnB,YAAY,CAAC,CAAC,kBAAkB,IAAI;YACpC,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACnF,UAAU,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC9D;aACA,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnB,OAAO,GAAG,iBAAiB,oCAAoC,QAAQ,EAAE,CAAC;IAC5E,CAAC;IAEO,aAAa,CAAC,QAAgB;QACpC,8BAA8B;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,uCAAuC;YACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CACtE,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QAED,8CAA8C;QAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CACtE,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,YAAY;AACZ,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,+EAA+E;AAE/E,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrajectoryScorer — Scores execution trajectories based on outcome quality.
|
|
3
|
+
*
|
|
4
|
+
* Scoring heuristics (max score = 1.0):
|
|
5
|
+
* - Base completion: 0.4 (all tasks completed → 0.4, partial → proportional)
|
|
6
|
+
* - No test failures: +0.3 (all tests passed)
|
|
7
|
+
* - No reviewer issues: +0.2 (reviewer approved)
|
|
8
|
+
* - Fewer iterations: +0.1 (fewer agent steps = more efficient)
|
|
9
|
+
*
|
|
10
|
+
* Scores are computed when a trajectory is saved and can be re-scored later
|
|
11
|
+
* if the user provides feedback (e.g., "accepted changes").
|
|
12
|
+
*
|
|
13
|
+
* Scoring happens at save time in the TrajectoryStore and is stored
|
|
14
|
+
* in the trajectory's `score` field for search ranking.
|
|
15
|
+
*/
|
|
16
|
+
import type { OrchestrationResult } from '../agents/orchestrator.js';
|
|
17
|
+
export interface ScoreComponents {
|
|
18
|
+
/** 0–0.4: based on task completion ratio */
|
|
19
|
+
completionScore: number;
|
|
20
|
+
/** 0–0.3: based on test success */
|
|
21
|
+
testScore: number;
|
|
22
|
+
/** 0–0.2: based on reviewer approval */
|
|
23
|
+
reviewScore: number;
|
|
24
|
+
/** 0–0.1: based on efficiency (fewer iterations) */
|
|
25
|
+
efficiencyScore: number;
|
|
26
|
+
/** Total score (0–1), clamped */
|
|
27
|
+
total: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ScoreInput {
|
|
30
|
+
/** Tasks completed vs total (e.g., 5/5) */
|
|
31
|
+
tasksCompleted: number;
|
|
32
|
+
tasksTotal: number;
|
|
33
|
+
/** Whether all tests passed (from TesterAgent) */
|
|
34
|
+
testsPassed?: boolean;
|
|
35
|
+
/** Whether the reviewer approved (no critical issues) */
|
|
36
|
+
reviewPassed?: boolean;
|
|
37
|
+
/** Number of agent steps executed (fewer = more efficient) */
|
|
38
|
+
totalSteps?: number;
|
|
39
|
+
/** 0–1 user feedback (1 = accepted without changes) */
|
|
40
|
+
userAcceptance?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Score a trajectory execution outcome.
|
|
44
|
+
* Returns component scores and the total.
|
|
45
|
+
*/
|
|
46
|
+
export declare function scoreTrajectory(input: ScoreInput): ScoreComponents;
|
|
47
|
+
/**
|
|
48
|
+
* Convenience: score an OrchestrationResult directly.
|
|
49
|
+
*/
|
|
50
|
+
export declare function scoreOrchestrationResult(result: OrchestrationResult, extra?: Partial<ScoreInput>): number;
|
|
51
|
+
//# sourceMappingURL=scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../src/learning/scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAelE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC1B,MAAM,CAQR"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrajectoryScorer — Scores execution trajectories based on outcome quality.
|
|
3
|
+
*
|
|
4
|
+
* Scoring heuristics (max score = 1.0):
|
|
5
|
+
* - Base completion: 0.4 (all tasks completed → 0.4, partial → proportional)
|
|
6
|
+
* - No test failures: +0.3 (all tests passed)
|
|
7
|
+
* - No reviewer issues: +0.2 (reviewer approved)
|
|
8
|
+
* - Fewer iterations: +0.1 (fewer agent steps = more efficient)
|
|
9
|
+
*
|
|
10
|
+
* Scores are computed when a trajectory is saved and can be re-scored later
|
|
11
|
+
* if the user provides feedback (e.g., "accepted changes").
|
|
12
|
+
*
|
|
13
|
+
* Scoring happens at save time in the TrajectoryStore and is stored
|
|
14
|
+
* in the trajectory's `score` field for search ranking.
|
|
15
|
+
*/
|
|
16
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
17
|
+
const MAX_COMPLETION_SCORE = 0.4;
|
|
18
|
+
const MAX_TEST_SCORE = 0.3;
|
|
19
|
+
const MAX_REVIEW_SCORE = 0.2;
|
|
20
|
+
const MAX_EFFICIENCY_SCORE = 0.1;
|
|
21
|
+
const MAX_USER_FEEDBACK_SCORE = 0.5;
|
|
22
|
+
const BASELINE_STEPS = 3; // "Ideal" minimum steps for most tasks
|
|
23
|
+
// ─── Scorer ─────────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Score a trajectory execution outcome.
|
|
26
|
+
* Returns component scores and the total.
|
|
27
|
+
*/
|
|
28
|
+
export function scoreTrajectory(input) {
|
|
29
|
+
const completionScore = computeCompletionScore(input.tasksCompleted, input.tasksTotal);
|
|
30
|
+
const testScore = input.testsPassed === true ? MAX_TEST_SCORE : 0;
|
|
31
|
+
const reviewScore = input.reviewPassed === true ? MAX_REVIEW_SCORE : 0;
|
|
32
|
+
const efficiencyScore = computeEfficiencyScore(input.totalSteps);
|
|
33
|
+
const userScore = input.userAcceptance
|
|
34
|
+
? input.userAcceptance * MAX_USER_FEEDBACK_SCORE
|
|
35
|
+
: 0;
|
|
36
|
+
const total = Math.min(completionScore + testScore + reviewScore + efficiencyScore + userScore, 1.0);
|
|
37
|
+
return { completionScore, testScore, reviewScore, efficiencyScore, total };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Convenience: score an OrchestrationResult directly.
|
|
41
|
+
*/
|
|
42
|
+
export function scoreOrchestrationResult(result, extra) {
|
|
43
|
+
const scored = scoreTrajectory({
|
|
44
|
+
tasksCompleted: result.tasksCompleted,
|
|
45
|
+
tasksTotal: result.tasksTotal,
|
|
46
|
+
reviewPassed: result.success,
|
|
47
|
+
...extra,
|
|
48
|
+
});
|
|
49
|
+
return scored.total;
|
|
50
|
+
}
|
|
51
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
52
|
+
function computeCompletionScore(completed, total) {
|
|
53
|
+
if (total === 0)
|
|
54
|
+
return 0;
|
|
55
|
+
return (completed / total) * MAX_COMPLETION_SCORE;
|
|
56
|
+
}
|
|
57
|
+
function computeEfficiencyScore(totalSteps) {
|
|
58
|
+
if (totalSteps === undefined || totalSteps <= 0)
|
|
59
|
+
return 0;
|
|
60
|
+
// Fewer steps = higher efficiency. 3 steps = max score, 10+ steps = 0.
|
|
61
|
+
const ratio = Math.max(0, 1 - (totalSteps - BASELINE_STEPS) / 10);
|
|
62
|
+
return ratio * MAX_EFFICIENCY_SCORE;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../src/learning/scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiCH,+EAA+E;AAE/E,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,uCAAuC;AAEjE,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc;QACpC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,uBAAuB;QAChD,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,EACvE,GAAG,CACJ,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA2B,EAC3B,KAA2B;IAE3B,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,OAAO;QAC5B,GAAG,KAAK;KACT,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,+EAA+E;AAE/E,SAAS,sBAAsB,CAAC,SAAiB,EAAE,KAAa;IAC9D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,oBAAoB,CAAC;AACpD,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAmB;IACjD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,uEAAuE;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,OAAO,KAAK,GAAG,oBAAoB,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelfImprover — The self-improvement loop that ties together scoring,
|
|
3
|
+
* agent performance tracking, pattern extraction, and model optimization.
|
|
4
|
+
*
|
|
5
|
+
* After each orchestration run (when `useMemory: true`), the SelfImprover:
|
|
6
|
+
* 1. Scores the trajectory (how well did we do?)
|
|
7
|
+
* 2. Records per-agent stats (which agents/models succeed/fail?)
|
|
8
|
+
* 3. Periodically extracts patterns from high-scoring trajectories
|
|
9
|
+
* 4. Provides optimization recommendations (best models per agent)
|
|
10
|
+
*
|
|
11
|
+
* The SelfImprover is called by the Orchestrator post-execution hook.
|
|
12
|
+
* Users can also interact with it via the `buff learn` CLI commands.
|
|
13
|
+
*/
|
|
14
|
+
import type { OrchestrationResult } from '../agents/orchestrator.js';
|
|
15
|
+
import type { LLMCallFn } from '../agents/agent.js';
|
|
16
|
+
export declare class SelfImprover {
|
|
17
|
+
private runCountSinceLastExtraction;
|
|
18
|
+
/**
|
|
19
|
+
* Process a completed orchestration run through the self-improvement loop.
|
|
20
|
+
* Scores the result, tracks agent stats, and conditionally extracts patterns.
|
|
21
|
+
*
|
|
22
|
+
* @param result The completed orchestration result
|
|
23
|
+
* @param callLLM LLM function for pattern extraction
|
|
24
|
+
* @param agentModels The model map used for this run (for tracking model perf)
|
|
25
|
+
* @param verbose Whether to log details
|
|
26
|
+
*/
|
|
27
|
+
processRun(result: OrchestrationResult, callLLM: LLMCallFn, agentModels?: Record<string, string>, verbose?: boolean): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Force pattern extraction from the best trajectories in the store.
|
|
30
|
+
*/
|
|
31
|
+
extractPatterns(callLLM: LLMCallFn, verbose?: boolean): Promise<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Get optimization recommendations based on collected stats.
|
|
34
|
+
* Returns a recommended model map for the Orchestrator.
|
|
35
|
+
*/
|
|
36
|
+
getOptimizedModelMap(): Record<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* Get a human-readable summary of the self-improvement status.
|
|
39
|
+
*/
|
|
40
|
+
getStatus(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Reset extraction counter (called when user manually extracts patterns).
|
|
43
|
+
*/
|
|
44
|
+
resetExtractionCounter(): void;
|
|
45
|
+
private averageScore;
|
|
46
|
+
}
|
|
47
|
+
export declare function getSelfImprover(): SelfImprover;
|
|
48
|
+
//# sourceMappingURL=self-improver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-improver.d.ts","sourceRoot":"","sources":["../../src/learning/self-improver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoBpD,qBAAa,YAAY;IACvB,OAAO,CAAC,2BAA2B,CAAa;IAEhD;;;;;;;;OAQG;IACG,UAAU,CACd,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,SAAS,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,IAAI,CAAC;IA2BhB;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,SAAS,EAClB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,MAAM,CAAC;IAkClB;;;OAGG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAe9C;;OAEG;IACH,SAAS,IAAI,MAAM;IAgCnB;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAM9B,OAAO,CAAC,YAAY;CAMrB;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|