codesift-mcp 0.10.2 → 0.12.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/dist/cache/hono-cache.d.ts.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +91 -6
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/embed-child.js +3 -0
- package/dist/cli/embed-child.js.map +1 -1
- package/dist/cli/git-hooks-installer.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +22 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
- package/dist/cli/hooks/pre-tool-use.js +182 -7
- package/dist/cli/hooks/pre-tool-use.js.map +1 -1
- package/dist/cli/hooks/shared.d.ts.map +1 -1
- package/dist/cli/hooks/shared.js +6 -1
- package/dist/cli/hooks/shared.js.map +1 -1
- package/dist/cli/orphan-guard.d.ts +34 -0
- package/dist/cli/orphan-guard.d.ts.map +1 -0
- package/dist/cli/orphan-guard.js +52 -0
- package/dist/cli/orphan-guard.js.map +1 -0
- package/dist/cli/service.d.ts +133 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +317 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/setup/codex.js +1 -1
- package/dist/cli/setup/codex.js.map +1 -1
- package/dist/cli/setup/fs.js.map +1 -1
- package/dist/cli/setup/mcp.d.ts +24 -1
- package/dist/cli/setup/mcp.d.ts.map +1 -1
- package/dist/cli/setup/mcp.js +33 -5
- package/dist/cli/setup/mcp.js.map +1 -1
- package/dist/cli/setup/types.d.ts +5 -0
- package/dist/cli/setup/types.d.ts.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/telemetry-commands.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/formatter-dispatch.d.ts.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +1 -0
- package/dist/instructions.js.map +1 -1
- package/dist/lsp/lsp-client.d.ts.map +1 -1
- package/dist/lsp/lsp-client.js.map +1 -1
- package/dist/lsp/lsp-manager.d.ts.map +1 -1
- package/dist/lsp/lsp-tools.d.ts.map +1 -1
- package/dist/lsp/lsp-tools.js +21 -1
- package/dist/lsp/lsp-tools.js.map +1 -1
- package/dist/parser/astro-template/state.d.ts.map +1 -1
- package/dist/parser/extractors/_shared.d.ts +4 -4
- package/dist/parser/extractors/_shared.d.ts.map +1 -1
- package/dist/parser/extractors/_shared.js.map +1 -1
- package/dist/parser/extractors/conversation.js.map +1 -1
- package/dist/parser/extractors/go.d.ts +2 -2
- package/dist/parser/extractors/go.d.ts.map +1 -1
- package/dist/parser/extractors/go.js.map +1 -1
- package/dist/parser/extractors/gradle-kts.d.ts +2 -2
- package/dist/parser/extractors/gradle-kts.d.ts.map +1 -1
- package/dist/parser/extractors/gradle-kts.js.map +1 -1
- package/dist/parser/extractors/hono-app-discovery.d.ts +2 -2
- package/dist/parser/extractors/hono-app-discovery.d.ts.map +1 -1
- package/dist/parser/extractors/hono-app-discovery.js.map +1 -1
- package/dist/parser/extractors/hono-ast-utils.d.ts +4 -4
- package/dist/parser/extractors/hono-ast-utils.d.ts.map +1 -1
- package/dist/parser/extractors/hono-ast-utils.js.map +1 -1
- package/dist/parser/extractors/hono-context-extractor.d.ts +2 -2
- package/dist/parser/extractors/hono-context-extractor.d.ts.map +1 -1
- package/dist/parser/extractors/hono-context-extractor.js.map +1 -1
- package/dist/parser/extractors/hono-inline-analyzer.d.ts +2 -2
- package/dist/parser/extractors/hono-inline-analyzer.d.ts.map +1 -1
- package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
- package/dist/parser/extractors/hono-middleware-extractor.d.ts +2 -2
- package/dist/parser/extractors/hono-middleware-extractor.d.ts.map +1 -1
- package/dist/parser/extractors/hono-middleware-extractor.js.map +1 -1
- package/dist/parser/extractors/hono-openapi-extractor.d.ts +2 -2
- package/dist/parser/extractors/hono-openapi-extractor.d.ts.map +1 -1
- package/dist/parser/extractors/hono-openapi-extractor.js.map +1 -1
- package/dist/parser/extractors/hono-route-extractor.d.ts +2 -2
- package/dist/parser/extractors/hono-route-extractor.d.ts.map +1 -1
- package/dist/parser/extractors/hono-route-extractor.js.map +1 -1
- package/dist/parser/extractors/hono-route-utils.d.ts +2 -2
- package/dist/parser/extractors/hono-route-utils.d.ts.map +1 -1
- package/dist/parser/extractors/hono-route-utils.js.map +1 -1
- package/dist/parser/extractors/hono-runtime-extractor.d.ts +2 -2
- package/dist/parser/extractors/hono-runtime-extractor.d.ts.map +1 -1
- package/dist/parser/extractors/hono-runtime-extractor.js.map +1 -1
- package/dist/parser/extractors/hono.d.ts.map +1 -1
- package/dist/parser/extractors/hono.js.map +1 -1
- package/dist/parser/extractors/javascript.d.ts +2 -2
- package/dist/parser/extractors/javascript.d.ts.map +1 -1
- package/dist/parser/extractors/javascript.js.map +1 -1
- package/dist/parser/extractors/kotlin-ast-helpers.d.ts +9 -9
- package/dist/parser/extractors/kotlin-ast-helpers.d.ts.map +1 -1
- package/dist/parser/extractors/kotlin-ast-helpers.js.map +1 -1
- package/dist/parser/extractors/kotlin-test-symbols.d.ts +4 -4
- package/dist/parser/extractors/kotlin-test-symbols.d.ts.map +1 -1
- package/dist/parser/extractors/kotlin-test-symbols.js.map +1 -1
- package/dist/parser/extractors/kotlin.d.ts +2 -2
- package/dist/parser/extractors/kotlin.d.ts.map +1 -1
- package/dist/parser/extractors/kotlin.js.map +1 -1
- package/dist/parser/extractors/php.d.ts +2 -2
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/parser/extractors/python.d.ts +2 -2
- package/dist/parser/extractors/python.d.ts.map +1 -1
- package/dist/parser/extractors/python.js.map +1 -1
- package/dist/parser/extractors/rust.d.ts +2 -2
- package/dist/parser/extractors/rust.d.ts.map +1 -1
- package/dist/parser/extractors/rust.js.map +1 -1
- package/dist/parser/extractors/sql-boundaries.js.map +1 -1
- package/dist/parser/extractors/typescript-cjs-nodes.d.ts +3 -3
- package/dist/parser/extractors/typescript-cjs-nodes.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-cjs-nodes.js.map +1 -1
- package/dist/parser/extractors/typescript-class-nodes.d.ts +6 -6
- package/dist/parser/extractors/typescript-class-nodes.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-class-nodes.js.map +1 -1
- package/dist/parser/extractors/typescript-declaration-nodes.d.ts +3 -3
- package/dist/parser/extractors/typescript-declaration-nodes.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-declaration-nodes.js.map +1 -1
- package/dist/parser/extractors/typescript-module-nodes.d.ts +4 -4
- package/dist/parser/extractors/typescript-module-nodes.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-module-nodes.js.map +1 -1
- package/dist/parser/extractors/typescript-react.d.ts +6 -6
- package/dist/parser/extractors/typescript-react.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-react.js.map +1 -1
- package/dist/parser/extractors/typescript-shared.d.ts +8 -8
- package/dist/parser/extractors/typescript-shared.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-shared.js.map +1 -1
- package/dist/parser/extractors/typescript-test-nodes.d.ts +2 -2
- package/dist/parser/extractors/typescript-test-nodes.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-test-nodes.js.map +1 -1
- package/dist/parser/extractors/typescript-type-nodes.d.ts +4 -4
- package/dist/parser/extractors/typescript-type-nodes.d.ts.map +1 -1
- package/dist/parser/extractors/typescript-type-nodes.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts +2 -2
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parse-cache.d.ts +3 -3
- package/dist/parser/parse-cache.d.ts.map +1 -1
- package/dist/parser/parse-cache.js.map +1 -1
- package/dist/parser/parser-manager.d.ts +3 -2
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +9 -3
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/parser-pool.js.map +1 -1
- package/dist/parser/symbol-extractor.d.ts +2 -2
- package/dist/parser/symbol-extractor.d.ts.map +1 -1
- package/dist/parser/symbol-extractor.js.map +1 -1
- package/dist/register-tool-groups/handler-wrappers.d.ts.map +1 -1
- package/dist/register-tool-groups/handler-wrappers.js +20 -6
- package/dist/register-tool-groups/handler-wrappers.js.map +1 -1
- package/dist/register-tool-groups/meta.js.map +1 -1
- package/dist/register-tool-groups/shared.d.ts.map +1 -1
- package/dist/register-tools/discovery.d.ts +18 -0
- package/dist/register-tools/discovery.d.ts.map +1 -1
- package/dist/register-tools/discovery.js +63 -0
- package/dist/register-tools/discovery.js.map +1 -1
- package/dist/register-tools/runtime.d.ts +3 -3
- package/dist/register-tools/runtime.d.ts.map +1 -1
- package/dist/register-tools/runtime.js +24 -8
- package/dist/register-tools/runtime.js.map +1 -1
- package/dist/register-tools.d.ts +32 -2
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +88 -12
- package/dist/register-tools.js.map +1 -1
- package/dist/retrieval/codebase-retrieval.js.map +1 -1
- package/dist/retrieval/retrieval-schemas.d.ts +13 -13
- package/dist/search/semantic.d.ts +6 -4
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +54 -31
- package/dist/search/semantic.js.map +1 -1
- package/dist/search/static-embedding-provider.d.ts.map +1 -1
- package/dist/search/static-embedding-provider.js.map +1 -1
- package/dist/search/tool-embedding-storage.d.ts.map +1 -1
- package/dist/search/tool-embedding-storage.js +5 -1
- package/dist/search/tool-embedding-storage.js.map +1 -1
- package/dist/server-helpers/repo-resolution.d.ts +18 -4
- package/dist/server-helpers/repo-resolution.d.ts.map +1 -1
- package/dist/server-helpers/repo-resolution.js +72 -12
- package/dist/server-helpers/repo-resolution.js.map +1 -1
- package/dist/server-helpers/request-context.d.ts +59 -0
- package/dist/server-helpers/request-context.d.ts.map +1 -0
- package/dist/server-helpers/request-context.js +31 -0
- package/dist/server-helpers/request-context.js.map +1 -0
- package/dist/server-helpers/response-hints.d.ts.map +1 -1
- package/dist/server-helpers/response-hints.js +42 -0
- package/dist/server-helpers/response-hints.js.map +1 -1
- package/dist/server.d.ts +1 -11
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +97 -70
- package/dist/server.js.map +1 -1
- package/dist/storage/_shared.d.ts +15 -0
- package/dist/storage/_shared.d.ts.map +1 -1
- package/dist/storage/_shared.js +39 -2
- package/dist/storage/_shared.js.map +1 -1
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +38 -6
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +14 -5
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +48 -3
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/index-store.d.ts +2 -0
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +101 -22
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +48 -19
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/telemetry/env-profile.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts +13 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +58 -4
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/tools/agent-config-tools.js.map +1 -1
- package/dist/tools/ast-query-tools.d.ts.map +1 -1
- package/dist/tools/ast-query-tools.js +12 -2
- package/dist/tools/ast-query-tools.js.map +1 -1
- package/dist/tools/astro-actions/ast.d.ts +7 -7
- package/dist/tools/astro-actions/ast.d.ts.map +1 -1
- package/dist/tools/astro-actions/ast.js.map +1 -1
- package/dist/tools/astro-actions/parser.d.ts.map +1 -1
- package/dist/tools/astro-actions/parser.js +3 -0
- package/dist/tools/astro-actions/parser.js.map +1 -1
- package/dist/tools/astro-actions/types.d.ts.map +1 -1
- package/dist/tools/astro-actions/zod-ast.d.ts +3 -3
- package/dist/tools/astro-actions/zod-ast.d.ts.map +1 -1
- package/dist/tools/astro-actions/zod-ast.js.map +1 -1
- package/dist/tools/astro-audit.js.map +1 -1
- package/dist/tools/astro-config.d.ts.map +1 -1
- package/dist/tools/astro-config.js +3 -0
- package/dist/tools/astro-config.js.map +1 -1
- package/dist/tools/astro-content-collections/discovery.d.ts +2 -2
- package/dist/tools/astro-content-collections/discovery.d.ts.map +1 -1
- package/dist/tools/astro-content-collections/discovery.js.map +1 -1
- package/dist/tools/astro-content-collections/schema.d.ts +2 -2
- package/dist/tools/astro-content-collections/schema.d.ts.map +1 -1
- package/dist/tools/astro-content-collections/schema.js.map +1 -1
- package/dist/tools/astro-content-collections.d.ts.map +1 -1
- package/dist/tools/astro-content-collections.js +5 -1
- package/dist/tools/astro-content-collections.js.map +1 -1
- package/dist/tools/astro-db-audit.d.ts.map +1 -1
- package/dist/tools/astro-db-audit.js +8 -0
- package/dist/tools/astro-db-audit.js.map +1 -1
- package/dist/tools/astro-db-parser.d.ts.map +1 -1
- package/dist/tools/astro-db-parser.js +3 -0
- package/dist/tools/astro-db-parser.js.map +1 -1
- package/dist/tools/astro-env-validator.d.ts.map +1 -1
- package/dist/tools/astro-env-validator.js +4 -0
- package/dist/tools/astro-env-validator.js.map +1 -1
- package/dist/tools/astro-helpers.d.ts +6 -6
- package/dist/tools/astro-helpers.d.ts.map +1 -1
- package/dist/tools/astro-helpers.js.map +1 -1
- package/dist/tools/astro-middleware.d.ts.map +1 -1
- package/dist/tools/astro-middleware.js +4 -0
- package/dist/tools/astro-middleware.js.map +1 -1
- package/dist/tools/astro-sessions.d.ts.map +1 -1
- package/dist/tools/astro-sessions.js +4 -0
- package/dist/tools/astro-sessions.js.map +1 -1
- package/dist/tools/complexity-tools.d.ts.map +1 -1
- package/dist/tools/complexity-tools.js +51 -15
- package/dist/tools/complexity-tools.js.map +1 -1
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/context.d.ts.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/context.js.map +1 -1
- package/dist/tools/dependency-audit-lockfile-tools.js.map +1 -1
- package/dist/tools/hono-api-contract.js.map +1 -1
- package/dist/tools/hono-visualize.js.map +1 -1
- package/dist/tools/index-shared.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-indexer.js +29 -1
- package/dist/tools/index-tools/folder-indexer.js.map +1 -1
- package/dist/tools/index-tools/folder-merge.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-merge.js +47 -1
- package/dist/tools/index-tools/folder-merge.js.map +1 -1
- package/dist/tools/index-tools/parse.d.ts.map +1 -1
- package/dist/tools/index-tools/parse.js +6 -2
- package/dist/tools/index-tools/parse.js.map +1 -1
- package/dist/tools/index-tools/registry.d.ts.map +1 -1
- package/dist/tools/index-tools/registry.js +32 -2
- package/dist/tools/index-tools/registry.js.map +1 -1
- package/dist/tools/index-tools/snapshots.js.map +1 -1
- package/dist/tools/index-tools/types.d.ts +7 -0
- package/dist/tools/index-tools/types.d.ts.map +1 -1
- package/dist/tools/insights-tools.js.map +1 -1
- package/dist/tools/journal-generator-helpers.d.ts.map +1 -1
- package/dist/tools/journal-generator-helpers.js.map +1 -1
- package/dist/tools/journal-git-client.js.map +1 -1
- package/dist/tools/journal-llm-client.d.ts.map +1 -1
- package/dist/tools/journal-llm-client.js.map +1 -1
- package/dist/tools/journal-migrator.d.ts.map +1 -1
- package/dist/tools/journal-phase-detector.d.ts.map +1 -1
- package/dist/tools/journal-sentinel.d.ts.map +1 -1
- package/dist/tools/nest-audit-tools.js.map +1 -1
- package/dist/tools/nest-ext-tools.js.map +1 -1
- package/dist/tools/nextjs-api-contract-readers.d.ts +5 -5
- package/dist/tools/nextjs-api-contract-readers.d.ts.map +1 -1
- package/dist/tools/nextjs-api-contract-readers.js.map +1 -1
- package/dist/tools/nextjs-boundary-tools.d.ts +2 -2
- package/dist/tools/nextjs-boundary-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-boundary-tools.js.map +1 -1
- package/dist/tools/nextjs-component-readers.d.ts +3 -3
- package/dist/tools/nextjs-component-readers.d.ts.map +1 -1
- package/dist/tools/nextjs-component-readers.js.map +1 -1
- package/dist/tools/nextjs-framework-audit-tools.js.map +1 -1
- package/dist/tools/nextjs-metadata-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-route-readers.d.ts +2 -2
- package/dist/tools/nextjs-route-readers.d.ts.map +1 -1
- package/dist/tools/nextjs-route-readers.js.map +1 -1
- package/dist/tools/nextjs-security-readers.d.ts +6 -6
- package/dist/tools/nextjs-security-readers.d.ts.map +1 -1
- package/dist/tools/nextjs-security-readers.js.map +1 -1
- package/dist/tools/pg-introspection.js.map +1 -1
- package/dist/tools/php-active-record-tools.js.map +1 -1
- package/dist/tools/php-view-tools.js.map +1 -1
- package/dist/tools/plan-turn/orchestrator.d.ts.map +1 -1
- package/dist/tools/plan-turn/orchestrator.js +14 -4
- package/dist/tools/plan-turn/orchestrator.js.map +1 -1
- package/dist/tools/plan-turn/recommendations.js +2 -2
- package/dist/tools/plan-turn/recommendations.js.map +1 -1
- package/dist/tools/project-profile-extractors.js.map +1 -1
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pydantic-models.js.map +1 -1
- package/dist/tools/python-audit/aggregate.js.map +1 -1
- package/dist/tools/python-circular-imports.d.ts.map +1 -1
- package/dist/tools/python-circular-imports.js +3 -0
- package/dist/tools/python-circular-imports.js.map +1 -1
- package/dist/tools/python-constants-tools.d.ts.map +1 -1
- package/dist/tools/python-constants-tools.js +14 -0
- package/dist/tools/python-constants-tools.js.map +1 -1
- package/dist/tools/query-tools.js.map +1 -1
- package/dist/tools/review-diff/constants.d.ts.map +1 -1
- package/dist/tools/search-tools/ripgrep.d.ts.map +1 -1
- package/dist/tools/search-tools/ripgrep.js +32 -2
- package/dist/tools/search-tools/ripgrep.js.map +1 -1
- package/dist/tools/search-tools/text-search.js.map +1 -1
- package/dist/tools/taint-tools.d.ts.map +1 -1
- package/dist/tools/taint-tools.js +4 -0
- package/dist/tools/taint-tools.js.map +1 -1
- package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
- package/dist/tools/typescript-constants-tools.js +14 -0
- package/dist/tools/typescript-constants-tools.js.map +1 -1
- package/dist/tools/wiki-manifest.js.map +1 -1
- package/dist/tools/workspace-tools.d.ts.map +1 -1
- package/dist/tools/yii-migrations-tools.js.map +1 -1
- package/dist/tools/yii-modules-tools.js.map +1 -1
- package/dist/utils/git-head.js.map +1 -1
- package/dist/utils/git-validation.d.ts.map +1 -1
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +10 -0
- package/dist/utils/import-graph.js.map +1 -1
- package/dist/utils/language-detect.d.ts.map +1 -1
- package/dist/utils/language-detect.js +6 -3
- package/dist/utils/language-detect.js.map +1 -1
- package/dist/utils/nextjs-ast-readers.d.ts +3 -3
- package/dist/utils/nextjs-ast-readers.d.ts.map +1 -1
- package/dist/utils/nextjs-ast-readers.js.map +1 -1
- package/dist/utils/nextjs-audit-cache.d.ts +3 -3
- package/dist/utils/nextjs-audit-cache.d.ts.map +1 -1
- package/dist/utils/nextjs-audit-cache.js.map +1 -1
- package/dist/utils/nextjs-metadata-readers.d.ts +4 -4
- package/dist/utils/nextjs-metadata-readers.d.ts.map +1 -1
- package/dist/utils/nextjs-metadata-readers.js.map +1 -1
- package/dist/utils/overlay-cache.d.ts.map +1 -1
- package/dist/utils/overlay-cache.js.map +1 -1
- package/dist/utils/python-imports.d.ts +2 -2
- package/dist/utils/python-imports.d.ts.map +1 -1
- package/dist/utils/python-imports.js.map +1 -1
- package/dist/utils/ts-imports.d.ts +2 -2
- package/dist/utils/ts-imports.d.ts.map +1 -1
- package/dist/utils/ts-imports.js.map +1 -1
- package/dist/utils/walk/filters.d.ts.map +1 -1
- package/dist/utils/walk/filters.js +22 -1
- package/dist/utils/walk/filters.js.map +1 -1
- package/dist/utils/walk/limits.d.ts.map +1 -1
- package/dist/utils/worktree.d.ts +60 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +170 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +13 -7
- package/rules/codesift.md +5 -1
- package/rules/codesift.mdc +5 -1
- package/rules/codex.md +5 -1
- package/rules/gemini.md +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-store.d.ts","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AA4BD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAcf;AAiCD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAMxC;AAWD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"chunk-store.d.ts","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AA4BD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAcf;AAiCD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAMxC;AAWD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAmCf;AAQD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,CAM3C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { atomicWriteFile } from "./_shared.js";
|
|
2
|
+
import { atomicWriteFile, cleanupOrphanTempFiles } from "./_shared.js";
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// Path helpers
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
@@ -82,12 +82,44 @@ export async function loadChunks(chunkPath) {
|
|
|
82
82
|
* File: ~/.codesift/{hash}.chunk-embeddings.ndjson
|
|
83
83
|
*/
|
|
84
84
|
export async function saveChunkEmbeddings(embeddingPath, embeddings) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
// Stream line-by-line. The previous version built one big `lines.join("\n")`
|
|
86
|
+
// string, which threw `RangeError: Invalid string length` once the combined
|
|
87
|
+
// ndjson exceeded V8's max string length (~512 MB) — a repo with enough chunks
|
|
88
|
+
// (e.g. TGMQuotas, ~27K) silently failed its entire chunk-embedding save with
|
|
89
|
+
// exit 0 and no chunk file, so semantic search stayed symbol-only there. This
|
|
90
|
+
// mirrors saveEmbeddings, which already streams for the same reason.
|
|
91
|
+
// Same orphan sweep as saveEmbeddings — a killed process leaves these behind.
|
|
92
|
+
await cleanupOrphanTempFiles(embeddingPath);
|
|
93
|
+
const tmpPath = `${embeddingPath}.tmp.${Date.now()}`;
|
|
94
|
+
const { createWriteStream } = await import("node:fs");
|
|
95
|
+
const stream = createWriteStream(tmpPath, { encoding: "utf-8" });
|
|
96
|
+
let streamError = null;
|
|
97
|
+
stream.on("error", (err) => { streamError = err; });
|
|
98
|
+
try {
|
|
99
|
+
for (const [id, vec] of embeddings) {
|
|
100
|
+
if (streamError)
|
|
101
|
+
throw streamError;
|
|
102
|
+
const line = JSON.stringify({ id, vec: Array.from(vec) }) + "\n";
|
|
103
|
+
if (!stream.write(line)) {
|
|
104
|
+
await new Promise((resolve) => stream.once("drain", resolve));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (streamError)
|
|
108
|
+
throw streamError;
|
|
109
|
+
await new Promise((resolve, reject) => {
|
|
110
|
+
stream.end(() => streamError ? reject(streamError) : resolve());
|
|
111
|
+
});
|
|
112
|
+
const { rename } = await import("node:fs/promises");
|
|
113
|
+
await rename(tmpPath, embeddingPath);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
try {
|
|
117
|
+
const { unlink } = await import("node:fs/promises");
|
|
118
|
+
await unlink(tmpPath);
|
|
119
|
+
}
|
|
120
|
+
catch { /* ignore */ }
|
|
121
|
+
throw err;
|
|
88
122
|
}
|
|
89
|
-
const data = lines.join("\n") + "\n";
|
|
90
|
-
await atomicWriteFile(embeddingPath, data);
|
|
91
123
|
}
|
|
92
124
|
function isChunkEmbeddingLine(parsed) {
|
|
93
125
|
return typeof parsed === "object" && parsed !== null &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-store.js","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"chunk-store.js","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,16 +9,14 @@ export declare function getEmbeddingPath(indexPath: string): string;
|
|
|
9
9
|
* {hash}.index.json → {hash}.embeddings.meta.json
|
|
10
10
|
*/
|
|
11
11
|
export declare function getEmbeddingMetaPath(indexPath: string): string;
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
* Returns a Map of symbolId → Float32Array vector.
|
|
15
|
-
*/
|
|
12
|
+
/** Content hashes that came with the vectors at `embeddingPath`, if any. */
|
|
13
|
+
export declare function contentHashesForPath(embeddingPath: string): Map<string, number>;
|
|
16
14
|
export declare function loadEmbeddings(embeddingPath: string, maxBytes?: number): Promise<Map<string, Float32Array>>;
|
|
17
15
|
/**
|
|
18
16
|
* Save all embeddings to an ndjson file using streaming writes.
|
|
19
17
|
* Avoids building a single huge string (30K+ symbols × 1536 floats = >300MB).
|
|
20
18
|
*/
|
|
21
|
-
export declare function saveEmbeddings(embeddingPath: string, embeddings: Map<string, Float32Array>): Promise<void>;
|
|
19
|
+
export declare function saveEmbeddings(embeddingPath: string, embeddings: Map<string, Float32Array>, hashes?: ReadonlyMap<string, number>): Promise<void>;
|
|
22
20
|
/**
|
|
23
21
|
* Save embedding metadata atomically.
|
|
24
22
|
*/
|
|
@@ -28,6 +26,17 @@ export declare function saveEmbeddingMeta(metaPath: string, meta: EmbeddingMeta)
|
|
|
28
26
|
* Returns null if not found or invalid.
|
|
29
27
|
*/
|
|
30
28
|
export declare function loadEmbeddingMeta(metaPath: string): Promise<EmbeddingMeta | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Seed the in-process hash map for `cacheKey` from what was persisted.
|
|
31
|
+
*
|
|
32
|
+
* This map used to start empty on every process, so `hashes.get(id)` was always
|
|
33
|
+
* undefined, every symbol compared as changed, and the entire corpus was
|
|
34
|
+
* re-embedded on each MCP server start — 4.18M symbols across 1,587 repos, and
|
|
35
|
+
* servers restart once per session.
|
|
36
|
+
*/
|
|
37
|
+
export declare function primeContentHashes(cacheKey: string, hashes: ReadonlyMap<string, number>): void;
|
|
38
|
+
/** Hashes currently known for `cacheKey`, for persisting beside the vectors. */
|
|
39
|
+
export declare function contentHashesFor(cacheKey: string): ReadonlyMap<string, number>;
|
|
31
40
|
/**
|
|
32
41
|
* Batch-embed symbols using the given provider, appending to existing embeddings.
|
|
33
42
|
* Skips symbols whose ID exists AND content hash hasn't changed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/storage/embedding-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D;
|
|
1
|
+
{"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/storage/embedding-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D;AAkCD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE/E;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAgGpC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgB/B;AAeD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAK9F;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAE9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACnC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EACjD,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CA2CpC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { atomicWriteFile } from "./_shared.js";
|
|
2
|
+
import { atomicWriteFile, cleanupOrphanTempFiles } from "./_shared.js";
|
|
3
3
|
/**
|
|
4
4
|
* Get the embedding file path from an index path.
|
|
5
5
|
* {hash}.index.json → {hash}.embeddings.ndjson
|
|
@@ -18,8 +18,22 @@ export function getEmbeddingMetaPath(indexPath) {
|
|
|
18
18
|
* Load all embeddings from an ndjson file.
|
|
19
19
|
* Returns a Map of symbolId → Float32Array vector.
|
|
20
20
|
*/
|
|
21
|
+
/**
|
|
22
|
+
* Content hashes read alongside the vectors on the last load of a given path.
|
|
23
|
+
*
|
|
24
|
+
* Keyed by path rather than repo name because that is what the loader knows.
|
|
25
|
+
* Populated as a side effect of `loadEmbeddings` — the data is already on the
|
|
26
|
+
* line, so collecting it costs nothing extra.
|
|
27
|
+
*/
|
|
28
|
+
const loadedContentHashes = new Map();
|
|
29
|
+
/** Content hashes that came with the vectors at `embeddingPath`, if any. */
|
|
30
|
+
export function contentHashesForPath(embeddingPath) {
|
|
31
|
+
return loadedContentHashes.get(embeddingPath) ?? new Map();
|
|
32
|
+
}
|
|
21
33
|
export async function loadEmbeddings(embeddingPath, maxBytes = Number.POSITIVE_INFINITY) {
|
|
22
34
|
const embeddings = new Map();
|
|
35
|
+
const hashes = new Map();
|
|
36
|
+
loadedContentHashes.set(embeddingPath, hashes);
|
|
23
37
|
// Stream line-by-line rather than readFile-ing the whole file into one string:
|
|
24
38
|
// embedding files are GB-scale (e.g. 4.5GB), so a single slurp spikes the heap
|
|
25
39
|
// by the full file size at load. readline keeps peak memory to one line plus
|
|
@@ -86,12 +100,17 @@ export async function loadEmbeddings(embeddingPath, maxBytes = Number.POSITIVE_I
|
|
|
86
100
|
if (residentBytes > maxBytes) {
|
|
87
101
|
overBudget = true;
|
|
88
102
|
embeddings.clear();
|
|
103
|
+
// Hashes describe vectors we are dropping; keeping them would let
|
|
104
|
+
// batchEmbed believe those symbols are still covered.
|
|
105
|
+
hashes.clear();
|
|
89
106
|
rl.close();
|
|
90
107
|
stream.destroy();
|
|
91
108
|
resolve();
|
|
92
109
|
return;
|
|
93
110
|
}
|
|
94
111
|
embeddings.set(entry.id, vec);
|
|
112
|
+
if (typeof entry.h === "number")
|
|
113
|
+
hashes.set(entry.id, entry.h);
|
|
95
114
|
}
|
|
96
115
|
}
|
|
97
116
|
catch {
|
|
@@ -110,7 +129,11 @@ export async function loadEmbeddings(embeddingPath, maxBytes = Number.POSITIVE_I
|
|
|
110
129
|
* Save all embeddings to an ndjson file using streaming writes.
|
|
111
130
|
* Avoids building a single huge string (30K+ symbols × 1536 floats = >300MB).
|
|
112
131
|
*/
|
|
113
|
-
export async function saveEmbeddings(embeddingPath, embeddings) {
|
|
132
|
+
export async function saveEmbeddings(embeddingPath, embeddings, hashes) {
|
|
133
|
+
// Sweep orphans from earlier runs that were killed mid-write. These files are
|
|
134
|
+
// never overwritten (the name carries a timestamp), so without this they
|
|
135
|
+
// accumulate indefinitely — see cleanupOrphanTempFiles.
|
|
136
|
+
await cleanupOrphanTempFiles(embeddingPath);
|
|
114
137
|
const tmpPath = `${embeddingPath}.tmp.${Date.now()}`;
|
|
115
138
|
const { createWriteStream } = await import("node:fs");
|
|
116
139
|
const stream = createWriteStream(tmpPath, { encoding: "utf-8" });
|
|
@@ -121,7 +144,8 @@ export async function saveEmbeddings(embeddingPath, embeddings) {
|
|
|
121
144
|
for (const [id, vec] of embeddings) {
|
|
122
145
|
if (streamError)
|
|
123
146
|
throw streamError;
|
|
124
|
-
const
|
|
147
|
+
const h = hashes?.get(id);
|
|
148
|
+
const line = JSON.stringify(h === undefined ? { id, vec: Array.from(vec) } : { id, vec: Array.from(vec), h }) + "\n";
|
|
125
149
|
const canContinue = stream.write(line);
|
|
126
150
|
if (!canContinue) {
|
|
127
151
|
await new Promise((resolve) => stream.once("drain", resolve));
|
|
@@ -183,6 +207,27 @@ function contentHash(text) {
|
|
|
183
207
|
}
|
|
184
208
|
/** Track content hashes so we re-embed when symbol content changes. */
|
|
185
209
|
const embeddingContentHashes = new Map();
|
|
210
|
+
/**
|
|
211
|
+
* Seed the in-process hash map for `cacheKey` from what was persisted.
|
|
212
|
+
*
|
|
213
|
+
* This map used to start empty on every process, so `hashes.get(id)` was always
|
|
214
|
+
* undefined, every symbol compared as changed, and the entire corpus was
|
|
215
|
+
* re-embedded on each MCP server start — 4.18M symbols across 1,587 repos, and
|
|
216
|
+
* servers restart once per session.
|
|
217
|
+
*/
|
|
218
|
+
export function primeContentHashes(cacheKey, hashes) {
|
|
219
|
+
if (hashes.size === 0)
|
|
220
|
+
return;
|
|
221
|
+
const target = embeddingContentHashes.get(cacheKey) ?? new Map();
|
|
222
|
+
for (const [id, h] of hashes)
|
|
223
|
+
if (!target.has(id))
|
|
224
|
+
target.set(id, h);
|
|
225
|
+
embeddingContentHashes.set(cacheKey, target);
|
|
226
|
+
}
|
|
227
|
+
/** Hashes currently known for `cacheKey`, for persisting beside the vectors. */
|
|
228
|
+
export function contentHashesFor(cacheKey) {
|
|
229
|
+
return embeddingContentHashes.get(cacheKey) ?? new Map();
|
|
230
|
+
}
|
|
186
231
|
/**
|
|
187
232
|
* Batch-embed symbols using the given provider, appending to existing embeddings.
|
|
188
233
|
* Skips symbols whose ID exists AND content hash hasn't changed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-store.js","sourceRoot":"","sources":["../../src/storage/embedding-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"embedding-store.js","sourceRoot":"","sources":["../../src/storage/embedding-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;AACtE,CAAC;AAqBD;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAA+B,CAAC;AAEnE,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IACxD,OAAO,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,QAAQ,GAAW,MAAM,CAAC,iBAAiB;IAE3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,mBAAmB,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAE/C,+EAA+E;IAC/E,+EAA+E;IAC/E,6EAA6E;IAC7E,iCAAiC;IACjC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAE1D,gFAAgF;IAChF,mEAAmE;IACnE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,UAAU,CAAC;IAElD,+EAA+E;IAC/E,gFAAgF;IAChF,gFAAgF;IAChF,iFAAiF;IACjF,uEAAuE;IACvE,EAAE;IACF,iFAAiF;IACjF,iFAAiF;IACjF,+EAA+E;IAC/E,8EAA8E;IAC9E,iFAAiF;IACjF,+EAA+E;IAC/E,6EAA6E;IAC7E,MAAM,sBAAsB,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC;QAC1C,IAAI,IAAI,GAAG,QAAQ,GAAG,sBAAsB,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CACX,kCAAkC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;gBAC/D,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6CAA6C;gBAC3E,iDAAiD,CACpD,CAAC;YACF,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,yEAAyE,CAAC,CAAC;IAErF,+EAA+E;IAC/E,0EAA0E;IAC1E,gFAAgF;IAChF,yEAAyE;IACzE,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,MAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,gBAAgB,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,8CAA8C;QACnF,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,UAAU;gBAAE,OAAO;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;gBACnD,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACxC,aAAa,IAAI,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,8BAA8B;oBAC1F,IAAI,aAAa,GAAG,QAAQ,EAAE,CAAC;wBAC7B,UAAU,GAAG,IAAI,CAAC;wBAClB,UAAU,CAAC,KAAK,EAAE,CAAC;wBACnB,kEAAkE;wBAClE,sDAAsD;wBACtD,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,OAAO,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBACD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC9B,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ;wBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,2CAA2C,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YAC1E,iDAAiD,CACpD,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,UAAqC,EACrC,MAAoC;IAEpC,8EAA8E;IAC9E,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,GAAG,aAAa,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACrD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjE,uEAAuE;IACvE,IAAI,WAAW,GAAiB,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,WAAW;gBAAE,MAAM,WAAW,CAAC;YACnC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CACzB,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACjF,GAAG,IAAI,CAAC;YACT,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,IAAI,WAAW;YAAE,MAAM,WAAW,CAAC;QACnC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,gBAAgB;QAChB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8BAA8B;QAC9B,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1G,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,IAAmB;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,IACE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAC7C,OAAQ,MAAkC,CAAC,OAAO,CAAC,KAAK,QAAQ;YAChE,OAAQ,MAAkC,CAAC,YAAY,CAAC,KAAK,QAAQ,EACrE,CAAC;YACD,OAAO,MAAuB,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,uEAAuE;AACvE,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAA+B,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,MAAmC;IACtF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;IACjF,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAgC,EAChC,QAAmC,EACnC,OAAiD,EACjD,SAAiB,EACjB,QAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAkB,CAAC;IAE1H,4DAA4D;IAC5D,MAAM,OAAO,GAAwC,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;QAC5F,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,wDAAwD;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -72,6 +72,8 @@ export declare function loadIndexOrStale(indexPath: string, currentVersions: Rec
|
|
|
72
72
|
* version miss.
|
|
73
73
|
*/
|
|
74
74
|
export declare function isExtractorVersionCurrent(index: CodeIndex, currentVersions: Record<string, string>): boolean;
|
|
75
|
+
export declare function getIndexWriteCountForTesting(): number;
|
|
76
|
+
export declare function resetIndexWriteCountForTesting(): void;
|
|
75
77
|
/**
|
|
76
78
|
* Incrementally update an index for a single changed file.
|
|
77
79
|
* Removes old symbols for the file, adds new ones, and saves atomically.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-store.d.ts","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMpE;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiB3B;AAED;;;;4BAI4B;AAC5B,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAClC;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,4BAA4B,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB;sFACkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;qEAEqE;AACrE,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,2BAA2B,EAAE,CAmC/B;AAED;;;;;;;;;;;;;;;;wCAgBwC;AACxC,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8BpC;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAGT;
|
|
1
|
+
{"version":3,"file":"index-store.d.ts","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMpE;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiB3B;AAED;;;;4BAI4B;AAC5B,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAClC;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,4BAA4B,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB;sFACkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;qEAEqE;AACrE,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,2BAA2B,EAAE,CAmC/B;AAED;;;;;;;;;;;;;;;;wCAgBwC;AACxC,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8BpC;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAGT;AAyBD,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AACD,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAoFD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,EAAE,EACxB,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtE"}
|
|
@@ -140,59 +140,138 @@ export function isExtractorVersionCurrent(index, currentVersions) {
|
|
|
140
140
|
return false;
|
|
141
141
|
return collectExtractorVersionMismatches(index, currentVersions).length === 0;
|
|
142
142
|
}
|
|
143
|
+
const pendingMutations = new Map();
|
|
144
|
+
const scheduledFlushes = new Map();
|
|
145
|
+
/**
|
|
146
|
+
* Count of full index rewrites. Exposed for tests: the whole point of batching
|
|
147
|
+
* is that N queued edits cost fewer than N rewrites, and ESM will not let a
|
|
148
|
+
* test spy on `node:fs/promises` to measure that from the outside.
|
|
149
|
+
*/
|
|
150
|
+
let indexWriteCount = 0;
|
|
151
|
+
export function getIndexWriteCountForTesting() {
|
|
152
|
+
return indexWriteCount;
|
|
153
|
+
}
|
|
154
|
+
export function resetIndexWriteCountForTesting() {
|
|
155
|
+
indexWriteCount = 0;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Fold every queued mutation for one index into a SINGLE load + save.
|
|
159
|
+
*
|
|
160
|
+
* The index is one JSON blob per repo, so each write costs a full parse plus a
|
|
161
|
+
* full stringify of the whole thing — 263 MB on tgm-survey-platform, 391 MB on
|
|
162
|
+
* Mobi3. Agents edit in bursts and the PostToolUse hook calls index_file once
|
|
163
|
+
* per edit, so the old one-write-per-edit path re-serialised the entire repo N
|
|
164
|
+
* times for N files. Telemetry over 10,613 index_file calls: 235 ms median
|
|
165
|
+
* overall, but 3.7 s median / 15.2 s p90 on tgm-survey-platform, 7.5 h of wall
|
|
166
|
+
* clock in total. Batching collapses a burst of N edits to one parse+write.
|
|
167
|
+
*
|
|
168
|
+
* Ordering and durability are unchanged: mutations still apply in submission
|
|
169
|
+
* order, and a caller's promise still resolves only once its own edit is on
|
|
170
|
+
* disk. This does not fix the underlying whole-blob format — it removes the
|
|
171
|
+
* repeated cost of it.
|
|
172
|
+
*/
|
|
173
|
+
async function flushIndexMutations(indexPath) {
|
|
174
|
+
const batch = pendingMutations.get(indexPath);
|
|
175
|
+
if (!batch || batch.length === 0)
|
|
176
|
+
return;
|
|
177
|
+
// Take ownership before the first await: anything queued from here on belongs
|
|
178
|
+
// to the next flush, which the scheduler chains after this one.
|
|
179
|
+
pendingMutations.delete(indexPath);
|
|
180
|
+
try {
|
|
181
|
+
const existing = await loadIndex(indexPath);
|
|
182
|
+
if (!existing) {
|
|
183
|
+
// Updates need an index to update; removals against a missing index are
|
|
184
|
+
// already in the desired state.
|
|
185
|
+
for (const mutation of batch) {
|
|
186
|
+
if (mutation.missing === "throw") {
|
|
187
|
+
mutation.reject(new Error(`Cannot incrementally update: index not found at ${indexPath}`));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
mutation.resolve();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
let changed = false;
|
|
196
|
+
for (const mutation of batch) {
|
|
197
|
+
if (mutation.apply(existing))
|
|
198
|
+
changed = true;
|
|
199
|
+
}
|
|
200
|
+
// A batch of pure no-ops (e.g. removing files the index never had) must not
|
|
201
|
+
// rewrite the whole blob — that was the point of the old early return.
|
|
202
|
+
if (changed) {
|
|
203
|
+
existing.updated_at = Date.now();
|
|
204
|
+
indexWriteCount++;
|
|
205
|
+
await saveIndex(indexPath, existing);
|
|
206
|
+
}
|
|
207
|
+
for (const mutation of batch)
|
|
208
|
+
mutation.resolve();
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
for (const mutation of batch)
|
|
212
|
+
mutation.reject(err);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** Queue a mutation and make sure exactly one flush is pending per index. */
|
|
216
|
+
function enqueueIndexMutation(indexPath, missing, apply) {
|
|
217
|
+
return new Promise((resolve, reject) => {
|
|
218
|
+
const queue = pendingMutations.get(indexPath);
|
|
219
|
+
if (queue)
|
|
220
|
+
queue.push({ apply, missing, resolve, reject });
|
|
221
|
+
else
|
|
222
|
+
pendingMutations.set(indexPath, [{ apply, missing, resolve, reject }]);
|
|
223
|
+
// A flush already waiting has not drained yet, so it will pick this up.
|
|
224
|
+
if (scheduledFlushes.has(indexPath))
|
|
225
|
+
return;
|
|
226
|
+
const prev = writeLocks.get(indexPath) ?? Promise.resolve();
|
|
227
|
+
const next = prev.then(() => {
|
|
228
|
+
// Release the slot before draining so mutations that arrive during the
|
|
229
|
+
// load/save schedule their own follow-up flush instead of being lost.
|
|
230
|
+
scheduledFlushes.delete(indexPath);
|
|
231
|
+
return flushIndexMutations(indexPath);
|
|
232
|
+
});
|
|
233
|
+
scheduledFlushes.set(indexPath, next);
|
|
234
|
+
// Swallow errors on the lock chain so one failure cannot block later writers.
|
|
235
|
+
writeLocks.set(indexPath, next.catch(() => { }));
|
|
236
|
+
});
|
|
237
|
+
}
|
|
143
238
|
/**
|
|
144
239
|
* Incrementally update an index for a single changed file.
|
|
145
240
|
* Removes old symbols for the file, adds new ones, and saves atomically.
|
|
146
241
|
* Serialized per indexPath to prevent read-modify-write races.
|
|
147
242
|
*/
|
|
148
243
|
export async function saveIncremental(indexPath, updatedFile, newSymbols, fileEntry) {
|
|
149
|
-
|
|
150
|
-
const next = prev.then(async () => {
|
|
151
|
-
const existing = await loadIndex(indexPath);
|
|
152
|
-
if (!existing) {
|
|
153
|
-
throw new Error(`Cannot incrementally update: index not found at ${indexPath}`);
|
|
154
|
-
}
|
|
155
|
-
// Update symbols
|
|
244
|
+
return enqueueIndexMutation(indexPath, "throw", (existing) => {
|
|
156
245
|
const filtered = existing.symbols.filter((symbol) => symbol.file !== updatedFile);
|
|
157
246
|
const merged = [...filtered, ...newSymbols];
|
|
158
247
|
existing.symbols = merged;
|
|
159
248
|
existing.symbol_count = merged.length;
|
|
160
|
-
existing.updated_at = Date.now();
|
|
161
249
|
// Update files[] to keep it in sync
|
|
162
250
|
if (fileEntry) {
|
|
163
251
|
existing.files = existing.files.filter((f) => f.path !== updatedFile);
|
|
164
252
|
existing.files.push(fileEntry);
|
|
165
253
|
existing.file_count = existing.files.length;
|
|
166
254
|
}
|
|
167
|
-
|
|
255
|
+
// A re-index of a file always rewrites its symbols, so this is never a no-op.
|
|
256
|
+
return true;
|
|
168
257
|
});
|
|
169
|
-
// Store the chain (swallow errors so next caller isn't blocked)
|
|
170
|
-
writeLocks.set(indexPath, next.catch(() => { }));
|
|
171
|
-
return next;
|
|
172
258
|
}
|
|
173
259
|
/**
|
|
174
260
|
* Remove all symbols and the file entry for a deleted file.
|
|
175
261
|
* Serialized per indexPath to prevent read-modify-write races.
|
|
176
262
|
*/
|
|
177
263
|
export async function removeFileFromIndex(indexPath, deletedFile) {
|
|
178
|
-
|
|
179
|
-
const next = prev.then(async () => {
|
|
180
|
-
const existing = await loadIndex(indexPath);
|
|
181
|
-
if (!existing)
|
|
182
|
-
return;
|
|
264
|
+
return enqueueIndexMutation(indexPath, "skip", (existing) => {
|
|
183
265
|
const hadSymbols = existing.symbols.some((s) => s.file === deletedFile);
|
|
184
266
|
const hadFile = existing.files.some((f) => f.path === deletedFile);
|
|
185
267
|
if (!hadSymbols && !hadFile)
|
|
186
|
-
return;
|
|
268
|
+
return false;
|
|
187
269
|
existing.symbols = existing.symbols.filter((s) => s.file !== deletedFile);
|
|
188
270
|
existing.symbol_count = existing.symbols.length;
|
|
189
271
|
existing.files = existing.files.filter((f) => f.path !== deletedFile);
|
|
190
272
|
existing.file_count = existing.files.length;
|
|
191
|
-
|
|
192
|
-
await saveIndex(indexPath, existing);
|
|
273
|
+
return true;
|
|
193
274
|
});
|
|
194
|
-
writeLocks.set(indexPath, next.catch(() => { }));
|
|
195
|
-
return next;
|
|
196
275
|
}
|
|
197
276
|
/**
|
|
198
277
|
* Derive a deterministic index file path from a repo root.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-store.js","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index-store.js","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AA2BD;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAG1B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACjG,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAAC,CA6C1D;AA+BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQpD"}
|
package/dist/storage/registry.js
CHANGED
|
@@ -27,14 +27,39 @@ export async function saveRegistry(registryPath, registry) {
|
|
|
27
27
|
const data = JSON.stringify(registry);
|
|
28
28
|
await atomicWriteFile(registryPath, data);
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Serialises read-modify-write cycles per registry file.
|
|
32
|
+
*
|
|
33
|
+
* `registerRepo` / `updateRepoMeta` / `removeRepo` each load the whole registry,
|
|
34
|
+
* mutate one entry and write it back. Nothing kept two of those from
|
|
35
|
+
* interleaving, so the classic lost update applied: A reads, B reads, A writes,
|
|
36
|
+
* B writes — and A's repo is silently gone from the registry. The caller sees a
|
|
37
|
+
* successful index followed by "Repository ... not found", or `prune` reporting
|
|
38
|
+
* zero repos.
|
|
39
|
+
*
|
|
40
|
+
* Concurrency here is not hypothetical even in a single process: watcher-driven
|
|
41
|
+
* re-indexing, background embedding and auto-index all call these unawaited
|
|
42
|
+
* while a foreground tool call is doing the same. `index-store.ts` already
|
|
43
|
+
* serialises its own writes this way (`writeLocks`); the registry never did.
|
|
44
|
+
*/
|
|
45
|
+
const registryWriteLocks = new Map();
|
|
46
|
+
function withRegistryLock(registryPath, work) {
|
|
47
|
+
const prev = registryWriteLocks.get(registryPath) ?? Promise.resolve();
|
|
48
|
+
const next = prev.then(work, work);
|
|
49
|
+
// Swallow on the chain only — the caller still sees its own rejection.
|
|
50
|
+
registryWriteLocks.set(registryPath, next.then(() => undefined, () => undefined));
|
|
51
|
+
return next;
|
|
52
|
+
}
|
|
30
53
|
/**
|
|
31
54
|
* Register or update a repo in the registry.
|
|
32
55
|
*/
|
|
33
56
|
export async function registerRepo(registryPath, meta) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
57
|
+
return withRegistryLock(registryPath, async () => {
|
|
58
|
+
const registry = await loadRegistry(registryPath);
|
|
59
|
+
registry.repos[meta.name] = meta;
|
|
60
|
+
registry.updated_at = Date.now();
|
|
61
|
+
await saveRegistry(registryPath, registry);
|
|
62
|
+
});
|
|
38
63
|
}
|
|
39
64
|
/**
|
|
40
65
|
* Get a single repo's metadata by name.
|
|
@@ -55,27 +80,31 @@ export async function listRepos(registryPath) {
|
|
|
55
80
|
* Partially update a repo's metadata (e.g., last_git_commit after freshness check).
|
|
56
81
|
*/
|
|
57
82
|
export async function updateRepoMeta(registryPath, repoName, updates) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
83
|
+
return withRegistryLock(registryPath, async () => {
|
|
84
|
+
const registry = await loadRegistry(registryPath);
|
|
85
|
+
const existing = registry.repos[repoName];
|
|
86
|
+
if (!existing)
|
|
87
|
+
return;
|
|
88
|
+
Object.assign(existing, updates);
|
|
89
|
+
registry.updated_at = Date.now();
|
|
90
|
+
await saveRegistry(registryPath, registry);
|
|
91
|
+
});
|
|
65
92
|
}
|
|
66
93
|
/**
|
|
67
94
|
* Remove a repo from the registry.
|
|
68
95
|
* Returns true if the repo existed and was removed, false otherwise.
|
|
69
96
|
*/
|
|
70
97
|
export async function removeRepo(registryPath, name) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
98
|
+
return withRegistryLock(registryPath, async () => {
|
|
99
|
+
const registry = await loadRegistry(registryPath);
|
|
100
|
+
if (!(name in registry.repos)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
delete registry.repos[name];
|
|
104
|
+
registry.updated_at = Date.now();
|
|
105
|
+
await saveRegistry(registryPath, registry);
|
|
106
|
+
return true;
|
|
107
|
+
});
|
|
79
108
|
}
|
|
80
109
|
/**
|
|
81
110
|
* Resolve registry metadata for a repo input string.
|