conexus 6.3.4__tar.gz → 6.3.6__tar.gz
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.
- {conexus-6.3.4 → conexus-6.3.6}/PKG-INFO +1 -1
- {conexus-6.3.4 → conexus-6.3.6}/mcpb/pyproject.toml +2 -2
- {conexus-6.3.4 → conexus-6.3.6}/pyproject.toml +1 -1
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/AspectRepository.java +100 -49
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/AspectHandler.java +34 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/VectorHandler.java +37 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/PgVectorRepository.java +68 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AspectRepositoryTest.java +70 -2
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorRepositoryContractTest.java +73 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_backup.py +82 -55
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/manifest_backfill.py +9 -6
- conexus-6.3.6/src/nexus/catalog/store_hook.py +196 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog.py +144 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/index.py +21 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/store.py +34 -4
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/binary_install.py +1 -1
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/service_registry.py +51 -1
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/storage_service_daemon.py +26 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t3_daemon.py +27 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/http_vector_client.py +25 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_aspect_queue.py +58 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/errors.py +50 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/exporter.py +258 -38
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/indexer.py +86 -9
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/indexer_utils.py +19 -10
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/core.py +13 -7
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_infra.py +73 -8
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/retry.py +83 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/storage_boundary_lint.py +94 -0
- conexus-6.3.4/src/nexus/catalog/store_hook.py +0 -101
- {conexus-6.3.4 → conexus-6.3.6}/.beads/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/.gitignore +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/LICENSE +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/agents/_shared/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/com.nexus.service.plist +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/com.nexus.t2.plist +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/com.nexus.t3.plist +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/nexus-service.service +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/nexus-t2.service +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/nexus-t3.service +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/hooks/scripts/routing/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/abstract-themes.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/analyze-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/citation-traversal.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/debug-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/document-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/find-by-author.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/hybrid-factual-lookup.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-author-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-inspect-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-inspect-dimensions.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-promote-propose.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/research-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/review-default.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/traverse-then-generate.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/type-scoped-search.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/dimensions.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/purposes.yml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/data/calibration/rdr-109/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/docs/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/docs/migration/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/docs/rdr/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/dt/scripts/Index Current Group in nx.applescript +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/dt/scripts/Index Selection in nx (Knowledge).applescript +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/dt/scripts/Index Selection in nx.applescript +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/mcpb/src/server.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/cron/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/launchd/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/rdr152-sandbox/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/java/dev/nexus/spike/s04/Main.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/resources/META-INF/native-image/reachability-metadata.json +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/resources/logback.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/Main.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/NexusService.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/CatalogRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/ChashRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/CollectionRegistry.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/DeadlockRetry.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/MemoryRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/MigrationJobRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/PgSession.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/PlanRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/PoolerModeCheck.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/SchemaMigrator.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/ScratchRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/SessionPrincipal.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TaxonomyRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TelemetryRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TenantConstants.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TenantScope.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TokenCache.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TokenHashing.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TokenStore.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/AuthFilter.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/CatalogHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/ChashHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/HealthHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/HttpUtil.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/MemoryHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/MigrationHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/PlanHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/RequestContext.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/ScratchHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/SessionTokenHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/TaxonomyHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/TelemetryHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/TokenAdminHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/VersionHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/WhoamiHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/jooq/binding/Vector.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/jooq/binding/VectorBinding.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeature.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/ChromaSchemeHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/ChunkTextFetcher.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/HttpsSchemeHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/ResolveResult.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/UnknownSchemeException.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/UriSchemeHandler.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/UriSchemeResolverRegistry.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/Bge768Embedder.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/CceEmbedder.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/ChromaQuotaValidator.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/ChromaRestClient.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/DimTables.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EgressProxy.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EmbedResult.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/Embedder.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EmbedderRouter.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EmbeddingModelUnavailableException.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/LocalChromaServer.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/OnnxEmbedder.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/TaxonomyCentroidRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/VectorRepository.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/VoyageEmbedder.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/native-image.properties +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/reflect-config.json +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/resource-config.json +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/traced/reachability-metadata.json +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/nexus/release.properties +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/aspects-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/aspects-002-next-retry-at.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-002-hygiene.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-003-soft-delete.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-004-manifest-functions.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-005-collection-vector-stats.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-006-combined-query-functions.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-007-graph-hop-functions.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-008-combined-query-extensions.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-009-read-shape-views.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-011-collection-health-stale-age.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/chash-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-001-catalog-cross-store.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-002-collection-registry.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-002-validate.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-003-collection-registry-extra.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-003-validate.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/grants-nexus-svc.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/memory-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/migration-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/perf-001-rename-collection-indexes.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/plans-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/role-001-nexus-svc.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/service-tokens-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/service-tokens-002-single-root-index.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/t1-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-002-centroids.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-003-doc-count-trigger.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-004-dedup-root-topics.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/telemetry-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/updated-at-001-triggers.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/vectors-001-baseline.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/vectors-002-trgm-index.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/logback.xml +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AspectOperatorQueryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AuthFilterTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/Bge768ParityTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/Bge768ServiceEmbedIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/BridgeAddressFieldsTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogDeleteCollectionCascadeTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogDocumentCascadeTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogHandlerDeleteTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogHandlerRenameTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogRenameCollectionTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ChashRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ChashVectorConcurrencyTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ChunksRlsBehavioralTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CollectionRegistryFkExtraTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CollectionRegistryFkTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CollectionVectorStatsTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CombinedQueryParityIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CombinedQueryParityTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/DualRunHarnessIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/EmbedParityTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/EmbeddingModeFailLoudTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ForeignKeyConstraintTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/GraphHopParityIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/GraphHopParityTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/HybridParityIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/HybridSelectiveGateTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ManifestFunctionsTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/MemoryHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/MemoryRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/MemorySchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgBouncerTenantIsolationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgContainerHelper.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorCombinedQueryContractTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorEmbedSkipGcRaceTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorHybridSearchContractTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorServingContractTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorUpsertDeadlockTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PlanHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PlanRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PlansSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ReadShapeViewsTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ReferenceOnlyChunkUpsertTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/SchemaMigratorIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ScratchHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ScratchRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ScratchSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ServiceBindHostTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ServiceIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ServiceTokenSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/SessionTokenHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/SoftDeleteTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyCentroidHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyCentroidRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyCentroidSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyPersistHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomySchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TelemetryRepositoryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TelemetrySchemaLiquibaseTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TenantPoolingIsolationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TokenAdminHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TokenBoundaryAdversarialTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/UpdatedAtTriggerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorHandlerEmbeddingModeTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorHandlerTokenUsageTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorHybridHttpTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/CatalogTsOrNullTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/CollectionRegistryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/DeadlockRetryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/PoolerModeCheckTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/RawSqlGateTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/TenantScopeAdmissionTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/TenantScopeGucAllowlistTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/AspectHandlerEnqueueErrorTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/CatalogHandlerImportEmptyBodyTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/CatalogHandlerManifestFkTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/CatalogHandlerUpdateManyDeleteManyTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/MigrationHandlerIngestCloudTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/TaxonomyHandlerAssignFkTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/VersionHandlerReleaseVersionTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/jooq/binding/VectorRoundTripTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeatureTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/resolver/ChromaSchemeHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/resolver/HttpsSchemeHandlerTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/resolver/UriSchemeResolverRegistryTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/Bge768EmbedderMathTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/EgressProxyTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterBge768Test.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterVoyageOnlyTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipIntegrationTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/PgVectorRepositoryWherePredicateTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/ReferenceOnlySqlShapeTest.java +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/service/src/test/resources/bge768/parity_reference.json +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/sn/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/sn/hooks/scripts/routing/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_git_hooks_meta.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_locking.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_mineru_pid.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_session_end_launcher.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_extractor.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_promotion.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_readers.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_worker.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/bib_enricher.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/bib_enricher_openalex.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/bib_extractor.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/AGENTS.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/auto_linker.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_db.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_docs.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_git.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_links.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_owners.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_protocol.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_spans.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_sync.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_writes.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/collection_name.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/collections_owner_backfill.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/consolidation.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/dedupe.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/dt_link_generator.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/event_log.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/events.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/factory.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/http_catalog_client.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/link_generator.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/orphan_backfill.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/projector.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/synthesizer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/tumbler.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/types.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/write_priority.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/checkpoint.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/chunk_batcher.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/chunk_identity.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/chunker.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/classifier.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/cli.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/code_indexer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/collection_audit.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/collection_health.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/collection_rename.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/_helpers.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/_migration_prompt.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/_provision.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/aspects.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/backfill.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/backups.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/collections.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/doctor.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/integrity.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/links.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/maintenance.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/migration.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/orphan_backfill.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/owners.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/remediation.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/report.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/collection.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/command_context.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/config_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/console.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/context_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/daemon.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/doc.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/doctor.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/dt.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/enrich.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/guided_upgrade_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/hook.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/hooks.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/init.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/memory.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/migrate_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/migration_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/mineru.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/plan.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/rdr.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/scratch.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/search_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/service_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/storage_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/t3.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/taxonomy_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/tenant_cmd.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/tier_status.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/uninstall.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/upgrade.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/config.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/app.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/config.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/activity.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/campaigns.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/health.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/partials.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/alpine.min.js +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/console.css +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/htmx.min.js +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/pico.min.css +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/activity/_detail.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/activity/_stream.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/activity/index.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/base.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/campaigns/detail.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/campaigns/index.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/health/_cards.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/health/index.html +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/watchers.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/context.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/corpus.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/cross_encoder.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/AGENTS.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/T2_DAEMON_WIP.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/aspect_worker_daemon.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/binary_lifecycle.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/catalog_write_shim.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/discovery.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/installer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/spin_guard.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t1_lease.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t2_client.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t2_daemon.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/AGENTS.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/chroma_quotas.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/collection_purge.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/embed_migrate.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/http_scratch_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/local_ef.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/managed_endpoint.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/migrations.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/pg_bundle.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/pg_provision.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/service_bge_model.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/service_endpoint.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/storage_mode.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t1.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/_raw_handle_guard.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/_tuning.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/aspect_extraction_queue.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/aspects_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/catalog.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/catalog_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/catalog_taxonomy.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/chash_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/chash_index.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/document_aspects.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/document_highlights.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_centroid_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_chash_index.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_document_aspects_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_document_highlights_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_memory_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_plan_library.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_taxonomy_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_telemetry_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_token_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/memory_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/memory_store.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/plan_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/plan_library.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/taxonomy_compute.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/taxonomy_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/telemetry.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/telemetry_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t3.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t3_reidentify.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/devonthink.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/_common.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/citations.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/ref_scanner.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/render.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/resolvers.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/resolvers_corpus.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/tokens.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc_indexer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doctor_search.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/dropped_writes.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/dt_writeback.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/filters.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/formatters.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/frecency.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/glossary.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/health.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/hook_registry.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/hooks.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/index_context.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/languages.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/logging_setup.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/AGENTS.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/_first_run.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/_t1_state.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/catalog.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/devonthink.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/plan_cache_registry.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_client/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_client/core.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_client/devonthink.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_server.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/md_chunker.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/merge_candidates.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/metadata_schema.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/banner.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/chroma_read.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/detection.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/driver.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/etl_registry.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/guided_upgrade.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/manifest_check.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/migration_report.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/orchestrator.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/pregate.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/quiesce.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/route_coverage.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/sequencer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/state.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/validation.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/vector_etl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/verify_fill.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/name_canaries.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/operators/aspect_sql.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/operators/dispatch.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pdeathsig.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pdf_chunker.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pdf_extractor.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/phase_review_sentinel.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pipeline_buffer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pipeline_stages.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/bundle.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/loader.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/match.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/matcher.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/promote.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/purposes.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/repair.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/runner.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/schema.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/scope.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/seed_loader.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/session_cache.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/prose_indexer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/registry.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/repo_identity.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/repos.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/ripgrep_cache.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/routing_stats.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/salience.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/scoring.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/search_clusterer.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/search_engine.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/session.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/stage_timers.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/taxonomy.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/taxonomy_backfill.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/ttl.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/types.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/util/__init__.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/src/nexus/util/process_group.py +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/tests/cc-validation/README.md +0 -0
- {conexus-6.3.4 → conexus-6.3.6}/tests/e2e/t2-migration-sqlite/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: conexus
|
|
3
|
-
Version: 6.3.
|
|
3
|
+
Version: 6.3.6
|
|
4
4
|
Summary: Self-hosted semantic search and knowledge management for LLM-driven development
|
|
5
5
|
Project-URL: Homepage, https://github.com/Hellblazer/nexus
|
|
6
6
|
Project-URL: Repository, https://github.com/Hellblazer/nexus
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "conexus-mcpb"
|
|
3
|
-
version = "6.3.
|
|
3
|
+
version = "6.3.6"
|
|
4
4
|
description = "Conexus packaged as Claude Desktop .mcpb (Desktop Extension)"
|
|
5
5
|
requires-python = ">=3.12"
|
|
6
6
|
dependencies = [
|
|
@@ -10,7 +10,7 @@ dependencies = [
|
|
|
10
10
|
# while collections are indexed at 768/1024-dim, so every T3 search hits a
|
|
11
11
|
# dimension mismatch and returns zero results. The .mcpb cannot run the
|
|
12
12
|
# interactive `nx init` embedder choice, so it must pin [local] explicitly.
|
|
13
|
-
"conexus[local]>=6.3.
|
|
13
|
+
"conexus[local]>=6.3.6",
|
|
14
14
|
]
|
|
15
15
|
|
|
16
16
|
[tool.uv]
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "conexus"
|
|
7
|
-
version = "6.3.
|
|
7
|
+
version = "6.3.6"
|
|
8
8
|
description = "Self-hosted semantic search and knowledge management for LLM-driven development"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.12,<3.14"
|
{conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/AspectRepository.java
RENAMED
|
@@ -869,6 +869,61 @@ public final class AspectRepository {
|
|
|
869
869
|
* Re-enqueue at the same (collection, source_path) resets to pending.
|
|
870
870
|
*/
|
|
871
871
|
public void enqueue(String tenant, Map<String, Object> body) {
|
|
872
|
+
tenantScope.withTenant(tenant, ctx -> {
|
|
873
|
+
buildEnqueueQuery(ctx, tenant, body).execute();
|
|
874
|
+
return null;
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
* Batch-enqueue N documents for extraction in ONE round trip
|
|
880
|
+
* (nexus-nj4ch, nexus-duoak follow-up: the indexer's per-file
|
|
881
|
+
* ``aspect_extraction_enqueue_hook`` call, fired once per document
|
|
882
|
+
* boundary under the ChunkBatcher, paid one WAN round trip per
|
|
883
|
+
* document — measured ~34.7s across ~250 real inserts in this repo's
|
|
884
|
+
* own shakeout). Same {@code ctx.batch(queries).execute()} pattern as
|
|
885
|
+
* {@link CatalogRepository#updateDocumentsMany} (heterogeneous
|
|
886
|
+
* per-row ON CONFLICT DO UPDATE — a single hand-built multi-row
|
|
887
|
+
* VALUES statement was rejected there for the same reason it would be
|
|
888
|
+
* here: jOOQ's typed VALUES API needs uniform per-column types, and
|
|
889
|
+
* Postgres NULL-parameter type inference fights optional per-row
|
|
890
|
+
* fields like {@code doc_id}).
|
|
891
|
+
*
|
|
892
|
+
* <p>Each map has the same shape as {@link #enqueue}'s {@code body}.
|
|
893
|
+
* A malformed row (missing collection/source_path) is skipped rather
|
|
894
|
+
* than aborting the whole batch — ghost-class isolation, mirroring
|
|
895
|
+
* {@code register_many}/{@code update_many}'s per-doc failure
|
|
896
|
+
* tolerance; the indexer's own {@code select_config(collection) is
|
|
897
|
+
* None} gate already filters out rows that don't need enqueueing
|
|
898
|
+
* before this is ever called, so a skip here should be rare (a
|
|
899
|
+
* genuine caller bug, not a routine collection-type filter).
|
|
900
|
+
*/
|
|
901
|
+
public int enqueueMany(String tenant, List<Map<String, Object>> rows) {
|
|
902
|
+
if (rows.isEmpty()) return 0;
|
|
903
|
+
return tenantScope.withTenant(tenant, ctx -> {
|
|
904
|
+
var queries = new ArrayList<org.jooq.Query>();
|
|
905
|
+
for (var row : rows) {
|
|
906
|
+
String collection = (String) row.get("collection");
|
|
907
|
+
String sourcePath = (String) row.get("source_path");
|
|
908
|
+
if (collection == null || collection.isBlank()) continue;
|
|
909
|
+
if (sourcePath == null || sourcePath.isBlank()) continue;
|
|
910
|
+
queries.add(buildEnqueueQuery(ctx, tenant, row));
|
|
911
|
+
}
|
|
912
|
+
if (!queries.isEmpty()) {
|
|
913
|
+
ctx.batch(queries).execute();
|
|
914
|
+
}
|
|
915
|
+
return queries.size();
|
|
916
|
+
});
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
/**
|
|
920
|
+
* Shared query-builder for {@link #enqueue} and {@link #enqueueMany} —
|
|
921
|
+
* same INSERT ... ON CONFLICT DO UPDATE shape, same
|
|
922
|
+
* {@code ensureCollectionRegistered} precondition (the caller runs it
|
|
923
|
+
* before calling this, once per row, since it must happen before the
|
|
924
|
+
* row's own INSERT within the same transaction).
|
|
925
|
+
*/
|
|
926
|
+
private org.jooq.Query buildEnqueueQuery(DSLContext ctx, String tenant, Map<String, Object> body) {
|
|
872
927
|
String collection = (String) body.get("collection");
|
|
873
928
|
String sourcePath = (String) body.get("source_path");
|
|
874
929
|
if (collection == null || collection.isBlank()) throw new IllegalArgumentException("collection required");
|
|
@@ -877,55 +932,51 @@ public final class AspectRepository {
|
|
|
877
932
|
OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
|
|
878
933
|
OffsetDateTime enqueuedAtTs = parseTs(enqueuedAt);
|
|
879
934
|
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
.
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
.set(ASPECT_EXTRACTION_QUEUE.NEXT_RETRY_AT, (OffsetDateTime) null)
|
|
926
|
-
.execute();
|
|
927
|
-
return null;
|
|
928
|
-
});
|
|
935
|
+
ensureCollectionRegistered(ctx, tenant, collection);
|
|
936
|
+
return ctx.insertInto(ASPECT_EXTRACTION_QUEUE,
|
|
937
|
+
ASPECT_EXTRACTION_QUEUE.TENANT_ID,
|
|
938
|
+
ASPECT_EXTRACTION_QUEUE.COLLECTION,
|
|
939
|
+
ASPECT_EXTRACTION_QUEUE.SOURCE_PATH,
|
|
940
|
+
ASPECT_EXTRACTION_QUEUE.DOC_ID,
|
|
941
|
+
ASPECT_EXTRACTION_QUEUE.CONTENT_HASH,
|
|
942
|
+
ASPECT_EXTRACTION_QUEUE.CONTENT,
|
|
943
|
+
ASPECT_EXTRACTION_QUEUE.STATUS,
|
|
944
|
+
ASPECT_EXTRACTION_QUEUE.RETRY_COUNT,
|
|
945
|
+
ASPECT_EXTRACTION_QUEUE.ENQUEUED_AT,
|
|
946
|
+
ASPECT_EXTRACTION_QUEUE.LAST_ATTEMPT_AT,
|
|
947
|
+
ASPECT_EXTRACTION_QUEUE.LAST_ERROR)
|
|
948
|
+
.values(
|
|
949
|
+
tenant, collection, sourcePath,
|
|
950
|
+
nullIfBlank((String) body.get("doc_id")),
|
|
951
|
+
(String) body.getOrDefault("content_hash", ""),
|
|
952
|
+
(String) body.getOrDefault("content", ""),
|
|
953
|
+
"pending", 0, enqueuedAtTs, null, null)
|
|
954
|
+
.onConflict(
|
|
955
|
+
ASPECT_EXTRACTION_QUEUE.TENANT_ID,
|
|
956
|
+
ASPECT_EXTRACTION_QUEUE.COLLECTION,
|
|
957
|
+
ASPECT_EXTRACTION_QUEUE.SOURCE_PATH)
|
|
958
|
+
.doUpdate()
|
|
959
|
+
// nexus-nyout: a doc_id-less re-enqueue (blank -> NULL via
|
|
960
|
+
// nullIfBlank; e.g. collection re-embed) must not erase an
|
|
961
|
+
// existing correct tumbler — COALESCE keeps the old linkage;
|
|
962
|
+
// a real incoming tumbler still overwrites. The queue IMPORT
|
|
963
|
+
// path stays verbatim EXCLUDED.doc_id: fidelity import
|
|
964
|
+
// reproduces exported rows exactly, including blanks.
|
|
965
|
+
.set(ASPECT_EXTRACTION_QUEUE.DOC_ID,
|
|
966
|
+
coalesce(EX_Q_DOC_ID, ASPECT_EXTRACTION_QUEUE.DOC_ID))
|
|
967
|
+
.set(ASPECT_EXTRACTION_QUEUE.CONTENT_HASH, EX_Q_CONTENT_HASH)
|
|
968
|
+
.set(ASPECT_EXTRACTION_QUEUE.CONTENT, EX_Q_CONTENT)
|
|
969
|
+
.set(ASPECT_EXTRACTION_QUEUE.STATUS, "pending")
|
|
970
|
+
.set(ASPECT_EXTRACTION_QUEUE.RETRY_COUNT, 0)
|
|
971
|
+
.set(ASPECT_EXTRACTION_QUEUE.ENQUEUED_AT, EX_Q_ENQUEUED_AT)
|
|
972
|
+
.set(ASPECT_EXTRACTION_QUEUE.LAST_ATTEMPT_AT, (OffsetDateTime) null)
|
|
973
|
+
.set(ASPECT_EXTRACTION_QUEUE.LAST_ERROR, (String) null)
|
|
974
|
+
// RDR-163 P1 (nexus-ztpt6): a re-enqueue is a fresh request — it
|
|
975
|
+
// resets retry_count to 0, so it must also clear any stale backoff
|
|
976
|
+
// (next_retry_at) left by a prior mark_retry. Otherwise the claim
|
|
977
|
+
// gate would silently hold the re-enqueued row until the old
|
|
978
|
+
// backoff elapses (up to base*2^(cap-1) seconds).
|
|
979
|
+
.set(ASPECT_EXTRACTION_QUEUE.NEXT_RETRY_AT, (OffsetDateTime) null);
|
|
929
980
|
}
|
|
930
981
|
|
|
931
982
|
/**
|
{conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/AspectHandler.java
RENAMED
|
@@ -47,6 +47,7 @@ import java.util.Optional;
|
|
|
47
47
|
* POST /v1/aspects/highlights/rename_collection rename collection denorm
|
|
48
48
|
|
|
49
49
|
* POST /v1/aspects/queue/enqueue enqueue document
|
|
50
|
+
* POST /v1/aspects/queue/enqueue_many batch-enqueue N documents in ONE round trip (nexus-nj4ch)
|
|
50
51
|
* POST /v1/aspects/queue/claim_next atomically claim one pending row
|
|
51
52
|
* POST /v1/aspects/queue/claim_batch claim up to limit= pending rows
|
|
52
53
|
* POST /v1/aspects/queue/mark_done delete row on success
|
|
@@ -122,6 +123,7 @@ public final class AspectHandler implements HttpHandler {
|
|
|
122
123
|
case "/highlights/rename_collection" -> handleHighlightRenameCollection(exchange, tenant, method);
|
|
123
124
|
// ── aspect_extraction_queue ───────────────────────────────────
|
|
124
125
|
case "/queue/enqueue" -> handleQueueEnqueue(exchange, tenant, method);
|
|
126
|
+
case "/queue/enqueue_many" -> handleQueueEnqueueMany(exchange, tenant, method);
|
|
125
127
|
case "/queue/claim_next" -> handleQueueClaimNext(exchange, tenant, method);
|
|
126
128
|
case "/queue/claim_batch" -> handleQueueClaimBatch(exchange, tenant, method);
|
|
127
129
|
case "/queue/mark_done" -> handleQueueMarkDone(exchange, tenant, method);
|
|
@@ -485,6 +487,38 @@ public final class AspectHandler implements HttpHandler {
|
|
|
485
487
|
HttpUtil.send(ex, 200, "{\"enqueued\":true}");
|
|
486
488
|
}
|
|
487
489
|
|
|
490
|
+
/**
|
|
491
|
+
* POST /v1/aspects/queue/enqueue_many (nexus-nj4ch: batches the
|
|
492
|
+
* indexer's per-document aspect-extraction enqueue into ONE round
|
|
493
|
+
* trip, mirroring the catalog update_many/delete_many and vectors
|
|
494
|
+
* get-all-metadata pattern).
|
|
495
|
+
*
|
|
496
|
+
* <p>Body: {"rows": [{"collection": "...", "source_path": "...", ...}, ...]}
|
|
497
|
+
* (each row has the same shape as {@code /queue/enqueue}'s body).
|
|
498
|
+
* Response 200: {"enqueued": N} (count of rows actually enqueued;
|
|
499
|
+
* malformed rows -- missing collection/source_path -- are silently
|
|
500
|
+
* skipped, not counted, mirroring register_many's per-doc isolation).
|
|
501
|
+
*
|
|
502
|
+
* <p>A malformed *shape* (non-list body, non-object element) 400s
|
|
503
|
+
* rather than silently shrinking the input, mirroring
|
|
504
|
+
* handleManifestWriteMany / handleUpdateMany's validation pattern.
|
|
505
|
+
*/
|
|
506
|
+
@SuppressWarnings("unchecked")
|
|
507
|
+
private void handleQueueEnqueueMany(HttpExchange ex, String tenant, String method) throws IOException {
|
|
508
|
+
if (!"POST".equals(method)) { HttpUtil.send(ex, 405, "{\"error\":\"POST required\"}"); return; }
|
|
509
|
+
Map<String, Object> body = readBody(ex);
|
|
510
|
+
Object raw = body.get("rows");
|
|
511
|
+
if (!(raw instanceof List<?> l)) {
|
|
512
|
+
HttpUtil.send(ex, 400, "{\"error\":\"'rows' must be a list\"}"); return;
|
|
513
|
+
}
|
|
514
|
+
if (l.stream().anyMatch(o -> !(o instanceof Map))) {
|
|
515
|
+
HttpUtil.send(ex, 400, "{\"error\":\"every 'rows' element must be an object\"}"); return;
|
|
516
|
+
}
|
|
517
|
+
List<Map<String, Object>> rows = l.stream().map(o -> (Map<String, Object>) o).toList();
|
|
518
|
+
int enqueued = repo.enqueueMany(tenant, rows);
|
|
519
|
+
HttpUtil.send(ex, 200, "{\"enqueued\":" + enqueued + "}");
|
|
520
|
+
}
|
|
521
|
+
|
|
488
522
|
private void handleQueueClaimNext(HttpExchange ex, String tenant, String method) throws IOException {
|
|
489
523
|
if (!"POST".equals(method)) { HttpUtil.send(ex, 405, "{\"error\":\"POST required\"}"); return; }
|
|
490
524
|
Optional<Map<String, Object>> row = repo.claimNext(tenant);
|
{conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/VectorHandler.java
RENAMED
|
@@ -35,6 +35,7 @@ import java.util.Map;
|
|
|
35
35
|
* POST /v1/vectors/hybrid-search pgvector hybrid fusion (tsvector+pg_trgm gate, vector rank) — RDR-155 P3
|
|
36
36
|
* POST /v1/vectors/store-put single-chunk put (MCP store_put path)
|
|
37
37
|
* POST /v1/vectors/get get chunks by metadata where-filter (incremental-sync staleness check)
|
|
38
|
+
* POST /v1/vectors/get-all-metadata ids+metadata for an ENTIRE collection in one round trip (nexus-duoak)
|
|
38
39
|
* POST /v1/vectors/store-get fetch chunks by IDs (MCP store_get/store_get_many)
|
|
39
40
|
* POST /v1/vectors/store-list list collection (MCP store_list)
|
|
40
41
|
* POST /v1/vectors/store-delete delete by IDs (MCP store_delete)
|
|
@@ -125,6 +126,7 @@ public final class VectorHandler implements HttpHandler {
|
|
|
125
126
|
case "/search-graph-hop" -> handleSearchGraphHop(exchange, method); // RDR-156 P4 (houg9)
|
|
126
127
|
case "/store-put" -> handleStorePut(exchange, method);
|
|
127
128
|
case "/get" -> handleGet(exchange, method);
|
|
129
|
+
case "/get-all-metadata" -> handleGetAllMetadata(exchange, method);
|
|
128
130
|
case "/store-get" -> handleStoreGet(exchange, method);
|
|
129
131
|
case "/get-embeddings" -> handleGetEmbeddings(exchange, method);
|
|
130
132
|
case "/store-list" -> handleStoreList(exchange, method);
|
|
@@ -147,6 +149,14 @@ public final class VectorHandler implements HttpHandler {
|
|
|
147
149
|
} catch (IllegalArgumentException e) {
|
|
148
150
|
log.debug("event=vector_bad_request op={} error={}", op, e.getMessage());
|
|
149
151
|
HttpUtil.send(exchange, 400, json(Map.of("error", e.getMessage())));
|
|
152
|
+
} catch (IllegalStateException e) {
|
|
153
|
+
// get-all-metadata's row-count cap (well-formed request, just too
|
|
154
|
+
// big for the single-round-trip fast path) — 422 distinguishes
|
|
155
|
+
// this from a malformed request (400) or a real server error
|
|
156
|
+
// (500); the Python client falls back to paginated /get on any
|
|
157
|
+
// non-2xx, so the exact code just needs to be non-2xx and logged.
|
|
158
|
+
log.debug("event=vector_get_all_metadata_row_cap_exceeded op={} error={}", op, e.getMessage());
|
|
159
|
+
HttpUtil.send(exchange, 422, json(Map.of("error", e.getMessage())));
|
|
150
160
|
} catch (Exception e) {
|
|
151
161
|
// Shared typed-DB-error ladder: pool-exhaustion 503 + class-23 409
|
|
152
162
|
// (nexus-h8rf6.2 / nexus-7e057) — see HttpUtil.sendTypedDbError.
|
|
@@ -487,6 +497,33 @@ public final class VectorHandler implements HttpHandler {
|
|
|
487
497
|
HttpUtil.send(ex, 200, json(result));
|
|
488
498
|
}
|
|
489
499
|
|
|
500
|
+
/**
|
|
501
|
+
* POST /v1/vectors/get-all-metadata (nexus-duoak follow-up).
|
|
502
|
+
*
|
|
503
|
+
* <p>ids + metadata for EVERY chunk in a collection in ONE round trip —
|
|
504
|
+
* collapses the ``ceil(chunk_count / 300)`` client round trips the
|
|
505
|
+
* indexer's staleness-cache-build phase otherwise pays through paginated
|
|
506
|
+
* {@code /v1/vectors/get} calls. No {@code documents} field (staleness
|
|
507
|
+
* only needs metadata) and no pagination — see
|
|
508
|
+
* {@link PgVectorRepository#getAllMetadata}.
|
|
509
|
+
*
|
|
510
|
+
* <p>Request: {"collection": "...", "where": {...}} (where optional)
|
|
511
|
+
* <p>Response 200: {"ids": [...], "metadatas": [...]}
|
|
512
|
+
* <p>Response 422: row count exceeds {@link PgVectorRepository#GET_ALL_METADATA_MAX_ROWS}
|
|
513
|
+
* — caller falls back to paginated {@code /get}.
|
|
514
|
+
*/
|
|
515
|
+
private void handleGetAllMetadata(HttpExchange ex, String method) throws IOException {
|
|
516
|
+
requireMethod(ex, method, "POST");
|
|
517
|
+
var repo = requirePgRepo(ex);
|
|
518
|
+
var tenant = requireTenant(ex);
|
|
519
|
+
Map<String, Object> body = readBody(ex);
|
|
520
|
+
String collection = requireString(body, "collection");
|
|
521
|
+
Map<String, Object> where = optMap(body, "where");
|
|
522
|
+
|
|
523
|
+
var result = repo.getAllMetadata(tenant, collection, where);
|
|
524
|
+
HttpUtil.send(ex, 200, json(result));
|
|
525
|
+
}
|
|
526
|
+
|
|
490
527
|
/**
|
|
491
528
|
* POST /v1/vectors/store-get
|
|
492
529
|
*
|
|
@@ -1457,6 +1457,74 @@ public final class PgVectorRepository {
|
|
|
1457
1457
|
return getWhere(tenant, collection, where, limit, offset, false);
|
|
1458
1458
|
}
|
|
1459
1459
|
|
|
1460
|
+
/**
|
|
1461
|
+
* Upper bound on rows a single {@link #getAllMetadata} call will return.
|
|
1462
|
+
* Above this, the caller (indexer staleness-cache build) falls back to
|
|
1463
|
+
* paginated {@code /v1/vectors/get} rather than the server materializing
|
|
1464
|
+
* an unbounded response in memory.
|
|
1465
|
+
*/
|
|
1466
|
+
public static final int GET_ALL_METADATA_MAX_ROWS = 200_000;
|
|
1467
|
+
|
|
1468
|
+
/**
|
|
1469
|
+
* Fetch ids + metadata for EVERY chunk in *collection* in ONE round trip
|
|
1470
|
+
* (nexus-duoak follow-up: staleness-cache-build phase). No {@code
|
|
1471
|
+
* documents} column (staleness only needs metadata: {@code
|
|
1472
|
+
* chunk_text_hash}, spans, {@code doc_id}) and no LIMIT/OFFSET — this
|
|
1473
|
+
* collapses the ``ceil(chunk_count / 300)`` client round trips
|
|
1474
|
+
* {@code build_staleness_cache}'s paginated {@code /v1/vectors/get} loop
|
|
1475
|
+
* pays (measured: ~113s of the phase's ~116s total on this repo's own
|
|
1476
|
+
* 24k-chunk {@code code__} collection) into ONE Postgres query + ONE
|
|
1477
|
+
* HTTP response. Same rationale as the catalog {@code update_many}/
|
|
1478
|
+
* {@code delete_many} batch endpoints: server-to-Postgres round trips
|
|
1479
|
+
* are same-process and cheap; client-to-server round trips pay real
|
|
1480
|
+
* network latency each time.
|
|
1481
|
+
*
|
|
1482
|
+
* <p>Capped at {@value #GET_ALL_METADATA_MAX_ROWS} rows — above that the
|
|
1483
|
+
* caller should fall back to the paginated path rather than have the
|
|
1484
|
+
* server materialize an unbounded result set in memory. Throws {@link
|
|
1485
|
+
* IllegalStateException} when the cap is exceeded (fail loud, not a
|
|
1486
|
+
* silent truncation — a caller silently getting a partial staleness
|
|
1487
|
+
* cache would treat un-fetched rows as "unknown", which the existing
|
|
1488
|
+
* cache-miss contract already treats as safely stale-and-reindex, but
|
|
1489
|
+
* silently truncating without signaling would hide that this fast path
|
|
1490
|
+
* degraded).
|
|
1491
|
+
*/
|
|
1492
|
+
public Map<String, Object> getAllMetadata(String tenant, String collection,
|
|
1493
|
+
Map<String, Object> where) {
|
|
1494
|
+
int dim = dimForCollection(collection);
|
|
1495
|
+
DimTables.ChunkTable ch = DimTables.CHUNKS.get(dim);
|
|
1496
|
+
org.jooq.Condition cond = ch.collection().eq(collection);
|
|
1497
|
+
if (where != null) {
|
|
1498
|
+
for (Map.Entry<String, Object> e : where.entrySet()) {
|
|
1499
|
+
cond = cond.and(metadataCondition(e.getKey(), e.getValue()));
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
org.jooq.Condition finalCond = cond;
|
|
1503
|
+
var result = tenantScope.withTenant(tenant, ctx ->
|
|
1504
|
+
ctx.select(ch.chash(), ch.metadata())
|
|
1505
|
+
.from(ch.table())
|
|
1506
|
+
.where(finalCond)
|
|
1507
|
+
.orderBy(ch.chash().asc())
|
|
1508
|
+
.limit(GET_ALL_METADATA_MAX_ROWS + 1)
|
|
1509
|
+
.fetch());
|
|
1510
|
+
|
|
1511
|
+
if (result.size() > GET_ALL_METADATA_MAX_ROWS) {
|
|
1512
|
+
throw new IllegalStateException(
|
|
1513
|
+
"getAllMetadata: collection '" + collection + "' has more than "
|
|
1514
|
+
+ GET_ALL_METADATA_MAX_ROWS + " matching rows; caller must fall "
|
|
1515
|
+
+ "back to paginated /v1/vectors/get");
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
List<String> outIds = new ArrayList<>(result.size());
|
|
1519
|
+
List<Map<String, Object>> outMetas = new ArrayList<>(result.size());
|
|
1520
|
+
for (var rec : result) {
|
|
1521
|
+
outIds.add(rec.value1());
|
|
1522
|
+
JSONB meta = rec.value2();
|
|
1523
|
+
outMetas.add(fromJson(meta != null ? meta.data() : null));
|
|
1524
|
+
}
|
|
1525
|
+
return new LinkedHashMap<>(Map.of("ids", outIds, "metadatas", outMetas));
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1460
1528
|
/**
|
|
1461
1529
|
* List the collections visible to {@code tenant} (RDR-155 P4a.2,
|
|
1462
1530
|
* bead nexus-1k8s1).
|
{conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AspectRepositoryTest.java
RENAMED
|
@@ -129,7 +129,7 @@ class AspectRepositoryTest {
|
|
|
129
129
|
// document_aspects doc_ids: "1.2.3" (makeAspect default), "2.4.6", "3.1.4"
|
|
130
130
|
// document_highlights doc_ids: "highlight-1", "by-uri-doc", "list-hl-0", "list-hl-1",
|
|
131
131
|
// "del-highlight", "import-hl-1", "rls-hl-private", "hl-rename-doc-1", "hl-rename-doc-2", "hl-rls-doc"
|
|
132
|
-
// aspect_extraction_queue doc_ids: "q-doc-1", "done-doc-id-unique", "etl-q-doc"
|
|
132
|
+
// aspect_extraction_queue doc_ids: "q-doc-1", "done-doc-id-unique", "etl-q-doc", "many-doc-a"
|
|
133
133
|
// (queue items without doc_id are doc_id=NULL — no FK entry needed)
|
|
134
134
|
for (String tumbler : List.of(
|
|
135
135
|
"1.2.3", "2.4.6", "3.1.4",
|
|
@@ -140,7 +140,9 @@ class AspectRepositoryTest {
|
|
|
140
140
|
// nexus-1usso importHighlightsBatch multi-row conversion tests
|
|
141
141
|
"batch-hl-1", "batch-hl-2",
|
|
142
142
|
// nexus-nyout doc_id COALESCE-on-NULL tests
|
|
143
|
-
"coalesce-doc-1", "coalesce-doc-2"
|
|
143
|
+
"coalesce-doc-1", "coalesce-doc-2",
|
|
144
|
+
// nexus-nj4ch enqueueMany batch tests
|
|
145
|
+
"many-doc-a")) {
|
|
144
146
|
su.createStatement().execute(
|
|
145
147
|
"INSERT INTO nexus.catalog_documents (tenant_id, tumbler, title) " +
|
|
146
148
|
"VALUES ('" + TENANT_A + "', '" + tumbler + "', 'Test fixture: " + tumbler + "') " +
|
|
@@ -600,6 +602,72 @@ class AspectRepositoryTest {
|
|
|
600
602
|
.isEqualTo("");
|
|
601
603
|
}
|
|
602
604
|
|
|
605
|
+
@Test @Order(73)
|
|
606
|
+
void enqueueMany_batchesHeterogeneousRowsInOneRoundTrip() {
|
|
607
|
+
// nexus-nj4ch: replaces N serial enqueue() calls with one
|
|
608
|
+
// enqueueMany() batch — rows may carry DIFFERENT optional fields
|
|
609
|
+
// (doc_id present or absent), mirroring updateDocumentsMany's
|
|
610
|
+
// heterogeneous-SET-clause shape.
|
|
611
|
+
var rowA = new java.util.LinkedHashMap<String, Object>();
|
|
612
|
+
rowA.put("collection", "enqmany-coll");
|
|
613
|
+
rowA.put("source_path", "many-a.md");
|
|
614
|
+
rowA.put("doc_id", "many-doc-a");
|
|
615
|
+
var rowB = new java.util.LinkedHashMap<String, Object>();
|
|
616
|
+
rowB.put("collection", "enqmany-coll");
|
|
617
|
+
rowB.put("source_path", "many-b.md");
|
|
618
|
+
rowB.put("content", "content for b");
|
|
619
|
+
|
|
620
|
+
int n = repo.enqueueMany(TENANT_A, List.of(rowA, rowB));
|
|
621
|
+
|
|
622
|
+
assertThat(n).isEqualTo(2);
|
|
623
|
+
var pending = repo.listPending(TENANT_A, 100);
|
|
624
|
+
assertThat(pending.stream().map(r -> r.get("source_path")))
|
|
625
|
+
.contains("many-a.md", "many-b.md");
|
|
626
|
+
var rowAResult = pending.stream()
|
|
627
|
+
.filter(r -> "many-a.md".equals(r.get("source_path"))).findFirst().orElseThrow();
|
|
628
|
+
assertThat(rowAResult.get("doc_id")).isEqualTo("many-doc-a");
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
@Test @Order(74)
|
|
632
|
+
void enqueueMany_skipsMalformedRowsWithoutAbortingBatch() {
|
|
633
|
+
// A row missing collection/source_path must not sink the rest of
|
|
634
|
+
// the batch -- ghost-class isolation, mirroring register_many's
|
|
635
|
+
// per-doc failure tolerance.
|
|
636
|
+
var badRow = new java.util.LinkedHashMap<String, Object>();
|
|
637
|
+
badRow.put("collection", "");
|
|
638
|
+
badRow.put("source_path", "bad.md");
|
|
639
|
+
var goodRow = new java.util.LinkedHashMap<String, Object>();
|
|
640
|
+
goodRow.put("collection", "enqmany-skip-coll");
|
|
641
|
+
goodRow.put("source_path", "good.md");
|
|
642
|
+
|
|
643
|
+
int n = repo.enqueueMany(TENANT_A, List.of(badRow, goodRow));
|
|
644
|
+
|
|
645
|
+
assertThat(n).as("only the well-formed row counts").isEqualTo(1);
|
|
646
|
+
var pending = repo.listPending(TENANT_A, 100);
|
|
647
|
+
assertThat(pending.stream().map(r -> r.get("source_path"))).contains("good.md");
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
@Test @Order(75)
|
|
651
|
+
void enqueueMany_reEnqueue_resetsToPending() {
|
|
652
|
+
// Same ON CONFLICT DO UPDATE semantics as the single-row enqueue()
|
|
653
|
+
// path -- a batch re-enqueue at an existing key resets to pending.
|
|
654
|
+
var body = new java.util.LinkedHashMap<String, Object>();
|
|
655
|
+
body.put("collection", "enqmany-reenq-coll");
|
|
656
|
+
body.put("source_path", "reenq.md");
|
|
657
|
+
repo.enqueue(TENANT_A, body);
|
|
658
|
+
repo.claimNext(TENANT_A);
|
|
659
|
+
|
|
660
|
+
repo.enqueueMany(TENANT_A, List.of(body));
|
|
661
|
+
|
|
662
|
+
Optional<Map<String, Object>> reclaimed = repo.claimNext(TENANT_A);
|
|
663
|
+
assertThat(reclaimed).as("batch re-enqueue must be claimable again").isPresent();
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
@Test @Order(76)
|
|
667
|
+
void enqueueMany_emptyListIsNoop() {
|
|
668
|
+
assertThat(repo.enqueueMany(TENANT_A, List.of())).isEqualTo(0);
|
|
669
|
+
}
|
|
670
|
+
|
|
603
671
|
@Test @Order(32)
|
|
604
672
|
void markDone_byDocId_deletesRow() {
|
|
605
673
|
var body = new java.util.LinkedHashMap<String, Object>();
|
|
@@ -675,6 +675,79 @@ class PgVectorRepositoryContractTest {
|
|
|
675
675
|
.containsExactly("gwa10000000000000000000000000000");
|
|
676
676
|
}
|
|
677
677
|
|
|
678
|
+
@Test
|
|
679
|
+
void getAllMetadata_returnsEveryChunkInOneCall_noDocuments() {
|
|
680
|
+
// nexus-duoak follow-up: collapses the staleness-cache-build phase's
|
|
681
|
+
// paginated /get loop into one round trip. No "documents" key in the
|
|
682
|
+
// response -- staleness only needs metadata, keeping the payload lean.
|
|
683
|
+
String col = "code__getallmeta__voyage-code-3__v1";
|
|
684
|
+
embedder1024.register("gam a", 1.0f, 0.0f);
|
|
685
|
+
embedder1024.register("gam b", 0.8f, 0.6f);
|
|
686
|
+
embedder1024.register("gam c", 0.6f, 0.8f);
|
|
687
|
+
repo1024.upsertChunks(TENANT_A, col,
|
|
688
|
+
List.of("gama0000000000000000000000000000", "gamb0000000000000000000000000000",
|
|
689
|
+
"gamc0000000000000000000000000000"),
|
|
690
|
+
List.of("gam a", "gam b", "gam c"),
|
|
691
|
+
List.of(Map.of("chunk_text_hash", "ha"), Map.of("chunk_text_hash", "hb"),
|
|
692
|
+
Map.of("chunk_text_hash", "hc")));
|
|
693
|
+
|
|
694
|
+
var result = repo1024.getAllMetadata(TENANT_A, col, null);
|
|
695
|
+
|
|
696
|
+
assertThat(result).doesNotContainKey("documents");
|
|
697
|
+
@SuppressWarnings("unchecked")
|
|
698
|
+
List<String> ids = (List<String>) result.get("ids");
|
|
699
|
+
assertThat(ids).containsExactlyInAnyOrder(
|
|
700
|
+
"gama0000000000000000000000000000", "gamb0000000000000000000000000000",
|
|
701
|
+
"gamc0000000000000000000000000000");
|
|
702
|
+
@SuppressWarnings("unchecked")
|
|
703
|
+
List<Map<String, Object>> metas = (List<Map<String, Object>>) result.get("metadatas");
|
|
704
|
+
assertThat(metas).hasSize(3);
|
|
705
|
+
assertThat(metas).extracting(m -> m.get("chunk_text_hash"))
|
|
706
|
+
.containsExactlyInAnyOrder("ha", "hb", "hc");
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
@Test
|
|
710
|
+
void getAllMetadata_withWhere_filtersExactly() {
|
|
711
|
+
String col = "code__getallmetawhere__voyage-code-3__v1";
|
|
712
|
+
embedder1024.register("gamw a", 1.0f, 0.0f);
|
|
713
|
+
embedder1024.register("gamw b", 0.8f, 0.6f);
|
|
714
|
+
repo1024.upsertChunks(TENANT_A, col,
|
|
715
|
+
List.of("gawa0000000000000000000000000000", "gawb0000000000000000000000000000"),
|
|
716
|
+
List.of("gamw a", "gamw b"),
|
|
717
|
+
List.of(Map.of("kind", "a"), Map.of("kind", "b")));
|
|
718
|
+
|
|
719
|
+
@SuppressWarnings("unchecked")
|
|
720
|
+
List<String> ids = (List<String>) repo1024.getAllMetadata(
|
|
721
|
+
TENANT_A, col, Map.of("kind", "a")).get("ids");
|
|
722
|
+
|
|
723
|
+
assertThat(ids).containsExactly("gawa0000000000000000000000000000");
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
@Test
|
|
727
|
+
void getAllMetadata_scopedToTenant_noCrossTenantLeak() {
|
|
728
|
+
String col = "code__getallmetatenant__voyage-code-3__v1";
|
|
729
|
+
embedder1024.register("gamt a", 1.0f, 0.0f);
|
|
730
|
+
embedder1024.register("gamt b", 0.8f, 0.6f);
|
|
731
|
+
repo1024.upsertChunks(TENANT_A, col,
|
|
732
|
+
List.of("gata0000000000000000000000000000"), List.of("gamt a"), List.of(Map.of()));
|
|
733
|
+
repo1024.upsertChunks(TENANT_B, col,
|
|
734
|
+
List.of("gatb0000000000000000000000000000"), List.of("gamt b"), List.of(Map.of()));
|
|
735
|
+
|
|
736
|
+
@SuppressWarnings("unchecked")
|
|
737
|
+
List<String> idsA = (List<String>) repo1024.getAllMetadata(TENANT_A, col, null).get("ids");
|
|
738
|
+
|
|
739
|
+
assertThat(idsA).containsExactly("gata0000000000000000000000000000");
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
@Test
|
|
743
|
+
void getAllMetadata_emptyCollection_returnsEmptyLists() {
|
|
744
|
+
var result = repo1024.getAllMetadata(
|
|
745
|
+
TENANT_A, "code__getallmetaempty__voyage-code-3__v1", null);
|
|
746
|
+
|
|
747
|
+
assertThat((List<?>) result.get("ids")).isEmpty();
|
|
748
|
+
assertThat((List<?>) result.get("metadatas")).isEmpty();
|
|
749
|
+
}
|
|
750
|
+
|
|
678
751
|
@Test
|
|
679
752
|
void search_mixedDimCollections_failsLoud() {
|
|
680
753
|
// COL_CODE_1024 dispatches to chunks_1024, COL_BGE_768 to chunks_768: one query
|