contextpro-mcp 0.0.0-stage → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +425 -0
- package/INSTALL.md +218 -0
- package/INSTRUCTIONS.md +33 -0
- package/LICENSE +21 -0
- package/NOTICE +12 -0
- package/README.md +89 -2
- package/SECURITY.md +29 -0
- package/agent-guide.md +354 -0
- package/agent-instructions.md +1 -0
- package/build/core/agent-setup.d.ts +5 -0
- package/build/core/agent-setup.d.ts.map +1 -0
- package/build/core/agent-setup.js +95 -0
- package/build/core/agent-setup.js.map +1 -0
- package/build/core/artifacts.d.ts +64 -0
- package/build/core/artifacts.d.ts.map +1 -0
- package/build/core/artifacts.js +370 -0
- package/build/core/artifacts.js.map +1 -0
- package/build/core/bounded-source.d.ts +15 -0
- package/build/core/bounded-source.d.ts.map +1 -0
- package/build/core/bounded-source.js +78 -0
- package/build/core/bounded-source.js.map +1 -0
- package/build/core/changed-since.d.ts +20 -0
- package/build/core/changed-since.d.ts.map +1 -0
- package/build/core/changed-since.js +43 -0
- package/build/core/changed-since.js.map +1 -0
- package/build/core/chat-model.d.ts +8 -0
- package/build/core/chat-model.d.ts.map +1 -0
- package/build/core/chat-model.js +135 -0
- package/build/core/chat-model.js.map +1 -0
- package/build/core/clustering.d.ts +6 -0
- package/build/core/clustering.d.ts.map +1 -0
- package/build/core/clustering.js +201 -0
- package/build/core/clustering.js.map +1 -0
- package/build/core/context-metadata.d.ts +50 -0
- package/build/core/context-metadata.d.ts.map +1 -0
- package/build/core/context-metadata.js +118 -0
- package/build/core/context-metadata.js.map +1 -0
- package/build/core/data-dir.d.ts +5 -0
- package/build/core/data-dir.d.ts.map +1 -0
- package/build/core/data-dir.js +61 -0
- package/build/core/data-dir.js.map +1 -0
- package/build/core/db-native.d.ts +28 -0
- package/build/core/db-native.d.ts.map +1 -0
- package/build/core/db-native.js +120 -0
- package/build/core/db-native.js.map +1 -0
- package/build/core/db.d.ts +294 -0
- package/build/core/db.d.ts.map +1 -0
- package/build/core/db.js +1047 -0
- package/build/core/db.js.map +1 -0
- package/build/core/doctor.d.ts +13 -0
- package/build/core/doctor.d.ts.map +1 -0
- package/build/core/doctor.js +55 -0
- package/build/core/doctor.js.map +1 -0
- package/build/core/efficiency.d.ts +16 -0
- package/build/core/efficiency.d.ts.map +1 -0
- package/build/core/efficiency.js +170 -0
- package/build/core/efficiency.js.map +1 -0
- package/build/core/embedding-tracker.d.ts +25 -0
- package/build/core/embedding-tracker.d.ts.map +1 -0
- package/build/core/embedding-tracker.js +228 -0
- package/build/core/embedding-tracker.js.map +1 -0
- package/build/core/embeddings.d.ts +90 -0
- package/build/core/embeddings.d.ts.map +1 -0
- package/build/core/embeddings.js +693 -0
- package/build/core/embeddings.js.map +1 -0
- package/build/core/evidence-state.d.ts +42 -0
- package/build/core/evidence-state.d.ts.map +1 -0
- package/build/core/evidence-state.js +153 -0
- package/build/core/evidence-state.js.map +1 -0
- package/build/core/extractor-stamp.d.ts +10 -0
- package/build/core/extractor-stamp.d.ts.map +1 -0
- package/build/core/extractor-stamp.js +51 -0
- package/build/core/extractor-stamp.js.map +1 -0
- package/build/core/feature-brief-cache.d.ts +37 -0
- package/build/core/feature-brief-cache.d.ts.map +1 -0
- package/build/core/feature-brief-cache.js +100 -0
- package/build/core/feature-brief-cache.js.map +1 -0
- package/build/core/file-fingerprint.d.ts +15 -0
- package/build/core/file-fingerprint.d.ts.map +1 -0
- package/build/core/file-fingerprint.js +24 -0
- package/build/core/file-fingerprint.js.map +1 -0
- package/build/core/graph-analytics.d.ts +46 -0
- package/build/core/graph-analytics.d.ts.map +1 -0
- package/build/core/graph-analytics.js +371 -0
- package/build/core/graph-analytics.js.map +1 -0
- package/build/core/hub.d.ts +23 -0
- package/build/core/hub.d.ts.map +1 -0
- package/build/core/hub.js +123 -0
- package/build/core/hub.js.map +1 -0
- package/build/core/ignore-dirs.d.ts +7 -0
- package/build/core/ignore-dirs.d.ts.map +1 -0
- package/build/core/ignore-dirs.js +84 -0
- package/build/core/ignore-dirs.js.map +1 -0
- package/build/core/index-freshness.d.ts +15 -0
- package/build/core/index-freshness.d.ts.map +1 -0
- package/build/core/index-freshness.js +96 -0
- package/build/core/index-freshness.js.map +1 -0
- package/build/core/index-reconcile.d.ts +28 -0
- package/build/core/index-reconcile.d.ts.map +1 -0
- package/build/core/index-reconcile.js +129 -0
- package/build/core/index-reconcile.js.map +1 -0
- package/build/core/local-daemon.d.ts +5 -0
- package/build/core/local-daemon.d.ts.map +1 -0
- package/build/core/local-daemon.js +282 -0
- package/build/core/local-daemon.js.map +1 -0
- package/build/core/memory-graph.d.ts +68 -0
- package/build/core/memory-graph.d.ts.map +1 -0
- package/build/core/memory-graph.js +152 -0
- package/build/core/memory-graph.js.map +1 -0
- package/build/core/native-repair.d.ts +12 -0
- package/build/core/native-repair.d.ts.map +1 -0
- package/build/core/native-repair.js +167 -0
- package/build/core/native-repair.js.map +1 -0
- package/build/core/native-runtime.d.ts +12 -0
- package/build/core/native-runtime.d.ts.map +1 -0
- package/build/core/native-runtime.js +38 -0
- package/build/core/native-runtime.js.map +1 -0
- package/build/core/pagerank.d.ts +29 -0
- package/build/core/pagerank.d.ts.map +1 -0
- package/build/core/pagerank.js +90 -0
- package/build/core/pagerank.js.map +1 -0
- package/build/core/parser-process.d.ts +21 -0
- package/build/core/parser-process.d.ts.map +1 -0
- package/build/core/parser-process.js +103 -0
- package/build/core/parser-process.js.map +1 -0
- package/build/core/parser-worker.d.ts +2 -0
- package/build/core/parser-worker.d.ts.map +1 -0
- package/build/core/parser-worker.js +17 -0
- package/build/core/parser-worker.js.map +1 -0
- package/build/core/parser.d.ts +66 -0
- package/build/core/parser.d.ts.map +1 -0
- package/build/core/parser.js +750 -0
- package/build/core/parser.js.map +1 -0
- package/build/core/path-guard.d.ts +6 -0
- package/build/core/path-guard.d.ts.map +1 -0
- package/build/core/path-guard.js +55 -0
- package/build/core/path-guard.js.map +1 -0
- package/build/core/process-lifecycle.d.ts +30 -0
- package/build/core/process-lifecycle.d.ts.map +1 -0
- package/build/core/process-lifecycle.js +129 -0
- package/build/core/process-lifecycle.js.map +1 -0
- package/build/core/project-config.d.ts +83 -0
- package/build/core/project-config.d.ts.map +1 -0
- package/build/core/project-config.js +302 -0
- package/build/core/project-config.js.map +1 -0
- package/build/core/project-graph.d.ts +69 -0
- package/build/core/project-graph.d.ts.map +1 -0
- package/build/core/project-graph.js +874 -0
- package/build/core/project-graph.js.map +1 -0
- package/build/core/provider-config.d.ts +15 -0
- package/build/core/provider-config.d.ts.map +1 -0
- package/build/core/provider-config.js +67 -0
- package/build/core/provider-config.js.map +1 -0
- package/build/core/provider-usage.d.ts +21 -0
- package/build/core/provider-usage.d.ts.map +1 -0
- package/build/core/provider-usage.js +52 -0
- package/build/core/provider-usage.js.map +1 -0
- package/build/core/python-language-server.d.ts +23 -0
- package/build/core/python-language-server.d.ts.map +1 -0
- package/build/core/python-language-server.js +217 -0
- package/build/core/python-language-server.js.map +1 -0
- package/build/core/python-runtime-identity.d.ts +3 -0
- package/build/core/python-runtime-identity.d.ts.map +1 -0
- package/build/core/python-runtime-identity.js +53 -0
- package/build/core/python-runtime-identity.js.map +1 -0
- package/build/core/reconcile-scheduler.d.ts +20 -0
- package/build/core/reconcile-scheduler.d.ts.map +1 -0
- package/build/core/reconcile-scheduler.js +58 -0
- package/build/core/reconcile-scheduler.js.map +1 -0
- package/build/core/request-context.d.ts +7 -0
- package/build/core/request-context.d.ts.map +1 -0
- package/build/core/request-context.js +17 -0
- package/build/core/request-context.js.map +1 -0
- package/build/core/request-root.d.ts +19 -0
- package/build/core/request-root.d.ts.map +1 -0
- package/build/core/request-root.js +26 -0
- package/build/core/request-root.js.map +1 -0
- package/build/core/root-guard.d.ts +9 -0
- package/build/core/root-guard.d.ts.map +1 -0
- package/build/core/root-guard.js +64 -0
- package/build/core/root-guard.js.map +1 -0
- package/build/core/roots-detect.d.ts +17 -0
- package/build/core/roots-detect.d.ts.map +1 -0
- package/build/core/roots-detect.js +63 -0
- package/build/core/roots-detect.js.map +1 -0
- package/build/core/runtime-session.d.ts +5 -0
- package/build/core/runtime-session.d.ts.map +1 -0
- package/build/core/runtime-session.js +10 -0
- package/build/core/runtime-session.js.map +1 -0
- package/build/core/scip-index.d.ts +71 -0
- package/build/core/scip-index.d.ts.map +1 -0
- package/build/core/scip-index.js +343 -0
- package/build/core/scip-index.js.map +1 -0
- package/build/core/semantic-diff.d.ts +32 -0
- package/build/core/semantic-diff.d.ts.map +1 -0
- package/build/core/semantic-diff.js +259 -0
- package/build/core/semantic-diff.js.map +1 -0
- package/build/core/source-context.d.ts +3 -0
- package/build/core/source-context.d.ts.map +1 -0
- package/build/core/source-context.js +86 -0
- package/build/core/source-context.js.map +1 -0
- package/build/core/source-mask.d.ts +8 -0
- package/build/core/source-mask.d.ts.map +1 -0
- package/build/core/source-mask.js +156 -0
- package/build/core/source-mask.js.map +1 -0
- package/build/core/source-mutation.d.ts +16 -0
- package/build/core/source-mutation.d.ts.map +1 -0
- package/build/core/source-mutation.js +193 -0
- package/build/core/source-mutation.js.map +1 -0
- package/build/core/sql-schema.d.ts +59 -0
- package/build/core/sql-schema.d.ts.map +1 -0
- package/build/core/sql-schema.js +218 -0
- package/build/core/sql-schema.js.map +1 -0
- package/build/core/startup-health.d.ts +40 -0
- package/build/core/startup-health.d.ts.map +1 -0
- package/build/core/startup-health.js +132 -0
- package/build/core/startup-health.js.map +1 -0
- package/build/core/team-ledger.d.ts +60 -0
- package/build/core/team-ledger.d.ts.map +1 -0
- package/build/core/team-ledger.js +171 -0
- package/build/core/team-ledger.js.map +1 -0
- package/build/core/test-impact.d.ts +23 -0
- package/build/core/test-impact.d.ts.map +1 -0
- package/build/core/test-impact.js +131 -0
- package/build/core/test-impact.js.map +1 -0
- package/build/core/tool-metrics.d.ts +29 -0
- package/build/core/tool-metrics.d.ts.map +1 -0
- package/build/core/tool-metrics.js +74 -0
- package/build/core/tool-metrics.js.map +1 -0
- package/build/core/tool-profile.d.ts +12 -0
- package/build/core/tool-profile.d.ts.map +1 -0
- package/build/core/tool-profile.js +102 -0
- package/build/core/tool-profile.js.map +1 -0
- package/build/core/tool-trace.d.ts +8 -0
- package/build/core/tool-trace.d.ts.map +1 -0
- package/build/core/tool-trace.js +70 -0
- package/build/core/tool-trace.js.map +1 -0
- package/build/core/tree-sitter-runtime.d.ts +20 -0
- package/build/core/tree-sitter-runtime.d.ts.map +1 -0
- package/build/core/tree-sitter-runtime.js +324 -0
- package/build/core/tree-sitter-runtime.js.map +1 -0
- package/build/core/tree-sitter.d.ts +6 -0
- package/build/core/tree-sitter.d.ts.map +1 -0
- package/build/core/tree-sitter.js +24 -0
- package/build/core/tree-sitter.js.map +1 -0
- package/build/core/typescript-reference-process.d.ts +30 -0
- package/build/core/typescript-reference-process.d.ts.map +1 -0
- package/build/core/typescript-reference-process.js +124 -0
- package/build/core/typescript-reference-process.js.map +1 -0
- package/build/core/typescript-reference-worker.d.ts +2 -0
- package/build/core/typescript-reference-worker.d.ts.map +1 -0
- package/build/core/typescript-reference-worker.js +14 -0
- package/build/core/typescript-reference-worker.js.map +1 -0
- package/build/core/typescript-references.d.ts +71 -0
- package/build/core/typescript-references.d.ts.map +1 -0
- package/build/core/typescript-references.js +392 -0
- package/build/core/typescript-references.js.map +1 -0
- package/build/core/typescript-skeleton.d.ts +5 -0
- package/build/core/typescript-skeleton.d.ts.map +1 -0
- package/build/core/typescript-skeleton.js +49 -0
- package/build/core/typescript-skeleton.js.map +1 -0
- package/build/core/walker.d.ts +16 -0
- package/build/core/walker.d.ts.map +1 -0
- package/build/core/walker.js +152 -0
- package/build/core/walker.js.map +1 -0
- package/build/core/workspace-router.d.ts +28 -0
- package/build/core/workspace-router.d.ts.map +1 -0
- package/build/core/workspace-router.js +93 -0
- package/build/core/workspace-router.js.map +1 -0
- package/build/core/worktree-gc.d.ts +16 -0
- package/build/core/worktree-gc.d.ts.map +1 -0
- package/build/core/worktree-gc.js +69 -0
- package/build/core/worktree-gc.js.map +1 -0
- package/build/core/worktree-overlay.d.ts +22 -0
- package/build/core/worktree-overlay.d.ts.map +1 -0
- package/build/core/worktree-overlay.js +84 -0
- package/build/core/worktree-overlay.js.map +1 -0
- package/build/core/worktree-root-guard.d.ts +8 -0
- package/build/core/worktree-root-guard.d.ts.map +1 -0
- package/build/core/worktree-root-guard.js +82 -0
- package/build/core/worktree-root-guard.js.map +1 -0
- package/build/core/worktree-seed.d.ts +14 -0
- package/build/core/worktree-seed.d.ts.map +1 -0
- package/build/core/worktree-seed.js +98 -0
- package/build/core/worktree-seed.js.map +1 -0
- package/build/git/shadow.d.ts +40 -0
- package/build/git/shadow.d.ts.map +1 -0
- package/build/git/shadow.js +298 -0
- package/build/git/shadow.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +634 -0
- package/build/index.js.map +1 -0
- package/build/tools/agentic-context.d.ts +86 -0
- package/build/tools/agentic-context.d.ts.map +1 -0
- package/build/tools/agentic-context.js +1546 -0
- package/build/tools/agentic-context.js.map +1 -0
- package/build/tools/blast-radius.d.ts +24 -0
- package/build/tools/blast-radius.d.ts.map +1 -0
- package/build/tools/blast-radius.js +231 -0
- package/build/tools/blast-radius.js.map +1 -0
- package/build/tools/changed-since.d.ts +7 -0
- package/build/tools/changed-since.d.ts.map +1 -0
- package/build/tools/changed-since.js +68 -0
- package/build/tools/changed-since.js.map +1 -0
- package/build/tools/compiler-actions.d.ts +26 -0
- package/build/tools/compiler-actions.d.ts.map +1 -0
- package/build/tools/compiler-actions.js +121 -0
- package/build/tools/compiler-actions.js.map +1 -0
- package/build/tools/context-tree.d.ts +9 -0
- package/build/tools/context-tree.d.ts.map +1 -0
- package/build/tools/context-tree.js +131 -0
- package/build/tools/context-tree.js.map +1 -0
- package/build/tools/context.d.ts +37 -0
- package/build/tools/context.d.ts.map +1 -0
- package/build/tools/context.js +800 -0
- package/build/tools/context.js.map +1 -0
- package/build/tools/diff.d.ts +9 -0
- package/build/tools/diff.d.ts.map +1 -0
- package/build/tools/diff.js +176 -0
- package/build/tools/diff.js.map +1 -0
- package/build/tools/directory-prior.d.ts +16 -0
- package/build/tools/directory-prior.d.ts.map +1 -0
- package/build/tools/directory-prior.js +121 -0
- package/build/tools/directory-prior.js.map +1 -0
- package/build/tools/discovery-documents.d.ts +11 -0
- package/build/tools/discovery-documents.d.ts.map +1 -0
- package/build/tools/discovery-documents.js +71 -0
- package/build/tools/discovery-documents.js.map +1 -0
- package/build/tools/discovery-hints.d.ts +25 -0
- package/build/tools/discovery-hints.d.ts.map +1 -0
- package/build/tools/discovery-hints.js +329 -0
- package/build/tools/discovery-hints.js.map +1 -0
- package/build/tools/efficiency-report.d.ts +13 -0
- package/build/tools/efficiency-report.d.ts.map +1 -0
- package/build/tools/efficiency-report.js +78 -0
- package/build/tools/efficiency-report.js.map +1 -0
- package/build/tools/evidence-retrieval.d.ts +33 -0
- package/build/tools/evidence-retrieval.d.ts.map +1 -0
- package/build/tools/evidence-retrieval.js +200 -0
- package/build/tools/evidence-retrieval.js.map +1 -0
- package/build/tools/exact-references.d.ts +10 -0
- package/build/tools/exact-references.d.ts.map +1 -0
- package/build/tools/exact-references.js +351 -0
- package/build/tools/exact-references.js.map +1 -0
- package/build/tools/explain.d.ts +14 -0
- package/build/tools/explain.d.ts.map +1 -0
- package/build/tools/explain.js +370 -0
- package/build/tools/explain.js.map +1 -0
- package/build/tools/feature-brief.d.ts +7 -0
- package/build/tools/feature-brief.d.ts.map +1 -0
- package/build/tools/feature-brief.js +89 -0
- package/build/tools/feature-brief.js.map +1 -0
- package/build/tools/feature-hub.d.ts +15 -0
- package/build/tools/feature-hub.d.ts.map +1 -0
- package/build/tools/feature-hub.js +404 -0
- package/build/tools/feature-hub.js.map +1 -0
- package/build/tools/file-skeleton.d.ts +7 -0
- package/build/tools/file-skeleton.d.ts.map +1 -0
- package/build/tools/file-skeleton.js +190 -0
- package/build/tools/file-skeleton.js.map +1 -0
- package/build/tools/grep.d.ts +25 -0
- package/build/tools/grep.d.ts.map +1 -0
- package/build/tools/grep.js +341 -0
- package/build/tools/grep.js.map +1 -0
- package/build/tools/impact-delta.d.ts +7 -0
- package/build/tools/impact-delta.d.ts.map +1 -0
- package/build/tools/impact-delta.js +102 -0
- package/build/tools/impact-delta.js.map +1 -0
- package/build/tools/memory-tools.d.ts +69 -0
- package/build/tools/memory-tools.d.ts.map +1 -0
- package/build/tools/memory-tools.js +366 -0
- package/build/tools/memory-tools.js.map +1 -0
- package/build/tools/planning-helpers.d.ts +26 -0
- package/build/tools/planning-helpers.d.ts.map +1 -0
- package/build/tools/planning-helpers.js +269 -0
- package/build/tools/planning-helpers.js.map +1 -0
- package/build/tools/project-graph.d.ts +19 -0
- package/build/tools/project-graph.d.ts.map +1 -0
- package/build/tools/project-graph.js +259 -0
- package/build/tools/project-graph.js.map +1 -0
- package/build/tools/propose-commit.d.ts +9 -0
- package/build/tools/propose-commit.d.ts.map +1 -0
- package/build/tools/propose-commit.js +156 -0
- package/build/tools/propose-commit.js.map +1 -0
- package/build/tools/register-tools.d.ts +18 -0
- package/build/tools/register-tools.d.ts.map +1 -0
- package/build/tools/register-tools.js +1131 -0
- package/build/tools/register-tools.js.map +1 -0
- package/build/tools/reindex.d.ts +76 -0
- package/build/tools/reindex.d.ts.map +1 -0
- package/build/tools/reindex.js +871 -0
- package/build/tools/reindex.js.map +1 -0
- package/build/tools/related.d.ts +6 -0
- package/build/tools/related.d.ts.map +1 -0
- package/build/tools/related.js +143 -0
- package/build/tools/related.js.map +1 -0
- package/build/tools/repo-map.d.ts +59 -0
- package/build/tools/repo-map.d.ts.map +1 -0
- package/build/tools/repo-map.js +270 -0
- package/build/tools/repo-map.js.map +1 -0
- package/build/tools/resolve-symbol.d.ts +41 -0
- package/build/tools/resolve-symbol.d.ts.map +1 -0
- package/build/tools/resolve-symbol.js +250 -0
- package/build/tools/resolve-symbol.js.map +1 -0
- package/build/tools/retrieval-helpers.d.ts +35 -0
- package/build/tools/retrieval-helpers.d.ts.map +1 -0
- package/build/tools/retrieval-helpers.js +302 -0
- package/build/tools/retrieval-helpers.js.map +1 -0
- package/build/tools/scip-index.d.ts +12 -0
- package/build/tools/scip-index.d.ts.map +1 -0
- package/build/tools/scip-index.js +66 -0
- package/build/tools/scip-index.js.map +1 -0
- package/build/tools/scoped-discovery.d.ts +7 -0
- package/build/tools/scoped-discovery.d.ts.map +1 -0
- package/build/tools/scoped-discovery.js +89 -0
- package/build/tools/scoped-discovery.js.map +1 -0
- package/build/tools/search.d.ts +62 -0
- package/build/tools/search.d.ts.map +1 -0
- package/build/tools/search.js +419 -0
- package/build/tools/search.js.map +1 -0
- package/build/tools/semantic-diff.d.ts +7 -0
- package/build/tools/semantic-diff.d.ts.map +1 -0
- package/build/tools/semantic-diff.js +45 -0
- package/build/tools/semantic-diff.js.map +1 -0
- package/build/tools/semantic-identifiers.d.ts +51 -0
- package/build/tools/semantic-identifiers.d.ts.map +1 -0
- package/build/tools/semantic-identifiers.js +522 -0
- package/build/tools/semantic-identifiers.js.map +1 -0
- package/build/tools/semantic-navigate.d.ts +18 -0
- package/build/tools/semantic-navigate.d.ts.map +1 -0
- package/build/tools/semantic-navigate.js +413 -0
- package/build/tools/semantic-navigate.js.map +1 -0
- package/build/tools/semantic-search.d.ts +30 -0
- package/build/tools/semantic-search.d.ts.map +1 -0
- package/build/tools/semantic-search.js +466 -0
- package/build/tools/semantic-search.js.map +1 -0
- package/build/tools/sql-schema.d.ts +23 -0
- package/build/tools/sql-schema.d.ts.map +1 -0
- package/build/tools/sql-schema.js +155 -0
- package/build/tools/sql-schema.js.map +1 -0
- package/build/tools/static-analysis.d.ts +7 -0
- package/build/tools/static-analysis.d.ts.map +1 -0
- package/build/tools/static-analysis.js +331 -0
- package/build/tools/static-analysis.js.map +1 -0
- package/build/tools/status.d.ts +74 -0
- package/build/tools/status.d.ts.map +1 -0
- package/build/tools/status.js +227 -0
- package/build/tools/status.js.map +1 -0
- package/build/tools/symbolic-edit.d.ts +57 -0
- package/build/tools/symbolic-edit.d.ts.map +1 -0
- package/build/tools/symbolic-edit.js +500 -0
- package/build/tools/symbolic-edit.js.map +1 -0
- package/build/tools/test-impact.d.ts +7 -0
- package/build/tools/test-impact.d.ts.map +1 -0
- package/build/tools/test-impact.js +34 -0
- package/build/tools/test-impact.js.map +1 -0
- package/build/tools/test-map.d.ts +8 -0
- package/build/tools/test-map.d.ts.map +1 -0
- package/build/tools/test-map.js +75 -0
- package/build/tools/test-map.js.map +1 -0
- package/docs/README.md +35 -0
- package/docs/architecture.md +35 -0
- package/docs/configuration.md +207 -0
- package/docs/maintenance.md +77 -0
- package/package.json +80 -4
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// Persistent artifact storage for reusable agent context packets and summaries
|
|
2
|
+
// FEATURE: Artifact cache — stable IDs for low-token reuse across MCP turns
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
|
+
import { mkdir, open, readFile, readdir, rename, stat, unlink, writeFile } from "fs/promises";
|
|
5
|
+
import { join, resolve } from "path";
|
|
6
|
+
import { resolveProjectPath, canonicalProjectPath } from "./path-guard.js";
|
|
7
|
+
/**
|
|
8
|
+
* Atomic file write: write to a unique temp file then rename over the target. A crash mid-write
|
|
9
|
+
* leaves the (untouched) original or the temp file, never a half-written target.
|
|
10
|
+
*/
|
|
11
|
+
export async function writeFileAtomic(target, data) {
|
|
12
|
+
const tmp = `${target}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
|
|
13
|
+
await writeFile(tmp, data, "utf-8");
|
|
14
|
+
try {
|
|
15
|
+
await rename(tmp, target);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (err.code === "EEXIST" || err.code === "EPERM") {
|
|
19
|
+
await unlink(target).catch(() => undefined);
|
|
20
|
+
await rename(tmp, target);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
await unlink(tmp).catch(() => undefined);
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const ARTIFACT_DIR = ".contextpro/artifacts";
|
|
29
|
+
const MANIFEST_FILE = "manifest.json";
|
|
30
|
+
const MANIFEST_LOCK_FILE = "manifest.lock";
|
|
31
|
+
const LOCK_RETRY_MS = 40;
|
|
32
|
+
const LOCK_TIMEOUT_MS = 15_000;
|
|
33
|
+
const STALE_LOCK_AGE_MS = 30_000;
|
|
34
|
+
const MAX_ARTIFACTS_PER_MANIFEST = 200;
|
|
35
|
+
async function readJsonFile(path, fallback) {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(await readFile(path, "utf-8"));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return fallback;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function artifactBaseDir(rootDir) {
|
|
44
|
+
return resolveProjectPath(rootDir, ARTIFACT_DIR);
|
|
45
|
+
}
|
|
46
|
+
function manifestPath(rootDir) {
|
|
47
|
+
return resolveProjectPath(rootDir, join(artifactBaseDir(rootDir), MANIFEST_FILE));
|
|
48
|
+
}
|
|
49
|
+
function manifestLockPath(rootDir) {
|
|
50
|
+
return resolveProjectPath(rootDir, join(artifactBaseDir(rootDir), MANIFEST_LOCK_FILE));
|
|
51
|
+
}
|
|
52
|
+
export function buildArtifactId(kind, key, repoFingerprint) {
|
|
53
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(kind))
|
|
54
|
+
throw new Error(`Invalid artifact kind: ${kind}`);
|
|
55
|
+
const hash = createHash("sha256")
|
|
56
|
+
.update(`${kind}|${repoFingerprint ?? "no-fingerprint"}|${key}`)
|
|
57
|
+
.digest("hex")
|
|
58
|
+
.slice(0, 14);
|
|
59
|
+
return `${kind}-${hash}`;
|
|
60
|
+
}
|
|
61
|
+
function sleep(ms) {
|
|
62
|
+
return new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
|
|
63
|
+
}
|
|
64
|
+
async function withManifestLock(rootDir, fn) {
|
|
65
|
+
const baseDir = artifactBaseDir(rootDir);
|
|
66
|
+
await mkdir(baseDir, { recursive: true });
|
|
67
|
+
const lockPath = manifestLockPath(rootDir);
|
|
68
|
+
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
69
|
+
while (true) {
|
|
70
|
+
try {
|
|
71
|
+
const handle = await open(lockPath, "wx");
|
|
72
|
+
try {
|
|
73
|
+
await handle.writeFile(JSON.stringify({ pid: process.pid, acquiredAt: new Date().toISOString() }) + "\n", "utf-8");
|
|
74
|
+
return await fn();
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await handle.close().catch(() => undefined);
|
|
78
|
+
await unlink(lockPath).catch(() => undefined);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// Stale-lock detection: if the lock file is older than STALE_LOCK_AGE_MS, an earlier
|
|
83
|
+
// process crashed before releasing it. Clear it and retry. Without this we'd block until
|
|
84
|
+
// LOCK_TIMEOUT_MS just because of a crashed prior process.
|
|
85
|
+
if (error.code === "EEXIST") {
|
|
86
|
+
try {
|
|
87
|
+
const statMod = await import("node:fs/promises");
|
|
88
|
+
const lockStats = await statMod.stat(lockPath).catch(() => null);
|
|
89
|
+
if (lockStats && Date.now() - lockStats.mtimeMs > STALE_LOCK_AGE_MS) {
|
|
90
|
+
await unlink(lockPath).catch(() => undefined);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// best-effort stale check
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (Date.now() >= deadline)
|
|
99
|
+
throw error;
|
|
100
|
+
await sleep(LOCK_RETRY_MS);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function scanArtifactsOnDisk(rootDir) {
|
|
105
|
+
const baseDir = artifactBaseDir(rootDir);
|
|
106
|
+
try {
|
|
107
|
+
const entries = await readdir(baseDir, { withFileTypes: true });
|
|
108
|
+
const artifacts = [];
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
if (!entry.isDirectory())
|
|
111
|
+
continue;
|
|
112
|
+
const kindDir = resolveProjectPath(rootDir, join(baseDir, entry.name));
|
|
113
|
+
const files = await readdir(kindDir, { withFileTypes: true }).catch(() => []);
|
|
114
|
+
for (const file of files) {
|
|
115
|
+
if (!file.isFile() || !file.name.endsWith(".json"))
|
|
116
|
+
continue;
|
|
117
|
+
const fullPath = resolveProjectPath(rootDir, join(kindDir, file.name));
|
|
118
|
+
const parsed = await readJsonFile(fullPath, null);
|
|
119
|
+
if (!parsed?.id || !parsed.kind || !parsed.key)
|
|
120
|
+
continue;
|
|
121
|
+
artifacts.push({
|
|
122
|
+
id: parsed.id,
|
|
123
|
+
kind: parsed.kind,
|
|
124
|
+
key: parsed.key,
|
|
125
|
+
path: fullPath,
|
|
126
|
+
createdAt: parsed.createdAt,
|
|
127
|
+
updatedAt: parsed.updatedAt,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return artifacts.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt) || left.id.localeCompare(right.id));
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function loadManifestWithRepair(rootDir) {
|
|
138
|
+
const manifest = await readJsonFile(manifestPath(rootDir), { artifacts: [] });
|
|
139
|
+
const existing = manifest.artifacts.filter((artifact) => Boolean(artifact?.id && artifact?.path));
|
|
140
|
+
const diskArtifacts = await scanArtifactsOnDisk(rootDir);
|
|
141
|
+
const merged = new Map();
|
|
142
|
+
for (const artifact of existing)
|
|
143
|
+
merged.set(artifact.id, artifact);
|
|
144
|
+
for (const artifact of diskArtifacts) {
|
|
145
|
+
const current = merged.get(artifact.id);
|
|
146
|
+
if (!current || artifact.updatedAt > current.updatedAt)
|
|
147
|
+
merged.set(artifact.id, artifact);
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
artifacts: [...merged.values()].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt) || left.id.localeCompare(right.id)),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Canonical JSON serializer used to build artifact keys. Sorts object keys, drops empty arrays
|
|
155
|
+
* and null/undefined values so that `includeKinds: []`, `includeKinds: undefined`, and missing
|
|
156
|
+
* fields all produce the same key (and therefore the same cached artifact).
|
|
157
|
+
*/
|
|
158
|
+
export function canonicalArtifactKey(value) {
|
|
159
|
+
const normalize = (v) => {
|
|
160
|
+
if (v === undefined || v === null)
|
|
161
|
+
return undefined;
|
|
162
|
+
if (Array.isArray(v)) {
|
|
163
|
+
const arr = v.map(normalize).filter((item) => item !== undefined);
|
|
164
|
+
return arr.length === 0 ? undefined : arr;
|
|
165
|
+
}
|
|
166
|
+
if (typeof v === "object") {
|
|
167
|
+
const obj = {};
|
|
168
|
+
const keys = Object.keys(v).sort();
|
|
169
|
+
for (const k of keys) {
|
|
170
|
+
const nv = normalize(v[k]);
|
|
171
|
+
if (nv !== undefined)
|
|
172
|
+
obj[k] = nv;
|
|
173
|
+
}
|
|
174
|
+
return Object.keys(obj).length === 0 ? undefined : obj;
|
|
175
|
+
}
|
|
176
|
+
return v;
|
|
177
|
+
};
|
|
178
|
+
const normalized = normalize(value);
|
|
179
|
+
return JSON.stringify(normalized ?? {});
|
|
180
|
+
}
|
|
181
|
+
export async function persistArtifact(options) {
|
|
182
|
+
// Serialize the existence check and publication of immutable snapshots too.
|
|
183
|
+
// Locking only manifest updates allowed concurrent writers to replace a context ID.
|
|
184
|
+
if (options.immutable)
|
|
185
|
+
return withManifestLock(options.rootDir, () => persistArtifactRecord(options, true));
|
|
186
|
+
return persistArtifactRecord(options, false);
|
|
187
|
+
}
|
|
188
|
+
async function persistArtifactRecord(options, manifestLocked) {
|
|
189
|
+
const baseDir = artifactBaseDir(options.rootDir);
|
|
190
|
+
const kindDir = resolveProjectPath(options.rootDir, join(baseDir, options.kind));
|
|
191
|
+
const id = buildArtifactId(options.kind, options.key, options.repoFingerprint);
|
|
192
|
+
const artifactFile = resolveProjectPath(options.rootDir, join(kindDir, `${id}.json`));
|
|
193
|
+
const existing = await readArtifact(options.rootDir, id);
|
|
194
|
+
if (options.immutable && existing)
|
|
195
|
+
return existing;
|
|
196
|
+
const now = new Date().toISOString();
|
|
197
|
+
const record = {
|
|
198
|
+
id,
|
|
199
|
+
kind: options.kind,
|
|
200
|
+
key: options.key,
|
|
201
|
+
path: artifactFile,
|
|
202
|
+
createdAt: existing?.createdAt ?? now,
|
|
203
|
+
updatedAt: now,
|
|
204
|
+
indexGeneration: options.indexGeneration,
|
|
205
|
+
repoRoot: resolve(options.rootDir),
|
|
206
|
+
repoFingerprint: options.repoFingerprint ?? null,
|
|
207
|
+
projectId: options.projectId ?? null,
|
|
208
|
+
clientId: options.clientId ?? null,
|
|
209
|
+
metadata: options.metadata ?? {},
|
|
210
|
+
payload: options.payload,
|
|
211
|
+
};
|
|
212
|
+
await mkdir(kindDir, { recursive: true });
|
|
213
|
+
await writeFileAtomic(artifactFile, JSON.stringify(record, null, 2) + "\n");
|
|
214
|
+
const nextRef = {
|
|
215
|
+
id: record.id,
|
|
216
|
+
kind: record.kind,
|
|
217
|
+
key: record.key,
|
|
218
|
+
path: record.path,
|
|
219
|
+
createdAt: record.createdAt,
|
|
220
|
+
updatedAt: record.updatedAt,
|
|
221
|
+
indexGeneration: record.indexGeneration,
|
|
222
|
+
};
|
|
223
|
+
const updateManifest = async () => {
|
|
224
|
+
const manifest = await loadManifestWithRepair(options.rootDir);
|
|
225
|
+
const filtered = manifest.artifacts.filter((artifact) => artifact.id !== id);
|
|
226
|
+
filtered.unshift(nextRef);
|
|
227
|
+
// LRU eviction: keep at most MAX_ARTIFACTS_PER_MANIFEST entries.
|
|
228
|
+
const trimmed = filtered.slice(0, MAX_ARTIFACTS_PER_MANIFEST);
|
|
229
|
+
await mkdir(baseDir, { recursive: true });
|
|
230
|
+
await writeFileAtomic(manifestPath(options.rootDir), JSON.stringify({ artifacts: trimmed }, null, 2) + "\n");
|
|
231
|
+
};
|
|
232
|
+
if (manifestLocked)
|
|
233
|
+
await updateManifest();
|
|
234
|
+
else
|
|
235
|
+
await withManifestLock(options.rootDir, updateManifest);
|
|
236
|
+
return nextRef;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Read an artifact only if it's still fresh for the given index generation. When the stored
|
|
240
|
+
* artifact's indexGeneration is older than `currentGeneration`, returns null so the caller
|
|
241
|
+
* recomputes instead of serving stale rankings.
|
|
242
|
+
*/
|
|
243
|
+
export async function readArtifactIfFresh(rootDir, artifactId, currentGeneration) {
|
|
244
|
+
const record = await readArtifact(rootDir, artifactId);
|
|
245
|
+
if (!record)
|
|
246
|
+
return null;
|
|
247
|
+
if (record.indexGeneration !== undefined && record.indexGeneration < currentGeneration) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
return record;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Resolve a cached artifact by its logical identity (kind + key + repo fingerprint), returning it
|
|
254
|
+
* only when still fresh for `currentGeneration`. This is the read side of the read-through cache:
|
|
255
|
+
* a tool computes its canonical key, calls this first, and only recomputes on a miss. Centralizes
|
|
256
|
+
* the artifact-ID derivation so callers never reconstruct it themselves.
|
|
257
|
+
*/
|
|
258
|
+
export async function lookupFreshArtifact(rootDir, kind, key, repoFingerprint, currentGeneration) {
|
|
259
|
+
const id = buildArtifactId(kind, key, repoFingerprint);
|
|
260
|
+
return readArtifactIfFresh(rootDir, id, currentGeneration);
|
|
261
|
+
}
|
|
262
|
+
function migrateLegacyArtifactPath(path) {
|
|
263
|
+
// .contextplus was renamed to .contextpro in 1.2.0; manifest entries written before the rename
|
|
264
|
+
// still carry the old path string. Rewrite on read so the user never sees the stale path.
|
|
265
|
+
return path.replace(/(^|\/)\.contextplus(\/|$)/g, "$1.contextpro$2");
|
|
266
|
+
}
|
|
267
|
+
function migrateReference(ref) {
|
|
268
|
+
const migrated = migrateLegacyArtifactPath(ref.path);
|
|
269
|
+
return migrated === ref.path ? ref : { ...ref, path: migrated };
|
|
270
|
+
}
|
|
271
|
+
function resolveStoredArtifactPath(rootDir, path) {
|
|
272
|
+
// Manifests can outlive a client's root spelling (/var versus /private/var,
|
|
273
|
+
// or an explicitly selected root alias). Require physical containment after
|
|
274
|
+
// resolving both, rather than rejecting the same file under another spelling.
|
|
275
|
+
return resolveProjectPath(canonicalProjectPath(resolve(rootDir)), canonicalProjectPath(resolve(rootDir, path)), "artifact path");
|
|
276
|
+
}
|
|
277
|
+
export async function readArtifact(rootDir, artifactId) {
|
|
278
|
+
const manifest = await loadManifestWithRepair(rootDir);
|
|
279
|
+
const ref = manifest.artifacts.find((artifact) => artifact.id === artifactId);
|
|
280
|
+
if (ref) {
|
|
281
|
+
const migratedPath = resolveStoredArtifactPath(rootDir, migrateLegacyArtifactPath(ref.path));
|
|
282
|
+
const record = await readJsonFile(migratedPath, null);
|
|
283
|
+
if (record)
|
|
284
|
+
return record;
|
|
285
|
+
if (migratedPath !== ref.path) {
|
|
286
|
+
const original = await readJsonFile(resolveStoredArtifactPath(rootDir, ref.path), null);
|
|
287
|
+
if (original)
|
|
288
|
+
return original;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const fallback = (await scanArtifactsOnDisk(rootDir)).find((artifact) => artifact.id === artifactId);
|
|
292
|
+
if (!fallback)
|
|
293
|
+
return null;
|
|
294
|
+
return readJsonFile(resolveStoredArtifactPath(rootDir, fallback.path), null);
|
|
295
|
+
}
|
|
296
|
+
export async function listArtifacts(rootDir, kind, limit = 20) {
|
|
297
|
+
const manifest = await loadManifestWithRepair(rootDir);
|
|
298
|
+
const selected = manifest.artifacts
|
|
299
|
+
.map(migrateReference)
|
|
300
|
+
.filter((artifact) => !kind || artifact.kind === kind)
|
|
301
|
+
.slice(0, Math.max(1, limit));
|
|
302
|
+
// Stat each selected artifact's payload for its on-disk size (best-effort; missing files report 0).
|
|
303
|
+
return Promise.all(selected.map(async (artifact) => {
|
|
304
|
+
const sizeBytes = await stat(resolveStoredArtifactPath(rootDir, artifact.path)).then((s) => s.size).catch(() => 0);
|
|
305
|
+
return { ...artifact, sizeBytes };
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Delete orphaned artifact files — `.json` payloads on disk whose id is no longer in the manifest
|
|
310
|
+
* (evicted by the LRU trim). The manifest is the source of truth; anything not referenced by it is
|
|
311
|
+
* dead weight. Returns how many files were removed and how many bytes were reclaimed.
|
|
312
|
+
*/
|
|
313
|
+
// Files younger than this are never reclaimed by GC, closing the persist/GC race: persistArtifact
|
|
314
|
+
// writes the .json BEFORE recording it in the manifest, so a just-written file can momentarily look
|
|
315
|
+
// "unreferenced." A grace window guarantees we never delete a file that another caller is mid-persist.
|
|
316
|
+
const GC_MIN_AGE_MS = 60_000;
|
|
317
|
+
export async function garbageCollectArtifacts(rootDir) {
|
|
318
|
+
const baseDir = artifactBaseDir(rootDir);
|
|
319
|
+
let deletedFiles = 0;
|
|
320
|
+
let freedBytes = 0;
|
|
321
|
+
// The ENTIRE reconcile-and-delete runs under the manifest lock so a concurrent persist (which also
|
|
322
|
+
// takes the lock to update the manifest) cannot interleave with our delete decisions.
|
|
323
|
+
await withManifestLock(rootDir, async () => {
|
|
324
|
+
// Liveness = the REPAIRED manifest (raw manifest ∪ every valid on-disk artifact). This is the set
|
|
325
|
+
// readArtifact/listArtifacts actually serve, so anything in it is reachable and must NOT be deleted
|
|
326
|
+
// — including the 201st+ artifacts the raw 200-entry manifest dropped. GC only reclaims files that
|
|
327
|
+
// are NOT a reachable artifact: corrupt/unparseable .json or tmp leftovers.
|
|
328
|
+
const repaired = await loadManifestWithRepair(rootDir);
|
|
329
|
+
const liveIds = new Set(repaired.artifacts.filter((a) => a?.id).map((a) => a.id));
|
|
330
|
+
const now = Date.now();
|
|
331
|
+
let entries;
|
|
332
|
+
try {
|
|
333
|
+
entries = await readdir(baseDir, { withFileTypes: true });
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
for (const entry of entries) {
|
|
339
|
+
if (!entry.isDirectory())
|
|
340
|
+
continue;
|
|
341
|
+
const kindDir = resolveProjectPath(rootDir, join(baseDir, entry.name));
|
|
342
|
+
const files = await readdir(kindDir, { withFileTypes: true }).catch(() => []);
|
|
343
|
+
for (const file of files) {
|
|
344
|
+
if (!file.isFile())
|
|
345
|
+
continue;
|
|
346
|
+
const fullPath = resolveProjectPath(rootDir, join(kindDir, file.name));
|
|
347
|
+
const fileStat = await stat(fullPath).catch(() => null);
|
|
348
|
+
if (!fileStat)
|
|
349
|
+
continue;
|
|
350
|
+
// Grace period: never touch a freshly written file (closes the persist/GC TOCTOU).
|
|
351
|
+
if (now - fileStat.mtimeMs < GC_MIN_AGE_MS)
|
|
352
|
+
continue;
|
|
353
|
+
// A leftover atomic-write temp file: orphaned by a crashed write. Always reclaimable.
|
|
354
|
+
const isTmp = file.name.includes(".tmp");
|
|
355
|
+
// A .json that does NOT parse as a reachable artifact id is dead weight.
|
|
356
|
+
const id = file.name.replace(/\.json$/, "");
|
|
357
|
+
const isOrphanArtifact = file.name.endsWith(".json") && !liveIds.has(id);
|
|
358
|
+
if (!isTmp && !isOrphanArtifact)
|
|
359
|
+
continue;
|
|
360
|
+
const removed = await unlink(fullPath).then(() => true).catch(() => false);
|
|
361
|
+
if (removed) {
|
|
362
|
+
deletedFiles += 1;
|
|
363
|
+
freedBytes += fileStat.size;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
return { deletedFiles, freedBytes };
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/core/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface LineRange {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
}
|
|
5
|
+
export type BoundedRange = {
|
|
6
|
+
start: number;
|
|
7
|
+
end: number;
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
omitted: string;
|
|
11
|
+
};
|
|
12
|
+
/** One open-file snapshot for all requested ranges; never retain skipped lines.
|
|
13
|
+
* LF coordinates and CR/UTF-8 bytes match readFile(...).split("\n"). */
|
|
14
|
+
export declare function readBoundedRanges(path: string, ranges: LineRange[], maxRangeBytes: number): Promise<Map<string, BoundedRange>>;
|
|
15
|
+
//# sourceMappingURL=bounded-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-source.d.ts","sourceRoot":"","sources":["../../src/core/bounded-source.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAC1D,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAG9F;wEACwE;AACxE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,MAAM,GACvD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAgDpC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
const MAX_SCAN_BYTES = 64 * 1024 * 1024;
|
|
4
|
+
/** One open-file snapshot for all requested ranges; never retain skipped lines.
|
|
5
|
+
* LF coordinates and CR/UTF-8 bytes match readFile(...).split("\n"). */
|
|
6
|
+
export async function readBoundedRanges(path, ranges, maxRangeBytes) {
|
|
7
|
+
const selected = new Map(ranges.map(range => [`${range.start}:${range.end}`, {
|
|
8
|
+
...range, chunks: [], bytes: 0, oversized: false,
|
|
9
|
+
}]));
|
|
10
|
+
const lastRequested = Math.max(...ranges.map(range => range.end));
|
|
11
|
+
const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
12
|
+
try {
|
|
13
|
+
const before = await handle.stat();
|
|
14
|
+
if (!before.isFile())
|
|
15
|
+
return new Map([...selected.keys()].map(key => [key, { omitted: "not a regular file" }]));
|
|
16
|
+
const buffer = Buffer.alloc(64 * 1024);
|
|
17
|
+
let line = 1, position = 0, eof = false, failure = "";
|
|
18
|
+
while (line <= lastRequested) {
|
|
19
|
+
if (position >= MAX_SCAN_BYTES) {
|
|
20
|
+
failure = "exceeds 64 MiB range scan limit";
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, MAX_SCAN_BYTES - position), position);
|
|
24
|
+
if (!bytesRead) {
|
|
25
|
+
eof = true;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
position += bytesRead;
|
|
29
|
+
const chunk = buffer.subarray(0, bytesRead);
|
|
30
|
+
if (chunk.includes(0)) {
|
|
31
|
+
failure = "binary file";
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
let offset = 0;
|
|
35
|
+
while (offset < bytesRead && line <= lastRequested) {
|
|
36
|
+
const newline = chunk.indexOf(10, offset);
|
|
37
|
+
const end = newline < 0 ? bytesRead : newline;
|
|
38
|
+
for (const range of selected.values()) {
|
|
39
|
+
if (range.oversized || line < range.start || line > range.end)
|
|
40
|
+
continue;
|
|
41
|
+
// A selected final line has no LF; interior lines preserve their LF.
|
|
42
|
+
const stop = newline >= 0 && line < range.end ? end + 1 : end;
|
|
43
|
+
const size = stop - offset;
|
|
44
|
+
if (range.bytes + size > maxRangeBytes) {
|
|
45
|
+
range.oversized = true;
|
|
46
|
+
range.chunks = [];
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (size)
|
|
50
|
+
range.chunks.push(Buffer.from(chunk.subarray(offset, stop)));
|
|
51
|
+
range.bytes += size;
|
|
52
|
+
}
|
|
53
|
+
if (newline < 0)
|
|
54
|
+
break;
|
|
55
|
+
line++;
|
|
56
|
+
offset = newline + 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const after = await handle.stat();
|
|
60
|
+
if (before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs)
|
|
61
|
+
failure = "file changed during range read; retry";
|
|
62
|
+
return new Map([...selected].map(([key, range]) => {
|
|
63
|
+
// A scan limit only invalidates unfinished ranges. Binary or modified
|
|
64
|
+
// snapshots invalidate every range from this file.
|
|
65
|
+
if (failure && (failure !== "exceeds 64 MiB range scan limit" || range.end >= line))
|
|
66
|
+
return [key, { omitted: failure }];
|
|
67
|
+
if (range.start > line && eof)
|
|
68
|
+
return [key, { omitted: `${range.start}: beyond end of file` }];
|
|
69
|
+
if (range.oversized)
|
|
70
|
+
return [key, { omitted: `${range.start}-${range.end}: over budget; request narrower targets or raise max_tokens` }];
|
|
71
|
+
return [key, { start: range.start, end: Math.min(range.end, line), text: Buffer.concat(range.chunks).toString("utf8") }];
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await handle.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=bounded-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-source.js","sourceRoot":"","sources":["../../src/core/bounded-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type SemanticDiffResult } from "./semantic-diff.js";
|
|
2
|
+
import { type TestImpactResult } from "./test-impact.js";
|
|
3
|
+
export interface ChangedSinceOptions {
|
|
4
|
+
since?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DependentEntry {
|
|
7
|
+
/** A changed file. */
|
|
8
|
+
path: string;
|
|
9
|
+
/** Files that import it (its blast radius at file granularity). */
|
|
10
|
+
importers: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface ChangedSinceResult {
|
|
13
|
+
ref: string;
|
|
14
|
+
changes: SemanticDiffResult;
|
|
15
|
+
tests: TestImpactResult;
|
|
16
|
+
/** For each changed file, the files that import it (impact surface). */
|
|
17
|
+
dependents: DependentEntry[];
|
|
18
|
+
}
|
|
19
|
+
export declare function computeChangedSince(rootDir: string, options?: ChangedSinceOptions): Promise<ChangedSinceResult>;
|
|
20
|
+
//# sourceMappingURL=changed-since.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changed-since.d.ts","sourceRoot":"","sources":["../../src/core/changed-since.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAG5E,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,wEAAwE;IACxE,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAiC7B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// changed_since — the per-PR review pack in one call.
|
|
2
|
+
//
|
|
3
|
+
// FEATURE: Reviewing a PR / picking the next stacked PR means answering three
|
|
4
|
+
// questions together: what symbols changed, which tests must run, and what else
|
|
5
|
+
// depends on the changed files. This composes semantic_diff + test_impact + a
|
|
6
|
+
// graph-based dependents lookup since a git ref, so an agent gets the whole
|
|
7
|
+
// review picture in a single token-lean call instead of three round-trips.
|
|
8
|
+
import { computeSemanticDiff } from "./semantic-diff.js";
|
|
9
|
+
import { computeTestImpact } from "./test-impact.js";
|
|
10
|
+
import { getDB } from "./db.js";
|
|
11
|
+
export async function computeChangedSince(rootDir, options = {}) {
|
|
12
|
+
const ref = options.since ?? "HEAD";
|
|
13
|
+
// semantic_diff and test_impact are independent — run them concurrently.
|
|
14
|
+
const [changes, tests] = await Promise.all([
|
|
15
|
+
computeSemanticDiff(rootDir, { since: ref }),
|
|
16
|
+
computeTestImpact(rootDir, { since: ref }),
|
|
17
|
+
]);
|
|
18
|
+
// Dependents: for each changed file, the files that import it (file-level blast
|
|
19
|
+
// radius) from the indexed import graph. Use the UNION of files with symbol
|
|
20
|
+
// changes AND all changed files reported by test_impact — a file edited only
|
|
21
|
+
// outside parsed symbols (an import-only or top-level side-effect change) won't
|
|
22
|
+
// appear in semantic_diff's files but still has importers worth surfacing.
|
|
23
|
+
const changedPaths = new Set([
|
|
24
|
+
...changes.files.map((f) => f.path),
|
|
25
|
+
...tests.changedFiles,
|
|
26
|
+
]);
|
|
27
|
+
const db = await getDB(rootDir);
|
|
28
|
+
const dependents = [];
|
|
29
|
+
for (const path of [...changedPaths].sort()) {
|
|
30
|
+
const row = db.getFile(path);
|
|
31
|
+
if (!row)
|
|
32
|
+
continue;
|
|
33
|
+
const importers = db.getImportersOf(row.id)
|
|
34
|
+
.map((imp) => db.getFileById(imp.source_file_id)?.path)
|
|
35
|
+
.filter((p) => typeof p === "string")
|
|
36
|
+
.sort();
|
|
37
|
+
if (importers.length > 0) {
|
|
38
|
+
dependents.push({ path, importers });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { ref, changes, tests, dependents };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=changed-since.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changed-since.js","sourceRoot":"","sources":["../../src/core/changed-since.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAE3E,OAAO,EAAE,mBAAmB,EAA2B,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAyB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAqBhC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,UAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IAEpC,yEAAyE;IACzE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,mBAAmB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC5C,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;KAC3C,CAAC,CAAC;IAEH,gFAAgF;IAChF,4EAA4E;IAC5E,6EAA6E;IAC7E,gFAAgF;IAChF,2EAA2E;IAC3E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS;QACnC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACnC,GAAG,KAAK,CAAC,YAAY;KACtB,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,SAAS,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;aACjD,IAAI,EAAE,CAAC;QACV,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function hasConfiguredChatModel(rootDir: string): Promise<boolean>;
|
|
2
|
+
export declare function chatModelIdentity(rootDir: string): Promise<string>;
|
|
3
|
+
export declare function chatCompletion(rootDir: string, prompt: string, options?: {
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
maxOutputTokens?: number;
|
|
6
|
+
}): Promise<string>;
|
|
7
|
+
export declare function extractJsonBlock(raw: string): string | null;
|
|
8
|
+
//# sourceMappingURL=chat-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-model.d.ts","sourceRoot":"","sources":["../../src/core/chat-model.ts"],"names":[],"mappings":"AA8EA,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9E;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxE;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CrJ;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS3D"}
|