contextpro-mcp 0.0.0-stage → 1.4.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 +416 -0
- package/INSTALL.md +128 -0
- package/INSTRUCTIONS.md +33 -0
- package/LICENSE +21 -0
- package/NOTICE +12 -0
- package/README.md +164 -2
- package/SECURITY.md +27 -0
- package/agent-guide.md +323 -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 +94 -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 +53 -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 +8 -0
- package/build/core/root-guard.d.ts.map +1 -0
- package/build/core/root-guard.js +53 -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 +599 -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 +349 -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 +26 -0
- package/docs/architecture.md +35 -0
- package/docs/configuration.md +178 -0
- package/docs/maintenance.md +77 -0
- package/package.json +80 -4
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { basename, relative } from "node:path";
|
|
2
|
+
import { searchTerms } from "../core/embeddings.js";
|
|
3
|
+
import { isTestEvidence, isTestFile } from "./retrieval-helpers.js";
|
|
4
|
+
const BACKEND_DIRECTORY = /(?:^|\/)(?:api|backend|server|services?|workers?|scripts?)(?:\/|$)/i;
|
|
5
|
+
export const SCOPE_CLAUSE_BOUNDARY = /;|[.!?](?=\s|$)|(?:^|\s)(?:but|however|instead)(?=\s|$)|(?:,\s*|\s+(?:and|then)\s+)(?=(?:include|including|show|find|read|open|locate|search|review|inspect|in|under|inside|within)\b)/i;
|
|
6
|
+
// Ambiguous exclusions must introduce evidence, not behavior such as skipping comments.
|
|
7
|
+
const EXCLUDED_FILE_CLAUSE = /(?:^|[\s(])(?:exclude|excluding|ignore|ignoring|(?:(?:do\s+not|don't)\s+(?:read|include|open|show|find|locate|search|review|inspect)|skip(?:ping)?|omit(?:ting)?|avoid(?:ing)?|without)(?=\s+(?:(?:the|any|relevant|existing|historical|archived?|old)\s+)*(?:tests?|testing|fixtures?|mocks?|regressions?|coverage|assert|locales?|translations?|translate|i18n|l10n|locali[sz](?:ation|e)|wording|copy|strings?|messages?|lockfile|lock\s+file|integrity|resolved|transitive|dependencies|dependency|readme|roadmap|handoff|readiness|docs?|documentation|documents?|notes?|history|blog\s+(?:posts?|articles?)|reports?|plans?|specs?|specifications?|(?:task|design|implementation)\s+(?:plans?|specs?|specifications?)|(?:product|project|repository|api|setup|developer|user|security|compliance)\s+docs|(?:project|repository)\s+(?:instructions|status)|(?:repo(?:sitory)?|project|codebase)\s+(?:orientation|overview)|(?:orientation|overview)\s+(?:(?:of|to|the)\s+)*(?:repo(?:sitory)?|project|codebase)|(?:status|qa|audit)\s+(?:documents?|reports?)|agent\s+brief|[\w@./-]+\.[A-Za-z][\w]*)(?=\s|[;,.!?]|$)))(?=\s|:|$)/i;
|
|
8
|
+
/** A negative read is neither a requested file nor an instruction to read whole files. */
|
|
9
|
+
export function positiveDiscoveryQuery(query) {
|
|
10
|
+
return query.split(SCOPE_CLAUSE_BOUNDARY).map(clause => clause.split(EXCLUDED_FILE_CLAUSE)[0]).join(" ");
|
|
11
|
+
}
|
|
12
|
+
/** Keep explicit phrases and compound keys intact alongside prose keywords. */
|
|
13
|
+
export function queryLiterals(query) {
|
|
14
|
+
const quoted = [...query.matchAll(/(["'`])([^"'`\n]{2,200})\1/g)].map(match => match[2]);
|
|
15
|
+
const keys = query.match(/\b[A-Za-z][\w$]*(?:[._][A-Za-z][\w$]*)+\b/g) ?? [];
|
|
16
|
+
return [...new Set([...quoted, ...keys].map(text => text.normalize("NFC").toLowerCase()))].slice(0, 8);
|
|
17
|
+
}
|
|
18
|
+
/** Secondary evidence stays available, but must not crowd out implementations. */
|
|
19
|
+
export function discoveryPathWeight(query, path, exactSymbol = false, documentHeadings) {
|
|
20
|
+
if (/\.(?:md|mdx|rst|txt)$/i.test(path) && /(?:^|\/)(?:blog|posts)\//i.test(path)
|
|
21
|
+
&& query.split(SCOPE_CLAUSE_BOUNDARY).some(clause => {
|
|
22
|
+
const negative = EXCLUDED_FILE_CLAUSE.exec(clause);
|
|
23
|
+
return negative && /\bblog\s+(?:posts?|articles?)\b/i.test(clause.slice(negative.index));
|
|
24
|
+
}))
|
|
25
|
+
return 0;
|
|
26
|
+
const documentStem = /\.(?:md|mdx|rst|txt)$/i.test(path) ? basename(path).replace(/\.[^.]+$/, "").toLowerCase() : undefined;
|
|
27
|
+
let mentionWeight;
|
|
28
|
+
for (const match of query.matchAll(/[\w@./-]+\.[A-Za-z][\w]*(?::\d+(?:-\d+)?)?|\b(?:readme|roadmap|handoff|readiness)\b/gi)) {
|
|
29
|
+
const token = match[0].replace(/:\d+(?:-\d+)?$/, "").replace(/^\.\//, "");
|
|
30
|
+
if (token.startsWith("/") || !(token === path || (!token.includes("/") && token === basename(path)) || path.endsWith(`/${token}`)
|
|
31
|
+
|| token.toLowerCase() === documentStem))
|
|
32
|
+
continue;
|
|
33
|
+
const clause = query.slice(0, match.index + match[0].length).split(SCOPE_CLAUSE_BOUNDARY).at(-1) ?? "";
|
|
34
|
+
const negative = EXCLUDED_FILE_CLAUSE.test(clause);
|
|
35
|
+
// A repeated title alone cannot undo an earlier exclusion.
|
|
36
|
+
if (mentionWeight === 0 && !negative && token.toLowerCase() === documentStem
|
|
37
|
+
&& !/\b(?:include|including|show|find|read|open|locate|search|review|inspect)\s+(?:(?:the|any|relevant|existing|historical|archived?|old)\s+)*$/i.test(clause.slice(0, -match[0].length)))
|
|
38
|
+
continue;
|
|
39
|
+
mentionWeight = negative ? 0 : 1;
|
|
40
|
+
}
|
|
41
|
+
if (mentionWeight !== undefined)
|
|
42
|
+
return mentionWeight;
|
|
43
|
+
if (documentStem !== undefined) {
|
|
44
|
+
const labels = `${path} ${documentHeadings ?? ""}`.replace(/[_-]/g, " ");
|
|
45
|
+
const excluded = new Set();
|
|
46
|
+
for (const clause of query.split(SCOPE_CLAUSE_BOUNDARY)) {
|
|
47
|
+
const negative = EXCLUDED_FILE_CLAUSE.exec(clause);
|
|
48
|
+
const action = negative ?? /\b(?:include|including|show|find|read|open|locate|search|review|inspect)\b/i.exec(clause);
|
|
49
|
+
if (!action)
|
|
50
|
+
continue;
|
|
51
|
+
const object = clause.slice(action.index + action[0].length);
|
|
52
|
+
if (/\b(?:historical|archived?|old)\b/i.test(object) && !/\b(?:archive[ds]?|historical|history|old)\b/i.test(labels))
|
|
53
|
+
continue;
|
|
54
|
+
for (const match of object.matchAll(/(?:^|,|\band\b)\s*(?:(?:the|any|relevant|existing|historical|archived?|old)\s+)*(?:(?:task|design|implementation)\s+)?(docs?|documentation|documents?|plans?|specs?|specifications?)\b(?![/.])/gi)) {
|
|
55
|
+
const category = /^doc/i.test(match[1]) ? "documents" : /^plan/i.test(match[1]) ? "plans" : "specifications";
|
|
56
|
+
const matches = category === "documents" || (category === "plans" ? /\bplans?\b/i : /\b(?:specs?|specifications?)\b/i).test(labels);
|
|
57
|
+
// A later category request may match an as-yet unread heading. Keep
|
|
58
|
+
// that candidate until the caller supplies its actual headings.
|
|
59
|
+
if (!matches && (negative || documentHeadings !== undefined))
|
|
60
|
+
continue;
|
|
61
|
+
if (negative)
|
|
62
|
+
excluded.add(category);
|
|
63
|
+
else {
|
|
64
|
+
excluded.delete(category);
|
|
65
|
+
excluded.delete("documents");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (excluded.size)
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
const excludesTests = query.split(SCOPE_CLAUSE_BOUNDARY).some(clause => {
|
|
73
|
+
const exclusion = EXCLUDED_FILE_CLAUSE.exec(clause);
|
|
74
|
+
return exclusion && /\b(?:tests?|testing|specs?|fixtures?|mocks?|regressions?|coverage|assert)\b/i.test(clause.slice(exclusion.index).replace(/[\w@./-]+\.[A-Za-z][\w]*/g, ""));
|
|
75
|
+
});
|
|
76
|
+
query = positiveDiscoveryQuery(query);
|
|
77
|
+
if (query.toLowerCase().includes(path.toLowerCase()))
|
|
78
|
+
return 1;
|
|
79
|
+
if (/\.(?:md|mdx|rst|txt)$/i.test(path) && /(?:^|\/)(?:archive[ds]?|historical|history)(?:\/|$)/i.test(path)
|
|
80
|
+
&& !/\b(?:archive[ds]?|historical|history)\b|\bold\s+(?:(?:task|design|implementation|product|project|repository|api|setup|developer|user|security|compliance)\s+)?(?:docs?|documentation|documents?|readme|roadmap|handoff|notes?|reports?|plans?|specs?|specifications?)\b/i.test(query))
|
|
81
|
+
return .25;
|
|
82
|
+
if (isLockfile(path) && !wantsLockfile(query))
|
|
83
|
+
return .15;
|
|
84
|
+
if ((isTestEvidence(path) || /(?:^|\/)(?:tests?|__tests__|fixtures?)(?:\/|$)/i.test(path))
|
|
85
|
+
&& (!exactSymbol || excludesTests)
|
|
86
|
+
&& !/\b(?:tests?|testing|specs?|fixtures?|mocks?|regressions?|coverage|assert)\b/i.test(query))
|
|
87
|
+
return .2;
|
|
88
|
+
const locale = /(?:^|\/)(?:locales?|translations?|messages|i18n|l10n)(?:\/|\.)/i.test(path) && /\.(?:json|ya?ml|[cm]?[jt]sx?)$/i.test(path);
|
|
89
|
+
if (locale && !exactSymbol && !/\b(?:locales?|translations?|translate|i18n|l10n|locali[sz](?:ation|e)|wording|copy|strings?|messages?)\b/i.test(searchTerms(query).join(" ")))
|
|
90
|
+
return .2;
|
|
91
|
+
// Known report locations can repeat implementation terms without containing
|
|
92
|
+
// the implementation. An extension alone says nothing about that role: JSON
|
|
93
|
+
// configuration, Markdown content and CSV data can be primary source evidence.
|
|
94
|
+
const reportPath = /(?:^|\/)(?:reports|benchmark-results|test-results|coverage)\/|(?:^|\/)docs\/benchmarks\//i.test(path);
|
|
95
|
+
if (/\b(?:implementation|code|pipeline|source)\b/i.test(query)
|
|
96
|
+
&& !/\b(?:report|reports|documentation|docs|results|dataset)\b/i.test(query)
|
|
97
|
+
&& reportPath
|
|
98
|
+
&& /\.(?:json|jsonl|md|csv)$/i.test(path))
|
|
99
|
+
return .35;
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
/** A broad visual task should find renderers before incidental service prose. */
|
|
103
|
+
export function facetPathWeight(query, term, path) {
|
|
104
|
+
const prior = discoveryPathWeight(query, path);
|
|
105
|
+
const visualTerms = new Set(query.toLowerCase().match(/\b(?:visual|illustration|animation|layout|theme|accent|onboarding|ui)\b/g) ?? []);
|
|
106
|
+
// Preserve direct path/topic matches, including non-UI theme/config modules.
|
|
107
|
+
if (visualTerms.size >= 2 && !path.toLowerCase().includes(term) && /\.[jt]sx$/i.test(path))
|
|
108
|
+
return prior * 1.5;
|
|
109
|
+
return prior;
|
|
110
|
+
}
|
|
111
|
+
/** Hints select only known indexed paths; query text never becomes an unchecked read. */
|
|
112
|
+
export function mentionedFiles(root, query, files) {
|
|
113
|
+
const positive = positiveDiscoveryQuery(query);
|
|
114
|
+
const tokens = new Set((positive.match(/[\w@./-]+\.[A-Za-z][\w]*(?::\d+(?:-\d+)?)?/g) ?? [])
|
|
115
|
+
.map(token => token.replace(/:\d+(?:-\d+)?$/, "").replace(/^\.\//, "")));
|
|
116
|
+
// Uppercase runbook stems also name real documents; never invent a read path.
|
|
117
|
+
const stems = new Set(positive.match(/\b[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+\b/g) ?? []);
|
|
118
|
+
for (const file of files)
|
|
119
|
+
if (/\.(?:md|mdx|rst|txt)$/i.test(file.path) && stems.has(basename(file.path).replace(/\.[^.]+$/, "")))
|
|
120
|
+
tokens.add(file.path);
|
|
121
|
+
const paths = new Set(files.map(file => file.path));
|
|
122
|
+
const names = new Map();
|
|
123
|
+
for (const file of files) {
|
|
124
|
+
const name = basename(file.path);
|
|
125
|
+
names.set(name, names.has(name) ? null : file.path);
|
|
126
|
+
}
|
|
127
|
+
return [...new Set([...tokens].flatMap(token => {
|
|
128
|
+
const path = token.startsWith("/") ? relative(root, token) : token;
|
|
129
|
+
const suffixes = !token.startsWith("/") && token.includes("/") && !token.split("/").includes("..")
|
|
130
|
+
? files.filter(file => file.path.endsWith(`/${token}`)) : [];
|
|
131
|
+
const match = paths.has(path) ? path : suffixes.length === 1 ? suffixes[0].path : names.get(token);
|
|
132
|
+
return match ? [match] : [];
|
|
133
|
+
}))];
|
|
134
|
+
}
|
|
135
|
+
/** Require both a UI scope and a broad navigation/orientation request. */
|
|
136
|
+
export function isUiOrientationQuery(query) {
|
|
137
|
+
query = positiveDiscoveryQuery(query);
|
|
138
|
+
const uiScope = /\b(?:ui|ux|frontend|front.end|user.facing|web app|website)\b/i.test(query);
|
|
139
|
+
// Routes/navigation/audit alone also occur in narrow coding requests. Only
|
|
140
|
+
// explicit overview language or a request to inventory product surfaces
|
|
141
|
+
// authorizes structural previews ahead of the ranked implementation.
|
|
142
|
+
const broad = /\b(?:orient|orientation|overview)\b/i.test(query)
|
|
143
|
+
|| /\b(?:map|survey)\s+(?:(?:out|the|our|this|all)\s+)*(?:ui|ux|frontend|front.end|app(?:lication)?|web app)\s+(?:structure|architecture|navigation|routes|screens|components)\b/i.test(query)
|
|
144
|
+
|| /\b(?:find|identify|list|show)\s+(?:(?:the|our|this)\s+)?(?:main|primary|key|all|product)\s+(?:(?:product|ui|ux|frontend|front.end|user.facing|web|app(?:lication)?|user)\s+)*(?:surfaces|screens|routes|components|journey)\b/i.test(query);
|
|
145
|
+
return uiScope && broad;
|
|
146
|
+
}
|
|
147
|
+
export function isOrientationQuery(query) {
|
|
148
|
+
query = positiveDiscoveryQuery(query);
|
|
149
|
+
return isUiOrientationQuery(query) || /\b(?:orient(?:ation)?|overview|understand)\b.*\b(?:repo(?:sitory)?|project|codebase)\b|\b(?:repo(?:sitory)?|project|codebase)\s+(?:orientation|overview)\b/i.test(query);
|
|
150
|
+
}
|
|
151
|
+
export function orientationFiles(db, files, query) {
|
|
152
|
+
if (isUiOrientationQuery(query))
|
|
153
|
+
return uiOrientationFiles(db, files, query);
|
|
154
|
+
const code = files.filter(file => /\.(?:[cm]?[jt]sx?|py|rs|go|java|cs|rb)$/.test(file.path) && !isTestFile(file.path));
|
|
155
|
+
const imports = new Map(files.map(file => [file.id, db.getImportsFrom(file.id)]));
|
|
156
|
+
const incoming = new Map();
|
|
157
|
+
for (const rows of imports.values())
|
|
158
|
+
for (const row of rows) {
|
|
159
|
+
if (row.target_file_id !== null)
|
|
160
|
+
incoming.set(row.target_file_id, (incoming.get(row.target_file_id) ?? 0) + 1);
|
|
161
|
+
}
|
|
162
|
+
const rank = (file) => (incoming.get(file.id) ?? 0) * 2 + imports.get(file.id).length;
|
|
163
|
+
const entry = code.filter(file => /(?:^|\/)(?:index|main|app|server|cli|__main__)\.[^/]+$/.test(file.path))
|
|
164
|
+
// At equal depth, a bootstrap with no callers is a stronger entry candidate
|
|
165
|
+
// than an imported app module, even if that module registers more imports.
|
|
166
|
+
.sort((a, b) => a.path.split("/").length - b.path.split("/").length
|
|
167
|
+
|| (incoming.get(a.id) ?? 0) - (incoming.get(b.id) ?? 0)
|
|
168
|
+
|| imports.get(b.id).length - imports.get(a.id).length || a.path.localeCompare(b.path))[0];
|
|
169
|
+
const hubs = code.filter(file => file !== entry).sort((a, b) => rank(b) - rank(a) || a.path.localeCompare(b.path));
|
|
170
|
+
// Include the leading hub's dependencies, not only ubiquitous utilities.
|
|
171
|
+
const hubDependencies = new Set(hubs[0] ? imports.get(hubs[0].id).map(row => row.target_file_id) : []);
|
|
172
|
+
const core = [...new Set([...hubs.slice(0, 1), ...hubs.filter(file => hubDependencies.has(file.id)).slice(0, 2), ...hubs])].slice(0, 3);
|
|
173
|
+
// The bootstrap also exposes architecture that shared utility rankings miss,
|
|
174
|
+
// such as a job service constructed beside the main client.
|
|
175
|
+
const entryDependencies = new Set(entry ? imports.get(entry.id).map(row => row.target_file_id) : []);
|
|
176
|
+
core.push(...hubs.filter(file => entryDependencies.has(file.id) && !core.includes(file)).slice(0, 2));
|
|
177
|
+
const selected = [
|
|
178
|
+
...files.filter(file => /^(?:package.json|pyproject.toml|Cargo.toml|go.mod)$/.test(file.path)).slice(0, 1),
|
|
179
|
+
...(entry ? [entry] : []), ...core,
|
|
180
|
+
];
|
|
181
|
+
const ids = new Set(selected.map(file => file.id));
|
|
182
|
+
if (/\btests?\b/i.test(query)) {
|
|
183
|
+
const test = files.filter(file => isTestFile(file.path)).sort((a, b) => imports.get(b.id).filter(imp => ids.has(imp.target_file_id)).length - imports.get(a.id).filter(imp => ids.has(imp.target_file_id)).length || a.path.localeCompare(b.path))[0];
|
|
184
|
+
if (test)
|
|
185
|
+
selected.push(test);
|
|
186
|
+
}
|
|
187
|
+
const readme = files.find(file => /^readme\.(?:md|txt|rst)$/i.test(file.path));
|
|
188
|
+
if (readme)
|
|
189
|
+
selected.push(readme);
|
|
190
|
+
return [...new Set(selected.map(file => file.path))];
|
|
191
|
+
}
|
|
192
|
+
/** UI structure supplies candidates even when translated labels do not repeat
|
|
193
|
+
* English query terms. Import edges are heuristic, not resolved references. */
|
|
194
|
+
function uiOrientationFiles(db, files, query) {
|
|
195
|
+
const imports = new Map(files.map(file => [file.id, db.getImportsFrom(file.id)]));
|
|
196
|
+
let ui = files.filter(file => {
|
|
197
|
+
if (discoveryPathWeight(query, file.path) < 1)
|
|
198
|
+
return false;
|
|
199
|
+
if (BACKEND_DIRECTORY.test(file.path) || /\.server\.(?:[cm]?[jt]sx?|vue|svelte)$/i.test(file.path))
|
|
200
|
+
return false;
|
|
201
|
+
if (/\.(?:[jt]sx|vue|svelte)$/.test(file.path))
|
|
202
|
+
return true;
|
|
203
|
+
if (!/\.[cm]?[jt]s$/.test(file.path) || /\.d\.[cm]?ts$/.test(file.path))
|
|
204
|
+
return false;
|
|
205
|
+
const modules = imports.get(file.id).map(row => row.target_path);
|
|
206
|
+
const framework = modules.some(path => /^(?:@angular\/|react(?:-dom|-router(?:-dom)?)?(?:\/|$)|preact(?:\/|$)|lit(?:-element|-html)?(?:\/|$)|vue(?:\/|$)|svelte(?:\/|$)|solid-js(?:\/|$))/.test(path));
|
|
207
|
+
const uiPath = /(?:^|\/)(?:components?|pages?|screens?|views?|layouts?|navigation|client|frontend)(?:\/|$)|\.component\.[cm]?[jt]s$/i.test(file.path);
|
|
208
|
+
const entry = /^(?:app|main|router|routes|navigation)(?:\.[\w-]+)?\.[cm]?[jt]s$/i.test(basename(file.path));
|
|
209
|
+
const backend = modules.some(path => /^(?:express|fastify|koa|node:http)(?:\/|$)/.test(path));
|
|
210
|
+
return framework || uiPath || (entry && !backend);
|
|
211
|
+
});
|
|
212
|
+
const terms = new Set(searchTerms(query));
|
|
213
|
+
const appScopes = new Map();
|
|
214
|
+
for (const file of files) {
|
|
215
|
+
const match = file.path.match(/^(apps|packages)\/([^/]+)\//);
|
|
216
|
+
if (match)
|
|
217
|
+
appScopes.set(match[0], { container: match[1], name: match[2] });
|
|
218
|
+
}
|
|
219
|
+
const paths = (query.toLowerCase().match(/[\p{L}\p{N}_./@-]+/gu) ?? []).map(path => path.replace(/\.+$/, ""));
|
|
220
|
+
const explicitScopes = [...appScopes.keys()].filter(scope => {
|
|
221
|
+
const path = scope.toLowerCase(), bare = path.slice(0, -1);
|
|
222
|
+
return paths.some(token => token === bare || token.startsWith(path) || token.endsWith(`/${bare}`) || token.includes(`/${path}`));
|
|
223
|
+
});
|
|
224
|
+
// Prefer matching app names over shared-package names. An unrelated apps/
|
|
225
|
+
// entry must not prevent selecting a requested package-hosted application.
|
|
226
|
+
// Explicit paths can still select any package.
|
|
227
|
+
const genericNames = new Set(["ui", "ux", "shared", "common", "components"]);
|
|
228
|
+
const namedScopes = [...appScopes].filter(([, scope]) => {
|
|
229
|
+
// An unqualified "UI" request does not name a package called ui. Its
|
|
230
|
+
// explicit path remains available through explicitScopes above.
|
|
231
|
+
const words = searchTerms(scope.name).filter(word => !genericNames.has(word));
|
|
232
|
+
return words.length > 0 && words.every(word => terms.has(word));
|
|
233
|
+
}).map(([scope]) => scope);
|
|
234
|
+
// "Product frontend ... billing" names product as the application and billing
|
|
235
|
+
// as a feature. Prefer qualified application names over incidental topic words.
|
|
236
|
+
const qualifiedScopes = namedScopes.filter(scope => {
|
|
237
|
+
const name = searchTerms(appScopes.get(scope).name).filter(word => !genericNames.has(word))
|
|
238
|
+
.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[\\s_-]+");
|
|
239
|
+
const qualifier = "(?:frontend|front[- ]end|ui|ux|web\\s+app|apps?|applications?)";
|
|
240
|
+
return new RegExp(`(?<![\\p{L}\\p{N}_])${name}\\s+${qualifier}\\b|\\b(?:app|application)\\s+(?:(?:named|called)\\s+)?${name}(?![\\p{L}\\p{N}_])`, "iu").test(query);
|
|
241
|
+
});
|
|
242
|
+
const matchedScopes = qualifiedScopes.length ? qualifiedScopes : namedScopes;
|
|
243
|
+
const namedApps = matchedScopes.filter(scope => appScopes.get(scope).container === "apps");
|
|
244
|
+
const requestedScopes = explicitScopes.length ? explicitScopes : namedApps.length ? namedApps : matchedScopes;
|
|
245
|
+
if (requestedScopes.length)
|
|
246
|
+
ui = ui.filter(file => requestedScopes.some(scope => file.path.startsWith(scope)));
|
|
247
|
+
const ids = new Set(ui.map(file => file.id));
|
|
248
|
+
const incoming = new Map();
|
|
249
|
+
for (const file of ui)
|
|
250
|
+
for (const row of imports.get(file.id)) {
|
|
251
|
+
if (row.target_file_id !== null)
|
|
252
|
+
incoming.set(row.target_file_id, (incoming.get(row.target_file_id) ?? 0) + 1);
|
|
253
|
+
}
|
|
254
|
+
const overlap = (file) => searchTerms(basename(file.path)).filter(term => terms.has(term)).length;
|
|
255
|
+
// Prefer modules composing the UI. Ubiquitous leaf utilities/types can have
|
|
256
|
+
// many callers without explaining a screen, so bound their popularity bonus.
|
|
257
|
+
const rank = (file) => (imports.get(file.id) ?? []).filter(row => ids.has(row.target_file_id)).length * 2 + Math.min(4, incoming.get(file.id) ?? 0);
|
|
258
|
+
const sorted = [...ui].sort((a, b) => rank(b) - rank(a) || a.path.localeCompare(b.path));
|
|
259
|
+
const layouts = sorted.filter(file => /(?:^|\/)(?:_?layout|_app)\./i.test(file.path)).sort((a, b) => a.path.split("/").length - b.path.split("/").length || a.path.localeCompare(b.path)).slice(0, 1);
|
|
260
|
+
const routes = sorted.filter(file => /(?:^|\/)(?:page|index|app|main|router)\./i.test(file.path) && !layouts.includes(file)).slice(0, 2);
|
|
261
|
+
const navigation = sorted.filter(file => /(?:navigation|navbar|sidebar|app-shell)/i.test(basename(file.path))).slice(0, 2);
|
|
262
|
+
const hubs = sorted.filter(file => !layouts.includes(file) && !routes.includes(file)).slice(0, 2);
|
|
263
|
+
const topics = [];
|
|
264
|
+
// One popular feature must not occupy every feature slot. Prefer a direct
|
|
265
|
+
// basename match for each requested topic, then use structural rank as a tie.
|
|
266
|
+
for (const term of terms) {
|
|
267
|
+
const matches = ui.filter(file => searchTerms(basename(file.path)).includes(term));
|
|
268
|
+
matches.sort((a, b) => searchTerms(basename(a.path)).length - searchTerms(basename(b.path)).length || rank(b) - rank(a) || a.path.localeCompare(b.path));
|
|
269
|
+
if (matches[0] && !topics.includes(matches[0]))
|
|
270
|
+
topics.push(matches[0]);
|
|
271
|
+
}
|
|
272
|
+
// Reserve the entry/layout evidence before a long feature inventory fills
|
|
273
|
+
// the bounded candidate list, including when the response budget is small.
|
|
274
|
+
const selected = [...new Set([...layouts, ...routes, ...navigation, ...hubs, ...topics])].slice(0, 11);
|
|
275
|
+
if (/\b(?:styles?|tokens?|theme|css)\b/i.test(query)) {
|
|
276
|
+
const imported = new Set(selected.flatMap(file => (imports.get(file.id) ?? []).map(row => row.target_file_id)));
|
|
277
|
+
const scope = (path) => path.match(/^(?:apps|packages)\/[^/]+\//)?.[0] ?? "";
|
|
278
|
+
const scopes = new Set(selected.map(file => scope(file.path)));
|
|
279
|
+
const proximity = (file) => Math.max(0, ...selected.map(source => {
|
|
280
|
+
const a = file.path.split("/"), b = source.path.split("/");
|
|
281
|
+
let shared = 0;
|
|
282
|
+
while (shared < Math.min(a.length, b.length) - 1 && a[shared] === b[shared])
|
|
283
|
+
shared++;
|
|
284
|
+
return shared;
|
|
285
|
+
}));
|
|
286
|
+
const styles = files.filter(file => /\.(?:css|scss|sass|less)$/.test(file.path)
|
|
287
|
+
&& discoveryPathWeight(query, file.path) >= 1
|
|
288
|
+
&& !BACKEND_DIRECTORY.test(file.path)
|
|
289
|
+
&& (imported.has(file.id) || (scopes.has(scope(file.path))
|
|
290
|
+
&& (scope(file.path) !== "" || proximity(file) > 0
|
|
291
|
+
|| /^(?:(?:assets|styles?|public\/(?:assets|styles?))\/|(?:globals?|styles?|theme)\.)/i.test(file.path)))));
|
|
292
|
+
styles.sort((a, b) => Number(imported.has(b.id)) - Number(imported.has(a.id)) || proximity(b) - proximity(a) || overlap(b) - overlap(a) || a.path.localeCompare(b.path));
|
|
293
|
+
if (styles[0])
|
|
294
|
+
selected.push(styles[0]);
|
|
295
|
+
}
|
|
296
|
+
return selected.map(file => file.path);
|
|
297
|
+
}
|
|
298
|
+
/** Mixed documentation/control requests often put decisive topics after the
|
|
299
|
+
* broad FTS query's token limit. Give each clause one bounded source candidate. */
|
|
300
|
+
export function documentTopicFiles(db, query) {
|
|
301
|
+
const generic = new Set("find main files file exact source ranges return include relevant code documentation docs and identify usage disclosures".split(" "));
|
|
302
|
+
const clauses = query.split(/[,;:]|\.\s|\band\b/i).map(clause => searchTerms(clause).filter(term => !generic.has(term))).filter(terms => terms.length).slice(0, 16);
|
|
303
|
+
if (clauses.length < 2)
|
|
304
|
+
return [];
|
|
305
|
+
const files = db.getAllFiles().filter(file => discoveryPathWeight(query, file.path) >= 1);
|
|
306
|
+
const selected = new Map();
|
|
307
|
+
for (const terms of clauses) {
|
|
308
|
+
const hits = db.searchFileText(terms.join(" "), 32, false, true).filter(hit => discoveryPathWeight(query, hit.path) >= 1);
|
|
309
|
+
// A partial basename match must never beat a complete multiword FTS hit.
|
|
310
|
+
const exact = files.filter(file => terms.every(term => searchTerms(basename(file.path)).includes(term)))
|
|
311
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
312
|
+
const paths = [...new Set([...exact.slice(0, 1).map(file => file.path), ...hits.slice(0, terms.length > 1 ? 2 : 1).map(hit => hit.path)])];
|
|
313
|
+
for (const path of paths) {
|
|
314
|
+
if (!selected.has(path) && selected.size >= 16)
|
|
315
|
+
continue;
|
|
316
|
+
const words = selected.get(path) ?? new Set();
|
|
317
|
+
terms.forEach(term => words.add(term));
|
|
318
|
+
selected.set(path, words);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return [...selected].map(([file, terms]) => ({ file, terms: [...terms] }));
|
|
322
|
+
}
|
|
323
|
+
export function isLockfile(path) {
|
|
324
|
+
return /(?:^|\/)(?:package-lock.json|npm-shrinkwrap.json|pnpm-lock.yaml|yarn.lock|bun.lockb?|Cargo.lock|poetry.lock|uv.lock|Gemfile.lock|go.sum)$/i.test(path);
|
|
325
|
+
}
|
|
326
|
+
export function wantsLockfile(query) {
|
|
327
|
+
return /lockfile|lock\s*file|package-lock|shrinkwrap|pnpm-lock|yarn\.lock|bun\.lock|cargo\.lock|poetry\.lock|uv\.lock|gemfile\.lock|go\.sum|\b(?:integrity|resolved|transitive|dependencies|dependency)\b/i.test(query);
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=discovery-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-hints.js","sourceRoot":"","sources":["../../src/tools/discovery-hints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type EfficiencyScope = "session" | "24h" | "7d" | "all";
|
|
2
|
+
export interface EfficiencyReportOptions {
|
|
3
|
+
rootDir: string;
|
|
4
|
+
scope?: EfficiencyScope;
|
|
5
|
+
sessionStartedAt?: number;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
inputCostPerMillion?: number;
|
|
8
|
+
contextproCostUsd?: number;
|
|
9
|
+
historyLimit?: number;
|
|
10
|
+
format?: "text" | "json";
|
|
11
|
+
}
|
|
12
|
+
export declare function getEfficiencyReport(options: EfficiencyReportOptions): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=efficiency-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency-report.d.ts","sourceRoot":"","sources":["../../src/tools/efficiency-report.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;AAC/D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAYD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD3F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Persistent, auditable context estimates with isolated MCP-session accounting.
|
|
2
|
+
import { getDB } from "../core/db.js";
|
|
3
|
+
import { getToolSchemaTokens, runtimeSessionId, runtimeSessionStartedAt } from "../core/runtime-session.js";
|
|
4
|
+
function sinceFor(scope, started) {
|
|
5
|
+
if (scope === "session")
|
|
6
|
+
return started ?? runtimeSessionStartedAt;
|
|
7
|
+
if (scope === "24h")
|
|
8
|
+
return Date.now() - 86_400_000;
|
|
9
|
+
if (scope === "7d")
|
|
10
|
+
return Date.now() - 7 * 86_400_000;
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const fmt = (n) => Math.max(0, Math.round(n)).toLocaleString("en-US");
|
|
14
|
+
function nonnegative(value, label) {
|
|
15
|
+
if (value !== undefined && (!Number.isFinite(value) || value < 0))
|
|
16
|
+
throw new Error(`${label} must be a finite nonnegative number.`);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
export async function getEfficiencyReport(options) {
|
|
20
|
+
const scope = options.scope ?? "session";
|
|
21
|
+
const since = sinceFor(scope, options.sessionStartedAt);
|
|
22
|
+
const sessionId = scope === "session" ? options.sessionId ?? runtimeSessionId : undefined;
|
|
23
|
+
const db = await getDB(options.rootDir);
|
|
24
|
+
const totals = db.getEfficiencyTotals(since, sessionId);
|
|
25
|
+
const byTool = db.getToolCallAggregates(since, sessionId).sort((a, b) => b.savedTokens - a.savedTokens);
|
|
26
|
+
const history = options.historyLimit === 0 ? [] : db.getToolSavingsHistory(options.historyLimit ?? 10, since, sessionId);
|
|
27
|
+
const rate = nonnegative(options.inputCostPerMillion, "inputCostPerMillion");
|
|
28
|
+
const operatingCost = nonnegative(options.contextproCostUsd, "contextproCostUsd");
|
|
29
|
+
const schemaTokens = scope === "session" ? getToolSchemaTokens() : null;
|
|
30
|
+
const netTokens = totals.sourceTokens - totals.outputTokens - totals.inputTokens - (schemaTokens ?? 0);
|
|
31
|
+
const avoided = Math.max(0, netTokens);
|
|
32
|
+
const cost = rate === undefined ? null : avoided * rate / 1_000_000;
|
|
33
|
+
const costText = cost === null ? "cost unavailable (model price not supplied)" : `$${cost.toFixed(4)} hypothetical input cost avoided`;
|
|
34
|
+
const finalSummary = `ContextPro: ${fmt(totals.calls)} tool calls; ~${fmt(avoided)} input tokens avoided versus full-file reads (estimate); ${costText}.`;
|
|
35
|
+
const report = {
|
|
36
|
+
scope, sessionId: sessionId ?? null, since: since === undefined ? null : new Date(since).toISOString(),
|
|
37
|
+
observed: { toolCalls: totals.calls, errors: totals.errors, averageMs: totals.avgMs, maxMs: totals.maxMs },
|
|
38
|
+
estimate: {
|
|
39
|
+
savedTokens: avoided,
|
|
40
|
+
sourceTokensRepresented: totals.sourceTokens,
|
|
41
|
+
responseTokens: totals.outputTokens,
|
|
42
|
+
requestTokens: totals.inputTokens,
|
|
43
|
+
toolSchemaTokens: schemaTokens,
|
|
44
|
+
netTokensAvoided: netTokens,
|
|
45
|
+
representedFileReferences: totals.representedFiles,
|
|
46
|
+
method: "UTF-8 bytes divided by four. Full-source baseline credits each represented file revision once per process session; subtract all request/response estimates and one advertised tool catalog for session reports. Historical rows may use the older per-call baseline.",
|
|
47
|
+
limitations: ["Not tokenizer measurements or a measured comparison against another agent.", "Client schema loading, repeated prompt history and cache behavior are unknown; one catalog is a scenario assumption.", "Non-session windows combine sessions and older estimates; catalog overhead is unavailable.", "History is bounded to the latest 5,000 calls per project; old periods may be incomplete."],
|
|
48
|
+
},
|
|
49
|
+
calls: { total: totals.calls, errors: totals.errors, averageMs: totals.avgMs, maxMs: totals.maxMs },
|
|
50
|
+
hypotheticalInputCostAvoided: cost === null ? null : {
|
|
51
|
+
usd: Number(cost.toFixed(6)), inputCostPerMillionTokens: rate,
|
|
52
|
+
contextproCostUsd: operatingCost ?? null,
|
|
53
|
+
netUsdAfterSuppliedCosts: operatingCost === undefined ? null : Number((cost - operatingCost).toFixed(6)),
|
|
54
|
+
note: "Scenario only: uncached input pricing, not actual billing savings. Net excludes operating costs unless supplied. No revenue is inferred.",
|
|
55
|
+
},
|
|
56
|
+
actualBillingSavingsUsd: null,
|
|
57
|
+
actualAgentTokensSaved: null,
|
|
58
|
+
finalSummary, byTool, recentSavings: history,
|
|
59
|
+
privacy: "Only numeric metrics, tool names and an opaque session ID are stored. Prompts, responses, source text, and file paths are never retained in efficiency history.",
|
|
60
|
+
};
|
|
61
|
+
if (options.format === "json")
|
|
62
|
+
return JSON.stringify(report, null, 2);
|
|
63
|
+
const lines = [
|
|
64
|
+
`ContextPro Efficiency — ${scope}`, finalSummary,
|
|
65
|
+
`Full-source baseline: ~${fmt(totals.sourceTokens)} tokens; requests: ~${fmt(totals.inputTokens)}; responses: ~${fmt(totals.outputTokens)}.`,
|
|
66
|
+
schemaTokens === null ? "Tool-catalog overhead: unavailable for this history window." : `Tool-catalog allowance: ~${fmt(schemaTokens)} tokens (one catalog; client behavior varies).`,
|
|
67
|
+
`Observed: ${fmt(totals.errors)} errors; average ${fmt(totals.avgMs)}ms per call.`,
|
|
68
|
+
];
|
|
69
|
+
if (netTokens < 0)
|
|
70
|
+
lines.push(`Estimated overhead exceeds this baseline by ~${fmt(-netTokens)} tokens; no savings claimed.`);
|
|
71
|
+
if (cost !== null && operatingCost !== undefined)
|
|
72
|
+
lines.push(`Hypothetical net after supplied ContextPro costs: $${(cost - operatingCost).toFixed(4)}.`);
|
|
73
|
+
if (cost === null)
|
|
74
|
+
lines.push("Pass input_cost_per_million to calculate a price scenario; never guess a model price.");
|
|
75
|
+
lines.push("", "Method: " + report.estimate.method, "Actual agent-token savings and billing savings are unknown. Provider caching and ContextPro costs can change the result.", report.privacy);
|
|
76
|
+
return lines.join("\n");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=efficiency-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency-report.js","sourceRoot":"","sources":["../../src/tools/efficiency-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type UnifiedSearchOptions } from "./search.js";
|
|
2
|
+
export type EvidenceRole = "implementation" | "dependency" | "caller" | "test";
|
|
3
|
+
export interface EvidenceCandidate {
|
|
4
|
+
path: string;
|
|
5
|
+
score: number;
|
|
6
|
+
reason: string;
|
|
7
|
+
symbols: string[];
|
|
8
|
+
roles: EvidenceRole[];
|
|
9
|
+
anchors: number[];
|
|
10
|
+
/** Absolute similarity, never a rank-derived confidence. */
|
|
11
|
+
semanticScore?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const connectedRetrievalEnabled: () => boolean;
|
|
14
|
+
export declare function retrieveEvidence(options: {
|
|
15
|
+
rootDir: string;
|
|
16
|
+
query: string;
|
|
17
|
+
graphHops?: 0 | 1 | 2;
|
|
18
|
+
graphMaxFiles?: number;
|
|
19
|
+
includeTests?: boolean;
|
|
20
|
+
preset?: UnifiedSearchOptions["preset"];
|
|
21
|
+
}): Promise<{
|
|
22
|
+
search: import("./search.js").UnifiedSearchData;
|
|
23
|
+
candidates: EvidenceCandidate[];
|
|
24
|
+
tests: {
|
|
25
|
+
path: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
score: number;
|
|
28
|
+
}[];
|
|
29
|
+
limited: boolean;
|
|
30
|
+
relevanceNotice: string | undefined;
|
|
31
|
+
relationNotice: string | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=evidence-retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-retrieval.d.ts","sourceRoot":"","sources":["../../src/tools/evidence-retrieval.ts"],"names":[],"mappings":"AAKA,OAAO,EAA6C,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAKnG,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC/E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/D,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IACzC,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,eAAO,MAAM,yBAAyB,QAAO,OAA8D,CAAC;AAE5G,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;CACjE;;;;;;;;;;;GAuKA"}
|