codehere 0.1.0 → 0.2.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.
Potentially problematic release.
This version of codehere might be problematic. Click here for more details.
- package/README.md +51 -25
- package/dist/agents/base.d.ts +107 -0
- package/dist/agents/base.d.ts.map +1 -0
- package/dist/agents/base.js +101 -0
- package/dist/agents/base.js.map +1 -0
- package/dist/agents/orchestrator-model-driven.d.ts +41 -0
- package/dist/agents/orchestrator-model-driven.d.ts.map +1 -0
- package/dist/agents/orchestrator-model-driven.js +141 -0
- package/dist/agents/orchestrator-model-driven.js.map +1 -0
- package/dist/agents/react-orchestrator-agent.d.ts +15 -0
- package/dist/agents/react-orchestrator-agent.d.ts.map +1 -0
- package/dist/agents/react-orchestrator-agent.js +54 -0
- package/dist/agents/react-orchestrator-agent.js.map +1 -0
- package/dist/application/agents/execution-agent.d.ts +68 -0
- package/dist/application/agents/execution-agent.d.ts.map +1 -0
- package/dist/application/agents/execution-agent.js +299 -0
- package/dist/application/agents/execution-agent.js.map +1 -0
- package/dist/application/agents/multi-agent-orchestrator.d.ts +64 -0
- package/dist/application/agents/multi-agent-orchestrator.d.ts.map +1 -0
- package/dist/application/agents/multi-agent-orchestrator.js +209 -0
- package/dist/application/agents/multi-agent-orchestrator.js.map +1 -0
- package/dist/application/agents/planning-agent.d.ts +61 -0
- package/dist/application/agents/planning-agent.d.ts.map +1 -0
- package/dist/application/agents/planning-agent.js +357 -0
- package/dist/application/agents/planning-agent.js.map +1 -0
- package/dist/application/agents/validation-agent.d.ts +64 -0
- package/dist/application/agents/validation-agent.d.ts.map +1 -0
- package/dist/application/agents/validation-agent.js +182 -0
- package/dist/application/agents/validation-agent.js.map +1 -0
- package/dist/application/architectures/plan-and-act.d.ts +94 -0
- package/dist/application/architectures/plan-and-act.d.ts.map +1 -0
- package/dist/application/architectures/plan-and-act.js +242 -0
- package/dist/application/architectures/plan-and-act.js.map +1 -0
- package/dist/application/index.d.ts +12 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +12 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/services/agent-factory.d.ts +9 -0
- package/dist/application/services/agent-factory.d.ts.map +1 -0
- package/dist/application/services/agent-factory.js +28 -0
- package/dist/application/services/agent-factory.js.map +1 -0
- package/dist/application/services/dependency-container.d.ts +140 -0
- package/dist/application/services/dependency-container.d.ts.map +1 -0
- package/dist/application/services/dependency-container.js +402 -0
- package/dist/application/services/dependency-container.js.map +1 -0
- package/dist/application/services/git-context-service.d.ts +30 -0
- package/dist/application/services/git-context-service.d.ts.map +1 -0
- package/dist/application/services/git-context-service.js +83 -0
- package/dist/application/services/git-context-service.js.map +1 -0
- package/dist/application/services/intelligent-router.d.ts +74 -0
- package/dist/application/services/intelligent-router.d.ts.map +1 -0
- package/dist/application/services/intelligent-router.js +711 -0
- package/dist/application/services/intelligent-router.js.map +1 -0
- package/dist/application/services/tool-executor-service.d.ts +14 -0
- package/dist/application/services/tool-executor-service.d.ts.map +1 -0
- package/dist/application/services/tool-executor-service.js +94 -0
- package/dist/application/services/tool-executor-service.js.map +1 -0
- package/dist/application/use-cases/ask-question-use-case.d.ts +36 -0
- package/dist/application/use-cases/ask-question-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/ask-question-use-case.js +150 -0
- package/dist/application/use-cases/ask-question-use-case.js.map +1 -0
- package/dist/application/use-cases/edit-file-use-case.d.ts +76 -0
- package/dist/application/use-cases/edit-file-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/edit-file-use-case.js +685 -0
- package/dist/application/use-cases/edit-file-use-case.js.map +1 -0
- package/dist/application/use-cases/explain-file-use-case.d.ts +21 -0
- package/dist/application/use-cases/explain-file-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/explain-file-use-case.js +50 -0
- package/dist/application/use-cases/explain-file-use-case.js.map +1 -0
- package/dist/application/use-cases/index-codebase-use-case.d.ts +46 -0
- package/dist/application/use-cases/index-codebase-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/index-codebase-use-case.js +113 -0
- package/dist/application/use-cases/index-codebase-use-case.js.map +1 -0
- package/dist/application/use-cases/planning-use-case.d.ts +46 -0
- package/dist/application/use-cases/planning-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/planning-use-case.js +267 -0
- package/dist/application/use-cases/planning-use-case.js.map +1 -0
- package/dist/application/use-cases/react-orchestration-use-case.d.ts +51 -0
- package/dist/application/use-cases/react-orchestration-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/react-orchestration-use-case.js +325 -0
- package/dist/application/use-cases/react-orchestration-use-case.js.map +1 -0
- package/dist/application/use-cases/reflexion-use-case.d.ts +24 -0
- package/dist/application/use-cases/reflexion-use-case.d.ts.map +1 -0
- package/dist/application/use-cases/reflexion-use-case.js +30 -0
- package/dist/application/use-cases/reflexion-use-case.js.map +1 -0
- package/dist/application/workflows/deterministic-workflows.d.ts +61 -0
- package/dist/application/workflows/deterministic-workflows.d.ts.map +1 -0
- package/dist/application/workflows/deterministic-workflows.js +189 -0
- package/dist/application/workflows/deterministic-workflows.js.map +1 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +1 -3
- package/dist/cache.js.map +1 -1
- package/dist/chat.js +10 -10
- package/dist/chat.js.map +1 -1
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.js +1 -2
- package/dist/docs.js.map +1 -1
- package/dist/domain/entities/code-chunk.d.ts +26 -0
- package/dist/domain/entities/code-chunk.d.ts.map +1 -0
- package/dist/domain/entities/code-chunk.js +6 -0
- package/dist/domain/entities/code-chunk.js.map +1 -0
- package/dist/domain/entities/decision.d.ts +37 -0
- package/dist/domain/entities/decision.d.ts.map +1 -0
- package/dist/domain/entities/decision.js +9 -0
- package/dist/domain/entities/decision.js.map +1 -0
- package/dist/domain/entities/edit.d.ts +35 -0
- package/dist/domain/entities/edit.d.ts.map +1 -0
- package/dist/domain/entities/edit.js +6 -0
- package/dist/domain/entities/edit.js.map +1 -0
- package/dist/domain/entities/knowledge-node.d.ts +83 -0
- package/dist/domain/entities/knowledge-node.d.ts.map +1 -0
- package/dist/domain/entities/knowledge-node.js +9 -0
- package/dist/domain/entities/knowledge-node.js.map +1 -0
- package/dist/domain/entities/knowledge-preservation.d.ts +42 -0
- package/dist/domain/entities/knowledge-preservation.d.ts.map +1 -0
- package/dist/domain/entities/knowledge-preservation.js +10 -0
- package/dist/domain/entities/knowledge-preservation.js.map +1 -0
- package/dist/domain/entities/memory.d.ts +36 -0
- package/dist/domain/entities/memory.d.ts.map +1 -0
- package/dist/domain/entities/memory.js +6 -0
- package/dist/domain/entities/memory.js.map +1 -0
- package/dist/domain/entities/pattern.d.ts +49 -0
- package/dist/domain/entities/pattern.d.ts.map +1 -0
- package/dist/domain/entities/pattern.js +7 -0
- package/dist/domain/entities/pattern.js.map +1 -0
- package/dist/domain/entities/plan.d.ts +42 -0
- package/dist/domain/entities/plan.d.ts.map +1 -0
- package/dist/domain/entities/plan.js +6 -0
- package/dist/domain/entities/plan.js.map +1 -0
- package/dist/domain/entities/query.d.ts +17 -0
- package/dist/domain/entities/query.d.ts.map +1 -0
- package/dist/domain/entities/query.js +6 -0
- package/dist/domain/entities/query.js.map +1 -0
- package/dist/domain/index.d.ts +16 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +19 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/interfaces/ai-service.interface.d.ts +62 -0
- package/dist/domain/interfaces/ai-service.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/ai-service.interface.js +6 -0
- package/dist/domain/interfaces/ai-service.interface.js.map +1 -0
- package/dist/domain/interfaces/code-analyzer.interface.d.ts +38 -0
- package/dist/domain/interfaces/code-analyzer.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/code-analyzer.interface.js +6 -0
- package/dist/domain/interfaces/code-analyzer.interface.js.map +1 -0
- package/dist/domain/interfaces/decision-repository.interface.d.ts +51 -0
- package/dist/domain/interfaces/decision-repository.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/decision-repository.interface.js +9 -0
- package/dist/domain/interfaces/decision-repository.interface.js.map +1 -0
- package/dist/domain/interfaces/embedding-repository.interface.d.ts +28 -0
- package/dist/domain/interfaces/embedding-repository.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/embedding-repository.interface.js +6 -0
- package/dist/domain/interfaces/embedding-repository.interface.js.map +1 -0
- package/dist/domain/interfaces/knowledge-graph-repository.interface.d.ts +91 -0
- package/dist/domain/interfaces/knowledge-graph-repository.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +9 -0
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js.map +1 -0
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.d.ts +50 -0
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +8 -0
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js.map +1 -0
- package/dist/domain/interfaces/memory-repository.interface.d.ts +49 -0
- package/dist/domain/interfaces/memory-repository.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/memory-repository.interface.js +6 -0
- package/dist/domain/interfaces/memory-repository.interface.js.map +1 -0
- package/dist/domain/interfaces/pattern-repository.interface.d.ts +48 -0
- package/dist/domain/interfaces/pattern-repository.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/pattern-repository.interface.js +6 -0
- package/dist/domain/interfaces/pattern-repository.interface.js.map +1 -0
- package/dist/domain/interfaces/verification-service.interface.d.ts +20 -0
- package/dist/domain/interfaces/verification-service.interface.d.ts.map +1 -0
- package/dist/domain/interfaces/verification-service.interface.js +6 -0
- package/dist/domain/interfaces/verification-service.interface.js.map +1 -0
- package/dist/domain/services/codebase-detector.d.ts +18 -0
- package/dist/domain/services/codebase-detector.d.ts.map +1 -0
- package/dist/domain/services/codebase-detector.js +91 -0
- package/dist/domain/services/codebase-detector.js.map +1 -0
- package/dist/domain/services/cross-team-pattern-sharing.d.ts +65 -0
- package/dist/domain/services/cross-team-pattern-sharing.d.ts.map +1 -0
- package/dist/domain/services/cross-team-pattern-sharing.js +125 -0
- package/dist/domain/services/cross-team-pattern-sharing.js.map +1 -0
- package/dist/domain/services/decision-recorder.d.ts +76 -0
- package/dist/domain/services/decision-recorder.d.ts.map +1 -0
- package/dist/domain/services/decision-recorder.js +223 -0
- package/dist/domain/services/decision-recorder.js.map +1 -0
- package/dist/domain/services/decision-retriever.d.ts +75 -0
- package/dist/domain/services/decision-retriever.d.ts.map +1 -0
- package/dist/domain/services/decision-retriever.js +133 -0
- package/dist/domain/services/decision-retriever.js.map +1 -0
- package/dist/domain/services/graded-memory-activation.d.ts +37 -0
- package/dist/domain/services/graded-memory-activation.d.ts.map +1 -0
- package/dist/domain/services/graded-memory-activation.js +69 -0
- package/dist/domain/services/graded-memory-activation.js.map +1 -0
- package/dist/domain/services/knowledge-access.d.ts +63 -0
- package/dist/domain/services/knowledge-access.d.ts.map +1 -0
- package/dist/domain/services/knowledge-access.js +132 -0
- package/dist/domain/services/knowledge-access.js.map +1 -0
- package/dist/domain/services/knowledge-extractor.d.ts +54 -0
- package/dist/domain/services/knowledge-extractor.d.ts.map +1 -0
- package/dist/domain/services/knowledge-extractor.js +247 -0
- package/dist/domain/services/knowledge-extractor.js.map +1 -0
- package/dist/domain/services/knowledge-graph-builder.d.ts +70 -0
- package/dist/domain/services/knowledge-graph-builder.d.ts.map +1 -0
- package/dist/domain/services/knowledge-graph-builder.js +268 -0
- package/dist/domain/services/knowledge-graph-builder.js.map +1 -0
- package/dist/domain/services/knowledge-graph-query.d.ts +69 -0
- package/dist/domain/services/knowledge-graph-query.d.ts.map +1 -0
- package/dist/domain/services/knowledge-graph-query.js +187 -0
- package/dist/domain/services/knowledge-graph-query.js.map +1 -0
- package/dist/domain/services/memory-retriever.d.ts +30 -0
- package/dist/domain/services/memory-retriever.d.ts.map +1 -0
- package/dist/domain/services/memory-retriever.js +82 -0
- package/dist/domain/services/memory-retriever.js.map +1 -0
- package/dist/domain/services/memory-synthesizer.d.ts +57 -0
- package/dist/domain/services/memory-synthesizer.d.ts.map +1 -0
- package/dist/domain/services/memory-synthesizer.js +91 -0
- package/dist/domain/services/memory-synthesizer.js.map +1 -0
- package/dist/domain/services/pattern-extractor.d.ts +108 -0
- package/dist/domain/services/pattern-extractor.d.ts.map +1 -0
- package/dist/domain/services/pattern-extractor.js +442 -0
- package/dist/domain/services/pattern-extractor.js.map +1 -0
- package/dist/domain/services/query-intent-classifier.d.ts +16 -0
- package/dist/domain/services/query-intent-classifier.d.ts.map +1 -0
- package/dist/domain/services/query-intent-classifier.js +140 -0
- package/dist/domain/services/query-intent-classifier.js.map +1 -0
- package/dist/domain/services/react-loop.d.ts +44 -0
- package/dist/domain/services/react-loop.d.ts.map +1 -0
- package/dist/domain/services/react-loop.js +110 -0
- package/dist/domain/services/react-loop.js.map +1 -0
- package/dist/edit.d.ts +0 -12
- package/dist/edit.d.ts.map +1 -1
- package/dist/edit.js +76 -351
- package/dist/edit.js.map +1 -1
- package/dist/embed.d.ts +0 -4
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.js +100 -174
- package/dist/embed.js.map +1 -1
- package/dist/error-handler.d.ts +1 -0
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +46 -3
- package/dist/error-handler.js.map +1 -1
- package/dist/index.js +228 -231
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/ai/cohere-ai-service.d.ts +54 -0
- package/dist/infrastructure/ai/cohere-ai-service.d.ts.map +1 -0
- package/dist/infrastructure/ai/cohere-ai-service.js +547 -0
- package/dist/infrastructure/ai/cohere-ai-service.js.map +1 -0
- package/dist/infrastructure/ai/command-r-evaluation.d.ts +42 -0
- package/dist/infrastructure/ai/command-r-evaluation.d.ts.map +1 -0
- package/dist/infrastructure/ai/command-r-evaluation.js +206 -0
- package/dist/infrastructure/ai/command-r-evaluation.js.map +1 -0
- package/dist/infrastructure/ai/model-config.d.ts +47 -0
- package/dist/infrastructure/ai/model-config.d.ts.map +1 -0
- package/dist/infrastructure/ai/model-config.js +84 -0
- package/dist/infrastructure/ai/model-config.js.map +1 -0
- package/dist/infrastructure/cache/embedding-cache.d.ts +46 -0
- package/dist/infrastructure/cache/embedding-cache.d.ts.map +1 -0
- package/dist/infrastructure/cache/embedding-cache.js +104 -0
- package/dist/infrastructure/cache/embedding-cache.js.map +1 -0
- package/dist/infrastructure/chunking/ast-code-chunker.d.ts +12 -0
- package/dist/infrastructure/chunking/ast-code-chunker.d.ts.map +1 -0
- package/dist/infrastructure/chunking/ast-code-chunker.js +19 -0
- package/dist/infrastructure/chunking/ast-code-chunker.js.map +1 -0
- package/dist/infrastructure/chunking/code-aware-chunker.d.ts +63 -0
- package/dist/infrastructure/chunking/code-aware-chunker.d.ts.map +1 -0
- package/dist/infrastructure/chunking/code-aware-chunker.js +397 -0
- package/dist/infrastructure/chunking/code-aware-chunker.js.map +1 -0
- package/dist/infrastructure/config/config-manager.d.ts +79 -0
- package/dist/infrastructure/config/config-manager.d.ts.map +1 -0
- package/dist/infrastructure/config/config-manager.js +162 -0
- package/dist/infrastructure/config/config-manager.js.map +1 -0
- package/dist/infrastructure/cost/cost-tracker.d.ts +90 -0
- package/dist/infrastructure/cost/cost-tracker.d.ts.map +1 -0
- package/dist/infrastructure/cost/cost-tracker.js +353 -0
- package/dist/infrastructure/cost/cost-tracker.js.map +1 -0
- package/dist/infrastructure/file-scanner/file-scanner.d.ts +31 -0
- package/dist/infrastructure/file-scanner/file-scanner.d.ts.map +1 -0
- package/dist/infrastructure/file-scanner/file-scanner.js +106 -0
- package/dist/infrastructure/file-scanner/file-scanner.js.map +1 -0
- package/dist/infrastructure/governance/nist-ai-rmf.d.ts +107 -0
- package/dist/infrastructure/governance/nist-ai-rmf.d.ts.map +1 -0
- package/dist/infrastructure/governance/nist-ai-rmf.js +294 -0
- package/dist/infrastructure/governance/nist-ai-rmf.js.map +1 -0
- package/dist/infrastructure/governance/policy-as-code.d.ts +90 -0
- package/dist/infrastructure/governance/policy-as-code.d.ts.map +1 -0
- package/dist/infrastructure/governance/policy-as-code.js +244 -0
- package/dist/infrastructure/governance/policy-as-code.js.map +1 -0
- package/dist/infrastructure/governance/prompt-to-code-lineage.d.ts +138 -0
- package/dist/infrastructure/governance/prompt-to-code-lineage.d.ts.map +1 -0
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +241 -0
- package/dist/infrastructure/governance/prompt-to-code-lineage.js.map +1 -0
- package/dist/infrastructure/index.d.ts +7 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +7 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/observability/execution-tracer.d.ts +105 -0
- package/dist/infrastructure/observability/execution-tracer.d.ts.map +1 -0
- package/dist/infrastructure/observability/execution-tracer.js +190 -0
- package/dist/infrastructure/observability/execution-tracer.js.map +1 -0
- package/dist/infrastructure/observability/prompt-versioner.d.ts +67 -0
- package/dist/infrastructure/observability/prompt-versioner.d.ts.map +1 -0
- package/dist/infrastructure/observability/prompt-versioner.js +145 -0
- package/dist/infrastructure/observability/prompt-versioner.js.map +1 -0
- package/dist/infrastructure/protocols/a2a-metadata.d.ts +278 -0
- package/dist/infrastructure/protocols/a2a-metadata.d.ts.map +1 -0
- package/dist/infrastructure/protocols/a2a-metadata.js +137 -0
- package/dist/infrastructure/protocols/a2a-metadata.js.map +1 -0
- package/dist/infrastructure/protocols/a2a-protocol.d.ts +132 -0
- package/dist/infrastructure/protocols/a2a-protocol.d.ts.map +1 -0
- package/dist/infrastructure/protocols/a2a-protocol.js +314 -0
- package/dist/infrastructure/protocols/a2a-protocol.js.map +1 -0
- package/dist/infrastructure/protocols/mcp-oauth.d.ts +91 -0
- package/dist/infrastructure/protocols/mcp-oauth.d.ts.map +1 -0
- package/dist/infrastructure/protocols/mcp-oauth.js +184 -0
- package/dist/infrastructure/protocols/mcp-oauth.js.map +1 -0
- package/dist/infrastructure/protocols/mcp-server.d.ts +126 -0
- package/dist/infrastructure/protocols/mcp-server.d.ts.map +1 -0
- package/dist/infrastructure/protocols/mcp-server.js +333 -0
- package/dist/infrastructure/protocols/mcp-server.js.map +1 -0
- package/dist/infrastructure/protocols/streaming-handler.d.ts +57 -0
- package/dist/infrastructure/protocols/streaming-handler.d.ts.map +1 -0
- package/dist/infrastructure/protocols/streaming-handler.js +103 -0
- package/dist/infrastructure/protocols/streaming-handler.js.map +1 -0
- package/dist/infrastructure/security/ai-sast-scanner.d.ts +55 -0
- package/dist/infrastructure/security/ai-sast-scanner.d.ts.map +1 -0
- package/dist/infrastructure/security/ai-sast-scanner.js +163 -0
- package/dist/infrastructure/security/ai-sast-scanner.js.map +1 -0
- package/dist/infrastructure/security/docker-sandbox.d.ts +57 -0
- package/dist/infrastructure/security/docker-sandbox.d.ts.map +1 -0
- package/dist/infrastructure/security/docker-sandbox.js +178 -0
- package/dist/infrastructure/security/docker-sandbox.js.map +1 -0
- package/dist/infrastructure/security/enhanced-security-gate.d.ts +51 -0
- package/dist/infrastructure/security/enhanced-security-gate.d.ts.map +1 -0
- package/dist/infrastructure/security/enhanced-security-gate.js +92 -0
- package/dist/infrastructure/security/enhanced-security-gate.js.map +1 -0
- package/dist/infrastructure/security/input-validator.d.ts +33 -0
- package/dist/infrastructure/security/input-validator.d.ts.map +1 -0
- package/dist/infrastructure/security/input-validator.js +152 -0
- package/dist/infrastructure/security/input-validator.js.map +1 -0
- package/dist/infrastructure/security/license-scanner.d.ts +55 -0
- package/dist/infrastructure/security/license-scanner.d.ts.map +1 -0
- package/dist/infrastructure/security/license-scanner.js +167 -0
- package/dist/infrastructure/security/license-scanner.js.map +1 -0
- package/dist/infrastructure/security/provider-bias-detector.d.ts +53 -0
- package/dist/infrastructure/security/provider-bias-detector.d.ts.map +1 -0
- package/dist/infrastructure/security/provider-bias-detector.js +164 -0
- package/dist/infrastructure/security/provider-bias-detector.js.map +1 -0
- package/dist/infrastructure/security/sandbox-executor.d.ts +34 -0
- package/dist/infrastructure/security/sandbox-executor.d.ts.map +1 -0
- package/dist/infrastructure/security/sandbox-executor.js +64 -0
- package/dist/infrastructure/security/sandbox-executor.js.map +1 -0
- package/dist/infrastructure/storage/memory-stream-service.d.ts +47 -0
- package/dist/infrastructure/storage/memory-stream-service.d.ts.map +1 -0
- package/dist/infrastructure/storage/memory-stream-service.js +204 -0
- package/dist/infrastructure/storage/memory-stream-service.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-decision-repository.d.ts +29 -0
- package/dist/infrastructure/storage/sqlite-decision-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite-decision-repository.js +232 -0
- package/dist/infrastructure/storage/sqlite-decision-repository.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-embedding-repository.d.ts +24 -0
- package/dist/infrastructure/storage/sqlite-embedding-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +162 -0
- package/dist/infrastructure/storage/sqlite-embedding-repository.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.d.ts +41 -0
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +417 -0
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.d.ts +29 -0
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +230 -0
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-memory-repository.d.ts +40 -0
- package/dist/infrastructure/storage/sqlite-memory-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite-memory-repository.js +229 -0
- package/dist/infrastructure/storage/sqlite-memory-repository.js.map +1 -0
- package/dist/infrastructure/storage/sqlite-pattern-repository.d.ts +25 -0
- package/dist/infrastructure/storage/sqlite-pattern-repository.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +249 -0
- package/dist/infrastructure/storage/sqlite-pattern-repository.js.map +1 -0
- package/dist/infrastructure/ux/appropriate-friction.d.ts +77 -0
- package/dist/infrastructure/ux/appropriate-friction.d.ts.map +1 -0
- package/dist/infrastructure/ux/appropriate-friction.js +213 -0
- package/dist/infrastructure/ux/appropriate-friction.js.map +1 -0
- package/dist/infrastructure/ux/bi-directional-learning.d.ts +109 -0
- package/dist/infrastructure/ux/bi-directional-learning.d.ts.map +1 -0
- package/dist/infrastructure/ux/bi-directional-learning.js +200 -0
- package/dist/infrastructure/ux/bi-directional-learning.js.map +1 -0
- package/dist/infrastructure/ux/expectation-management.d.ts +65 -0
- package/dist/infrastructure/ux/expectation-management.d.ts.map +1 -0
- package/dist/infrastructure/ux/expectation-management.js +193 -0
- package/dist/infrastructure/ux/expectation-management.js.map +1 -0
- package/dist/infrastructure/ux/hitl-validation.d.ts +104 -0
- package/dist/infrastructure/ux/hitl-validation.d.ts.map +1 -0
- package/dist/infrastructure/ux/hitl-validation.js +211 -0
- package/dist/infrastructure/ux/hitl-validation.js.map +1 -0
- package/dist/infrastructure/ux/progressive-disclosure.d.ts +84 -0
- package/dist/infrastructure/ux/progressive-disclosure.d.ts.map +1 -0
- package/dist/infrastructure/ux/progressive-disclosure.js +235 -0
- package/dist/infrastructure/ux/progressive-disclosure.js.map +1 -0
- package/dist/infrastructure/ux/team-standards.d.ts +94 -0
- package/dist/infrastructure/ux/team-standards.d.ts.map +1 -0
- package/dist/infrastructure/ux/team-standards.js +196 -0
- package/dist/infrastructure/ux/team-standards.js.map +1 -0
- package/dist/infrastructure/verification/verification-service.d.ts +12 -0
- package/dist/infrastructure/verification/verification-service.d.ts.map +1 -0
- package/dist/infrastructure/verification/verification-service.js +47 -0
- package/dist/infrastructure/verification/verification-service.js.map +1 -0
- package/dist/infrastructure/xai/attention-visualizer.d.ts +73 -0
- package/dist/infrastructure/xai/attention-visualizer.d.ts.map +1 -0
- package/dist/infrastructure/xai/attention-visualizer.js +174 -0
- package/dist/infrastructure/xai/attention-visualizer.js.map +1 -0
- package/dist/infrastructure/xai/cot-visualizer.d.ts +105 -0
- package/dist/infrastructure/xai/cot-visualizer.d.ts.map +1 -0
- package/dist/infrastructure/xai/cot-visualizer.js +239 -0
- package/dist/infrastructure/xai/cot-visualizer.js.map +1 -0
- package/dist/infrastructure/xai/decision-tree-log.d.ts +104 -0
- package/dist/infrastructure/xai/decision-tree-log.d.ts.map +1 -0
- package/dist/infrastructure/xai/decision-tree-log.js +216 -0
- package/dist/infrastructure/xai/decision-tree-log.js.map +1 -0
- package/dist/infrastructure/xai/interactive-xai.d.ts +106 -0
- package/dist/infrastructure/xai/interactive-xai.d.ts.map +1 -0
- package/dist/infrastructure/xai/interactive-xai.js +262 -0
- package/dist/infrastructure/xai/interactive-xai.js.map +1 -0
- package/dist/infrastructure/xai/uncertainty-quantifier.d.ts +80 -0
- package/dist/infrastructure/xai/uncertainty-quantifier.d.ts.map +1 -0
- package/dist/infrastructure/xai/uncertainty-quantifier.js +201 -0
- package/dist/infrastructure/xai/uncertainty-quantifier.js.map +1 -0
- package/dist/intelligent-retrieval.d.ts.map +1 -1
- package/dist/intelligent-retrieval.js +8 -1
- package/dist/intelligent-retrieval.js.map +1 -1
- package/dist/intent/classifier.d.ts +6 -0
- package/dist/intent/classifier.d.ts.map +1 -0
- package/dist/intent/classifier.js +2 -0
- package/dist/intent/classifier.js.map +1 -0
- package/dist/intent/context.d.ts +4 -0
- package/dist/intent/context.d.ts.map +1 -0
- package/dist/intent/context.js +2 -0
- package/dist/intent/context.js.map +1 -0
- package/dist/iterative-refinement.d.ts.map +1 -1
- package/dist/iterative-refinement.js +20 -3
- package/dist/iterative-refinement.js.map +1 -1
- package/dist/learning.d.ts.map +1 -1
- package/dist/learning.js +1 -2
- package/dist/learning.js.map +1 -1
- package/dist/monitoring.d.ts.map +1 -1
- package/dist/monitoring.js +1 -2
- package/dist/monitoring.js.map +1 -1
- package/dist/parallel-processor.d.ts +3 -2
- package/dist/parallel-processor.d.ts.map +1 -1
- package/dist/parallel-processor.js +183 -56
- package/dist/parallel-processor.js.map +1 -1
- package/dist/presentation/cli/commands/ask-command.d.ts +8 -0
- package/dist/presentation/cli/commands/ask-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/ask-command.js +133 -0
- package/dist/presentation/cli/commands/ask-command.js.map +1 -0
- package/dist/presentation/cli/commands/config-command.d.ts +9 -0
- package/dist/presentation/cli/commands/config-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/config-command.js +123 -0
- package/dist/presentation/cli/commands/config-command.js.map +1 -0
- package/dist/presentation/cli/commands/cost-command.d.ts +8 -0
- package/dist/presentation/cli/commands/cost-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/cost-command.js +191 -0
- package/dist/presentation/cli/commands/cost-command.js.map +1 -0
- package/dist/presentation/cli/commands/decision-command.d.ts +12 -0
- package/dist/presentation/cli/commands/decision-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/decision-command.js +207 -0
- package/dist/presentation/cli/commands/decision-command.js.map +1 -0
- package/dist/presentation/cli/commands/help-command.d.ts +9 -0
- package/dist/presentation/cli/commands/help-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/help-command.js +281 -0
- package/dist/presentation/cli/commands/help-command.js.map +1 -0
- package/dist/presentation/cli/commands/knowledge-command.d.ts +13 -0
- package/dist/presentation/cli/commands/knowledge-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/knowledge-command.js +129 -0
- package/dist/presentation/cli/commands/knowledge-command.js.map +1 -0
- package/dist/presentation/cli/commands/learning-dashboard-command.d.ts +8 -0
- package/dist/presentation/cli/commands/learning-dashboard-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/learning-dashboard-command.js +183 -0
- package/dist/presentation/cli/commands/learning-dashboard-command.js.map +1 -0
- package/dist/presentation/cli/commands/orchestrate-command.d.ts +8 -0
- package/dist/presentation/cli/commands/orchestrate-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/orchestrate-command.js +112 -0
- package/dist/presentation/cli/commands/orchestrate-command.js.map +1 -0
- package/dist/presentation/cli/commands/plan-command.d.ts +8 -0
- package/dist/presentation/cli/commands/plan-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/plan-command.js +114 -0
- package/dist/presentation/cli/commands/plan-command.js.map +1 -0
- package/dist/presentation/cli/commands/react-command.d.ts +8 -0
- package/dist/presentation/cli/commands/react-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/react-command.js +99 -0
- package/dist/presentation/cli/commands/react-command.js.map +1 -0
- package/dist/presentation/cli/commands/setup-command.d.ts +10 -0
- package/dist/presentation/cli/commands/setup-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/setup-command.js +231 -0
- package/dist/presentation/cli/commands/setup-command.js.map +1 -0
- package/dist/presentation/cli/commands/smart-command.d.ts +6 -0
- package/dist/presentation/cli/commands/smart-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/smart-command.js +212 -0
- package/dist/presentation/cli/commands/smart-command.js.map +1 -0
- package/dist/presentation/cli/commands/trace-command.d.ts +8 -0
- package/dist/presentation/cli/commands/trace-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/trace-command.js +125 -0
- package/dist/presentation/cli/commands/trace-command.js.map +1 -0
- package/dist/presentation/cli/commands/undo-command.d.ts +8 -0
- package/dist/presentation/cli/commands/undo-command.d.ts.map +1 -0
- package/dist/presentation/cli/commands/undo-command.js +141 -0
- package/dist/presentation/cli/commands/undo-command.js.map +1 -0
- package/dist/presentation/cli/error-display.d.ts +23 -0
- package/dist/presentation/cli/error-display.d.ts.map +1 -0
- package/dist/presentation/cli/error-display.js +122 -0
- package/dist/presentation/cli/error-display.js.map +1 -0
- package/dist/refactor.d.ts.map +1 -1
- package/dist/refactor.js +2 -4
- package/dist/refactor.js.map +1 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +2 -63
- package/dist/search.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +52 -3
- package/dist/session.js.map +1 -1
- package/dist/testgen.d.ts.map +1 -1
- package/dist/testgen.js +1 -2
- package/dist/testgen.js.map +1 -1
- package/dist/tools/bash.d.ts +53 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +213 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +48 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +235 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/executor.d.ts +29 -0
- package/dist/tools/executor.d.ts.map +1 -0
- package/dist/tools/executor.js +153 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/git-tool.d.ts +87 -0
- package/dist/tools/git-tool.d.ts.map +1 -0
- package/dist/tools/git-tool.js +292 -0
- package/dist/tools/git-tool.js.map +1 -0
- package/dist/tools/parser.d.ts +33 -0
- package/dist/tools/parser.d.ts.map +1 -0
- package/dist/tools/parser.js +158 -0
- package/dist/tools/parser.js.map +1 -0
- package/dist/tools/registry.d.ts +74 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +302 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.d.ts +41 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +100 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +4 -2
- package/dist/ui.js.map +1 -1
- package/dist/utils/check-api-status.d.ts +12 -0
- package/dist/utils/check-api-status.d.ts.map +1 -0
- package/dist/utils/check-api-status.js +82 -0
- package/dist/utils/check-api-status.js.map +1 -0
- package/dist/utils/diff-parser.d.ts +22 -0
- package/dist/utils/diff-parser.d.ts.map +1 -0
- package/dist/utils/diff-parser.js +160 -0
- package/dist/utils/diff-parser.js.map +1 -0
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/version.d.ts +21 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +52 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/verification/backup.d.ts +30 -0
- package/dist/verification/backup.d.ts.map +1 -0
- package/dist/verification/backup.js +238 -0
- package/dist/verification/backup.js.map +1 -0
- package/dist/verification/compiler.d.ts +20 -0
- package/dist/verification/compiler.d.ts.map +1 -0
- package/dist/verification/compiler.js +228 -0
- package/dist/verification/compiler.js.map +1 -0
- package/dist/verification/index.d.ts +59 -0
- package/dist/verification/index.d.ts.map +1 -0
- package/dist/verification/index.js +273 -0
- package/dist/verification/index.js.map +1 -0
- package/dist/verification/test-runner.d.ts +27 -0
- package/dist/verification/test-runner.d.ts.map +1 -0
- package/dist/verification/test-runner.js +379 -0
- package/dist/verification/test-runner.js.map +1 -0
- package/package.json +39 -14
- package/ARCHITECTURE.md +0 -240
- package/CHANGELOG.md +0 -44
- package/CONTRIBUTING.md +0 -171
- package/dist/benchmark.d.ts +0 -39
- package/dist/benchmark.d.ts.map +0 -1
- package/dist/benchmark.js +0 -195
- package/dist/benchmark.js.map +0 -1
- package/dist/scaffold.d.ts +0 -14
- package/dist/scaffold.d.ts.map +0 -1
- package/dist/scaffold.js +0 -85
- package/dist/scaffold.js.map +0 -1
- package/templates/next-page/app/layout.tsx +0 -19
- package/templates/next-page/app/page.tsx +0 -10
- package/templates/next-page/package.json +0 -22
- package/templates/node-api/index.js +0 -57
- package/templates/node-api/package.json +0 -13
|
@@ -0,0 +1,685 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Use Case: EditFileUseCase
|
|
3
|
+
* Handles file editing with verification and Reflexion
|
|
4
|
+
*/
|
|
5
|
+
import { container } from '../services/dependency-container.js';
|
|
6
|
+
import { backupFile, rollbackFile } from '../../verification/backup.js';
|
|
7
|
+
import { executionTracer } from '../../infrastructure/observability/execution-tracer.js';
|
|
8
|
+
import { validateFilePath } from '../../infrastructure/security/input-validator.js';
|
|
9
|
+
export class EditFileUseCase {
|
|
10
|
+
aiService;
|
|
11
|
+
verificationService;
|
|
12
|
+
sastScanner;
|
|
13
|
+
enhancedSecurityGate;
|
|
14
|
+
appropriateFriction;
|
|
15
|
+
hitlValidation;
|
|
16
|
+
biDirectionalLearning;
|
|
17
|
+
teamStandards;
|
|
18
|
+
promptToCodeLineage;
|
|
19
|
+
nistAIRMF;
|
|
20
|
+
policyAsCode;
|
|
21
|
+
constructor(aiService, verificationService, sastScanner, // Optional: AI SAST scanner (legacy, prefer enhancedSecurityGate)
|
|
22
|
+
enhancedSecurityGate, // Optional: Enhanced security gate (all scanners)
|
|
23
|
+
appropriateFriction, // Optional: Appropriate friction system
|
|
24
|
+
hitlValidation, // Optional: HITL validation system
|
|
25
|
+
biDirectionalLearning, // Optional: Bi-directional learning system
|
|
26
|
+
teamStandards, // Optional: Team standards system
|
|
27
|
+
promptToCodeLineage, // Optional: Prompt-to-code lineage tracking
|
|
28
|
+
nistAIRMF, // Optional: NIST AI RMF for enterprise governance
|
|
29
|
+
policyAsCode // Optional: Policy-as-Code for automated compliance
|
|
30
|
+
) {
|
|
31
|
+
this.aiService = aiService;
|
|
32
|
+
this.verificationService = verificationService;
|
|
33
|
+
this.sastScanner = sastScanner;
|
|
34
|
+
this.enhancedSecurityGate = enhancedSecurityGate;
|
|
35
|
+
this.appropriateFriction = appropriateFriction;
|
|
36
|
+
this.hitlValidation = hitlValidation;
|
|
37
|
+
this.biDirectionalLearning = biDirectionalLearning;
|
|
38
|
+
this.teamStandards = teamStandards;
|
|
39
|
+
this.promptToCodeLineage = promptToCodeLineage;
|
|
40
|
+
this.nistAIRMF = nistAIRMF;
|
|
41
|
+
this.policyAsCode = policyAsCode;
|
|
42
|
+
}
|
|
43
|
+
async execute(request) {
|
|
44
|
+
// 1. Start Prompt-to-Code Lineage tracking
|
|
45
|
+
let lineageId;
|
|
46
|
+
let rootNodeId;
|
|
47
|
+
if (this.promptToCodeLineage) {
|
|
48
|
+
const runId = executionTracer.getCurrentRunId();
|
|
49
|
+
if (runId) {
|
|
50
|
+
lineageId = this.promptToCodeLineage.createLineage(request.instruction, {
|
|
51
|
+
sessionId: runId,
|
|
52
|
+
workspace: process.cwd(),
|
|
53
|
+
});
|
|
54
|
+
const lineage = lineageId ? this.promptToCodeLineage.getLineage(lineageId) : undefined;
|
|
55
|
+
rootNodeId = lineage?.rootNodeId;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// No run context - create lineage without sessionId
|
|
59
|
+
lineageId = this.promptToCodeLineage.createLineage(request.instruction);
|
|
60
|
+
const lineage = lineageId ? this.promptToCodeLineage.getLineage(lineageId) : undefined;
|
|
61
|
+
rootNodeId = lineage?.rootNodeId;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Validate file path
|
|
65
|
+
const pathValidation = validateFilePath(request.filepath);
|
|
66
|
+
if (!pathValidation.valid) {
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
error: `Invalid file path: ${pathValidation.errors.join(', ')}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// NIST AI RMF: GOVERN - Establish risk culture and accountability (Enterprise Governance)
|
|
73
|
+
if (this.nistAIRMF) {
|
|
74
|
+
// Check if file exists for context type (quick check)
|
|
75
|
+
const { existsSync } = await import('fs');
|
|
76
|
+
const { join } = await import('path');
|
|
77
|
+
const safeFilePath = pathValidation.sanitized || request.filepath;
|
|
78
|
+
const fullPath = join(process.cwd(), safeFilePath);
|
|
79
|
+
const fileExists = existsSync(fullPath);
|
|
80
|
+
const riskContext = {
|
|
81
|
+
contextType: fileExists ? 'code_edit' : 'code_generation',
|
|
82
|
+
targetDomain: this.inferDomain(request.filepath, request.instruction),
|
|
83
|
+
riskLevel: this.determineRiskLevel(request.instruction, ''),
|
|
84
|
+
regulatoryRelevant: this.isRegulatoryRelevant(request.filepath, request.instruction),
|
|
85
|
+
};
|
|
86
|
+
const governDecision = await this.nistAIRMF.govern(riskContext);
|
|
87
|
+
console.log(`[EditFileUseCase] NIST AI RMF Govern: ${governDecision.decision}`);
|
|
88
|
+
if (governDecision.outcome === 'blocked') {
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
error: `Operation blocked by governance policy: ${governDecision.rationale}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (governDecision.outcome === 'requires_review') {
|
|
95
|
+
console.warn(`[EditFileUseCase] ⚠️ Governance requires review: ${governDecision.rationale}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// CRITICAL FIX: Security check FIRST (before any expensive operations)
|
|
99
|
+
// This prevents wasting time and tokens on dangerous code
|
|
100
|
+
// RESEARCH CONTEXT: 45% of AI-generated code has security flaws, 35% has license issues
|
|
101
|
+
// Use Enhanced Security Gate if available (includes all scanners), fallback to SAST only
|
|
102
|
+
if (this.enhancedSecurityGate) {
|
|
103
|
+
// Fast pre-check on instruction before generating edit
|
|
104
|
+
const fastCheck = await this.enhancedSecurityGate.fastCheck(request.instruction);
|
|
105
|
+
if (!fastCheck.allowed) {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
error: `Security vulnerabilities detected in instruction: ${fastCheck.findings.join('; ')}`,
|
|
109
|
+
securityFindings: fastCheck.findings,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (this.sastScanner) {
|
|
114
|
+
// Legacy: Quick security check on instruction before generating edit
|
|
115
|
+
// This is a fast pattern-based check, full AI scan happens after edit generation
|
|
116
|
+
const quickSecurityCheck = await this.sastScanner.scanInstruction(request.instruction);
|
|
117
|
+
if (quickSecurityCheck && quickSecurityCheck.findings && quickSecurityCheck.findings.length > 0) {
|
|
118
|
+
const criticalFindings = quickSecurityCheck.findings.filter((f) => f.severity === 'critical') || [];
|
|
119
|
+
const highFindings = quickSecurityCheck.findings.filter((f) => f.severity === 'high') || [];
|
|
120
|
+
if (criticalFindings.length > 0 || highFindings.length > 0) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
error: `Security vulnerabilities detected: ${criticalFindings.length} critical, ${highFindings.length} high severity findings. Review and fix before applying.`,
|
|
124
|
+
securityFindings: quickSecurityCheck.findings,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const { readFileSync, writeFileSync, existsSync, mkdirSync } = await import('fs');
|
|
130
|
+
const { join, dirname } = await import('path');
|
|
131
|
+
// Use sanitized path if validation found issues
|
|
132
|
+
const safeFilePath = pathValidation.sanitized || request.filepath;
|
|
133
|
+
const fullPath = join(process.cwd(), safeFilePath);
|
|
134
|
+
const fileExists = existsSync(fullPath);
|
|
135
|
+
// Determine risk level for friction/HITL
|
|
136
|
+
const riskLevel = this.determineRiskLevel(request.instruction, fileExists ? '' : '');
|
|
137
|
+
// 2. Check Appropriate Friction (after security check, before edit generation)
|
|
138
|
+
let frictionApplied = null;
|
|
139
|
+
if (this.appropriateFriction) {
|
|
140
|
+
const frictionPoint = this.appropriateFriction.needsFriction('edit_file', {
|
|
141
|
+
riskLevel,
|
|
142
|
+
isDestructive: !fileExists || request.instruction.toLowerCase().includes('delete'),
|
|
143
|
+
modifiesSecuritySensitiveCode: request.instruction.toLowerCase().includes('security') ||
|
|
144
|
+
request.instruction.toLowerCase().includes('auth') ||
|
|
145
|
+
request.instruction.toLowerCase().includes('password'),
|
|
146
|
+
});
|
|
147
|
+
if (frictionPoint) {
|
|
148
|
+
frictionApplied = frictionPoint;
|
|
149
|
+
console.log(`[EditFileUseCase] ⚠️ Friction applied: ${frictionPoint.message}`);
|
|
150
|
+
// For CLI: Log warning. For UI: This would pause and wait for user interaction
|
|
151
|
+
if (frictionPoint.requiresExplicitConfirmation) {
|
|
152
|
+
// In CLI, we'll allow it but log the warning
|
|
153
|
+
// In UI, this would block until user confirms
|
|
154
|
+
console.warn(`[EditFileUseCase] Explicit confirmation required: ${frictionPoint.message}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Handle file creation if file doesn't exist
|
|
159
|
+
if (!fileExists) {
|
|
160
|
+
console.log(`[EditFileUseCase] File does not exist, creating new file: ${fullPath}`);
|
|
161
|
+
console.log(`[EditFileUseCase] Instruction: ${request.instruction}`);
|
|
162
|
+
return await this.createFile(request, fullPath);
|
|
163
|
+
}
|
|
164
|
+
console.log(`[EditFileUseCase] Editing existing file: ${fullPath}`);
|
|
165
|
+
console.log(`[EditFileUseCase] Instruction: ${request.instruction}`);
|
|
166
|
+
// Read current content
|
|
167
|
+
const currentContent = readFileSync(fullPath, 'utf-8');
|
|
168
|
+
console.log(`[EditFileUseCase] File size: ${currentContent.length} chars`);
|
|
169
|
+
// Update risk level with file context
|
|
170
|
+
const updatedRiskLevel = this.determineRiskLevel(request.instruction, currentContent);
|
|
171
|
+
// 3. Check HITL Validation requirement
|
|
172
|
+
let hitlRequired = false;
|
|
173
|
+
let hitlCheckpointId;
|
|
174
|
+
if (this.hitlValidation && this.hitlValidation.requiresValidation({
|
|
175
|
+
riskLevel: updatedRiskLevel,
|
|
176
|
+
isDestructive: request.instruction.toLowerCase().includes('delete'),
|
|
177
|
+
modifiesSecuritySensitiveCode: request.instruction.toLowerCase().includes('security') ||
|
|
178
|
+
request.instruction.toLowerCase().includes('auth') ||
|
|
179
|
+
request.instruction.toLowerCase().includes('password'),
|
|
180
|
+
})) {
|
|
181
|
+
hitlRequired = true;
|
|
182
|
+
// Note: In CLI, we proceed with warning. In UI, this would block until approval
|
|
183
|
+
console.warn(`[EditFileUseCase] ⚠️ HITL validation required for this operation`);
|
|
184
|
+
}
|
|
185
|
+
// Track edit generation in lineage
|
|
186
|
+
if (this.promptToCodeLineage && lineageId && rootNodeId) {
|
|
187
|
+
this.promptToCodeLineage.addNode(lineageId, {
|
|
188
|
+
type: 'plan',
|
|
189
|
+
timestamp: Date.now(),
|
|
190
|
+
description: `Generating edit for ${request.filepath}`,
|
|
191
|
+
input: { instruction: request.instruction, filepath: request.filepath },
|
|
192
|
+
metadata: { riskLevel: updatedRiskLevel },
|
|
193
|
+
}, rootNodeId);
|
|
194
|
+
}
|
|
195
|
+
// Generate edit
|
|
196
|
+
let diff;
|
|
197
|
+
try {
|
|
198
|
+
diff = await this.aiService.generateEdit(currentContent, request.instruction, request.filepath);
|
|
199
|
+
console.log(`[EditFileUseCase] Generated diff length: ${diff.length} chars`);
|
|
200
|
+
if (diff.length > 0) {
|
|
201
|
+
console.log(`[EditFileUseCase] Diff preview: ${diff.substring(0, 200)}...`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.warn(`[EditFileUseCase] Warning: Empty diff generated`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
console.error(`[EditFileUseCase] Failed to generate edit:`, error);
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
error: `Failed to generate edit: ${error instanceof Error ? error.message : String(error)}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Apply diff
|
|
215
|
+
let newContent;
|
|
216
|
+
try {
|
|
217
|
+
newContent = await this.applyDiff(currentContent, diff);
|
|
218
|
+
console.log(`[EditFileUseCase] Applied diff, new content size: ${newContent.length} chars`);
|
|
219
|
+
// Check if content actually changed
|
|
220
|
+
if (newContent === currentContent) {
|
|
221
|
+
console.warn(`[EditFileUseCase] Warning: Content unchanged after applying diff`);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const diffSize = newContent.length - currentContent.length;
|
|
225
|
+
console.log(`[EditFileUseCase] Content changed: ${diffSize > 0 ? '+' : ''}${diffSize} chars difference`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
console.error(`[EditFileUseCase] Failed to apply diff:`, error);
|
|
230
|
+
return {
|
|
231
|
+
success: false,
|
|
232
|
+
error: `Failed to apply diff: ${error instanceof Error ? error.message : String(error)}`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// Comprehensive security scan - before verification
|
|
236
|
+
// RESEARCH CONTEXT: 45% AI code has flaws, 35% license issues, provider bias risk
|
|
237
|
+
// Use Enhanced Security Gate if available (all scanners), fallback to SAST only
|
|
238
|
+
if (this.enhancedSecurityGate) {
|
|
239
|
+
// Comprehensive scan: SAST + License + Provider Bias + Uncertainty
|
|
240
|
+
const securityResult = await this.enhancedSecurityGate.scan(request.filepath, newContent, request.instruction, { query: request.instruction });
|
|
241
|
+
if (!securityResult.passed) {
|
|
242
|
+
const errorMessages = [
|
|
243
|
+
...securityResult.errors,
|
|
244
|
+
...securityResult.warnings.map(w => `Warning: ${w}`),
|
|
245
|
+
];
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
error: `Security validation failed: ${errorMessages.join('; ')}`,
|
|
249
|
+
securityFindings: securityResult.sast.findings,
|
|
250
|
+
licenseFindings: securityResult.license.findings,
|
|
251
|
+
providerBiasFindings: securityResult.providerBias.findings,
|
|
252
|
+
uncertaintyFindings: securityResult.uncertainty,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
// Log warnings for non-blocking issues (provider bias, uncertainty)
|
|
256
|
+
if (securityResult.warnings.length > 0) {
|
|
257
|
+
console.warn(`[EditFileUseCase] Security warnings: ${securityResult.warnings.join('; ')}`);
|
|
258
|
+
}
|
|
259
|
+
// NIST AI RMF: MAP - Context framing and risk identification (Enterprise Governance)
|
|
260
|
+
if (this.nistAIRMF) {
|
|
261
|
+
const riskContext = {
|
|
262
|
+
contextType: fileExists ? 'code_edit' : 'code_generation',
|
|
263
|
+
targetDomain: this.inferDomain(request.filepath, request.instruction),
|
|
264
|
+
riskLevel: this.determineRiskLevel(request.instruction, newContent),
|
|
265
|
+
regulatoryRelevant: this.isRegulatoryRelevant(request.filepath, request.instruction),
|
|
266
|
+
};
|
|
267
|
+
const { decision: mapDecision, riskProfile } = await this.nistAIRMF.map(riskContext, {
|
|
268
|
+
security: {
|
|
269
|
+
vulnerabilities: securityResult.sast.findings?.length || 0,
|
|
270
|
+
licenseConflicts: securityResult.license.findings?.length || 0,
|
|
271
|
+
providerBias: (securityResult.providerBias.findings?.length || 0) > 0,
|
|
272
|
+
uncertainty: securityResult.uncertainty?.combined?.value || 0.5,
|
|
273
|
+
},
|
|
274
|
+
compliance: {
|
|
275
|
+
gdprRelevant: riskContext.regulatoryRelevant,
|
|
276
|
+
hipaaRelevant: this.inferDomain(request.filepath, request.instruction) === 'healthcare',
|
|
277
|
+
},
|
|
278
|
+
operational: {
|
|
279
|
+
complexity: newContent.length > 1000 ? 0.8 : 0.5,
|
|
280
|
+
dependencies: 0, // Could be enhanced
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
console.log(`[EditFileUseCase] NIST AI RMF Map: ${mapDecision.decision}`);
|
|
284
|
+
if (mapDecision.outcome === 'blocked') {
|
|
285
|
+
return {
|
|
286
|
+
success: false,
|
|
287
|
+
error: `Operation blocked by risk mapping: ${mapDecision.rationale}`,
|
|
288
|
+
securityFindings: securityResult.sast.findings,
|
|
289
|
+
licenseFindings: securityResult.license.findings,
|
|
290
|
+
providerBiasFindings: securityResult.providerBias.findings,
|
|
291
|
+
uncertaintyFindings: securityResult.uncertainty,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
// NIST AI RMF: MEASURE - Quantify and monitor risks (Enterprise Governance)
|
|
295
|
+
const measureDecision = await this.nistAIRMF.measure(riskProfile, {
|
|
296
|
+
sastFindings: securityResult.sast.findings?.length || 0,
|
|
297
|
+
licenseFindings: securityResult.license.findings?.length || 0,
|
|
298
|
+
providerBiasFindings: securityResult.providerBias.findings?.length || 0,
|
|
299
|
+
uncertaintyScore: securityResult.uncertainty?.combined?.value,
|
|
300
|
+
});
|
|
301
|
+
console.log(`[EditFileUseCase] NIST AI RMF Measure: ${measureDecision.decision}`);
|
|
302
|
+
}
|
|
303
|
+
// Policy-as-Code: Evaluate policies before proceeding (Enterprise Governance)
|
|
304
|
+
if (this.policyAsCode) {
|
|
305
|
+
const policyEvaluation = await this.policyAsCode.evaluate({
|
|
306
|
+
filepath: request.filepath,
|
|
307
|
+
code: newContent,
|
|
308
|
+
instruction: request.instruction,
|
|
309
|
+
securityFindings: securityResult.sast.findings,
|
|
310
|
+
licenseFindings: securityResult.license.findings,
|
|
311
|
+
providerBiasFindings: securityResult.providerBias.findings,
|
|
312
|
+
uncertainty: securityResult.uncertainty,
|
|
313
|
+
});
|
|
314
|
+
if (!policyEvaluation.passed && policyEvaluation.blockingRules.length > 0) {
|
|
315
|
+
const blockingRule = policyEvaluation.blockingRules[0];
|
|
316
|
+
console.error(`[EditFileUseCase] Policy violation: ${blockingRule.ruleName} - ${blockingRule.message}`);
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
error: `Policy violation: ${blockingRule.message}`,
|
|
320
|
+
securityFindings: securityResult.sast.findings,
|
|
321
|
+
licenseFindings: securityResult.license.findings,
|
|
322
|
+
providerBiasFindings: securityResult.providerBias.findings,
|
|
323
|
+
uncertaintyFindings: securityResult.uncertainty,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
if (policyEvaluation.results.length > 0) {
|
|
327
|
+
console.log(`[EditFileUseCase] Policy evaluation: ${policyEvaluation.results.filter(r => r.passed).length}/${policyEvaluation.results.length} passed`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Track security scan in lineage
|
|
331
|
+
if (this.promptToCodeLineage && lineageId && rootNodeId) {
|
|
332
|
+
this.promptToCodeLineage.addNode(lineageId, {
|
|
333
|
+
type: 'verification',
|
|
334
|
+
timestamp: Date.now(),
|
|
335
|
+
description: 'Security scan completed',
|
|
336
|
+
input: { filepath: request.filepath },
|
|
337
|
+
output: { passed: securityResult.passed, findings: securityResult.errors.length },
|
|
338
|
+
metadata: {
|
|
339
|
+
securityScan: true,
|
|
340
|
+
licenseIssues: securityResult.license.findings?.length || 0,
|
|
341
|
+
providerBiasIssues: securityResult.providerBias.findings?.length || 0,
|
|
342
|
+
},
|
|
343
|
+
}, rootNodeId);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else if (this.sastScanner) {
|
|
347
|
+
// Legacy: SAST-only scan
|
|
348
|
+
const securityCheck = await this.sastScanner.scan(request.filepath, newContent);
|
|
349
|
+
const criticalFindings = securityCheck.findings?.filter(f => f.severity === 'critical') || [];
|
|
350
|
+
const highFindings = securityCheck.findings?.filter(f => f.severity === 'high') || [];
|
|
351
|
+
// Block edits with critical or high severity findings
|
|
352
|
+
if (criticalFindings.length > 0 || highFindings.length > 0) {
|
|
353
|
+
return {
|
|
354
|
+
success: false,
|
|
355
|
+
error: `Security vulnerabilities detected: ${criticalFindings.length} critical, ${highFindings.length} high severity findings. Review and fix before applying.`,
|
|
356
|
+
securityFindings: securityCheck.findings,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Create backup before applying edit
|
|
361
|
+
let backupPath;
|
|
362
|
+
try {
|
|
363
|
+
backupPath = await backupFile(fullPath);
|
|
364
|
+
console.log(`[EditFileUseCase] Backup created: ${backupPath}`);
|
|
365
|
+
// Link backup to current run for undo capability
|
|
366
|
+
const runId = executionTracer.getCurrentRunId();
|
|
367
|
+
if (runId) {
|
|
368
|
+
executionTracer.trace({
|
|
369
|
+
operationType: 'file_operation',
|
|
370
|
+
operationName: 'backup',
|
|
371
|
+
input: { filepath: fullPath },
|
|
372
|
+
output: { backupPath },
|
|
373
|
+
metadata: {
|
|
374
|
+
runId,
|
|
375
|
+
filepath: fullPath,
|
|
376
|
+
},
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
console.warn(`[EditFileUseCase] Failed to create backup: ${error instanceof Error ? error.message : String(error)}`);
|
|
382
|
+
// Continue anyway - backup failure shouldn't block edit
|
|
383
|
+
}
|
|
384
|
+
// 4. Team Standards Validation (before writing file)
|
|
385
|
+
let teamStandardsApplied = false;
|
|
386
|
+
if (this.teamStandards && newContent) {
|
|
387
|
+
const teamId = 'default'; // TODO: Get from config or context
|
|
388
|
+
const standardsResult = this.teamStandards.validateCode(teamId, newContent, request.filepath);
|
|
389
|
+
if (!standardsResult.passed) {
|
|
390
|
+
console.warn(`[EditFileUseCase] Team standards violations: ${standardsResult.violations.length}`);
|
|
391
|
+
// Try auto-fix
|
|
392
|
+
const fixedResult = this.teamStandards.applyStyleGuide(teamId, newContent, request.filepath);
|
|
393
|
+
if (fixedResult.fixesApplied > 0) {
|
|
394
|
+
newContent = fixedResult.modified;
|
|
395
|
+
teamStandardsApplied = true;
|
|
396
|
+
console.log(`[EditFileUseCase] Auto-fixed ${fixedResult.fixesApplied} style issues`);
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
// Critical violations that can't be auto-fixed
|
|
400
|
+
const criticalViolations = standardsResult.issues.filter(i => i.severity === 'error');
|
|
401
|
+
if (criticalViolations.length > 0) {
|
|
402
|
+
return {
|
|
403
|
+
success: false,
|
|
404
|
+
error: `Team standards validation failed: ${criticalViolations.length} critical violations`,
|
|
405
|
+
frictionApplied,
|
|
406
|
+
hitlRequired,
|
|
407
|
+
hitlCheckpointId,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Verify if verification service available
|
|
414
|
+
let verification;
|
|
415
|
+
if (this.verificationService) {
|
|
416
|
+
console.log(`[EditFileUseCase] Writing file and verifying...`);
|
|
417
|
+
writeFileSync(fullPath, newContent, 'utf-8');
|
|
418
|
+
verification = await this.verificationService.verify(fullPath);
|
|
419
|
+
console.log(`[EditFileUseCase] Verification result: success=${verification.success}, compiled=${verification.compiled}, testsPassed=${verification.testsPassed}`);
|
|
420
|
+
if (verification.errors && verification.errors.length > 0) {
|
|
421
|
+
console.error(`[EditFileUseCase] Verification errors: ${verification.errors.join('; ')}`);
|
|
422
|
+
}
|
|
423
|
+
if (!verification.success) {
|
|
424
|
+
console.warn(`[EditFileUseCase] Verification failed, rolling back...`);
|
|
425
|
+
// Automatic rollback on verification failure
|
|
426
|
+
if (backupPath) {
|
|
427
|
+
try {
|
|
428
|
+
await rollbackFile(fullPath, backupPath);
|
|
429
|
+
console.log(`[EditFileUseCase] File rolled back successfully`);
|
|
430
|
+
}
|
|
431
|
+
catch (rollbackError) {
|
|
432
|
+
console.error(`[EditFileUseCase] Rollback failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`);
|
|
433
|
+
// Try to restore from original content as fallback
|
|
434
|
+
try {
|
|
435
|
+
writeFileSync(fullPath, currentContent, 'utf-8');
|
|
436
|
+
console.log(`[EditFileUseCase] File restored from original content`);
|
|
437
|
+
}
|
|
438
|
+
catch (restoreError) {
|
|
439
|
+
console.error(`[EditFileUseCase] Restore also failed: ${restoreError instanceof Error ? restoreError.message : String(restoreError)}`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// Use Reflexion to learn from failure
|
|
444
|
+
const reflexionUseCase = container.reflexionUseCase;
|
|
445
|
+
const reflection = await reflexionUseCase.execute({
|
|
446
|
+
trajectory: {
|
|
447
|
+
query: request.instruction,
|
|
448
|
+
steps: [{
|
|
449
|
+
thought: { content: 'Attempting edit', reasoning: request.instruction },
|
|
450
|
+
action: { type: 'tool', name: 'edit', parameters: {} },
|
|
451
|
+
observation: { result: null, success: false, error: verification.errors.join('; ') },
|
|
452
|
+
timestamp: new Date(),
|
|
453
|
+
}],
|
|
454
|
+
success: false,
|
|
455
|
+
},
|
|
456
|
+
reward: 0,
|
|
457
|
+
errors: verification.errors,
|
|
458
|
+
});
|
|
459
|
+
return {
|
|
460
|
+
success: false,
|
|
461
|
+
verification,
|
|
462
|
+
reflection: reflection.reflection,
|
|
463
|
+
error: verification.errors.join('; '),
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
// No verification - just apply (still create backup for undo capability)
|
|
469
|
+
console.log(`[EditFileUseCase] No verification service, writing file directly`);
|
|
470
|
+
writeFileSync(fullPath, newContent, 'utf-8');
|
|
471
|
+
}
|
|
472
|
+
const edit = {
|
|
473
|
+
filepath: request.filepath,
|
|
474
|
+
oldContent: currentContent,
|
|
475
|
+
newContent,
|
|
476
|
+
instruction: request.instruction,
|
|
477
|
+
diff,
|
|
478
|
+
metadata: {
|
|
479
|
+
verificationResult: verification,
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
// 5. Record Bi-directional Learning
|
|
483
|
+
if (this.biDirectionalLearning) {
|
|
484
|
+
const userId = 'default'; // TODO: Get from context
|
|
485
|
+
this.biDirectionalLearning.recordFeedback(userId, {
|
|
486
|
+
type: 'edit',
|
|
487
|
+
signal: 'positive', // Successful edit = positive signal
|
|
488
|
+
originalCode: currentContent,
|
|
489
|
+
modifiedCode: newContent,
|
|
490
|
+
filepath: request.filepath,
|
|
491
|
+
context: {
|
|
492
|
+
query: request.instruction,
|
|
493
|
+
generatedBy: 'EditFileUseCase',
|
|
494
|
+
},
|
|
495
|
+
});
|
|
496
|
+
console.log(`[EditFileUseCase] Edit recorded for learning`);
|
|
497
|
+
}
|
|
498
|
+
// 6. Complete Prompt-to-Code Lineage tracking
|
|
499
|
+
if (this.promptToCodeLineage && lineageId && rootNodeId) {
|
|
500
|
+
this.promptToCodeLineage.trackCodeGeneration(lineageId, rootNodeId, {
|
|
501
|
+
filepath: request.filepath,
|
|
502
|
+
content: newContent,
|
|
503
|
+
diff: diff,
|
|
504
|
+
originalContent: currentContent,
|
|
505
|
+
}, {
|
|
506
|
+
verificationPassed: verification?.success || false,
|
|
507
|
+
});
|
|
508
|
+
console.log(`[EditFileUseCase] Lineage tracking complete`);
|
|
509
|
+
}
|
|
510
|
+
console.log(`[EditFileUseCase] Edit completed successfully`);
|
|
511
|
+
return {
|
|
512
|
+
success: true,
|
|
513
|
+
edit,
|
|
514
|
+
verification,
|
|
515
|
+
frictionApplied,
|
|
516
|
+
hitlRequired,
|
|
517
|
+
hitlCheckpointId,
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Create a new file with generated content
|
|
522
|
+
*/
|
|
523
|
+
async createFile(request, fullPath) {
|
|
524
|
+
const { writeFileSync, mkdirSync, existsSync } = await import('fs');
|
|
525
|
+
const { dirname } = await import('path');
|
|
526
|
+
try {
|
|
527
|
+
// Ensure directory exists
|
|
528
|
+
const dir = dirname(fullPath);
|
|
529
|
+
if (!existsSync(dir)) {
|
|
530
|
+
console.log(`[EditFileUseCase] Creating directory: ${dir}`);
|
|
531
|
+
mkdirSync(dir, { recursive: true });
|
|
532
|
+
}
|
|
533
|
+
// Generate file content using AI
|
|
534
|
+
console.log(`[EditFileUseCase] Generating new file content...`);
|
|
535
|
+
let fileContent;
|
|
536
|
+
try {
|
|
537
|
+
fileContent = await this.aiService.generateFileContent(request.filepath, request.instruction, request.requirements || []);
|
|
538
|
+
console.log(`[EditFileUseCase] Generated content length: ${fileContent.length} chars`);
|
|
539
|
+
}
|
|
540
|
+
catch (error) {
|
|
541
|
+
console.error(`[EditFileUseCase] Failed to generate file content:`, error);
|
|
542
|
+
return {
|
|
543
|
+
success: false,
|
|
544
|
+
error: `Failed to generate file content: ${error instanceof Error ? error.message : String(error)}`,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
// Security scan before writing
|
|
548
|
+
if (this.sastScanner) {
|
|
549
|
+
const securityCheck = await this.sastScanner.scan(request.filepath, fileContent);
|
|
550
|
+
const criticalFindings = securityCheck.findings?.filter(f => f.severity === 'critical') || [];
|
|
551
|
+
const highFindings = securityCheck.findings?.filter(f => f.severity === 'high') || [];
|
|
552
|
+
if (criticalFindings.length > 0 || highFindings.length > 0) {
|
|
553
|
+
return {
|
|
554
|
+
success: false,
|
|
555
|
+
error: `Security vulnerabilities detected: ${criticalFindings.length} critical, ${highFindings.length} high severity findings. Review and fix before creating.`,
|
|
556
|
+
securityFindings: securityCheck.findings,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
// Write file
|
|
561
|
+
writeFileSync(fullPath, fileContent, 'utf-8');
|
|
562
|
+
console.log(`[EditFileUseCase] File created successfully: ${fullPath}`);
|
|
563
|
+
// Verify if verification service available
|
|
564
|
+
let verification;
|
|
565
|
+
if (this.verificationService) {
|
|
566
|
+
console.log(`[EditFileUseCase] Verifying new file...`);
|
|
567
|
+
verification = await this.verificationService.verify(fullPath);
|
|
568
|
+
console.log(`[EditFileUseCase] Verification result: success=${verification.success}, compiled=${verification.compiled}, testsPassed=${verification.testsPassed}`);
|
|
569
|
+
if (!verification.success) {
|
|
570
|
+
console.warn(`[EditFileUseCase] Verification failed for new file, but keeping it for inspection`);
|
|
571
|
+
return {
|
|
572
|
+
success: false,
|
|
573
|
+
verification,
|
|
574
|
+
error: verification.errors?.join('; ') || 'Verification failed',
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
const edit = {
|
|
579
|
+
filepath: request.filepath,
|
|
580
|
+
oldContent: '', // No old content for new files
|
|
581
|
+
newContent: fileContent,
|
|
582
|
+
instruction: request.instruction,
|
|
583
|
+
diff: `New file created: ${request.filepath}`,
|
|
584
|
+
metadata: {
|
|
585
|
+
verificationResult: verification,
|
|
586
|
+
},
|
|
587
|
+
};
|
|
588
|
+
console.log(`[EditFileUseCase] File creation completed successfully`);
|
|
589
|
+
return {
|
|
590
|
+
success: true,
|
|
591
|
+
edit,
|
|
592
|
+
verification,
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
catch (error) {
|
|
596
|
+
console.error(`[EditFileUseCase] Failed to create file:`, error);
|
|
597
|
+
return {
|
|
598
|
+
success: false,
|
|
599
|
+
error: `Failed to create file: ${error instanceof Error ? error.message : String(error)}`,
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
async applyDiff(content, diff) {
|
|
604
|
+
try {
|
|
605
|
+
const { applyEditFallback } = await import('../../utils/diff-parser.js');
|
|
606
|
+
return applyEditFallback(content, diff);
|
|
607
|
+
}
|
|
608
|
+
catch (error) {
|
|
609
|
+
console.error('Failed to apply diff:', error);
|
|
610
|
+
// Fallback: if diff parsing fails, return original content
|
|
611
|
+
// This prevents silent failures
|
|
612
|
+
throw new Error(`Failed to apply diff: ${error instanceof Error ? error.message : String(error)}`);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Determine risk level based on instruction and content
|
|
617
|
+
*/
|
|
618
|
+
determineRiskLevel(instruction, currentContent) {
|
|
619
|
+
const instructionLower = instruction.toLowerCase();
|
|
620
|
+
// Critical: Destructive operations
|
|
621
|
+
if (instructionLower.includes('delete') ||
|
|
622
|
+
instructionLower.includes('remove all') ||
|
|
623
|
+
instructionLower.includes('drop table') ||
|
|
624
|
+
instructionLower.includes('rm -rf')) {
|
|
625
|
+
return 'critical';
|
|
626
|
+
}
|
|
627
|
+
// High: Security-sensitive operations
|
|
628
|
+
if (instructionLower.includes('security') ||
|
|
629
|
+
instructionLower.includes('auth') ||
|
|
630
|
+
instructionLower.includes('password') ||
|
|
631
|
+
instructionLower.includes('credential') ||
|
|
632
|
+
instructionLower.includes('token') ||
|
|
633
|
+
instructionLower.includes('api key')) {
|
|
634
|
+
return 'high';
|
|
635
|
+
}
|
|
636
|
+
// High: Large file modifications
|
|
637
|
+
if (currentContent.length > 5000 && instruction.split(' ').length > 30) {
|
|
638
|
+
return 'high';
|
|
639
|
+
}
|
|
640
|
+
// Medium: Complex refactoring
|
|
641
|
+
if (instructionLower.includes('refactor') ||
|
|
642
|
+
instructionLower.includes('restructure') ||
|
|
643
|
+
instructionLower.includes('rewrite')) {
|
|
644
|
+
return 'medium';
|
|
645
|
+
}
|
|
646
|
+
// Low: Simple edits
|
|
647
|
+
return 'low';
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Infer domain from filepath and instruction for NIST AI RMF
|
|
651
|
+
*/
|
|
652
|
+
inferDomain(filepath, instruction) {
|
|
653
|
+
const pathLower = filepath.toLowerCase();
|
|
654
|
+
const instructionLower = instruction.toLowerCase();
|
|
655
|
+
if (pathLower.includes('health') || instructionLower.includes('health')) {
|
|
656
|
+
return 'healthcare';
|
|
657
|
+
}
|
|
658
|
+
if (pathLower.includes('finance') || pathLower.includes('payment') || instructionLower.includes('finance')) {
|
|
659
|
+
return 'financial';
|
|
660
|
+
}
|
|
661
|
+
if (pathLower.includes('auth') || instructionLower.includes('authentication')) {
|
|
662
|
+
return 'security';
|
|
663
|
+
}
|
|
664
|
+
return 'general';
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Determine if operation is regulatory relevant (GDPR, HIPAA, etc.)
|
|
668
|
+
*/
|
|
669
|
+
isRegulatoryRelevant(filepath, instruction) {
|
|
670
|
+
const pathLower = filepath.toLowerCase();
|
|
671
|
+
const instructionLower = instruction.toLowerCase();
|
|
672
|
+
// GDPR: Personal data processing
|
|
673
|
+
if (pathLower.includes('user') || pathLower.includes('customer') ||
|
|
674
|
+
instructionLower.includes('personal data') || instructionLower.includes('gdpr')) {
|
|
675
|
+
return true;
|
|
676
|
+
}
|
|
677
|
+
// HIPAA: Healthcare data
|
|
678
|
+
if (pathLower.includes('health') || instructionLower.includes('patient') ||
|
|
679
|
+
instructionLower.includes('medical record')) {
|
|
680
|
+
return true;
|
|
681
|
+
}
|
|
682
|
+
return false;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
//# sourceMappingURL=edit-file-use-case.js.map
|