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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context cache for inference results.
|
|
3
|
+
* Uses a simple JSON file — no native dependencies, works everywhere.
|
|
4
|
+
*/
|
|
5
|
+
export declare class InferenceCache {
|
|
6
|
+
/**
|
|
7
|
+
* Get cached response if available and not expired
|
|
8
|
+
*/
|
|
9
|
+
get(prompt: string, model: string, provider: string): Promise<string | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Store a response in the cache
|
|
12
|
+
*/
|
|
13
|
+
set(prompt: string, response: string, model: string, provider: string, ttl?: number): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Clear all cache entries
|
|
16
|
+
*/
|
|
17
|
+
clear(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Get cache statistics
|
|
20
|
+
*/
|
|
21
|
+
stats(): Promise<{
|
|
22
|
+
total: number;
|
|
23
|
+
providers: Record<string, number>;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare function getCache(): InferenceCache;
|
|
27
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/context/cache.ts"],"names":[],"mappings":"AAkEA;;;GAGG;AACH,qBAAa,cAAc;IACzB;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkBlF;;OAEG;IACG,GAAG,CACP,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAa,GACjB,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CAa7E;AAKD,wBAAgB,QAAQ,IAAI,cAAc,CAKzC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
const CACHE_DIR = join(homedir(), '.buff');
|
|
6
|
+
const CACHE_PATH = join(CACHE_DIR, 'cache.json');
|
|
7
|
+
function ensureDir() {
|
|
8
|
+
if (!existsSync(CACHE_DIR)) {
|
|
9
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function readCache() {
|
|
13
|
+
try {
|
|
14
|
+
ensureDir();
|
|
15
|
+
if (!existsSync(CACHE_PATH)) {
|
|
16
|
+
return { entries: {} };
|
|
17
|
+
}
|
|
18
|
+
const raw = readFileSync(CACHE_PATH, 'utf-8');
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { entries: {} };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function writeCache(data) {
|
|
26
|
+
ensureDir();
|
|
27
|
+
writeFileSync(CACHE_PATH, JSON.stringify(data, null, 2), 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Remove expired entries from the cache data in-place
|
|
31
|
+
*/
|
|
32
|
+
function pruneExpired(data) {
|
|
33
|
+
const now = Math.floor(Date.now() / 1000);
|
|
34
|
+
for (const [key, entry] of Object.entries(data.entries)) {
|
|
35
|
+
if (entry.createdAt + entry.ttl < now) {
|
|
36
|
+
delete data.entries[key];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate a cache key from the prompt and options
|
|
42
|
+
*/
|
|
43
|
+
function generateKey(prompt, model, provider) {
|
|
44
|
+
const hash = createHash('sha256')
|
|
45
|
+
.update(`${provider}:${model}:${prompt}`)
|
|
46
|
+
.digest('hex');
|
|
47
|
+
return hash;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Context cache for inference results.
|
|
51
|
+
* Uses a simple JSON file — no native dependencies, works everywhere.
|
|
52
|
+
*/
|
|
53
|
+
export class InferenceCache {
|
|
54
|
+
/**
|
|
55
|
+
* Get cached response if available and not expired
|
|
56
|
+
*/
|
|
57
|
+
async get(prompt, model, provider) {
|
|
58
|
+
const data = readCache();
|
|
59
|
+
const key = generateKey(prompt, model, provider);
|
|
60
|
+
const entry = data.entries[key];
|
|
61
|
+
if (!entry)
|
|
62
|
+
return null;
|
|
63
|
+
const now = Math.floor(Date.now() / 1000);
|
|
64
|
+
if (entry.createdAt + entry.ttl < now) {
|
|
65
|
+
// Expired — remove it
|
|
66
|
+
delete data.entries[key];
|
|
67
|
+
writeCache(data);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return entry.response;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Store a response in the cache
|
|
74
|
+
*/
|
|
75
|
+
async set(prompt, response, model, provider, ttl = 3600) {
|
|
76
|
+
const data = readCache();
|
|
77
|
+
pruneExpired(data); // Clean up expired entries before writing
|
|
78
|
+
const key = generateKey(prompt, model, provider);
|
|
79
|
+
data.entries[key] = {
|
|
80
|
+
response,
|
|
81
|
+
model,
|
|
82
|
+
provider,
|
|
83
|
+
createdAt: Math.floor(Date.now() / 1000),
|
|
84
|
+
ttl,
|
|
85
|
+
};
|
|
86
|
+
writeCache(data);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Clear all cache entries
|
|
90
|
+
*/
|
|
91
|
+
async clear() {
|
|
92
|
+
writeCache({ entries: {} });
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get cache statistics
|
|
96
|
+
*/
|
|
97
|
+
async stats() {
|
|
98
|
+
const data = readCache();
|
|
99
|
+
pruneExpired(data);
|
|
100
|
+
const total = Object.keys(data.entries).length;
|
|
101
|
+
const providers = {};
|
|
102
|
+
for (const entry of Object.values(data.entries)) {
|
|
103
|
+
providers[entry.provider] = (providers[entry.provider] || 0) + 1;
|
|
104
|
+
}
|
|
105
|
+
return { total, providers };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Singleton instance
|
|
109
|
+
let cacheInstance = null;
|
|
110
|
+
export function getCache() {
|
|
111
|
+
if (!cacheInstance) {
|
|
112
|
+
cacheInstance = new InferenceCache();
|
|
113
|
+
}
|
|
114
|
+
return cacheInstance;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/context/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatHistory — Stores and retrieves chat conversation history.
|
|
3
|
+
*
|
|
4
|
+
* History is stored in a JSON file at ~/.buff/memory/history.json
|
|
5
|
+
* and supports keyword search for retrieving past conversations.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Store chat sessions with messages
|
|
9
|
+
* - Keyword search across all past conversations
|
|
10
|
+
* - Configurable retention period (default: 30 days)
|
|
11
|
+
* - Automatic cleanup of old entries
|
|
12
|
+
*/
|
|
13
|
+
export interface HistoryMessage {
|
|
14
|
+
/** Role: 'user' or 'assistant' */
|
|
15
|
+
role: 'user' | 'assistant';
|
|
16
|
+
/** Message content */
|
|
17
|
+
content: string;
|
|
18
|
+
/** Timestamp when message was sent */
|
|
19
|
+
timestamp: number;
|
|
20
|
+
}
|
|
21
|
+
export interface HistorySession {
|
|
22
|
+
/** Unique session ID */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Provider used */
|
|
25
|
+
provider: string;
|
|
26
|
+
/** Model used */
|
|
27
|
+
model: string;
|
|
28
|
+
/** When the session started */
|
|
29
|
+
startedAt: number;
|
|
30
|
+
/** When the session ended */
|
|
31
|
+
endedAt: number;
|
|
32
|
+
/** Messages in the session */
|
|
33
|
+
messages: HistoryMessage[];
|
|
34
|
+
/** Summary of the session (generated from first user message) */
|
|
35
|
+
summary: string;
|
|
36
|
+
/** Tags for categorizing sessions */
|
|
37
|
+
tags: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Manages chat conversation history with search capabilities.
|
|
41
|
+
*/
|
|
42
|
+
export declare class ChatHistory {
|
|
43
|
+
/**
|
|
44
|
+
* Store a completed chat session.
|
|
45
|
+
*/
|
|
46
|
+
storeSession(messages: HistoryMessage[], provider: string, model: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Get a specific session by ID.
|
|
49
|
+
*/
|
|
50
|
+
getSession(id: string): HistorySession | null;
|
|
51
|
+
/**
|
|
52
|
+
* Search sessions by keyword in message content.
|
|
53
|
+
* Performs case-insensitive substring matching on all messages.
|
|
54
|
+
*
|
|
55
|
+
* @param query Search keyword or phrase
|
|
56
|
+
* @param limit Maximum results to return
|
|
57
|
+
* @returns Matching sessions sorted by relevance
|
|
58
|
+
*/
|
|
59
|
+
search(query: string, limit?: number): HistorySession[];
|
|
60
|
+
/**
|
|
61
|
+
* Get all sessions, sorted by recency.
|
|
62
|
+
*/
|
|
63
|
+
getAllSessions(limit?: number): HistorySession[];
|
|
64
|
+
/**
|
|
65
|
+
* Get recent sessions (last N days).
|
|
66
|
+
*/
|
|
67
|
+
getRecentSessions(days?: number): HistorySession[];
|
|
68
|
+
/**
|
|
69
|
+
* Get total number of stored sessions.
|
|
70
|
+
*/
|
|
71
|
+
count(): number;
|
|
72
|
+
/**
|
|
73
|
+
* Clear all history.
|
|
74
|
+
*/
|
|
75
|
+
clear(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Delete sessions older than the specified retention period.
|
|
78
|
+
*/
|
|
79
|
+
prune(retentionDays?: number): number;
|
|
80
|
+
/**
|
|
81
|
+
* Format a search result for display.
|
|
82
|
+
*/
|
|
83
|
+
formatSessionSummary(session: HistorySession): string;
|
|
84
|
+
private pruneIfNeeded;
|
|
85
|
+
}
|
|
86
|
+
export declare function getChatHistory(): ChatHistory;
|
|
87
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/context/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAwFD;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,YAAY,CACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM;IA2BT;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAK7C;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE;IAyC3D;;OAEG;IACH,cAAc,CAAC,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE;IAOpD;;OAEG;IACH,iBAAiB,CAAC,IAAI,GAAE,MAAU,GAAG,cAAc,EAAE;IAQrD;;OAEG;IACH,KAAK,IAAI,MAAM;IAKf;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,CAAC,aAAa,GAAE,MAA+B,GAAG,MAAM;IAmB7D;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAgBrD,OAAO,CAAC,aAAa;CActB;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatHistory — Stores and retrieves chat conversation history.
|
|
3
|
+
*
|
|
4
|
+
* History is stored in a JSON file at ~/.buff/memory/history.json
|
|
5
|
+
* and supports keyword search for retrieving past conversations.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Store chat sessions with messages
|
|
9
|
+
* - Keyword search across all past conversations
|
|
10
|
+
* - Configurable retention period (default: 30 days)
|
|
11
|
+
* - Automatic cleanup of old entries
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
17
|
+
const MEMORY_DIR = join(homedir(), '.buff', 'memory');
|
|
18
|
+
const HISTORY_PATH = join(MEMORY_DIR, 'history.json');
|
|
19
|
+
const CURRENT_VERSION = 1;
|
|
20
|
+
/** Default retention period in days */
|
|
21
|
+
const DEFAULT_RETENTION_DAYS = 30;
|
|
22
|
+
/** Maximum sessions to keep */
|
|
23
|
+
const MAX_SESSIONS = 500;
|
|
24
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
25
|
+
function ensureDir() {
|
|
26
|
+
if (!existsSync(MEMORY_DIR)) {
|
|
27
|
+
mkdirSync(MEMORY_DIR, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function readHistory() {
|
|
31
|
+
try {
|
|
32
|
+
ensureDir();
|
|
33
|
+
if (!existsSync(HISTORY_PATH)) {
|
|
34
|
+
return { sessions: {}, version: CURRENT_VERSION };
|
|
35
|
+
}
|
|
36
|
+
const raw = readFileSync(HISTORY_PATH, 'utf-8');
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return { sessions: {}, version: CURRENT_VERSION };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function writeHistory(data) {
|
|
44
|
+
ensureDir();
|
|
45
|
+
writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2), 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
function generateSessionId() {
|
|
48
|
+
return `session-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract a summary from the first user message.
|
|
52
|
+
*/
|
|
53
|
+
function generateSummary(messages) {
|
|
54
|
+
const firstUserMsg = messages.find((m) => m.role === 'user');
|
|
55
|
+
if (!firstUserMsg)
|
|
56
|
+
return 'Empty session';
|
|
57
|
+
const text = firstUserMsg.content.slice(0, 120);
|
|
58
|
+
return text.length < firstUserMsg.content.length ? text + '...' : text;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract tags from messages for better search.
|
|
62
|
+
* Simple keyword-based tagging.
|
|
63
|
+
*/
|
|
64
|
+
function extractTags(messages) {
|
|
65
|
+
const content = messages.map((m) => m.content.toLowerCase()).join(' ');
|
|
66
|
+
const tags = [];
|
|
67
|
+
const keywordTags = {
|
|
68
|
+
'code': ['create', 'write', 'implement', 'code', 'function', 'class', 'file'],
|
|
69
|
+
'debug': ['debug', 'fix', 'bug', 'error', 'issue', 'broken'],
|
|
70
|
+
'refactor': ['refactor', 'improve', 'optimize', 'clean', 'restructure'],
|
|
71
|
+
'explain': ['explain', 'what is', 'how does', 'why', 'describe', 'tell me about'],
|
|
72
|
+
'architecture': ['architecture', 'design', 'plan', 'structure', 'pattern'],
|
|
73
|
+
'test': ['test', 'testing', 'spec', 'assert', 'verify'],
|
|
74
|
+
'config': ['config', 'setup', 'install', 'configure', 'deploy'],
|
|
75
|
+
};
|
|
76
|
+
for (const [tag, keywords] of Object.entries(keywordTags)) {
|
|
77
|
+
if (keywords.some((kw) => content.includes(kw))) {
|
|
78
|
+
tags.push(tag);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return tags.slice(0, 5); // Max 5 tags
|
|
82
|
+
}
|
|
83
|
+
// ─── ChatHistory ────────────────────────────────────────────────────────────
|
|
84
|
+
/**
|
|
85
|
+
* Manages chat conversation history with search capabilities.
|
|
86
|
+
*/
|
|
87
|
+
export class ChatHistory {
|
|
88
|
+
/**
|
|
89
|
+
* Store a completed chat session.
|
|
90
|
+
*/
|
|
91
|
+
storeSession(messages, provider, model) {
|
|
92
|
+
if (messages.length === 0)
|
|
93
|
+
return '';
|
|
94
|
+
const data = readHistory();
|
|
95
|
+
this.pruneIfNeeded(data);
|
|
96
|
+
const id = generateSessionId();
|
|
97
|
+
const startedAt = messages[0]?.timestamp || Date.now();
|
|
98
|
+
const endedAt = messages[messages.length - 1]?.timestamp || Date.now();
|
|
99
|
+
const session = {
|
|
100
|
+
id,
|
|
101
|
+
provider,
|
|
102
|
+
model,
|
|
103
|
+
startedAt,
|
|
104
|
+
endedAt,
|
|
105
|
+
messages,
|
|
106
|
+
summary: generateSummary(messages),
|
|
107
|
+
tags: extractTags(messages),
|
|
108
|
+
};
|
|
109
|
+
data.sessions[id] = session;
|
|
110
|
+
writeHistory(data);
|
|
111
|
+
return id;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get a specific session by ID.
|
|
115
|
+
*/
|
|
116
|
+
getSession(id) {
|
|
117
|
+
const data = readHistory();
|
|
118
|
+
return data.sessions[id] || null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Search sessions by keyword in message content.
|
|
122
|
+
* Performs case-insensitive substring matching on all messages.
|
|
123
|
+
*
|
|
124
|
+
* @param query Search keyword or phrase
|
|
125
|
+
* @param limit Maximum results to return
|
|
126
|
+
* @returns Matching sessions sorted by relevance
|
|
127
|
+
*/
|
|
128
|
+
search(query, limit = 10) {
|
|
129
|
+
const data = readHistory();
|
|
130
|
+
const q = query.toLowerCase();
|
|
131
|
+
const scored = Object.values(data.sessions)
|
|
132
|
+
.map((session) => {
|
|
133
|
+
let score = 0;
|
|
134
|
+
// Score based on summary match
|
|
135
|
+
if (session.summary.toLowerCase().includes(q)) {
|
|
136
|
+
score += 5;
|
|
137
|
+
}
|
|
138
|
+
// Score based on tag matches
|
|
139
|
+
if (session.tags.some((t) => t.includes(q))) {
|
|
140
|
+
score += 3;
|
|
141
|
+
}
|
|
142
|
+
// Score based on message content matches
|
|
143
|
+
for (const msg of session.messages) {
|
|
144
|
+
const content = msg.content.toLowerCase();
|
|
145
|
+
if (content.includes(q)) {
|
|
146
|
+
// More weight for user messages and exact matches
|
|
147
|
+
score += msg.role === 'user' ? 2 : 1;
|
|
148
|
+
// Bonus for early messages (more relevant to the topic)
|
|
149
|
+
const idx = session.messages.indexOf(msg);
|
|
150
|
+
if (idx < 3)
|
|
151
|
+
score += 0.5;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { session, score };
|
|
155
|
+
})
|
|
156
|
+
.filter((s) => s.score > 0)
|
|
157
|
+
.sort((a, b) => b.score - a.score)
|
|
158
|
+
.slice(0, limit)
|
|
159
|
+
.map((s) => s.session);
|
|
160
|
+
return scored;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get all sessions, sorted by recency.
|
|
164
|
+
*/
|
|
165
|
+
getAllSessions(limit = 50) {
|
|
166
|
+
const data = readHistory();
|
|
167
|
+
return Object.values(data.sessions)
|
|
168
|
+
.sort((a, b) => b.startedAt - a.startedAt)
|
|
169
|
+
.slice(0, limit);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get recent sessions (last N days).
|
|
173
|
+
*/
|
|
174
|
+
getRecentSessions(days = 7) {
|
|
175
|
+
const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;
|
|
176
|
+
const data = readHistory();
|
|
177
|
+
return Object.values(data.sessions)
|
|
178
|
+
.filter((s) => s.startedAt >= cutoff)
|
|
179
|
+
.sort((a, b) => b.startedAt - a.startedAt);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get total number of stored sessions.
|
|
183
|
+
*/
|
|
184
|
+
count() {
|
|
185
|
+
const data = readHistory();
|
|
186
|
+
return Object.keys(data.sessions).length;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Clear all history.
|
|
190
|
+
*/
|
|
191
|
+
clear() {
|
|
192
|
+
writeHistory({ sessions: {}, version: CURRENT_VERSION });
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Delete sessions older than the specified retention period.
|
|
196
|
+
*/
|
|
197
|
+
prune(retentionDays = DEFAULT_RETENTION_DAYS) {
|
|
198
|
+
const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
|
|
199
|
+
const data = readHistory();
|
|
200
|
+
let removed = 0;
|
|
201
|
+
for (const [id, session] of Object.entries(data.sessions)) {
|
|
202
|
+
if (session.startedAt < cutoff) {
|
|
203
|
+
delete data.sessions[id];
|
|
204
|
+
removed++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (removed > 0) {
|
|
208
|
+
writeHistory(data);
|
|
209
|
+
}
|
|
210
|
+
return removed;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Format a search result for display.
|
|
214
|
+
*/
|
|
215
|
+
formatSessionSummary(session) {
|
|
216
|
+
const date = new Date(session.startedAt).toLocaleDateString('en-US', {
|
|
217
|
+
month: 'short',
|
|
218
|
+
day: 'numeric',
|
|
219
|
+
hour: '2-digit',
|
|
220
|
+
minute: '2-digit',
|
|
221
|
+
});
|
|
222
|
+
const msgCount = session.messages.length;
|
|
223
|
+
const tags = session.tags.length > 0 ? ` [${session.tags.join(', ')}]` : '';
|
|
224
|
+
return ` 📝 ${session.id.slice(0, 20).padEnd(22)} ${date.padEnd(20)} ${String(msgCount).padStart(3)} msgs ${session.summary.slice(0, 60).padEnd(62)}${tags}`;
|
|
225
|
+
}
|
|
226
|
+
// ── Private ────────────────────────────────────────────────────────────
|
|
227
|
+
pruneIfNeeded(data) {
|
|
228
|
+
const entries = Object.keys(data.sessions);
|
|
229
|
+
if (entries.length < MAX_SESSIONS)
|
|
230
|
+
return;
|
|
231
|
+
// Remove oldest sessions
|
|
232
|
+
const sorted = entries
|
|
233
|
+
.map((id) => ({ id, session: data.sessions[id] }))
|
|
234
|
+
.sort((a, b) => a.session.startedAt - b.session.startedAt);
|
|
235
|
+
const toRemove = sorted.slice(0, entries.length - MAX_SESSIONS + 10);
|
|
236
|
+
for (const { id } of toRemove) {
|
|
237
|
+
delete data.sessions[id];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Singleton instance
|
|
242
|
+
let historyInstance = null;
|
|
243
|
+
export function getChatHistory() {
|
|
244
|
+
if (!historyInstance) {
|
|
245
|
+
historyInstance = new ChatHistory();
|
|
246
|
+
}
|
|
247
|
+
return historyInstance;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/context/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a parsed file context chunk
|
|
3
|
+
*/
|
|
4
|
+
export interface ContextChunk {
|
|
5
|
+
filePath: string;
|
|
6
|
+
content: string;
|
|
7
|
+
priority: number;
|
|
8
|
+
tokenCount: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Options for context parsing
|
|
12
|
+
*/
|
|
13
|
+
export interface ContextParserOptions {
|
|
14
|
+
/** Maximum total tokens (approximate) to include */
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
/** File patterns to prioritize (e.g., ['index.ts', 'main.go']) */
|
|
17
|
+
priorityPatterns?: string[];
|
|
18
|
+
/** File extensions to include */
|
|
19
|
+
includeExtensions?: string[];
|
|
20
|
+
/** Files/directories to ignore */
|
|
21
|
+
ignorePatterns?: string[];
|
|
22
|
+
/** Whether to include .gitignore'd files */
|
|
23
|
+
includeGitIgnored?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Multi-file context parser
|
|
27
|
+
* Reads files, chunks content, and prioritizes important files
|
|
28
|
+
*/
|
|
29
|
+
export declare class ContextParser {
|
|
30
|
+
private options;
|
|
31
|
+
constructor(options?: ContextParserOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Parse context from a list of file paths
|
|
34
|
+
*/
|
|
35
|
+
parseFromFiles(filePaths: string[]): ContextChunk[];
|
|
36
|
+
/**
|
|
37
|
+
* Parse context from a directory, recursively finding relevant files
|
|
38
|
+
*/
|
|
39
|
+
parseFromDirectory(dirPath: string): Promise<ContextChunk[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Recursively walk a directory
|
|
42
|
+
*/
|
|
43
|
+
private walkDirectory;
|
|
44
|
+
/**
|
|
45
|
+
* Parse a single string of context text
|
|
46
|
+
*/
|
|
47
|
+
parseFromString(text: string, label?: string): ContextChunk[];
|
|
48
|
+
/**
|
|
49
|
+
* Split text into chunks that fit within token limits
|
|
50
|
+
*/
|
|
51
|
+
private chunkText;
|
|
52
|
+
/**
|
|
53
|
+
* Prune chunks to fit within token limits, prioritizing by priority
|
|
54
|
+
*/
|
|
55
|
+
private pruneToTokenLimit;
|
|
56
|
+
/**
|
|
57
|
+
* Format chunks into a single prompt-ready string
|
|
58
|
+
*/
|
|
59
|
+
static formatContext(chunks: ContextChunk[]): string;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/context/parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAoBD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,OAAO,CAAC,EAAE,oBAAoB;IAI1C;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE;IA4BnD;;OAEG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAMlE;;OAEG;YACW,aAAa;IAsC3B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAgB,GAAG,YAAY,EAAE;IAkBtE;;OAEG;IACH,OAAO,CAAC,SAAS;IAoCjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM;CASrD"}
|