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.
Files changed (558) hide show
  1. {conexus-6.3.4 → conexus-6.3.6}/PKG-INFO +1 -1
  2. {conexus-6.3.4 → conexus-6.3.6}/mcpb/pyproject.toml +2 -2
  3. {conexus-6.3.4 → conexus-6.3.6}/pyproject.toml +1 -1
  4. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/AspectRepository.java +100 -49
  5. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/AspectHandler.java +34 -0
  6. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/VectorHandler.java +37 -0
  7. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/PgVectorRepository.java +68 -0
  8. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AspectRepositoryTest.java +70 -2
  9. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorRepositoryContractTest.java +73 -0
  10. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_backup.py +82 -55
  11. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/manifest_backfill.py +9 -6
  12. conexus-6.3.6/src/nexus/catalog/store_hook.py +196 -0
  13. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog.py +144 -0
  14. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/index.py +21 -0
  15. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/store.py +34 -4
  16. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/binary_install.py +1 -1
  17. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/service_registry.py +51 -1
  18. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/storage_service_daemon.py +26 -0
  19. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t3_daemon.py +27 -0
  20. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/http_vector_client.py +25 -0
  21. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_aspect_queue.py +58 -0
  22. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/errors.py +50 -0
  23. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/exporter.py +258 -38
  24. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/indexer.py +86 -9
  25. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/indexer_utils.py +19 -10
  26. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/core.py +13 -7
  27. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_infra.py +73 -8
  28. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/retry.py +83 -0
  29. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/storage_boundary_lint.py +94 -0
  30. conexus-6.3.4/src/nexus/catalog/store_hook.py +0 -101
  31. {conexus-6.3.4 → conexus-6.3.6}/.beads/README.md +0 -0
  32. {conexus-6.3.4 → conexus-6.3.6}/.gitignore +0 -0
  33. {conexus-6.3.4 → conexus-6.3.6}/LICENSE +0 -0
  34. {conexus-6.3.4 → conexus-6.3.6}/README.md +0 -0
  35. {conexus-6.3.4 → conexus-6.3.6}/conexus/README.md +0 -0
  36. {conexus-6.3.4 → conexus-6.3.6}/conexus/agents/_shared/README.md +0 -0
  37. {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/com.nexus.service.plist +0 -0
  38. {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/com.nexus.t2.plist +0 -0
  39. {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/com.nexus.t3.plist +0 -0
  40. {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/nexus-service.service +0 -0
  41. {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/nexus-t2.service +0 -0
  42. {conexus-6.3.4 → conexus-6.3.6}/conexus/daemon/nexus-t3.service +0 -0
  43. {conexus-6.3.4 → conexus-6.3.6}/conexus/hooks/scripts/routing/README.md +0 -0
  44. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/abstract-themes.yml +0 -0
  45. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/analyze-default.yml +0 -0
  46. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/citation-traversal.yml +0 -0
  47. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/debug-default.yml +0 -0
  48. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/document-default.yml +0 -0
  49. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/find-by-author.yml +0 -0
  50. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/hybrid-factual-lookup.yml +0 -0
  51. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-author-default.yml +0 -0
  52. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-inspect-default.yml +0 -0
  53. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-inspect-dimensions.yml +0 -0
  54. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/plan-promote-propose.yml +0 -0
  55. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/research-default.yml +0 -0
  56. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/review-default.yml +0 -0
  57. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/traverse-then-generate.yml +0 -0
  58. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/builtin/type-scoped-search.yml +0 -0
  59. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/dimensions.yml +0 -0
  60. {conexus-6.3.4 → conexus-6.3.6}/conexus/plans/purposes.yml +0 -0
  61. {conexus-6.3.4 → conexus-6.3.6}/data/calibration/rdr-109/README.md +0 -0
  62. {conexus-6.3.4 → conexus-6.3.6}/docs/README.md +0 -0
  63. {conexus-6.3.4 → conexus-6.3.6}/docs/migration/README.md +0 -0
  64. {conexus-6.3.4 → conexus-6.3.6}/docs/rdr/README.md +0 -0
  65. {conexus-6.3.4 → conexus-6.3.6}/dt/scripts/Index Current Group in nx.applescript +0 -0
  66. {conexus-6.3.4 → conexus-6.3.6}/dt/scripts/Index Selection in nx (Knowledge).applescript +0 -0
  67. {conexus-6.3.4 → conexus-6.3.6}/dt/scripts/Index Selection in nx.applescript +0 -0
  68. {conexus-6.3.4 → conexus-6.3.6}/mcpb/src/server.py +0 -0
  69. {conexus-6.3.4 → conexus-6.3.6}/scripts/cron/README.md +0 -0
  70. {conexus-6.3.4 → conexus-6.3.6}/scripts/launchd/README.md +0 -0
  71. {conexus-6.3.4 → conexus-6.3.6}/scripts/rdr152-sandbox/README.md +0 -0
  72. {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/java/dev/nexus/spike/s04/Main.java +0 -0
  73. {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/resources/META-INF/native-image/reachability-metadata.json +0 -0
  74. {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
  75. {conexus-6.3.4 → conexus-6.3.6}/scripts/spikes/s04-build/src/main/resources/logback.xml +0 -0
  76. {conexus-6.3.4 → conexus-6.3.6}/service/README.md +0 -0
  77. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/Main.java +0 -0
  78. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/NexusService.java +0 -0
  79. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/CatalogRepository.java +0 -0
  80. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/ChashRepository.java +0 -0
  81. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/CollectionRegistry.java +0 -0
  82. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/DeadlockRetry.java +0 -0
  83. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/MemoryRepository.java +0 -0
  84. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/MigrationJobRepository.java +0 -0
  85. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/PgSession.java +0 -0
  86. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/PlanRepository.java +0 -0
  87. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/PoolerModeCheck.java +0 -0
  88. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/SchemaMigrator.java +0 -0
  89. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/ScratchRepository.java +0 -0
  90. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/SessionPrincipal.java +0 -0
  91. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TaxonomyRepository.java +0 -0
  92. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TelemetryRepository.java +0 -0
  93. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TenantConstants.java +0 -0
  94. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TenantScope.java +0 -0
  95. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TokenCache.java +0 -0
  96. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TokenHashing.java +0 -0
  97. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/db/TokenStore.java +0 -0
  98. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/AuthFilter.java +0 -0
  99. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/CatalogHandler.java +0 -0
  100. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/ChashHandler.java +0 -0
  101. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/HealthHandler.java +0 -0
  102. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/HttpUtil.java +0 -0
  103. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/MemoryHandler.java +0 -0
  104. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/MigrationHandler.java +0 -0
  105. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/PlanHandler.java +0 -0
  106. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/RequestContext.java +0 -0
  107. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/ScratchHandler.java +0 -0
  108. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/SessionTokenHandler.java +0 -0
  109. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/TaxonomyHandler.java +0 -0
  110. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/TelemetryHandler.java +0 -0
  111. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/TokenAdminHandler.java +0 -0
  112. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/VersionHandler.java +0 -0
  113. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/http/WhoamiHandler.java +0 -0
  114. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/jooq/binding/Vector.java +0 -0
  115. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/jooq/binding/VectorBinding.java +0 -0
  116. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeature.java +0 -0
  117. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/ChromaSchemeHandler.java +0 -0
  118. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/ChunkTextFetcher.java +0 -0
  119. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/HttpsSchemeHandler.java +0 -0
  120. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/ResolveResult.java +0 -0
  121. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/UnknownSchemeException.java +0 -0
  122. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/UriSchemeHandler.java +0 -0
  123. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/resolver/UriSchemeResolverRegistry.java +0 -0
  124. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/Bge768Embedder.java +0 -0
  125. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/CceEmbedder.java +0 -0
  126. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/ChromaQuotaValidator.java +0 -0
  127. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/ChromaRestClient.java +0 -0
  128. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/DimTables.java +0 -0
  129. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EgressProxy.java +0 -0
  130. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EmbedResult.java +0 -0
  131. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/Embedder.java +0 -0
  132. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EmbedderRouter.java +0 -0
  133. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/EmbeddingModelUnavailableException.java +0 -0
  134. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/LocalChromaServer.java +0 -0
  135. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/OnnxEmbedder.java +0 -0
  136. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/TaxonomyCentroidRepository.java +0 -0
  137. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/VectorRepository.java +0 -0
  138. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/java/dev/nexus/service/vectors/VoyageEmbedder.java +0 -0
  139. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/native-image.properties +0 -0
  140. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/reflect-config.json +0 -0
  141. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/resource-config.json +0 -0
  142. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/native-image/traced/reachability-metadata.json +0 -0
  143. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/META-INF/nexus/release.properties +0 -0
  144. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/aspects-001-baseline.xml +0 -0
  145. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/aspects-002-next-retry-at.xml +0 -0
  146. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-001-baseline.xml +0 -0
  147. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-002-hygiene.xml +0 -0
  148. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-003-soft-delete.xml +0 -0
  149. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-004-manifest-functions.xml +0 -0
  150. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-005-collection-vector-stats.xml +0 -0
  151. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-006-combined-query-functions.xml +0 -0
  152. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-007-graph-hop-functions.xml +0 -0
  153. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-008-combined-query-extensions.xml +0 -0
  154. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-009-read-shape-views.xml +0 -0
  155. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/catalog-011-collection-health-stale-age.xml +0 -0
  156. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/chash-001-baseline.xml +0 -0
  157. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
  158. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-001-catalog-cross-store.xml +0 -0
  159. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-002-collection-registry.xml +0 -0
  160. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-002-validate.xml +0 -0
  161. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-003-collection-registry-extra.xml +0 -0
  162. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/fk-003-validate.xml +0 -0
  163. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/grants-nexus-svc.xml +0 -0
  164. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/memory-001-baseline.xml +0 -0
  165. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/migration-001-baseline.xml +0 -0
  166. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/perf-001-rename-collection-indexes.xml +0 -0
  167. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/plans-001-baseline.xml +0 -0
  168. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/role-001-nexus-svc.xml +0 -0
  169. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/service-tokens-001-baseline.xml +0 -0
  170. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/service-tokens-002-single-root-index.xml +0 -0
  171. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/t1-001-baseline.xml +0 -0
  172. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-001-baseline.xml +0 -0
  173. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-002-centroids.xml +0 -0
  174. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-003-doc-count-trigger.xml +0 -0
  175. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/taxonomy-004-dedup-root-topics.xml +0 -0
  176. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/telemetry-001-baseline.xml +0 -0
  177. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/updated-at-001-triggers.xml +0 -0
  178. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/vectors-001-baseline.xml +0 -0
  179. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/db/changelog/vectors-002-trgm-index.xml +0 -0
  180. {conexus-6.3.4 → conexus-6.3.6}/service/src/main/resources/logback.xml +0 -0
  181. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AspectOperatorQueryTest.java +0 -0
  182. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/AuthFilterTest.java +0 -0
  183. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/Bge768ParityTest.java +0 -0
  184. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/Bge768ServiceEmbedIntegrationTest.java +0 -0
  185. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/BridgeAddressFieldsTest.java +0 -0
  186. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogDeleteCollectionCascadeTest.java +0 -0
  187. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogDocumentCascadeTest.java +0 -0
  188. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogHandlerDeleteTest.java +0 -0
  189. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogHandlerRenameTest.java +0 -0
  190. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogRenameCollectionTest.java +0 -0
  191. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogRepositoryTest.java +0 -0
  192. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CatalogSchemaLiquibaseTest.java +0 -0
  193. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ChashRepositoryTest.java +0 -0
  194. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ChashVectorConcurrencyTest.java +0 -0
  195. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ChunksRlsBehavioralTest.java +0 -0
  196. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CollectionRegistryFkExtraTest.java +0 -0
  197. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CollectionRegistryFkTest.java +0 -0
  198. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CollectionVectorStatsTest.java +0 -0
  199. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CombinedQueryParityIntegrationTest.java +0 -0
  200. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/CombinedQueryParityTest.java +0 -0
  201. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/DualRunHarnessIntegrationTest.java +0 -0
  202. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/EmbedParityTest.java +0 -0
  203. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/EmbeddingModeFailLoudTest.java +0 -0
  204. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ForeignKeyConstraintTest.java +0 -0
  205. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/GraphHopParityIntegrationTest.java +0 -0
  206. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/GraphHopParityTest.java +0 -0
  207. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/HybridParityIntegrationTest.java +0 -0
  208. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/HybridSelectiveGateTest.java +0 -0
  209. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ManifestFunctionsTest.java +0 -0
  210. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/MemoryHandlerTest.java +0 -0
  211. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/MemoryRepositoryTest.java +0 -0
  212. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/MemorySchemaLiquibaseTest.java +0 -0
  213. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgBouncerTenantIsolationTest.java +0 -0
  214. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgContainerHelper.java +0 -0
  215. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorCombinedQueryContractTest.java +0 -0
  216. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorEmbedSkipGcRaceTest.java +0 -0
  217. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorHybridSearchContractTest.java +0 -0
  218. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorServingContractTest.java +0 -0
  219. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PgVectorUpsertDeadlockTest.java +0 -0
  220. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PlanHandlerTest.java +0 -0
  221. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PlanRepositoryTest.java +0 -0
  222. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/PlansSchemaLiquibaseTest.java +0 -0
  223. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ReadShapeViewsTest.java +0 -0
  224. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ReferenceOnlyChunkUpsertTest.java +0 -0
  225. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/SchemaMigratorIntegrationTest.java +0 -0
  226. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ScratchHandlerTest.java +0 -0
  227. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ScratchRepositoryTest.java +0 -0
  228. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ScratchSchemaLiquibaseTest.java +0 -0
  229. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ServiceBindHostTest.java +0 -0
  230. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ServiceIntegrationTest.java +0 -0
  231. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/ServiceTokenSchemaLiquibaseTest.java +0 -0
  232. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/SessionTokenHandlerTest.java +0 -0
  233. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/SoftDeleteTest.java +0 -0
  234. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyCentroidHandlerTest.java +0 -0
  235. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyCentroidRepositoryTest.java +0 -0
  236. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyCentroidSchemaLiquibaseTest.java +0 -0
  237. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyPersistHandlerTest.java +0 -0
  238. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomyRepositoryTest.java +0 -0
  239. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TaxonomySchemaLiquibaseTest.java +0 -0
  240. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TelemetryRepositoryTest.java +0 -0
  241. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TelemetrySchemaLiquibaseTest.java +0 -0
  242. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TenantPoolingIsolationTest.java +0 -0
  243. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TokenAdminHandlerTest.java +0 -0
  244. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/TokenBoundaryAdversarialTest.java +0 -0
  245. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/UpdatedAtTriggerTest.java +0 -0
  246. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorHandlerEmbeddingModeTest.java +0 -0
  247. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorHandlerTokenUsageTest.java +0 -0
  248. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorHybridHttpTest.java +0 -0
  249. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/VectorIntegrationTest.java +0 -0
  250. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/CatalogTsOrNullTest.java +0 -0
  251. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/CollectionRegistryTest.java +0 -0
  252. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/DeadlockRetryTest.java +0 -0
  253. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/PoolerModeCheckTest.java +0 -0
  254. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/RawSqlGateTest.java +0 -0
  255. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/TenantScopeAdmissionTest.java +0 -0
  256. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/db/TenantScopeGucAllowlistTest.java +0 -0
  257. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/AspectHandlerEnqueueErrorTest.java +0 -0
  258. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/CatalogHandlerImportEmptyBodyTest.java +0 -0
  259. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/CatalogHandlerManifestFkTest.java +0 -0
  260. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/CatalogHandlerUpdateManyDeleteManyTest.java +0 -0
  261. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/MigrationHandlerIngestCloudTest.java +0 -0
  262. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/TaxonomyHandlerAssignFkTest.java +0 -0
  263. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/http/VersionHandlerReleaseVersionTest.java +0 -0
  264. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/jooq/binding/VectorRoundTripTest.java +0 -0
  265. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeatureTest.java +0 -0
  266. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/resolver/ChromaSchemeHandlerTest.java +0 -0
  267. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/resolver/HttpsSchemeHandlerTest.java +0 -0
  268. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/resolver/UriSchemeResolverRegistryTest.java +0 -0
  269. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/Bge768EmbedderMathTest.java +0 -0
  270. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/EgressProxyTest.java +0 -0
  271. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterBge768Test.java +0 -0
  272. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterVoyageOnlyTest.java +0 -0
  273. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipIntegrationTest.java +0 -0
  274. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipTest.java +0 -0
  275. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/PgVectorRepositoryWherePredicateTest.java +0 -0
  276. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/java/dev/nexus/service/vectors/ReferenceOnlySqlShapeTest.java +0 -0
  277. {conexus-6.3.4 → conexus-6.3.6}/service/src/test/resources/bge768/parity_reference.json +0 -0
  278. {conexus-6.3.4 → conexus-6.3.6}/sn/README.md +0 -0
  279. {conexus-6.3.4 → conexus-6.3.6}/sn/hooks/scripts/routing/README.md +0 -0
  280. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/__init__.py +0 -0
  281. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_git_hooks_meta.py +0 -0
  282. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_locking.py +0 -0
  283. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_mineru_pid.py +0 -0
  284. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/_session_end_launcher.py +0 -0
  285. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_extractor.py +0 -0
  286. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_promotion.py +0 -0
  287. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_readers.py +0 -0
  288. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/aspect_worker.py +0 -0
  289. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/bib_enricher.py +0 -0
  290. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/bib_enricher_openalex.py +0 -0
  291. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/bib_extractor.py +0 -0
  292. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/AGENTS.md +0 -0
  293. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/__init__.py +0 -0
  294. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/auto_linker.py +0 -0
  295. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog.py +0 -0
  296. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_db.py +0 -0
  297. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_docs.py +0 -0
  298. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_git.py +0 -0
  299. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_links.py +0 -0
  300. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_owners.py +0 -0
  301. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_protocol.py +0 -0
  302. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_spans.py +0 -0
  303. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_sync.py +0 -0
  304. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/catalog_writes.py +0 -0
  305. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/collection_name.py +0 -0
  306. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/collections_owner_backfill.py +0 -0
  307. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/consolidation.py +0 -0
  308. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/dedupe.py +0 -0
  309. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/dt_link_generator.py +0 -0
  310. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/event_log.py +0 -0
  311. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/events.py +0 -0
  312. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/factory.py +0 -0
  313. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/http_catalog_client.py +0 -0
  314. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/link_generator.py +0 -0
  315. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/orphan_backfill.py +0 -0
  316. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/projector.py +0 -0
  317. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/synthesizer.py +0 -0
  318. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/tumbler.py +0 -0
  319. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/types.py +0 -0
  320. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/catalog/write_priority.py +0 -0
  321. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/checkpoint.py +0 -0
  322. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/chunk_batcher.py +0 -0
  323. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/chunk_identity.py +0 -0
  324. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/chunker.py +0 -0
  325. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/classifier.py +0 -0
  326. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/cli.py +0 -0
  327. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/code_indexer.py +0 -0
  328. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/collection_audit.py +0 -0
  329. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/collection_health.py +0 -0
  330. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/collection_rename.py +0 -0
  331. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/__init__.py +0 -0
  332. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/_helpers.py +0 -0
  333. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/_migration_prompt.py +0 -0
  334. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/_provision.py +0 -0
  335. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/aspects.py +0 -0
  336. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/__init__.py +0 -0
  337. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/backfill.py +0 -0
  338. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/backups.py +0 -0
  339. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/collections.py +0 -0
  340. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/doctor.py +0 -0
  341. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/integrity.py +0 -0
  342. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/links.py +0 -0
  343. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/maintenance.py +0 -0
  344. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/migration.py +0 -0
  345. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/orphan_backfill.py +0 -0
  346. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/owners.py +0 -0
  347. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/remediation.py +0 -0
  348. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/catalog_cmds/report.py +0 -0
  349. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/collection.py +0 -0
  350. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/command_context.py +0 -0
  351. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/config_cmd.py +0 -0
  352. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/console.py +0 -0
  353. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/context_cmd.py +0 -0
  354. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/daemon.py +0 -0
  355. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/doc.py +0 -0
  356. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/doctor.py +0 -0
  357. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/dt.py +0 -0
  358. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/enrich.py +0 -0
  359. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/guided_upgrade_cmd.py +0 -0
  360. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/hook.py +0 -0
  361. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/hooks.py +0 -0
  362. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/init.py +0 -0
  363. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/memory.py +0 -0
  364. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/migrate_cmd.py +0 -0
  365. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/migration_cmd.py +0 -0
  366. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/mineru.py +0 -0
  367. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/plan.py +0 -0
  368. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/rdr.py +0 -0
  369. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/scratch.py +0 -0
  370. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/search_cmd.py +0 -0
  371. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/service_cmd.py +0 -0
  372. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/storage_cmd.py +0 -0
  373. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/t3.py +0 -0
  374. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/taxonomy_cmd.py +0 -0
  375. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/tenant_cmd.py +0 -0
  376. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/tier_status.py +0 -0
  377. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/uninstall.py +0 -0
  378. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/commands/upgrade.py +0 -0
  379. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/config.py +0 -0
  380. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/__init__.py +0 -0
  381. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/app.py +0 -0
  382. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/config.py +0 -0
  383. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/__init__.py +0 -0
  384. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/activity.py +0 -0
  385. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/campaigns.py +0 -0
  386. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/health.py +0 -0
  387. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/routes/partials.py +0 -0
  388. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/alpine.min.js +0 -0
  389. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/console.css +0 -0
  390. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/htmx.min.js +0 -0
  391. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/static/pico.min.css +0 -0
  392. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/activity/_detail.html +0 -0
  393. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/activity/_stream.html +0 -0
  394. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/activity/index.html +0 -0
  395. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/base.html +0 -0
  396. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/campaigns/detail.html +0 -0
  397. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/campaigns/index.html +0 -0
  398. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/health/_cards.html +0 -0
  399. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/templates/health/index.html +0 -0
  400. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/console/watchers.py +0 -0
  401. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/context.py +0 -0
  402. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/corpus.py +0 -0
  403. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/cross_encoder.py +0 -0
  404. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/AGENTS.md +0 -0
  405. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/T2_DAEMON_WIP.md +0 -0
  406. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/__init__.py +0 -0
  407. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/aspect_worker_daemon.py +0 -0
  408. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/binary_lifecycle.py +0 -0
  409. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/catalog_write_shim.py +0 -0
  410. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/discovery.py +0 -0
  411. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/installer.py +0 -0
  412. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/spin_guard.py +0 -0
  413. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t1_lease.py +0 -0
  414. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t2_client.py +0 -0
  415. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/daemon/t2_daemon.py +0 -0
  416. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/AGENTS.md +0 -0
  417. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/__init__.py +0 -0
  418. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/chroma_quotas.py +0 -0
  419. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/collection_purge.py +0 -0
  420. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/embed_migrate.py +0 -0
  421. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/http_scratch_store.py +0 -0
  422. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/local_ef.py +0 -0
  423. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/managed_endpoint.py +0 -0
  424. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/migrations.py +0 -0
  425. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/pg_bundle.py +0 -0
  426. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/pg_provision.py +0 -0
  427. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/service_bge_model.py +0 -0
  428. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/service_endpoint.py +0 -0
  429. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/storage_mode.py +0 -0
  430. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t1.py +0 -0
  431. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/__init__.py +0 -0
  432. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/_raw_handle_guard.py +0 -0
  433. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/_tuning.py +0 -0
  434. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/aspect_extraction_queue.py +0 -0
  435. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/aspects_etl.py +0 -0
  436. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/catalog.py +0 -0
  437. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/catalog_etl.py +0 -0
  438. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/catalog_taxonomy.py +0 -0
  439. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/chash_etl.py +0 -0
  440. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/chash_index.py +0 -0
  441. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/document_aspects.py +0 -0
  442. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/document_highlights.py +0 -0
  443. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_centroid_store.py +0 -0
  444. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_chash_index.py +0 -0
  445. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_document_aspects_store.py +0 -0
  446. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_document_highlights_store.py +0 -0
  447. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_memory_store.py +0 -0
  448. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_plan_library.py +0 -0
  449. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_taxonomy_store.py +0 -0
  450. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_telemetry_store.py +0 -0
  451. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/http_token_store.py +0 -0
  452. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/memory_etl.py +0 -0
  453. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/memory_store.py +0 -0
  454. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/plan_etl.py +0 -0
  455. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/plan_library.py +0 -0
  456. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/taxonomy_compute.py +0 -0
  457. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/taxonomy_etl.py +0 -0
  458. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/telemetry.py +0 -0
  459. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t2/telemetry_etl.py +0 -0
  460. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t3.py +0 -0
  461. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/db/t3_reidentify.py +0 -0
  462. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/devonthink.py +0 -0
  463. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/__init__.py +0 -0
  464. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/_common.py +0 -0
  465. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/citations.py +0 -0
  466. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/ref_scanner.py +0 -0
  467. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/render.py +0 -0
  468. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/resolvers.py +0 -0
  469. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/resolvers_corpus.py +0 -0
  470. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc/tokens.py +0 -0
  471. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doc_indexer.py +0 -0
  472. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/doctor_search.py +0 -0
  473. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/dropped_writes.py +0 -0
  474. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/dt_writeback.py +0 -0
  475. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/filters.py +0 -0
  476. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/formatters.py +0 -0
  477. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/frecency.py +0 -0
  478. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/glossary.py +0 -0
  479. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/health.py +0 -0
  480. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/hook_registry.py +0 -0
  481. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/hooks.py +0 -0
  482. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/index_context.py +0 -0
  483. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/languages.py +0 -0
  484. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/logging_setup.py +0 -0
  485. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/AGENTS.md +0 -0
  486. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/__init__.py +0 -0
  487. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/_first_run.py +0 -0
  488. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/_t1_state.py +0 -0
  489. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/catalog.py +0 -0
  490. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/devonthink.py +0 -0
  491. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp/plan_cache_registry.py +0 -0
  492. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_client/__init__.py +0 -0
  493. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_client/core.py +0 -0
  494. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_client/devonthink.py +0 -0
  495. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/mcp_server.py +0 -0
  496. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/md_chunker.py +0 -0
  497. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/merge_candidates.py +0 -0
  498. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/metadata_schema.py +0 -0
  499. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/__init__.py +0 -0
  500. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/banner.py +0 -0
  501. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/chroma_read.py +0 -0
  502. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/detection.py +0 -0
  503. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/driver.py +0 -0
  504. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/etl_registry.py +0 -0
  505. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/guided_upgrade.py +0 -0
  506. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/manifest_check.py +0 -0
  507. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/migration_report.py +0 -0
  508. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/orchestrator.py +0 -0
  509. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/pregate.py +0 -0
  510. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/quiesce.py +0 -0
  511. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/route_coverage.py +0 -0
  512. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/sequencer.py +0 -0
  513. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/state.py +0 -0
  514. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/validation.py +0 -0
  515. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/vector_etl.py +0 -0
  516. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/migration/verify_fill.py +0 -0
  517. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/name_canaries.py +0 -0
  518. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/operators/aspect_sql.py +0 -0
  519. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/operators/dispatch.py +0 -0
  520. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pdeathsig.py +0 -0
  521. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pdf_chunker.py +0 -0
  522. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pdf_extractor.py +0 -0
  523. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/phase_review_sentinel.py +0 -0
  524. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pipeline_buffer.py +0 -0
  525. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/pipeline_stages.py +0 -0
  526. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/__init__.py +0 -0
  527. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/bundle.py +0 -0
  528. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/loader.py +0 -0
  529. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/match.py +0 -0
  530. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/matcher.py +0 -0
  531. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/promote.py +0 -0
  532. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/purposes.py +0 -0
  533. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/repair.py +0 -0
  534. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/runner.py +0 -0
  535. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/schema.py +0 -0
  536. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/scope.py +0 -0
  537. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/seed_loader.py +0 -0
  538. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/plans/session_cache.py +0 -0
  539. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/prose_indexer.py +0 -0
  540. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/registry.py +0 -0
  541. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/repo_identity.py +0 -0
  542. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/repos.py +0 -0
  543. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/ripgrep_cache.py +0 -0
  544. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/routing_stats.py +0 -0
  545. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/salience.py +0 -0
  546. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/scoring.py +0 -0
  547. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/search_clusterer.py +0 -0
  548. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/search_engine.py +0 -0
  549. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/session.py +0 -0
  550. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/stage_timers.py +0 -0
  551. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/taxonomy.py +0 -0
  552. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/taxonomy_backfill.py +0 -0
  553. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/ttl.py +0 -0
  554. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/types.py +0 -0
  555. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/util/__init__.py +0 -0
  556. {conexus-6.3.4 → conexus-6.3.6}/src/nexus/util/process_group.py +0 -0
  557. {conexus-6.3.4 → conexus-6.3.6}/tests/cc-validation/README.md +0 -0
  558. {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.4
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.4"
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.4",
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.4"
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"
@@ -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
- tenantScope.withTenant(tenant, ctx -> {
881
- ensureCollectionRegistered(ctx, tenant, collection);
882
- ctx.insertInto(ASPECT_EXTRACTION_QUEUE,
883
- ASPECT_EXTRACTION_QUEUE.TENANT_ID,
884
- ASPECT_EXTRACTION_QUEUE.COLLECTION,
885
- ASPECT_EXTRACTION_QUEUE.SOURCE_PATH,
886
- ASPECT_EXTRACTION_QUEUE.DOC_ID,
887
- ASPECT_EXTRACTION_QUEUE.CONTENT_HASH,
888
- ASPECT_EXTRACTION_QUEUE.CONTENT,
889
- ASPECT_EXTRACTION_QUEUE.STATUS,
890
- ASPECT_EXTRACTION_QUEUE.RETRY_COUNT,
891
- ASPECT_EXTRACTION_QUEUE.ENQUEUED_AT,
892
- ASPECT_EXTRACTION_QUEUE.LAST_ATTEMPT_AT,
893
- ASPECT_EXTRACTION_QUEUE.LAST_ERROR)
894
- .values(
895
- tenant, collection, sourcePath,
896
- nullIfBlank((String) body.get("doc_id")),
897
- (String) body.getOrDefault("content_hash", ""),
898
- (String) body.getOrDefault("content", ""),
899
- "pending", 0, enqueuedAtTs, null, null)
900
- .onConflict(
901
- ASPECT_EXTRACTION_QUEUE.TENANT_ID,
902
- ASPECT_EXTRACTION_QUEUE.COLLECTION,
903
- ASPECT_EXTRACTION_QUEUE.SOURCE_PATH)
904
- .doUpdate()
905
- // nexus-nyout: a doc_id-less re-enqueue (blank -> NULL via
906
- // nullIfBlank; e.g. collection re-embed) must not erase an
907
- // existing correct tumbler COALESCE keeps the old linkage;
908
- // a real incoming tumbler still overwrites. The queue IMPORT
909
- // path stays verbatim EXCLUDED.doc_id: fidelity import
910
- // reproduces exported rows exactly, including blanks.
911
- .set(ASPECT_EXTRACTION_QUEUE.DOC_ID,
912
- coalesce(EX_Q_DOC_ID, ASPECT_EXTRACTION_QUEUE.DOC_ID))
913
- .set(ASPECT_EXTRACTION_QUEUE.CONTENT_HASH, EX_Q_CONTENT_HASH)
914
- .set(ASPECT_EXTRACTION_QUEUE.CONTENT, EX_Q_CONTENT)
915
- .set(ASPECT_EXTRACTION_QUEUE.STATUS, "pending")
916
- .set(ASPECT_EXTRACTION_QUEUE.RETRY_COUNT, 0)
917
- .set(ASPECT_EXTRACTION_QUEUE.ENQUEUED_AT, EX_Q_ENQUEUED_AT)
918
- .set(ASPECT_EXTRACTION_QUEUE.LAST_ATTEMPT_AT, (OffsetDateTime) null)
919
- .set(ASPECT_EXTRACTION_QUEUE.LAST_ERROR, (String) null)
920
- // RDR-163 P1 (nexus-ztpt6): a re-enqueue is a fresh request it
921
- // resets retry_count to 0, so it must also clear any stale backoff
922
- // (next_retry_at) left by a prior mark_retry. Otherwise the claim
923
- // gate would silently hold the re-enqueued row until the old
924
- // backoff elapses (up to base*2^(cap-1) seconds).
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
  /**
@@ -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);
@@ -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).
@@ -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