codehere 0.2.2 → 0.3.0-rc.1
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/README.md +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +335 -63
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: Sandbox Executor
|
|
3
|
-
* Main interface for secure code execution
|
|
4
|
-
* Routes to appropriate sandbox implementation (Docker/WASM)
|
|
5
|
-
*/
|
|
6
|
-
import { DockerSandbox } from './docker-sandbox.js';
|
|
7
|
-
export class SandboxExecutor {
|
|
8
|
-
dockerSandbox;
|
|
9
|
-
useDocker = true; // Default to Docker
|
|
10
|
-
constructor() {
|
|
11
|
-
this.dockerSandbox = new DockerSandbox();
|
|
12
|
-
this.initialize();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Initialize sandbox executor
|
|
16
|
-
* Check availability of Docker/WASM
|
|
17
|
-
*/
|
|
18
|
-
async initialize() {
|
|
19
|
-
const dockerAvailable = await this.dockerSandbox.isAvailable();
|
|
20
|
-
if (!dockerAvailable) {
|
|
21
|
-
console.warn('⚠️ Docker not available. Sandbox execution will be limited.');
|
|
22
|
-
this.useDocker = false;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Execute code in secure sandbox
|
|
27
|
-
*/
|
|
28
|
-
async execute(request) {
|
|
29
|
-
if (!this.useDocker) {
|
|
30
|
-
// Fallback: Return error if Docker not available
|
|
31
|
-
return {
|
|
32
|
-
success: false,
|
|
33
|
-
output: '',
|
|
34
|
-
error: 'Docker sandbox not available. Please install Docker to enable secure code execution.',
|
|
35
|
-
exitCode: 1,
|
|
36
|
-
duration: 0,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
// Route to Docker sandbox
|
|
40
|
-
return await this.dockerSandbox.execute(request.code, request.language, request.options);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Execute bash command in sandbox
|
|
44
|
-
*/
|
|
45
|
-
async executeBash(command, options) {
|
|
46
|
-
if (!this.useDocker) {
|
|
47
|
-
return {
|
|
48
|
-
success: false,
|
|
49
|
-
output: '',
|
|
50
|
-
error: 'Docker sandbox not available.',
|
|
51
|
-
exitCode: 1,
|
|
52
|
-
duration: 0,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
return await this.dockerSandbox.executeBash(command, options);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Check if sandbox is available
|
|
59
|
-
*/
|
|
60
|
-
async isAvailable() {
|
|
61
|
-
return await this.dockerSandbox.isAvailable();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=sandbox-executor.js.map
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TOON (Token-Oriented Object Notation) Serializer
|
|
3
|
-
*
|
|
4
|
-
* Phase 1: Code Context Serialization for v1.0.0 MVP
|
|
5
|
-
*
|
|
6
|
-
* Benefits:
|
|
7
|
-
* - 30-60% token reduction compared to JSON
|
|
8
|
-
* - Better LLM parsing accuracy
|
|
9
|
-
* - Self-documenting structure
|
|
10
|
-
*
|
|
11
|
-
* Feature Flag: CODEHERE_USE_TOON (default: false for v1.0.0)
|
|
12
|
-
*/
|
|
13
|
-
let toonLib = null;
|
|
14
|
-
/**
|
|
15
|
-
* Lazy load TOON library (only if feature flag is enabled)
|
|
16
|
-
*/
|
|
17
|
-
async function getToonLib() {
|
|
18
|
-
if (toonLib === null) {
|
|
19
|
-
try {
|
|
20
|
-
// Dynamic import for ES modules - use eval to avoid TypeScript compile-time error when package isn't installed
|
|
21
|
-
// This allows the code to compile even if @toon-format/toon is not installed
|
|
22
|
-
const toonModulePath = '@toon-format/toon';
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
24
|
-
const toonModule = await import(/* @ts-ignore */ toonModulePath);
|
|
25
|
-
toonLib = toonModule;
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
// TOON library not installed or feature disabled
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return toonLib;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Check if TOON is enabled via feature flag
|
|
36
|
-
*/
|
|
37
|
-
function isToonEnabled() {
|
|
38
|
-
return process.env.CODEHERE_USE_TOON === 'true' || process.env.CODEHERE_USE_TOON === '1';
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Serialize code chunks to TOON format
|
|
42
|
-
*
|
|
43
|
-
* TOON format for code chunks:
|
|
44
|
-
* chunks[N]{filepath,content,score,lineStart,lineEnd}:
|
|
45
|
-
* src/auth.ts,function authenticate() {...},0.95,10,60
|
|
46
|
-
* src/utils.ts,export function helper() {...},0.87,5,35
|
|
47
|
-
*
|
|
48
|
-
* @param chunks Code chunks to serialize
|
|
49
|
-
* @returns TOON-formatted string, or null if TOON is disabled or library unavailable
|
|
50
|
-
*/
|
|
51
|
-
export async function serializeCodeChunksToToon(chunks) {
|
|
52
|
-
if (!isToonEnabled() || chunks.length === 0) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
const toon = await getToonLib();
|
|
56
|
-
if (!toon) {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
// Convert code chunks to array of objects for TOON encoding
|
|
61
|
-
const chunksData = chunks.map(chunk => ({
|
|
62
|
-
filepath: chunk.filepath,
|
|
63
|
-
content: chunk.content,
|
|
64
|
-
score: chunk.score || 1.0,
|
|
65
|
-
lineStart: chunk.lineStart || 0,
|
|
66
|
-
lineEnd: chunk.lineEnd || 0,
|
|
67
|
-
}));
|
|
68
|
-
// Encode to TOON format
|
|
69
|
-
// TOON library exports: { encode, decode } or default export
|
|
70
|
-
const toonData = { chunks: chunksData };
|
|
71
|
-
const encodeFn = toon.encode || toon.default?.encode || (typeof toon === 'function' ? toon : null);
|
|
72
|
-
if (!encodeFn || typeof encodeFn !== 'function') {
|
|
73
|
-
throw new Error('TOON encode function not found in module');
|
|
74
|
-
}
|
|
75
|
-
const toonString = encodeFn(toonData, { delimiter: '\t' });
|
|
76
|
-
return toonString;
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
// If TOON encoding fails, return null to fall back to JSON
|
|
80
|
-
console.warn('[TOON] Encoding failed, falling back to JSON:', error instanceof Error ? error.message : String(error));
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Serialize code chunks to traditional format (fallback)
|
|
86
|
-
* Used when TOON is disabled or unavailable
|
|
87
|
-
*
|
|
88
|
-
* @param chunks Code chunks to serialize
|
|
89
|
-
* @returns Traditional formatted string
|
|
90
|
-
*/
|
|
91
|
-
export function serializeCodeChunksToTraditional(chunks) {
|
|
92
|
-
return chunks
|
|
93
|
-
.map((chunk, idx) => `[Chunk ${idx + 1} from ${chunk.filepath}]\n${chunk.content}`)
|
|
94
|
-
.join('\n\n---\n\n');
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Serialize code chunks (TOON if enabled, traditional otherwise)
|
|
98
|
-
*
|
|
99
|
-
* @param chunks Code chunks to serialize
|
|
100
|
-
* @returns Formatted string (TOON or traditional)
|
|
101
|
-
*/
|
|
102
|
-
export async function serializeCodeChunks(chunks) {
|
|
103
|
-
const toonResult = await serializeCodeChunksToToon(chunks);
|
|
104
|
-
if (toonResult !== null) {
|
|
105
|
-
return toonResult;
|
|
106
|
-
}
|
|
107
|
-
return serializeCodeChunksToTraditional(chunks);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Check if TOON is available and enabled
|
|
111
|
-
*/
|
|
112
|
-
export async function isToonAvailable() {
|
|
113
|
-
if (!isToonEnabled()) {
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
const lib = await getToonLib();
|
|
117
|
-
return lib !== null;
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=toon-serializer.js.map
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: MemoryStreamService
|
|
3
|
-
* Manages episodic memory with 3-factor scoring
|
|
4
|
-
*/
|
|
5
|
-
import { MemoryRetriever } from '../../domain/services/memory-retriever.js';
|
|
6
|
-
import { getEmbeddingCache } from '../cache/embedding-cache.js';
|
|
7
|
-
export class MemoryStreamService {
|
|
8
|
-
repository;
|
|
9
|
-
retriever;
|
|
10
|
-
aiService;
|
|
11
|
-
embeddingCache = getEmbeddingCache();
|
|
12
|
-
constructor(repository, aiService) {
|
|
13
|
-
this.repository = repository;
|
|
14
|
-
this.aiService = aiService;
|
|
15
|
-
this.retriever = new MemoryRetriever(); // Pure domain service, no dependencies
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Store observation
|
|
19
|
-
*/
|
|
20
|
-
async recordObservation(description, metadata, codebaseId, codebasePath) {
|
|
21
|
-
const embedding = await this.aiService.embed(description);
|
|
22
|
-
if (Array.isArray(embedding[0])) {
|
|
23
|
-
throw new Error('Expected single embedding');
|
|
24
|
-
}
|
|
25
|
-
const memory = {
|
|
26
|
-
type: 'observation',
|
|
27
|
-
description,
|
|
28
|
-
embedding: embedding,
|
|
29
|
-
timestamp: new Date(),
|
|
30
|
-
importance: this.calculateImportance(description),
|
|
31
|
-
lastAccessed: new Date(),
|
|
32
|
-
metadata: {
|
|
33
|
-
...metadata,
|
|
34
|
-
...(codebaseId && { codebaseId }),
|
|
35
|
-
...(codebasePath && { codebasePath }),
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
await this.repository.store(memory);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Store reflection
|
|
42
|
-
*/
|
|
43
|
-
async recordReflection(description, trajectory, reward, errors, codebaseId, codebasePath) {
|
|
44
|
-
const embedding = await this.aiService.embed(description);
|
|
45
|
-
if (Array.isArray(embedding[0])) {
|
|
46
|
-
throw new Error('Expected single embedding');
|
|
47
|
-
}
|
|
48
|
-
const memory = {
|
|
49
|
-
type: 'reflection',
|
|
50
|
-
description,
|
|
51
|
-
embedding: embedding,
|
|
52
|
-
timestamp: new Date(),
|
|
53
|
-
importance: 8, // Reflections are high importance
|
|
54
|
-
lastAccessed: new Date(),
|
|
55
|
-
metadata: {
|
|
56
|
-
trajectory,
|
|
57
|
-
reward,
|
|
58
|
-
errors,
|
|
59
|
-
...(codebaseId && { codebaseId }),
|
|
60
|
-
...(codebasePath && { codebasePath }),
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
await this.repository.store(memory);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Store plan
|
|
67
|
-
*/
|
|
68
|
-
async recordPlan(description, plan, codebaseId, codebasePath) {
|
|
69
|
-
const embedding = await this.aiService.embed(description);
|
|
70
|
-
if (Array.isArray(embedding[0])) {
|
|
71
|
-
throw new Error('Expected single embedding');
|
|
72
|
-
}
|
|
73
|
-
const memory = {
|
|
74
|
-
type: 'plan',
|
|
75
|
-
description,
|
|
76
|
-
embedding: embedding,
|
|
77
|
-
timestamp: new Date(),
|
|
78
|
-
importance: 7,
|
|
79
|
-
lastAccessed: new Date(),
|
|
80
|
-
metadata: {
|
|
81
|
-
plan,
|
|
82
|
-
...(codebaseId && { codebaseId }),
|
|
83
|
-
...(codebasePath && { codebasePath }),
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
await this.repository.store(memory);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Retrieve relevant memories with optional reranking
|
|
90
|
-
* Uses two-stage retrieval: initial recall → rerank precision
|
|
91
|
-
* Performance: Uses embedding cache to avoid redundant API calls
|
|
92
|
-
*/
|
|
93
|
-
async retrieve(query, limit = 10, useRerank = true) {
|
|
94
|
-
const allMemories = await this.repository.getAll();
|
|
95
|
-
if (allMemories.length === 0) {
|
|
96
|
-
return [];
|
|
97
|
-
}
|
|
98
|
-
// Check cache first to avoid redundant API calls
|
|
99
|
-
let queryEmbedding = this.embeddingCache.get(query);
|
|
100
|
-
if (!queryEmbedding) {
|
|
101
|
-
const embedding = await this.aiService.embed(query);
|
|
102
|
-
if (Array.isArray(embedding[0])) {
|
|
103
|
-
throw new Error('Expected single embedding');
|
|
104
|
-
}
|
|
105
|
-
queryEmbedding = embedding;
|
|
106
|
-
// Cache the embedding for future use
|
|
107
|
-
this.embeddingCache.set(query, queryEmbedding);
|
|
108
|
-
}
|
|
109
|
-
// Ensure we have a valid embedding
|
|
110
|
-
if (!queryEmbedding) {
|
|
111
|
-
throw new Error('Failed to generate query embedding');
|
|
112
|
-
}
|
|
113
|
-
// Initial retrieval: Get more candidates than needed for reranking
|
|
114
|
-
const initialLimit = useRerank ? Math.min(limit * 2, 50) : limit;
|
|
115
|
-
const initialMemories = this.retriever.retrieve(allMemories, queryEmbedding, initialLimit);
|
|
116
|
-
if (!useRerank || initialMemories.length === 0) {
|
|
117
|
-
return initialMemories.slice(0, limit);
|
|
118
|
-
}
|
|
119
|
-
// Rerank: Use Cohere Rerank API to improve precision
|
|
120
|
-
try {
|
|
121
|
-
const documents = initialMemories.map(m => m.description);
|
|
122
|
-
const rerankResults = await this.aiService.rerank(query, documents, limit);
|
|
123
|
-
// Reorder memories based on rerank scores
|
|
124
|
-
return rerankResults.map((result) => initialMemories[result.index]);
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
// Fallback to initial results if rerank fails
|
|
128
|
-
console.warn('Memory rerank failed, using initial results:', error instanceof Error ? error.message : String(error));
|
|
129
|
-
return initialMemories.slice(0, limit);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Retrieve relevant memories for a specific codebase
|
|
134
|
-
* Filters memories by codebaseId before retrieval
|
|
135
|
-
* Performance: Uses embedding cache to avoid redundant API calls
|
|
136
|
-
*/
|
|
137
|
-
async retrieveByCodebase(query, codebaseId, limit = 10, useRerank = true) {
|
|
138
|
-
// Get all memories for this codebase first
|
|
139
|
-
const codebaseMemories = await this.repository.getAllByCodebase(codebaseId);
|
|
140
|
-
if (codebaseMemories.length === 0) {
|
|
141
|
-
return [];
|
|
142
|
-
}
|
|
143
|
-
// Check cache first to avoid redundant API calls
|
|
144
|
-
let queryEmbedding = this.embeddingCache.get(query);
|
|
145
|
-
if (!queryEmbedding) {
|
|
146
|
-
const embedding = await this.aiService.embed(query);
|
|
147
|
-
if (Array.isArray(embedding[0])) {
|
|
148
|
-
throw new Error('Expected single embedding');
|
|
149
|
-
}
|
|
150
|
-
queryEmbedding = embedding;
|
|
151
|
-
// Cache the embedding for future use
|
|
152
|
-
this.embeddingCache.set(query, queryEmbedding);
|
|
153
|
-
}
|
|
154
|
-
// Ensure we have a valid embedding
|
|
155
|
-
if (!queryEmbedding) {
|
|
156
|
-
throw new Error('Failed to generate query embedding');
|
|
157
|
-
}
|
|
158
|
-
// Initial retrieval: Get more candidates than needed for reranking
|
|
159
|
-
const initialLimit = useRerank ? Math.min(limit * 2, 50) : limit;
|
|
160
|
-
const initialMemories = this.retriever.retrieve(codebaseMemories, queryEmbedding, initialLimit);
|
|
161
|
-
if (!useRerank || initialMemories.length === 0) {
|
|
162
|
-
return initialMemories.slice(0, limit);
|
|
163
|
-
}
|
|
164
|
-
// Rerank: Use Cohere Rerank API to improve precision
|
|
165
|
-
try {
|
|
166
|
-
const documents = initialMemories.map(m => m.description);
|
|
167
|
-
const rerankResults = await this.aiService.rerank(query, documents, limit);
|
|
168
|
-
// Reorder memories based on rerank scores
|
|
169
|
-
return rerankResults.map((result) => initialMemories[result.index]);
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
// Fallback to initial results if rerank fails
|
|
173
|
-
console.warn('Memory rerank failed, using initial results:', error instanceof Error ? error.message : String(error));
|
|
174
|
-
return initialMemories.slice(0, limit);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Update memory access time
|
|
179
|
-
*/
|
|
180
|
-
async updateAccess(memory) {
|
|
181
|
-
memory.lastAccessed = new Date();
|
|
182
|
-
await this.repository.update(memory);
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Calculate importance score (1-10)
|
|
186
|
-
*/
|
|
187
|
-
calculateImportance(description) {
|
|
188
|
-
const lower = description.toLowerCase();
|
|
189
|
-
// High importance indicators
|
|
190
|
-
if (lower.includes('error') || lower.includes('failed') || lower.includes('success')) {
|
|
191
|
-
return 8;
|
|
192
|
-
}
|
|
193
|
-
if (lower.includes('test') || lower.includes('verification')) {
|
|
194
|
-
return 7;
|
|
195
|
-
}
|
|
196
|
-
// Medium importance
|
|
197
|
-
if (lower.includes('edit') || lower.includes('change') || lower.includes('modify')) {
|
|
198
|
-
return 5;
|
|
199
|
-
}
|
|
200
|
-
// Default
|
|
201
|
-
return 3;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
//# sourceMappingURL=memory-stream-service.js.map
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plan Repository
|
|
3
|
-
* Persists and retrieves plans for execution across sessions
|
|
4
|
-
*
|
|
5
|
-
* Phase 1: v0.5.0-alpha.0
|
|
6
|
-
*/
|
|
7
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
8
|
-
import { join, dirname } from 'path';
|
|
9
|
-
import { fileURLToPath } from 'url';
|
|
10
|
-
import { randomUUID } from 'crypto';
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
13
|
-
function getPlansDir() {
|
|
14
|
-
const agentDir = join(__dirname, '../../..');
|
|
15
|
-
if (existsSync(join(agentDir, 'package.json'))) {
|
|
16
|
-
return join(agentDir, 'data', 'plans');
|
|
17
|
-
}
|
|
18
|
-
return join(process.cwd(), '.codehere', 'plans');
|
|
19
|
-
}
|
|
20
|
-
export class FilePlanRepository {
|
|
21
|
-
plansDir;
|
|
22
|
-
constructor() {
|
|
23
|
-
this.plansDir = getPlansDir();
|
|
24
|
-
if (!existsSync(this.plansDir)) {
|
|
25
|
-
mkdirSync(this.plansDir, { recursive: true });
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Save a plan to disk
|
|
30
|
-
*/
|
|
31
|
-
async save(plan) {
|
|
32
|
-
const planId = plan.id || randomUUID();
|
|
33
|
-
const planPath = join(this.plansDir, `${planId}.json`);
|
|
34
|
-
const planToSave = {
|
|
35
|
-
...plan,
|
|
36
|
-
id: planId,
|
|
37
|
-
savedAt: new Date().toISOString(),
|
|
38
|
-
};
|
|
39
|
-
writeFileSync(planPath, JSON.stringify(planToSave, null, 2), 'utf-8');
|
|
40
|
-
return planId;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get a plan by ID
|
|
44
|
-
*/
|
|
45
|
-
async get(planId) {
|
|
46
|
-
const planPath = join(this.plansDir, `${planId}.json`);
|
|
47
|
-
if (!existsSync(planPath)) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
try {
|
|
51
|
-
const content = readFileSync(planPath, 'utf-8');
|
|
52
|
-
return JSON.parse(content);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
console.error(`Failed to read plan ${planId}:`, error);
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* List recent plans
|
|
61
|
-
*/
|
|
62
|
-
async list(limit = 10) {
|
|
63
|
-
// In alpha, simple file-based listing
|
|
64
|
-
// Can be enhanced later with proper sorting
|
|
65
|
-
return [];
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Update a plan
|
|
69
|
-
*/
|
|
70
|
-
async update(planId, updates) {
|
|
71
|
-
const plan = await this.get(planId);
|
|
72
|
-
if (!plan) {
|
|
73
|
-
throw new Error(`Plan ${planId} not found`);
|
|
74
|
-
}
|
|
75
|
-
const updatedPlan = { ...plan, ...updates };
|
|
76
|
-
await this.save(updatedPlan);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Delete a plan
|
|
80
|
-
*/
|
|
81
|
-
async delete(planId) {
|
|
82
|
-
const planPath = join(this.plansDir, `${planId}.json`);
|
|
83
|
-
if (existsSync(planPath)) {
|
|
84
|
-
const { unlinkSync } = await import('fs');
|
|
85
|
-
unlinkSync(planPath);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
let instance = null;
|
|
90
|
-
export function getPlanRepository() {
|
|
91
|
-
if (!instance) {
|
|
92
|
-
instance = new FilePlanRepository();
|
|
93
|
-
}
|
|
94
|
-
return instance;
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=plan-repository.js.map
|