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,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox types — Configuration types for Docker-based sandbox isolation.
|
|
3
|
+
*
|
|
4
|
+
* The sandbox system provides process-level isolation for running generated
|
|
5
|
+
* code and tests inside Docker containers with configurable resource limits.
|
|
6
|
+
*
|
|
7
|
+
* Basic usage:
|
|
8
|
+
* ```ts
|
|
9
|
+
* const manager = new SandboxManager({ memoryLimit: '512m', cpuLimit: 1 });
|
|
10
|
+
* const id = await manager.createContainer();
|
|
11
|
+
* await manager.copyProject(id, '/path/to/project');
|
|
12
|
+
* const result = await manager.runCommand(id, 'npm test');
|
|
13
|
+
* await manager.destroyContainer(id);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
17
|
+
import { join, dirname } from 'node:path';
|
|
18
|
+
// ─── Defaults ───────────────────────────────────────────────────────────────
|
|
19
|
+
export const DEFAULT_RESOURCE_LIMITS = {
|
|
20
|
+
memoryLimit: '1g',
|
|
21
|
+
cpuLimit: 1,
|
|
22
|
+
diskLimit: '2g',
|
|
23
|
+
pidsLimit: 100,
|
|
24
|
+
networkAccess: false,
|
|
25
|
+
timeoutMs: 600_000,
|
|
26
|
+
};
|
|
27
|
+
export const DEFAULT_SANDBOX_CONFIG = {
|
|
28
|
+
enabled: false,
|
|
29
|
+
limits: { ...DEFAULT_RESOURCE_LIMITS },
|
|
30
|
+
image: {
|
|
31
|
+
image: 'node:20-slim',
|
|
32
|
+
label: 'Node.js 20 (slim)',
|
|
33
|
+
runtimes: ['node'],
|
|
34
|
+
installCommand: 'npm install',
|
|
35
|
+
testCommand: 'npm test',
|
|
36
|
+
shell: '/bin/bash',
|
|
37
|
+
},
|
|
38
|
+
workDir: '/workspace',
|
|
39
|
+
containerUser: 'node',
|
|
40
|
+
stopTimeoutMs: 10_000,
|
|
41
|
+
};
|
|
42
|
+
// ─── Sandbox Configuration Manager ──────────────────────────────────────────
|
|
43
|
+
let SANDBOX_CONFIG_PATH = '/tmp/buff-sandbox-config.json';
|
|
44
|
+
let cachedConfig = null;
|
|
45
|
+
/**
|
|
46
|
+
* Get the current sandbox configuration.
|
|
47
|
+
* Reads from ~/.buff/sandbox-config.json (if exists), falls back to defaults.
|
|
48
|
+
*/
|
|
49
|
+
export function getSandboxConfig() {
|
|
50
|
+
if (cachedConfig)
|
|
51
|
+
return { ...cachedConfig };
|
|
52
|
+
try {
|
|
53
|
+
// Lazy init path to avoid module-level side effects
|
|
54
|
+
if (SANDBOX_CONFIG_PATH === '/tmp/buff-sandbox-config.json' && process.env.HOME) {
|
|
55
|
+
SANDBOX_CONFIG_PATH = join(process.env.HOME, '.buff', 'sandbox-config.json');
|
|
56
|
+
}
|
|
57
|
+
if (existsSync(SANDBOX_CONFIG_PATH)) {
|
|
58
|
+
const raw = readFileSync(SANDBOX_CONFIG_PATH, 'utf-8');
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
cachedConfig = {
|
|
61
|
+
...DEFAULT_SANDBOX_CONFIG,
|
|
62
|
+
...parsed,
|
|
63
|
+
limits: { ...DEFAULT_RESOURCE_LIMITS, ...(parsed.limits || {}) },
|
|
64
|
+
image: { ...DEFAULT_SANDBOX_CONFIG.image, ...(parsed.image || {}) },
|
|
65
|
+
};
|
|
66
|
+
return { ...cachedConfig };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Fall through to default
|
|
71
|
+
}
|
|
72
|
+
return { ...DEFAULT_SANDBOX_CONFIG };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Update the sandbox configuration and persist to disk.
|
|
76
|
+
*/
|
|
77
|
+
/**
|
|
78
|
+
* Reset the sandbox config cache. Useful for testing.
|
|
79
|
+
*/
|
|
80
|
+
export function resetSandboxConfigCache() {
|
|
81
|
+
cachedConfig = null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Update the sandbox configuration and persist to disk.
|
|
85
|
+
*/
|
|
86
|
+
export function setSandboxConfig(config) {
|
|
87
|
+
const current = getSandboxConfig();
|
|
88
|
+
const updated = {
|
|
89
|
+
...current,
|
|
90
|
+
...config,
|
|
91
|
+
limits: { ...current.limits, ...(config.limits || {}) },
|
|
92
|
+
image: { ...current.image, ...(config.image || {}) },
|
|
93
|
+
};
|
|
94
|
+
try {
|
|
95
|
+
const dir = dirname(SANDBOX_CONFIG_PATH);
|
|
96
|
+
if (!existsSync(dir)) {
|
|
97
|
+
mkdirSync(dir, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
writeFileSync(SANDBOX_CONFIG_PATH, JSON.stringify(updated, null, 2), 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Non-critical: config stays in memory
|
|
103
|
+
}
|
|
104
|
+
cachedConfig = updated;
|
|
105
|
+
return { ...updated };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner — Reusable utilities for detecting security issues.
|
|
3
|
+
*
|
|
4
|
+
* Capabilities:
|
|
5
|
+
* - PII detection (emails, API keys, tokens, SSNs, etc.)
|
|
6
|
+
* - Prompt injection pattern detection
|
|
7
|
+
* - Dangerous code pattern detection (eval, exec, shell injection, etc.)
|
|
8
|
+
* - File permission checks
|
|
9
|
+
*
|
|
10
|
+
* Used by SecurityAgent and can be imported directly for custom use.
|
|
11
|
+
*/
|
|
12
|
+
export interface SecurityFinding {
|
|
13
|
+
type: 'pii' | 'injection' | 'dangerous-code';
|
|
14
|
+
severity: 'info' | 'low' | 'medium' | 'high' | 'critical';
|
|
15
|
+
category: string;
|
|
16
|
+
match: string;
|
|
17
|
+
context?: string;
|
|
18
|
+
line?: number;
|
|
19
|
+
recommendation?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ScanResult {
|
|
22
|
+
passed: boolean;
|
|
23
|
+
findings: SecurityFinding[];
|
|
24
|
+
summary: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Scan text for PII (personally identifiable information).
|
|
28
|
+
*/
|
|
29
|
+
export declare function scanForPII(text: string): SecurityFinding[];
|
|
30
|
+
/**
|
|
31
|
+
* Scan text for prompt injection attempts.
|
|
32
|
+
*/
|
|
33
|
+
export declare function scanForInjections(text: string): SecurityFinding[];
|
|
34
|
+
/**
|
|
35
|
+
* Scan code for dangerous patterns.
|
|
36
|
+
*/
|
|
37
|
+
export declare function scanForDangerousCode(code: string, contextInfo?: {
|
|
38
|
+
isGenerated?: boolean;
|
|
39
|
+
filename?: string;
|
|
40
|
+
}): SecurityFinding[];
|
|
41
|
+
/**
|
|
42
|
+
* Run all security scans on a given text.
|
|
43
|
+
* Convenience function that combines PII, injection, and code scans.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runAllScans(text: string, options?: {
|
|
46
|
+
isGenerated?: boolean;
|
|
47
|
+
filename?: string;
|
|
48
|
+
}): ScanResult;
|
|
49
|
+
/**
|
|
50
|
+
* Format findings as a readable report string.
|
|
51
|
+
*/
|
|
52
|
+
export declare function formatScanReport(result: ScanResult): string;
|
|
53
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuGH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAC7C,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CA4E1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAiBjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,eAAe,EAAE,CAqCnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,UAAU,CA0BZ;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkB3D"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner — Reusable utilities for detecting security issues.
|
|
3
|
+
*
|
|
4
|
+
* Capabilities:
|
|
5
|
+
* - PII detection (emails, API keys, tokens, SSNs, etc.)
|
|
6
|
+
* - Prompt injection pattern detection
|
|
7
|
+
* - Dangerous code pattern detection (eval, exec, shell injection, etc.)
|
|
8
|
+
* - File permission checks
|
|
9
|
+
*
|
|
10
|
+
* Used by SecurityAgent and can be imported directly for custom use.
|
|
11
|
+
*/
|
|
12
|
+
// ─── PII Patterns ───────────────────────────────────────────────────────────
|
|
13
|
+
const EMAIL_PATTERN = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
|
|
14
|
+
const API_KEY_PATTERNS = [
|
|
15
|
+
/sk-[a-zA-Z0-9]{20,}/g, // OpenAI-style keys
|
|
16
|
+
/gsk_[a-zA-Z0-9]{20,}/g, // Groq-style keys
|
|
17
|
+
/ghp_[a-zA-Z0-9]{36,}/g, // GitHub PAT
|
|
18
|
+
/gho_[a-zA-Z0-9]{36,}/g, // GitHub OAuth
|
|
19
|
+
/ghu_[a-zA-Z0-9]{36,}/g, // GitHub user token
|
|
20
|
+
/xox[bpras]-[a-zA-Z0-9-]{24,}/g, // Slack tokens
|
|
21
|
+
/AKIA[0-9A-Z]{16}/g, // AWS access keys
|
|
22
|
+
/-----BEGIN (RSA |EC )?PRIVATE KEY-----/g, // Private keys
|
|
23
|
+
/eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g, // JWT tokens
|
|
24
|
+
];
|
|
25
|
+
const SSN_PATTERN = /\b\d{3}-\d{2}-\d{4}\b/g;
|
|
26
|
+
const CREDIT_CARD_PATTERN = /\b(?:\d{4}[ -]?){3}\d{4}\b/g;
|
|
27
|
+
const PHONE_PATTERN = /\b(?:\+1)?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\b/g;
|
|
28
|
+
// ─── Injection Patterns ─────────────────────────────────────────────────────
|
|
29
|
+
const INJECTION_PATTERNS = [
|
|
30
|
+
// Ignore/Cancel system instructions
|
|
31
|
+
/\bignore\s+(all\s+)?(previous|above|prior)\s+(instructions|directions|prompts?)\b/i,
|
|
32
|
+
/\bdisregard\s+(all\s+)?(previous|above)\s+(instructions|directions)\b/i,
|
|
33
|
+
/\bforget\s+(all\s+)?(previous|prior)\s+(instructions|context)\b/i,
|
|
34
|
+
// Role-play jailbreaks
|
|
35
|
+
/\byou\s+are\s+(now|free|released|DAN|jailbroken)\b/i,
|
|
36
|
+
/\bpretend\s+(to\s+)?(be|you\s+are)\s+(a|an|the)\b/i,
|
|
37
|
+
/\bDAN\b/i, // "Do Anything Now"
|
|
38
|
+
// Prompt leaking
|
|
39
|
+
/\boutput\s+(the\s+)?(initial|original|first|above)\s+(prompt|instruction|system)\b/i,
|
|
40
|
+
/\breveal\s+(the\s+)?(prompt|instructions|system\s+message)\b/i,
|
|
41
|
+
/\bshow\s+(me\s+)?(the\s+)?(prompt|instructions)\b/i,
|
|
42
|
+
/\bprint\s+(the\s+)?(prompt|instructions|system\s+prompt)\b/i,
|
|
43
|
+
// Token smuggling
|
|
44
|
+
/\bbase64\s+(\d+\s+times|repeat)/i,
|
|
45
|
+
/\bleetspeak/i,
|
|
46
|
+
/\broT13/i,
|
|
47
|
+
];
|
|
48
|
+
// ─── Dangerous Code Patterns ────────────────────────────────────────────────
|
|
49
|
+
const DANGEROUS_EXEC_PATTERNS = [
|
|
50
|
+
/\beval\s*\(/g,
|
|
51
|
+
/\bFunction\s*\(/g,
|
|
52
|
+
/\bsetTimeout\s*\(\s*["'`]/g,
|
|
53
|
+
/\bsetInterval\s*\(\s*["'`]/g,
|
|
54
|
+
/\bnew\s+Function\s*\(/g,
|
|
55
|
+
];
|
|
56
|
+
const DANGEROUS_SHELL_PATTERNS = [
|
|
57
|
+
/\bexec(?:Sync)?\s*\(/g, // exec/execSync calls
|
|
58
|
+
/\bspawn(?:Sync)?\s*\(/g,
|
|
59
|
+
/\bfork\s*\(/g,
|
|
60
|
+
/\bexecFile(?:Sync)?\s*\(/g,
|
|
61
|
+
/`[^`]*\$\{[^}]*`/g, // Template literals with shell interpolation
|
|
62
|
+
];
|
|
63
|
+
const DANGEROUS_FS_PATTERNS = [
|
|
64
|
+
/\b(?:un)?linkSync?\s*\(/g,
|
|
65
|
+
/\brm\s+-rf/g,
|
|
66
|
+
/\bchmod\s*(?:\s+-R)?\s*777/g,
|
|
67
|
+
/\bchown\b/g,
|
|
68
|
+
];
|
|
69
|
+
const DANGEROUS_NETWORK_PATTERNS = [
|
|
70
|
+
/\bfetch\s*\(/g,
|
|
71
|
+
/\b(?:https?|axios|got|request)\s*\./gi,
|
|
72
|
+
/\bWebSocket\s*\(/g,
|
|
73
|
+
/\bnet\s*\.\s*connect\b/g,
|
|
74
|
+
];
|
|
75
|
+
const DANGEROUS_SQL_PATTERNS = [
|
|
76
|
+
/\bDROP\s+TABLE\b/gi,
|
|
77
|
+
/\bDROP\s+DATABASE\b/gi,
|
|
78
|
+
/\bTRUNCATE\s+TABLE\b/gi,
|
|
79
|
+
/\bALTER\s+TABLE\b.*\bDROP\b/gi,
|
|
80
|
+
/'.*OR\s+1\s*=\s*1.*--/gi,
|
|
81
|
+
];
|
|
82
|
+
/** Categories of dangerous code for grouping in results */
|
|
83
|
+
const DANGEROUS_PATTERN_CATEGORIES = [
|
|
84
|
+
{ name: 'eval-dynamic-exec', severity: 'high', patterns: DANGEROUS_EXEC_PATTERNS, description: 'Dynamic code execution' },
|
|
85
|
+
{ name: 'shell-commands', severity: 'critical', patterns: DANGEROUS_SHELL_PATTERNS, description: 'Shell command execution' },
|
|
86
|
+
{ name: 'dangerous-fs', severity: 'medium', patterns: DANGEROUS_FS_PATTERNS, description: 'Dangerous filesystem operations' },
|
|
87
|
+
{ name: 'network-calls', severity: 'low', patterns: DANGEROUS_NETWORK_PATTERNS, description: 'Network calls in generated code' },
|
|
88
|
+
{ name: 'sql-injection', severity: 'critical', patterns: DANGEROUS_SQL_PATTERNS, description: 'SQL injection patterns' },
|
|
89
|
+
];
|
|
90
|
+
// ─── Scanner Functions ──────────────────────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Scan text for PII (personally identifiable information).
|
|
93
|
+
*/
|
|
94
|
+
export function scanForPII(text) {
|
|
95
|
+
const findings = [];
|
|
96
|
+
// Emails
|
|
97
|
+
const emails = text.match(EMAIL_PATTERN);
|
|
98
|
+
if (emails) {
|
|
99
|
+
for (const email of emails) {
|
|
100
|
+
findings.push({
|
|
101
|
+
type: 'pii',
|
|
102
|
+
severity: 'medium',
|
|
103
|
+
category: 'email',
|
|
104
|
+
match: email,
|
|
105
|
+
recommendation: 'Remove or obfuscate email address before sharing',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// API keys & secrets
|
|
110
|
+
for (const pattern of API_KEY_PATTERNS) {
|
|
111
|
+
const matches = text.match(pattern);
|
|
112
|
+
if (matches) {
|
|
113
|
+
for (const key of matches) {
|
|
114
|
+
findings.push({
|
|
115
|
+
type: 'pii',
|
|
116
|
+
severity: 'critical',
|
|
117
|
+
category: 'api-key',
|
|
118
|
+
match: key.slice(0, 12) + '...',
|
|
119
|
+
recommendation: 'Revoke this key immediately and generate a new one',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// SSNs
|
|
125
|
+
const ssns = text.match(SSN_PATTERN);
|
|
126
|
+
if (ssns) {
|
|
127
|
+
for (const ssn of ssns) {
|
|
128
|
+
findings.push({
|
|
129
|
+
type: 'pii',
|
|
130
|
+
severity: 'critical',
|
|
131
|
+
category: 'ssn',
|
|
132
|
+
match: ssn.replace(/\d{4}$/, 'XXXX'),
|
|
133
|
+
recommendation: 'Remove SSN — this is sensitive PII',
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Credit cards
|
|
138
|
+
const cards = text.match(CREDIT_CARD_PATTERN);
|
|
139
|
+
if (cards) {
|
|
140
|
+
for (const card of cards) {
|
|
141
|
+
findings.push({
|
|
142
|
+
type: 'pii',
|
|
143
|
+
severity: 'critical',
|
|
144
|
+
category: 'credit-card',
|
|
145
|
+
match: card.replace(/\d{4}$/, 'XXXX'),
|
|
146
|
+
recommendation: 'Remove credit card number — PCI violation',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Phone numbers
|
|
151
|
+
const phones = text.match(PHONE_PATTERN);
|
|
152
|
+
if (phones) {
|
|
153
|
+
for (const phone of phones) {
|
|
154
|
+
findings.push({
|
|
155
|
+
type: 'pii',
|
|
156
|
+
severity: 'low',
|
|
157
|
+
category: 'phone',
|
|
158
|
+
match: phone,
|
|
159
|
+
recommendation: 'Consider obfuscating phone number',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return findings;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Scan text for prompt injection attempts.
|
|
167
|
+
*/
|
|
168
|
+
export function scanForInjections(text) {
|
|
169
|
+
const findings = [];
|
|
170
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
171
|
+
const match = text.match(pattern);
|
|
172
|
+
if (match) {
|
|
173
|
+
findings.push({
|
|
174
|
+
type: 'injection',
|
|
175
|
+
severity: 'high',
|
|
176
|
+
category: 'prompt-injection',
|
|
177
|
+
match: match[0].slice(0, 80),
|
|
178
|
+
recommendation: 'Review the prompt for jailbreak or injection attempts',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return findings;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Scan code for dangerous patterns.
|
|
186
|
+
*/
|
|
187
|
+
export function scanForDangerousCode(code, contextInfo) {
|
|
188
|
+
const findings = [];
|
|
189
|
+
for (const category of DANGEROUS_PATTERN_CATEGORIES) {
|
|
190
|
+
for (const pattern of category.patterns) {
|
|
191
|
+
const matches = code.matchAll(pattern);
|
|
192
|
+
for (const match of matches) {
|
|
193
|
+
// Find the line number
|
|
194
|
+
const beforeMatch = code.slice(0, match.index);
|
|
195
|
+
const line = (beforeMatch.match(/\n/g) || []).length + 1;
|
|
196
|
+
// Get surrounding context (20 chars before and after)
|
|
197
|
+
const start = Math.max(0, (match.index || 0) - 20);
|
|
198
|
+
const end = Math.min(code.length, (match.index || 0) + match[0].length + 20);
|
|
199
|
+
const context = code.slice(start, end).replace(/\n/g, ' ');
|
|
200
|
+
// For generated code, lower the severity of network calls and dynamic exec
|
|
201
|
+
let severity = category.severity;
|
|
202
|
+
if (contextInfo?.isGenerated) {
|
|
203
|
+
if (category.name === 'network-calls')
|
|
204
|
+
severity = 'low';
|
|
205
|
+
if (category.name === 'eval-dynamic-exec')
|
|
206
|
+
severity = 'medium';
|
|
207
|
+
}
|
|
208
|
+
findings.push({
|
|
209
|
+
type: 'dangerous-code',
|
|
210
|
+
severity,
|
|
211
|
+
category: category.name,
|
|
212
|
+
match: match[0].slice(0, 60),
|
|
213
|
+
context,
|
|
214
|
+
line,
|
|
215
|
+
recommendation: `Dangerous ${category.description} pattern detected. Review carefully.`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return findings;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Run all security scans on a given text.
|
|
224
|
+
* Convenience function that combines PII, injection, and code scans.
|
|
225
|
+
*/
|
|
226
|
+
export function runAllScans(text, options) {
|
|
227
|
+
const findings = [
|
|
228
|
+
...scanForPII(text),
|
|
229
|
+
...scanForInjections(text),
|
|
230
|
+
...scanForDangerousCode(text, { isGenerated: options?.isGenerated }),
|
|
231
|
+
];
|
|
232
|
+
const criticalCount = findings.filter((f) => f.severity === 'critical').length;
|
|
233
|
+
const highCount = findings.filter((f) => f.severity === 'high').length;
|
|
234
|
+
const mediumCount = findings.filter((f) => f.severity === 'medium').length;
|
|
235
|
+
const lowCount = findings.filter((f) => f.severity === 'low' || f.severity === 'info').length;
|
|
236
|
+
// Fail on critical or high severity findings
|
|
237
|
+
const passed = criticalCount === 0 && highCount === 0;
|
|
238
|
+
const summaryParts = [];
|
|
239
|
+
if (criticalCount > 0)
|
|
240
|
+
summaryParts.push(`${criticalCount} critical`);
|
|
241
|
+
if (highCount > 0)
|
|
242
|
+
summaryParts.push(`${highCount} high`);
|
|
243
|
+
if (mediumCount > 0)
|
|
244
|
+
summaryParts.push(`${mediumCount} medium`);
|
|
245
|
+
if (lowCount > 0)
|
|
246
|
+
summaryParts.push(`${lowCount} low`);
|
|
247
|
+
const summary = findings.length === 0
|
|
248
|
+
? 'Security scan passed — no issues found'
|
|
249
|
+
: `Security scan found ${findings.length} issue(s): ${summaryParts.join(', ')} severity`;
|
|
250
|
+
return { passed, findings, summary };
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Format findings as a readable report string.
|
|
254
|
+
*/
|
|
255
|
+
export function formatScanReport(result) {
|
|
256
|
+
if (result.findings.length === 0) {
|
|
257
|
+
return ' ✅ Security scan: Clean';
|
|
258
|
+
}
|
|
259
|
+
const lines = [
|
|
260
|
+
` ${result.passed ? '⚠️' : '❌'} Security scan: ${result.summary}`,
|
|
261
|
+
];
|
|
262
|
+
for (const finding of result.findings) {
|
|
263
|
+
const icon = finding.severity === 'critical' ? '🔴' :
|
|
264
|
+
finding.severity === 'high' ? '🟠' :
|
|
265
|
+
finding.severity === 'medium' ? '🟡' : '🔵';
|
|
266
|
+
const lineStr = finding.line ? ` (line ${finding.line})` : '';
|
|
267
|
+
lines.push(` ${icon} [${finding.severity}] ${finding.category}${lineStr}: ${finding.match.slice(0, 60)}`);
|
|
268
|
+
}
|
|
269
|
+
return lines.join('\n');
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Config — Project-level configuration with config priority chain.
|
|
3
|
+
*
|
|
4
|
+
* Config priority (highest to lowest):
|
|
5
|
+
* 1. Project-level `.buffconfig.json` in working directory
|
|
6
|
+
* 2. User-level config at `~/.buff/buffconfig.json`
|
|
7
|
+
* 3. Built-in defaults
|
|
8
|
+
*
|
|
9
|
+
* This enables teams to commit a `.buffconfig.json` to their repo that
|
|
10
|
+
* defines shared provider defaults, team repository URL, and other
|
|
11
|
+
* project-wide settings while allowing individual overrides.
|
|
12
|
+
*
|
|
13
|
+
* The project-level config is read-only by default — CLI commands write
|
|
14
|
+
* to the user-level config. The `buff config init` command can generate
|
|
15
|
+
* a project-level config.
|
|
16
|
+
*/
|
|
17
|
+
import type { BuffConfig, TeamConfig } from '../config/types.js';
|
|
18
|
+
/** Default team config values */
|
|
19
|
+
export declare const DEFAULT_TEAM_CONFIG: TeamConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Find and load the project-level `.buffconfig.json`.
|
|
22
|
+
* Searches from the working directory upward for common filenames.
|
|
23
|
+
*
|
|
24
|
+
* @param cwd — Working directory to search from (default: process.cwd())
|
|
25
|
+
* @returns The parsed project config, or null if none found
|
|
26
|
+
*/
|
|
27
|
+
export declare function findProjectConfig(cwd?: string): BuffConfig | null;
|
|
28
|
+
/**
|
|
29
|
+
* Get the team config from the project-level config.
|
|
30
|
+
* Falls back to user-level config if project config doesn't have team settings.
|
|
31
|
+
*
|
|
32
|
+
* @param cwd — Optional working directory
|
|
33
|
+
* @returns The resolved team config
|
|
34
|
+
*/
|
|
35
|
+
export declare function getTeamConfig(cwd?: string): TeamConfig;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a project-level `.buffconfig.json` exists.
|
|
38
|
+
*/
|
|
39
|
+
export declare function hasProjectConfig(cwd?: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get the path to the team data directory.
|
|
42
|
+
* Uses project-level config path, falling back to ~/.buff/team/.
|
|
43
|
+
*
|
|
44
|
+
* The team directory is a git repository that contains:
|
|
45
|
+
* - trajectories/ — Shared agent execution trajectories
|
|
46
|
+
* - patterns/ — Project-level coding patterns
|
|
47
|
+
* - templates/ — Team workflow templates
|
|
48
|
+
*/
|
|
49
|
+
export declare function getTeamDataDir(cwd?: string): string;
|
|
50
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/team/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKjE,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAC;AAWF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAkBjE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAmBtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMnD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Config — Project-level configuration with config priority chain.
|
|
3
|
+
*
|
|
4
|
+
* Config priority (highest to lowest):
|
|
5
|
+
* 1. Project-level `.buffconfig.json` in working directory
|
|
6
|
+
* 2. User-level config at `~/.buff/buffconfig.json`
|
|
7
|
+
* 3. Built-in defaults
|
|
8
|
+
*
|
|
9
|
+
* This enables teams to commit a `.buffconfig.json` to their repo that
|
|
10
|
+
* defines shared provider defaults, team repository URL, and other
|
|
11
|
+
* project-wide settings while allowing individual overrides.
|
|
12
|
+
*
|
|
13
|
+
* The project-level config is read-only by default — CLI commands write
|
|
14
|
+
* to the user-level config. The `buff config init` command can generate
|
|
15
|
+
* a project-level config.
|
|
16
|
+
*/
|
|
17
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
18
|
+
import { join, resolve } from 'node:path';
|
|
19
|
+
import { homedir } from 'node:os';
|
|
20
|
+
import { ConfigManager } from '../config/manager.js';
|
|
21
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
22
|
+
/** Default team config values */
|
|
23
|
+
export const DEFAULT_TEAM_CONFIG = {
|
|
24
|
+
branch: 'main',
|
|
25
|
+
autoSyncMinutes: 0,
|
|
26
|
+
shareTrajectories: true,
|
|
27
|
+
};
|
|
28
|
+
/** Priority config search paths (relative to working directory) */
|
|
29
|
+
const PROJECT_CONFIG_FILENAMES = [
|
|
30
|
+
'.buffconfig.json',
|
|
31
|
+
'buffconfig.json',
|
|
32
|
+
'.buff/config.json',
|
|
33
|
+
];
|
|
34
|
+
// ─── Config Priority Chain ──────────────────────────────────────────────────
|
|
35
|
+
/**
|
|
36
|
+
* Find and load the project-level `.buffconfig.json`.
|
|
37
|
+
* Searches from the working directory upward for common filenames.
|
|
38
|
+
*
|
|
39
|
+
* @param cwd — Working directory to search from (default: process.cwd())
|
|
40
|
+
* @returns The parsed project config, or null if none found
|
|
41
|
+
*/
|
|
42
|
+
export function findProjectConfig(cwd) {
|
|
43
|
+
const dir = resolve(cwd || process.cwd());
|
|
44
|
+
for (const filename of PROJECT_CONFIG_FILENAMES) {
|
|
45
|
+
const filePath = join(dir, filename);
|
|
46
|
+
if (existsSync(filePath)) {
|
|
47
|
+
try {
|
|
48
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
49
|
+
const config = JSON.parse(raw);
|
|
50
|
+
return config;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Try next filename
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the team config from the project-level config.
|
|
62
|
+
* Falls back to user-level config if project config doesn't have team settings.
|
|
63
|
+
*
|
|
64
|
+
* @param cwd — Optional working directory
|
|
65
|
+
* @returns The resolved team config
|
|
66
|
+
*/
|
|
67
|
+
export function getTeamConfig(cwd) {
|
|
68
|
+
// Check project-level config first
|
|
69
|
+
const projectConfig = findProjectConfig(cwd);
|
|
70
|
+
if (projectConfig?.team) {
|
|
71
|
+
return { ...DEFAULT_TEAM_CONFIG, ...projectConfig.team };
|
|
72
|
+
}
|
|
73
|
+
// Fall back to user-level config
|
|
74
|
+
try {
|
|
75
|
+
const configManager = new ConfigManager();
|
|
76
|
+
const userConfig = configManager.getAll();
|
|
77
|
+
if (userConfig.team) {
|
|
78
|
+
return { ...DEFAULT_TEAM_CONFIG, ...userConfig.team };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Fall through to defaults
|
|
83
|
+
}
|
|
84
|
+
return { ...DEFAULT_TEAM_CONFIG };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if a project-level `.buffconfig.json` exists.
|
|
88
|
+
*/
|
|
89
|
+
export function hasProjectConfig(cwd) {
|
|
90
|
+
return findProjectConfig(cwd) !== null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the path to the team data directory.
|
|
94
|
+
* Uses project-level config path, falling back to ~/.buff/team/.
|
|
95
|
+
*
|
|
96
|
+
* The team directory is a git repository that contains:
|
|
97
|
+
* - trajectories/ — Shared agent execution trajectories
|
|
98
|
+
* - patterns/ — Project-level coding patterns
|
|
99
|
+
* - templates/ — Team workflow templates
|
|
100
|
+
*/
|
|
101
|
+
export function getTeamDataDir(cwd) {
|
|
102
|
+
const teamConfig = getTeamConfig(cwd);
|
|
103
|
+
if (teamConfig.localPath)
|
|
104
|
+
return resolve(teamConfig.localPath);
|
|
105
|
+
// Default: ~/.buff/team/
|
|
106
|
+
return join(homedir(), '.buff', 'team');
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/team/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,+EAA+E;AAE/E,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,MAAM;IACd,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,mEAAmE;AACnE,MAAM,wBAAwB,GAAG;IAC/B,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE1C,KAAK,MAAM,QAAQ,IAAI,wBAAwB,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;gBAC7C,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;gBACpB,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,mCAAmC;IACnC,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,aAAa,EAAE,IAAI,EAAE,CAAC;QACxB,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,aAAa,CAAC,IAAI,EAAgB,CAAC;IACzE,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,UAAU,CAAC,IAAI,EAAgB,CAAC;QACtE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IAED,OAAO,EAAE,GAAG,mBAAmB,EAAgB,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAE/D,yBAAyB;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|