@legioncodeinc/nectar 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +662 -0
- package/README.md +307 -0
- package/dist/api/daemon-api-wiring.d.ts +72 -0
- package/dist/api/daemon-api-wiring.d.ts.map +1 -0
- package/dist/api/daemon-api-wiring.js +150 -0
- package/dist/api/daemon-api-wiring.js.map +1 -0
- package/dist/api/hive-graph-api.d.ts +136 -0
- package/dist/api/hive-graph-api.d.ts.map +1 -0
- package/dist/api/hive-graph-api.js +234 -0
- package/dist/api/hive-graph-api.js.map +1 -0
- package/dist/api/loopback-client.d.ts +27 -0
- package/dist/api/loopback-client.d.ts.map +1 -0
- package/dist/api/loopback-client.js +87 -0
- package/dist/api/loopback-client.js.map +1 -0
- package/dist/api/router.d.ts +172 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +212 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/status-query.d.ts +49 -0
- package/dist/api/status-query.d.ts.map +1 -0
- package/dist/api/status-query.js +103 -0
- package/dist/api/status-query.js.map +1 -0
- package/dist/brood-guard.d.ts +24 -0
- package/dist/brood-guard.d.ts.map +1 -0
- package/dist/brood-guard.js +19 -0
- package/dist/brood-guard.js.map +1 -0
- package/dist/brood-prereqs.d.ts +62 -0
- package/dist/brood-prereqs.d.ts.map +1 -0
- package/dist/brood-prereqs.js +87 -0
- package/dist/brood-prereqs.js.map +1 -0
- package/dist/brooding/bucketing.d.ts +68 -0
- package/dist/brooding/bucketing.d.ts.map +1 -0
- package/dist/brooding/bucketing.js +122 -0
- package/dist/brooding/bucketing.js.map +1 -0
- package/dist/brooding/cli.d.ts +78 -0
- package/dist/brooding/cli.d.ts.map +1 -0
- package/dist/brooding/cli.js +140 -0
- package/dist/brooding/cli.js.map +1 -0
- package/dist/brooding/constants.d.ts +75 -0
- package/dist/brooding/constants.d.ts.map +1 -0
- package/dist/brooding/constants.js +91 -0
- package/dist/brooding/constants.js.map +1 -0
- package/dist/brooding/cost.d.ts +110 -0
- package/dist/brooding/cost.d.ts.map +1 -0
- package/dist/brooding/cost.js +96 -0
- package/dist/brooding/cost.js.map +1 -0
- package/dist/brooding/describe.d.ts +152 -0
- package/dist/brooding/describe.d.ts.map +1 -0
- package/dist/brooding/describe.js +281 -0
- package/dist/brooding/describe.js.map +1 -0
- package/dist/brooding/discovery.d.ts +116 -0
- package/dist/brooding/discovery.d.ts.map +1 -0
- package/dist/brooding/discovery.js +179 -0
- package/dist/brooding/discovery.js.map +1 -0
- package/dist/brooding/index.d.ts +23 -0
- package/dist/brooding/index.d.ts.map +1 -0
- package/dist/brooding/index.js +33 -0
- package/dist/brooding/index.js.map +1 -0
- package/dist/brooding/pipeline-async.d.ts +97 -0
- package/dist/brooding/pipeline-async.d.ts.map +1 -0
- package/dist/brooding/pipeline-async.js +364 -0
- package/dist/brooding/pipeline-async.js.map +1 -0
- package/dist/brooding/pipeline.d.ts +198 -0
- package/dist/brooding/pipeline.d.ts.map +1 -0
- package/dist/brooding/pipeline.js +454 -0
- package/dist/brooding/pipeline.js.map +1 -0
- package/dist/brooding/precheck.d.ts +52 -0
- package/dist/brooding/precheck.d.ts.map +1 -0
- package/dist/brooding/precheck.js +143 -0
- package/dist/brooding/precheck.js.map +1 -0
- package/dist/brooding/resumability.d.ts +57 -0
- package/dist/brooding/resumability.d.ts.map +1 -0
- package/dist/brooding/resumability.js +46 -0
- package/dist/brooding/resumability.js.map +1 -0
- package/dist/cli.d.ts +139 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +912 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-file.d.ts +52 -0
- package/dist/config-file.d.ts.map +1 -0
- package/dist/config-file.js +130 -0
- package/dist/config-file.js.map +1 -0
- package/dist/config.d.ts +49 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +265 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +664 -0
- package/dist/daemon.js.map +1 -0
- package/dist/doctor-registry.d.ts +134 -0
- package/dist/doctor-registry.d.ts.map +1 -0
- package/dist/doctor-registry.js +173 -0
- package/dist/doctor-registry.js.map +1 -0
- package/dist/embeddings/cohere-portkey.d.ts +67 -0
- package/dist/embeddings/cohere-portkey.d.ts.map +1 -0
- package/dist/embeddings/cohere-portkey.js +171 -0
- package/dist/embeddings/cohere-portkey.js.map +1 -0
- package/dist/embeddings/config.d.ts +74 -0
- package/dist/embeddings/config.d.ts.map +1 -0
- package/dist/embeddings/config.js +131 -0
- package/dist/embeddings/config.js.map +1 -0
- package/dist/embeddings/guard.d.ts +34 -0
- package/dist/embeddings/guard.d.ts.map +1 -0
- package/dist/embeddings/guard.js +67 -0
- package/dist/embeddings/guard.js.map +1 -0
- package/dist/embeddings/hosted-portkey.d.ts +73 -0
- package/dist/embeddings/hosted-portkey.d.ts.map +1 -0
- package/dist/embeddings/hosted-portkey.js +179 -0
- package/dist/embeddings/hosted-portkey.js.map +1 -0
- package/dist/embeddings/http.d.ts +33 -0
- package/dist/embeddings/http.d.ts.map +1 -0
- package/dist/embeddings/http.js +19 -0
- package/dist/embeddings/http.js.map +1 -0
- package/dist/embeddings/index.d.ts +17 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +17 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/local-nomic.d.ts +78 -0
- package/dist/embeddings/local-nomic.d.ts.map +1 -0
- package/dist/embeddings/local-nomic.js +126 -0
- package/dist/embeddings/local-nomic.js.map +1 -0
- package/dist/embeddings/provider.d.ts +79 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +50 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/enricher/config.d.ts +43 -0
- package/dist/enricher/config.d.ts.map +1 -0
- package/dist/enricher/config.js +34 -0
- package/dist/enricher/config.js.map +1 -0
- package/dist/enricher/content-cache.d.ts +29 -0
- package/dist/enricher/content-cache.d.ts.map +1 -0
- package/dist/enricher/content-cache.js +24 -0
- package/dist/enricher/content-cache.js.map +1 -0
- package/dist/enricher/cycle.d.ts +71 -0
- package/dist/enricher/cycle.d.ts.map +1 -0
- package/dist/enricher/cycle.js +319 -0
- package/dist/enricher/cycle.js.map +1 -0
- package/dist/enricher/describe.d.ts +61 -0
- package/dist/enricher/describe.d.ts.map +1 -0
- package/dist/enricher/describe.js +175 -0
- package/dist/enricher/describe.js.map +1 -0
- package/dist/enricher/failure.d.ts +25 -0
- package/dist/enricher/failure.d.ts.map +1 -0
- package/dist/enricher/failure.js +46 -0
- package/dist/enricher/failure.js.map +1 -0
- package/dist/enricher/index.d.ts +22 -0
- package/dist/enricher/index.d.ts.map +1 -0
- package/dist/enricher/index.js +22 -0
- package/dist/enricher/index.js.map +1 -0
- package/dist/enricher/jaccard.d.ts +11 -0
- package/dist/enricher/jaccard.d.ts.map +1 -0
- package/dist/enricher/jaccard.js +29 -0
- package/dist/enricher/jaccard.js.map +1 -0
- package/dist/enricher/loop.d.ts +22 -0
- package/dist/enricher/loop.d.ts.map +1 -0
- package/dist/enricher/loop.js +34 -0
- package/dist/enricher/loop.js.map +1 -0
- package/dist/enricher/meaningful-change.d.ts +28 -0
- package/dist/enricher/meaningful-change.d.ts.map +1 -0
- package/dist/enricher/meaningful-change.js +41 -0
- package/dist/enricher/meaningful-change.js.map +1 -0
- package/dist/enricher/observability.d.ts +22 -0
- package/dist/enricher/observability.d.ts.map +1 -0
- package/dist/enricher/observability.js +55 -0
- package/dist/enricher/observability.js.map +1 -0
- package/dist/enricher/pending-query.d.ts +35 -0
- package/dist/enricher/pending-query.d.ts.map +1 -0
- package/dist/enricher/pending-query.js +54 -0
- package/dist/enricher/pending-query.js.map +1 -0
- package/dist/enricher/sql-update.d.ts +7 -0
- package/dist/enricher/sql-update.d.ts.map +1 -0
- package/dist/enricher/sql-update.js +22 -0
- package/dist/enricher/sql-update.js.map +1 -0
- package/dist/enricher/store-adapter.d.ts +98 -0
- package/dist/enricher/store-adapter.d.ts.map +1 -0
- package/dist/enricher/store-adapter.js +129 -0
- package/dist/enricher/store-adapter.js.map +1 -0
- package/dist/enricher/store.d.ts +58 -0
- package/dist/enricher/store.d.ts.map +1 -0
- package/dist/enricher/store.js +126 -0
- package/dist/enricher/store.js.map +1 -0
- package/dist/enricher/tokenize.d.ts +10 -0
- package/dist/enricher/tokenize.d.ts.map +1 -0
- package/dist/enricher/tokenize.js +28 -0
- package/dist/enricher/tokenize.js.map +1 -0
- package/dist/errors.d.ts +41 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +56 -0
- package/dist/errors.js.map +1 -0
- package/dist/health.d.ts +147 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +168 -0
- package/dist/health.js.map +1 -0
- package/dist/hive-graph/deeplake-credentials.d.ts +68 -0
- package/dist/hive-graph/deeplake-credentials.d.ts.map +1 -0
- package/dist/hive-graph/deeplake-credentials.js +135 -0
- package/dist/hive-graph/deeplake-credentials.js.map +1 -0
- package/dist/hive-graph/deeplake-heal.d.ts +63 -0
- package/dist/hive-graph/deeplake-heal.d.ts.map +1 -0
- package/dist/hive-graph/deeplake-heal.js +118 -0
- package/dist/hive-graph/deeplake-heal.js.map +1 -0
- package/dist/hive-graph/deeplake-store.d.ts +199 -0
- package/dist/hive-graph/deeplake-store.d.ts.map +1 -0
- package/dist/hive-graph/deeplake-store.js +541 -0
- package/dist/hive-graph/deeplake-store.js.map +1 -0
- package/dist/hive-graph/deeplake-transport.d.ts +89 -0
- package/dist/hive-graph/deeplake-transport.d.ts.map +1 -0
- package/dist/hive-graph/deeplake-transport.js +145 -0
- package/dist/hive-graph/deeplake-transport.js.map +1 -0
- package/dist/hive-graph/hash.d.ts +3 -0
- package/dist/hive-graph/hash.d.ts.map +1 -0
- package/dist/hive-graph/hash.js +12 -0
- package/dist/hive-graph/hash.js.map +1 -0
- package/dist/hive-graph/memory-store.d.ts +39 -0
- package/dist/hive-graph/memory-store.d.ts.map +1 -0
- package/dist/hive-graph/memory-store.js +125 -0
- package/dist/hive-graph/memory-store.js.map +1 -0
- package/dist/hive-graph/model.d.ts +109 -0
- package/dist/hive-graph/model.d.ts.map +1 -0
- package/dist/hive-graph/model.js +36 -0
- package/dist/hive-graph/model.js.map +1 -0
- package/dist/hive-graph/paths.d.ts +7 -0
- package/dist/hive-graph/paths.d.ts.map +1 -0
- package/dist/hive-graph/paths.js +26 -0
- package/dist/hive-graph/paths.js.map +1 -0
- package/dist/hive-graph/project-scope.d.ts +99 -0
- package/dist/hive-graph/project-scope.d.ts.map +1 -0
- package/dist/hive-graph/project-scope.js +286 -0
- package/dist/hive-graph/project-scope.js.map +1 -0
- package/dist/hive-graph/schema.d.ts +53 -0
- package/dist/hive-graph/schema.d.ts.map +1 -0
- package/dist/hive-graph/schema.js +139 -0
- package/dist/hive-graph/schema.js.map +1 -0
- package/dist/hive-graph/search-types.d.ts +82 -0
- package/dist/hive-graph/search-types.d.ts.map +1 -0
- package/dist/hive-graph/search-types.js +2 -0
- package/dist/hive-graph/search-types.js.map +1 -0
- package/dist/hive-graph/search.d.ts +51 -0
- package/dist/hive-graph/search.d.ts.map +1 -0
- package/dist/hive-graph/search.js +417 -0
- package/dist/hive-graph/search.js.map +1 -0
- package/dist/hive-graph/sql-guards.d.ts +99 -0
- package/dist/hive-graph/sql-guards.d.ts.map +1 -0
- package/dist/hive-graph/sql-guards.js +129 -0
- package/dist/hive-graph/sql-guards.js.map +1 -0
- package/dist/hive-graph/store.d.ts +151 -0
- package/dist/hive-graph/store.d.ts.map +1 -0
- package/dist/hive-graph/store.js +2 -0
- package/dist/hive-graph/store.js.map +1 -0
- package/dist/hive-graph/ulid.d.ts +14 -0
- package/dist/hive-graph/ulid.d.ts.map +1 -0
- package/dist/hive-graph/ulid.js +109 -0
- package/dist/hive-graph/ulid.js.map +1 -0
- package/dist/hivedoctor-registry.d.ts +111 -0
- package/dist/hivedoctor-registry.d.ts.map +1 -0
- package/dist/hivedoctor-registry.js +143 -0
- package/dist/hivedoctor-registry.js.map +1 -0
- package/dist/index.d.ts +106 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/lock.d.ts +66 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +282 -0
- package/dist/lock.js.map +1 -0
- package/dist/poll-loop.d.ts +71 -0
- package/dist/poll-loop.d.ts.map +1 -0
- package/dist/poll-loop.js +130 -0
- package/dist/poll-loop.js.map +1 -0
- package/dist/portkey/config.d.ts +46 -0
- package/dist/portkey/config.d.ts.map +1 -0
- package/dist/portkey/config.js +68 -0
- package/dist/portkey/config.js.map +1 -0
- package/dist/portkey/describe-model.d.ts +53 -0
- package/dist/portkey/describe-model.d.ts.map +1 -0
- package/dist/portkey/describe-model.js +56 -0
- package/dist/portkey/describe-model.js.map +1 -0
- package/dist/portkey/headers.d.ts +31 -0
- package/dist/portkey/headers.d.ts.map +1 -0
- package/dist/portkey/headers.js +37 -0
- package/dist/portkey/headers.js.map +1 -0
- package/dist/portkey/transport.d.ts +89 -0
- package/dist/portkey/transport.d.ts.map +1 -0
- package/dist/portkey/transport.js +167 -0
- package/dist/portkey/transport.js.map +1 -0
- package/dist/projection/format.d.ts +51 -0
- package/dist/projection/format.d.ts.map +1 -0
- package/dist/projection/format.js +81 -0
- package/dist/projection/format.js.map +1 -0
- package/dist/projection/generate.d.ts +31 -0
- package/dist/projection/generate.d.ts.map +1 -0
- package/dist/projection/generate.js +83 -0
- package/dist/projection/generate.js.map +1 -0
- package/dist/projection/inherit.d.ts +27 -0
- package/dist/projection/inherit.d.ts.map +1 -0
- package/dist/projection/inherit.js +128 -0
- package/dist/projection/inherit.js.map +1 -0
- package/dist/projection/load.d.ts +47 -0
- package/dist/projection/load.d.ts.map +1 -0
- package/dist/projection/load.js +258 -0
- package/dist/projection/load.js.map +1 -0
- package/dist/projection/store-adapter.d.ts +42 -0
- package/dist/projection/store-adapter.d.ts.map +1 -0
- package/dist/projection/store-adapter.js +42 -0
- package/dist/projection/store-adapter.js.map +1 -0
- package/dist/projection/write.d.ts +79 -0
- package/dist/projection/write.d.ts.map +1 -0
- package/dist/projection/write.js +122 -0
- package/dist/projection/write.js.map +1 -0
- package/dist/registration/classify.d.ts +33 -0
- package/dist/registration/classify.d.ts.map +1 -0
- package/dist/registration/classify.js +32 -0
- package/dist/registration/classify.js.map +1 -0
- package/dist/registration/copy-detect.d.ts +22 -0
- package/dist/registration/copy-detect.d.ts.map +1 -0
- package/dist/registration/copy-detect.js +12 -0
- package/dist/registration/copy-detect.js.map +1 -0
- package/dist/registration/disk-fs.d.ts +41 -0
- package/dist/registration/disk-fs.d.ts.map +1 -0
- package/dist/registration/disk-fs.js +175 -0
- package/dist/registration/disk-fs.js.map +1 -0
- package/dist/registration/fs-watch.d.ts +114 -0
- package/dist/registration/fs-watch.d.ts.map +1 -0
- package/dist/registration/fs-watch.js +266 -0
- package/dist/registration/fs-watch.js.map +1 -0
- package/dist/registration/ignore.d.ts +77 -0
- package/dist/registration/ignore.d.ts.map +1 -0
- package/dist/registration/ignore.js +249 -0
- package/dist/registration/ignore.js.map +1 -0
- package/dist/registration/ladder.d.ts +211 -0
- package/dist/registration/ladder.d.ts.map +1 -0
- package/dist/registration/ladder.js +378 -0
- package/dist/registration/ladder.js.map +1 -0
- package/dist/registration/paths-safe.d.ts +21 -0
- package/dist/registration/paths-safe.d.ts.map +1 -0
- package/dist/registration/paths-safe.js +88 -0
- package/dist/registration/paths-safe.js.map +1 -0
- package/dist/registration/prune-cli.d.ts +48 -0
- package/dist/registration/prune-cli.d.ts.map +1 -0
- package/dist/registration/prune-cli.js +57 -0
- package/dist/registration/prune-cli.js.map +1 -0
- package/dist/registration/review-cli.d.ts +42 -0
- package/dist/registration/review-cli.d.ts.map +1 -0
- package/dist/registration/review-cli.js +110 -0
- package/dist/registration/review-cli.js.map +1 -0
- package/dist/registration/review-store.d.ts +73 -0
- package/dist/registration/review-store.d.ts.map +1 -0
- package/dist/registration/review-store.js +243 -0
- package/dist/registration/review-store.js.map +1 -0
- package/dist/registration/service.d.ts +196 -0
- package/dist/registration/service.d.ts.map +1 -0
- package/dist/registration/service.js +384 -0
- package/dist/registration/service.js.map +1 -0
- package/dist/registration/store-bridge.d.ts +133 -0
- package/dist/registration/store-bridge.d.ts.map +1 -0
- package/dist/registration/store-bridge.js +159 -0
- package/dist/registration/store-bridge.js.map +1 -0
- package/dist/registration/tlsh.d.ts +125 -0
- package/dist/registration/tlsh.d.ts.map +1 -0
- package/dist/registration/tlsh.js +274 -0
- package/dist/registration/tlsh.js.map +1 -0
- package/dist/server.d.ts +26 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +156 -0
- package/dist/server.js.map +1 -0
- package/dist/service/argv.d.ts +52 -0
- package/dist/service/argv.d.ts.map +1 -0
- package/dist/service/argv.js +127 -0
- package/dist/service/argv.js.map +1 -0
- package/dist/service/command-runner.d.ts +54 -0
- package/dist/service/command-runner.d.ts.map +1 -0
- package/dist/service/command-runner.js +55 -0
- package/dist/service/command-runner.js.map +1 -0
- package/dist/service/index.d.ts +83 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +270 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/platform.d.ts +110 -0
- package/dist/service/platform.d.ts.map +1 -0
- package/dist/service/platform.js +157 -0
- package/dist/service/platform.js.map +1 -0
- package/dist/service/templates.d.ts +88 -0
- package/dist/service/templates.d.ts.map +1 -0
- package/dist/service/templates.js +212 -0
- package/dist/service/templates.js.map +1 -0
- package/dist/source-graph/deeplake-credentials.d.ts +57 -0
- package/dist/source-graph/deeplake-credentials.d.ts.map +1 -0
- package/dist/source-graph/deeplake-credentials.js +109 -0
- package/dist/source-graph/deeplake-credentials.js.map +1 -0
- package/dist/source-graph/deeplake-heal.d.ts +53 -0
- package/dist/source-graph/deeplake-heal.d.ts.map +1 -0
- package/dist/source-graph/deeplake-heal.js +41 -0
- package/dist/source-graph/deeplake-heal.js.map +1 -0
- package/dist/source-graph/deeplake-store.d.ts +151 -0
- package/dist/source-graph/deeplake-store.d.ts.map +1 -0
- package/dist/source-graph/deeplake-store.js +389 -0
- package/dist/source-graph/deeplake-store.js.map +1 -0
- package/dist/source-graph/deeplake-transport.d.ts +74 -0
- package/dist/source-graph/deeplake-transport.d.ts.map +1 -0
- package/dist/source-graph/deeplake-transport.js +107 -0
- package/dist/source-graph/deeplake-transport.js.map +1 -0
- package/dist/source-graph/hash.d.ts +3 -0
- package/dist/source-graph/hash.d.ts.map +1 -0
- package/dist/source-graph/hash.js +12 -0
- package/dist/source-graph/hash.js.map +1 -0
- package/dist/source-graph/memory-store.d.ts +32 -0
- package/dist/source-graph/memory-store.d.ts.map +1 -0
- package/dist/source-graph/memory-store.js +81 -0
- package/dist/source-graph/memory-store.js.map +1 -0
- package/dist/source-graph/model.d.ts +102 -0
- package/dist/source-graph/model.d.ts.map +1 -0
- package/dist/source-graph/model.js +36 -0
- package/dist/source-graph/model.js.map +1 -0
- package/dist/source-graph/paths.d.ts +7 -0
- package/dist/source-graph/paths.d.ts.map +1 -0
- package/dist/source-graph/paths.js +26 -0
- package/dist/source-graph/paths.js.map +1 -0
- package/dist/source-graph/schema.d.ts +44 -0
- package/dist/source-graph/schema.d.ts.map +1 -0
- package/dist/source-graph/schema.js +123 -0
- package/dist/source-graph/schema.js.map +1 -0
- package/dist/source-graph/sql-guards.d.ts +99 -0
- package/dist/source-graph/sql-guards.d.ts.map +1 -0
- package/dist/source-graph/sql-guards.js +129 -0
- package/dist/source-graph/sql-guards.js.map +1 -0
- package/dist/source-graph/store.d.ts +101 -0
- package/dist/source-graph/store.d.ts.map +1 -0
- package/dist/source-graph/store.js +2 -0
- package/dist/source-graph/store.js.map +1 -0
- package/dist/source-graph/ulid.d.ts +9 -0
- package/dist/source-graph/ulid.d.ts.map +1 -0
- package/dist/source-graph/ulid.js +61 -0
- package/dist/source-graph/ulid.js.map +1 -0
- package/dist/telemetry/checkin.d.ts +66 -0
- package/dist/telemetry/checkin.d.ts.map +1 -0
- package/dist/telemetry/checkin.js +142 -0
- package/dist/telemetry/checkin.js.map +1 -0
- package/dist/telemetry/db.d.ts +34 -0
- package/dist/telemetry/db.d.ts.map +1 -0
- package/dist/telemetry/db.js +122 -0
- package/dist/telemetry/db.js.map +1 -0
- package/dist/telemetry/index.d.ts +76 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +98 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/logs.d.ts +83 -0
- package/dist/telemetry/logs.d.ts.map +1 -0
- package/dist/telemetry/logs.js +110 -0
- package/dist/telemetry/logs.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +82 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +148 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry-usage/emit.d.ts +105 -0
- package/dist/telemetry-usage/emit.d.ts.map +1 -0
- package/dist/telemetry-usage/emit.js +267 -0
- package/dist/telemetry-usage/emit.js.map +1 -0
- package/dist/telemetry-usage/posthog-key.d.ts +22 -0
- package/dist/telemetry-usage/posthog-key.d.ts.map +1 -0
- package/dist/telemetry-usage/posthog-key.js +22 -0
- package/dist/telemetry-usage/posthog-key.js.map +1 -0
- package/dist/worker.d.ts +69 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +91 -0
- package/dist/worker.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nectar review-matches` command logic (PRD-006d AC-18).
|
|
3
|
+
*
|
|
4
|
+
* Lists the pending low-confidence step-4 candidates (new path <-> candidate
|
|
5
|
+
* missing nectar, with confidence / TLSH distance and a diff preview) and lets
|
|
6
|
+
* the operator accept or reject each:
|
|
7
|
+
* - accept -> carry the candidate nectar onto the new path (as a
|
|
8
|
+
* high-confidence step 4 would have) and drop the pending entry;
|
|
9
|
+
* - reject -> leave the new path minted fresh (it already was, at review time)
|
|
10
|
+
* and the missing entry in the set; drop the pending entry;
|
|
11
|
+
* - skip -> leave the entry for a later review.
|
|
12
|
+
*
|
|
13
|
+
* DELIBERATE SPEC GAP (AC-18): the accept/reject interaction defaults to
|
|
14
|
+
* interactive (list -> choose -> confirm). This module takes the per-candidate
|
|
15
|
+
* decision through an injected `decide` seam so the interactive prompt (wired in
|
|
16
|
+
* the CLI) is the default while tests supply a scripted decider. NO
|
|
17
|
+
* `--accept`/`--reject`/`--all` flag grammar is invented; the flag surface
|
|
18
|
+
* remains a flagged implementation decision.
|
|
19
|
+
*/
|
|
20
|
+
import type { HiveGraphStore } from "../hive-graph/store.js";
|
|
21
|
+
import type { Tenancy } from "../hive-graph/model.js";
|
|
22
|
+
import type { PendingReviewStore, PendingReviewCandidate } from "./review-store.js";
|
|
23
|
+
export type ReviewDecision = "accept" | "reject" | "skip";
|
|
24
|
+
export interface ReviewMatchesDeps {
|
|
25
|
+
readonly store: HiveGraphStore;
|
|
26
|
+
readonly tenancy: Tenancy;
|
|
27
|
+
readonly pendingReviews: PendingReviewStore;
|
|
28
|
+
/** Per-candidate decision. The interactive prompt (default) or a scripted test decider. */
|
|
29
|
+
decide(candidate: PendingReviewCandidate, preview: string): Promise<ReviewDecision> | ReviewDecision;
|
|
30
|
+
/** Output sink (stdout in the CLI, a capture in tests). */
|
|
31
|
+
out(line: string): void;
|
|
32
|
+
now(): string;
|
|
33
|
+
onEnrichQueued?(nectar: string): void;
|
|
34
|
+
}
|
|
35
|
+
export interface ReviewMatchesResult {
|
|
36
|
+
readonly accepted: number;
|
|
37
|
+
readonly rejected: number;
|
|
38
|
+
readonly skipped: number;
|
|
39
|
+
readonly staleDropped: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function runReviewMatches(deps: ReviewMatchesDeps): Promise<ReviewMatchesResult>;
|
|
42
|
+
//# sourceMappingURL=review-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-cli.d.ts","sourceRoot":"","sources":["../../src/registration/review-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAGpF,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,2FAA2F;IAC3F,MAAM,CAAC,SAAS,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;IACrG,2DAA2D;IAC3D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,IAAI,MAAM,CAAC;IACd,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAgBD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwG5F"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { inTenancy } from "../hive-graph/model.js";
|
|
2
|
+
import { carryNectar } from "./ladder.js";
|
|
3
|
+
/** Build a short human-readable preview for one candidate. */
|
|
4
|
+
function buildPreview(store, candidate) {
|
|
5
|
+
const source = store.latestVersion(candidate.candidateNectar);
|
|
6
|
+
const lastKnownPath = source?.path ?? "(unknown)";
|
|
7
|
+
const distance = candidate.distance === null ? "n/a" : String(candidate.distance);
|
|
8
|
+
return [
|
|
9
|
+
`candidate ${candidate.id}`,
|
|
10
|
+
` new path: ${candidate.newPath}`,
|
|
11
|
+
` maybe nectar: ${candidate.candidateNectar} (last known at ${lastKnownPath})`,
|
|
12
|
+
` confidence: ${candidate.confidence.toFixed(3)} (distance ${distance})`,
|
|
13
|
+
` new content hash: ${candidate.contentHash}`,
|
|
14
|
+
].join("\n");
|
|
15
|
+
}
|
|
16
|
+
export async function runReviewMatches(deps) {
|
|
17
|
+
const items = deps.pendingReviews.list();
|
|
18
|
+
if (items.length === 0) {
|
|
19
|
+
deps.out("No pending matches to review.");
|
|
20
|
+
return { accepted: 0, rejected: 0, skipped: 0, staleDropped: 0 };
|
|
21
|
+
}
|
|
22
|
+
let accepted = 0;
|
|
23
|
+
let rejected = 0;
|
|
24
|
+
let skipped = 0;
|
|
25
|
+
let staleDropped = 0;
|
|
26
|
+
for (const candidate of items) {
|
|
27
|
+
const preview = buildPreview(deps.store, candidate);
|
|
28
|
+
deps.out(preview);
|
|
29
|
+
const decision = await deps.decide(candidate, preview);
|
|
30
|
+
switch (decision) {
|
|
31
|
+
case "accept": {
|
|
32
|
+
// Verify the candidate nectar exists AND is in this tenancy before carrying;
|
|
33
|
+
// an accept must never re-associate a nectar from another project (AC-20).
|
|
34
|
+
const identity = deps.store.getIdentity(candidate.candidateNectar);
|
|
35
|
+
if (identity === undefined || !inTenancy(identity, deps.tenancy)) {
|
|
36
|
+
deps.pendingReviews.remove(candidate.id);
|
|
37
|
+
deps.out(`candidate ${candidate.candidateNectar} is not in scope; dropped stale review`);
|
|
38
|
+
staleDropped += 1;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
// Stale-content guard (PRD-018d NEC-036, AC-018d.8): the candidate's
|
|
42
|
+
// `contentHash` is a snapshot taken when the review was raised. If the
|
|
43
|
+
// placeholder mint (`mintedNectar`) has since seen a further edit at
|
|
44
|
+
// `newPath` (a step-2 append onto that SAME identity, keyed by path),
|
|
45
|
+
// its latest content hash no longer matches what was queued, so the
|
|
46
|
+
// recorded hash/size/mtime metadata this accept would carry onto the
|
|
47
|
+
// identity is outdated. Resolve as stale instead of carrying it.
|
|
48
|
+
// Checked against the mintedNectar's own version (not "whatever is
|
|
49
|
+
// currently at newPath") so it is precise even when mintedNectar is a
|
|
50
|
+
// synthetic id in a test fixture that was never actually minted (in
|
|
51
|
+
// which case there is nothing to compare and the accept proceeds).
|
|
52
|
+
const mintedVersion = deps.store.latestVersion(candidate.mintedNectar);
|
|
53
|
+
if (mintedVersion !== undefined && mintedVersion.contentHash !== candidate.contentHash) {
|
|
54
|
+
deps.pendingReviews.remove(candidate.id);
|
|
55
|
+
deps.out(`candidate ${candidate.candidateNectar} is stale (content at ${candidate.newPath} changed since queued); dropped stale review`);
|
|
56
|
+
staleDropped += 1;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
const carried = carryNectar(deps.store, deps.tenancy, deps.now(), candidate.candidateNectar, {
|
|
60
|
+
relPath: candidate.newPath,
|
|
61
|
+
contentHash: candidate.contentHash,
|
|
62
|
+
sizeBytes: candidate.sizeBytes,
|
|
63
|
+
mtimeObserved: candidate.mtimeObserved,
|
|
64
|
+
}, candidate.confidence);
|
|
65
|
+
deps.pendingReviews.remove(candidate.id);
|
|
66
|
+
if (carried) {
|
|
67
|
+
// Retire the placeholder nectar the ladder minted for newPath at review
|
|
68
|
+
// time, so exactly one identity (the carried one) points at newPath and
|
|
69
|
+
// there is no duplicate. Only when the carry succeeded, and only for a
|
|
70
|
+
// real, in-scope mint that is not the carried nectar itself. The
|
|
71
|
+
// tenancy-scoped delete is the sole deletion path.
|
|
72
|
+
let retiredNote = "";
|
|
73
|
+
const minted = candidate.mintedNectar;
|
|
74
|
+
if (minted !== "" && minted !== candidate.candidateNectar) {
|
|
75
|
+
const mintIdentity = deps.store.getIdentity(minted);
|
|
76
|
+
if (mintIdentity !== undefined && inTenancy(mintIdentity, deps.tenancy)) {
|
|
77
|
+
deps.store.deleteNectar(deps.tenancy, minted);
|
|
78
|
+
retiredNote = `; retired placeholder mint ${minted}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
deps.onEnrichQueued?.(candidate.candidateNectar);
|
|
82
|
+
deps.out(`accepted: carried ${candidate.candidateNectar} to ${candidate.newPath}${retiredNote}`);
|
|
83
|
+
accepted += 1;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
deps.out(`candidate ${candidate.candidateNectar} no longer exists; dropped stale review`);
|
|
87
|
+
staleDropped += 1;
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "reject": {
|
|
92
|
+
deps.pendingReviews.remove(candidate.id);
|
|
93
|
+
deps.out(`rejected: ${candidate.newPath} keeps its fresh nectar ${candidate.mintedNectar}`);
|
|
94
|
+
rejected += 1;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case "skip": {
|
|
98
|
+
deps.out(`skipped: ${candidate.newPath} left for later review`);
|
|
99
|
+
skipped += 1;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
default: {
|
|
103
|
+
const _exhaustive = decision;
|
|
104
|
+
return _exhaustive;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { accepted, rejected, skipped, staleDropped };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=review-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-cli.js","sourceRoot":"","sources":["../../src/registration/review-cli.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB1C,8DAA8D;AAC9D,SAAS,YAAY,CAAC,KAAqB,EAAE,SAAiC;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,MAAM,EAAE,IAAI,IAAI,WAAW,CAAC;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClF,OAAO;QACL,aAAa,SAAS,CAAC,EAAE,EAAE;QAC3B,sBAAsB,SAAS,CAAC,OAAO,EAAE;QACzC,sBAAsB,SAAS,CAAC,eAAe,mBAAmB,aAAa,GAAG;QAClF,sBAAsB,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,QAAQ,GAAG;QAC/E,uBAAuB,SAAS,CAAC,WAAW,EAAE;KAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuB;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC1C,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACvD,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,6EAA6E;gBAC7E,2EAA2E;gBAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;gBACnE,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACzC,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,eAAe,wCAAwC,CAAC,CAAC;oBACzF,YAAY,IAAI,CAAC,CAAC;oBAClB,MAAM;gBACR,CAAC;gBACD,qEAAqE;gBACrE,uEAAuE;gBACvE,qEAAqE;gBACrE,sEAAsE;gBACtE,oEAAoE;gBACpE,qEAAqE;gBACrE,iEAAiE;gBACjE,mEAAmE;gBACnE,sEAAsE;gBACtE,oEAAoE;gBACpE,mEAAmE;gBACnE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBACvE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;oBACvF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACzC,IAAI,CAAC,GAAG,CACN,aAAa,SAAS,CAAC,eAAe,yBAAyB,SAAS,CAAC,OAAO,8CAA8C,CAC/H,CAAC;oBACF,YAAY,IAAI,CAAC,CAAC;oBAClB,MAAM;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,WAAW,CACzB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,GAAG,EAAE,EACV,SAAS,CAAC,eAAe,EACzB;oBACE,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,WAAW,EAAE,SAAS,CAAC,WAAW;oBAClC,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,aAAa,EAAE,SAAS,CAAC,aAAa;iBACvC,EACD,SAAS,CAAC,UAAU,CACrB,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,OAAO,EAAE,CAAC;oBACZ,wEAAwE;oBACxE,wEAAwE;oBACxE,uEAAuE;oBACvE,iEAAiE;oBACjE,mDAAmD;oBACnD,IAAI,WAAW,GAAG,EAAE,CAAC;oBACrB,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;oBACtC,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,SAAS,CAAC,eAAe,EAAE,CAAC;wBAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;wBACpD,IAAI,YAAY,KAAK,SAAS,IAAI,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;4BACxE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;4BAC9C,WAAW,GAAG,8BAA8B,MAAM,EAAE,CAAC;wBACvD,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;oBACjD,IAAI,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,eAAe,OAAO,SAAS,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC,CAAC;oBACjG,QAAQ,IAAI,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,eAAe,yCAAyC,CAAC,CAAC;oBAC1F,YAAY,IAAI,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,OAAO,2BAA2B,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC5F,QAAQ,IAAI,CAAC,CAAC;gBACd,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,OAAO,wBAAwB,CAAC,CAAC;gBAChE,OAAO,IAAI,CAAC,CAAC;gBACb,MAAM;YACR,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,WAAW,GAAU,QAAQ,CAAC;gBACpC,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** One unreviewed step-4 candidate. Carries everything an accept needs so no disk re-read is required. */
|
|
2
|
+
export interface PendingReviewCandidate {
|
|
3
|
+
/** Stable id (a minted ULID) so accept/reject can target one entry. */
|
|
4
|
+
readonly id: string;
|
|
5
|
+
/** The candidate MISSING nectar the new path may be. */
|
|
6
|
+
readonly candidateNectar: string;
|
|
7
|
+
/** The new path (already minted fresh at review time). */
|
|
8
|
+
readonly newPath: string;
|
|
9
|
+
readonly confidence: number;
|
|
10
|
+
readonly distance: number | null;
|
|
11
|
+
/** The new file's content hash + metadata, so accept can carry without reading disk. */
|
|
12
|
+
readonly contentHash: string;
|
|
13
|
+
readonly sizeBytes: number;
|
|
14
|
+
readonly mtimeObserved: string;
|
|
15
|
+
/** The fresh nectar minted for `newPath` when the candidate was raised. */
|
|
16
|
+
readonly mintedNectar: string;
|
|
17
|
+
readonly createdAt: string;
|
|
18
|
+
}
|
|
19
|
+
export interface PendingReviewStore {
|
|
20
|
+
add(candidate: PendingReviewCandidate): void;
|
|
21
|
+
list(): PendingReviewCandidate[];
|
|
22
|
+
remove(id: string): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class InMemoryPendingReviewStore implements PendingReviewStore {
|
|
25
|
+
private readonly items;
|
|
26
|
+
/**
|
|
27
|
+
* Dedupe/replace by `(candidateNectar, newPath)` (PRD-018d NEC-036/AC-18d.7):
|
|
28
|
+
* a re-observation of the same target while a candidate for it is already
|
|
29
|
+
* pending refreshes that candidate in place instead of appending a sibling,
|
|
30
|
+
* so the queue never grows per re-observation of one path.
|
|
31
|
+
*/
|
|
32
|
+
add(candidate: PendingReviewCandidate): void;
|
|
33
|
+
list(): PendingReviewCandidate[];
|
|
34
|
+
remove(id: string): void;
|
|
35
|
+
}
|
|
36
|
+
/** A JSON-file-backed pending-review queue in the daemon runtime dir. Fail-open on a malformed/missing file. */
|
|
37
|
+
export declare class FilePendingReviewStore implements PendingReviewStore {
|
|
38
|
+
private readonly filePath;
|
|
39
|
+
constructor(filePath: string);
|
|
40
|
+
/** Sibling lock file guarding the read-modify-write critical section in `add`/`remove`. */
|
|
41
|
+
private lockPath;
|
|
42
|
+
private read;
|
|
43
|
+
/**
|
|
44
|
+
* Atomic write: serialize to a unique temp file in the same directory, then
|
|
45
|
+
* `renameSync` it over the target (atomic on the same filesystem). A reader
|
|
46
|
+
* therefore never sees a torn/partial file, and two concurrent writers cannot
|
|
47
|
+
* interleave bytes (last rename wins). This queue is ephemeral, last-write-wins
|
|
48
|
+
* operational state (not durable domain state, which lives in Deep Lake, FR-8).
|
|
49
|
+
* `write()` on its own only guarantees atomicity (no torn file); it is the
|
|
50
|
+
* callers `add`/`remove` that additionally guarantee no LOST update, by
|
|
51
|
+
* holding {@link acquireFileLock} across their whole read-then-write
|
|
52
|
+
* (PRD-018d AC-018d.6). The temp file is cleaned up on failure.
|
|
53
|
+
*/
|
|
54
|
+
private write;
|
|
55
|
+
/**
|
|
56
|
+
* Serialized (PRD-018d AC-018d.6) read-modify-write: the advisory lock makes
|
|
57
|
+
* this critical section mutually exclusive with any other `add`/`remove`
|
|
58
|
+
* call on the same file, from this process or another, so a daemon `add()`
|
|
59
|
+
* racing a CLI `remove()` can no longer resurrect a resolved candidate or
|
|
60
|
+
* silently drop a fresh one (M5) - whichever call wins the lock re-reads
|
|
61
|
+
* AFTER acquiring it, so it always sees the other's already-applied write.
|
|
62
|
+
*
|
|
63
|
+
* Also dedupes/replaces by `(candidateNectar, newPath)` (AC-018d.7): a
|
|
64
|
+
* re-observation of the same target refreshes the existing candidate in
|
|
65
|
+
* place rather than appending a sibling, so the queue does not grow per
|
|
66
|
+
* re-observation of one path (M6).
|
|
67
|
+
*/
|
|
68
|
+
add(candidate: PendingReviewCandidate): void;
|
|
69
|
+
list(): PendingReviewCandidate[];
|
|
70
|
+
/** Serialized (PRD-018d AC-018d.6) the same way as {@link add}. */
|
|
71
|
+
remove(id: string): void;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=review-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-store.d.ts","sourceRoot":"","sources":["../../src/registration/review-store.ts"],"names":[],"mappings":"AAsBA,0GAA0G;AAC1G,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC7C,IAAI,IAAI,sBAAsB,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE;;;;;OAKG;IACH,GAAG,CAAC,SAAS,EAAE,sBAAsB,GAAG,IAAI;IAa5C,IAAI,IAAI,sBAAsB,EAAE;IAIhC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGzB;AAqGD,gHAAgH;AAChH,qBAAa,sBAAuB,YAAW,kBAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,IAAI;IAiBZ;;;;;;;;;;OAUG;IACH,OAAO,CAAC,KAAK;IAiBb;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,SAAS,EAAE,sBAAsB,GAAG,IAAI;IAc5C,IAAI,IAAI,sBAAsB,EAAE;IAIhC,mEAAmE;IACnE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CASzB"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pending-candidate surface for `review-matches` (PRD-006d AC-18).
|
|
3
|
+
*
|
|
4
|
+
* The settled handler writes a low-confidence step-4 candidate here (via
|
|
5
|
+
* `onReviewNeeded`); the `review-matches` command reads them back, lets the
|
|
6
|
+
* operator accept (carry the nectar) or reject (leave the fresh mint), and
|
|
7
|
+
* removes each as it is resolved.
|
|
8
|
+
*
|
|
9
|
+
* Two implementations:
|
|
10
|
+
* - {@link InMemoryPendingReviewStore}: the in-process surface the running
|
|
11
|
+
* daemon and the tests use.
|
|
12
|
+
* - {@link FilePendingReviewStore}: a JSON file under the daemon runtime dir so
|
|
13
|
+
* a separate `review-matches` CLI process can see candidates a daemon queued.
|
|
14
|
+
* This is an ephemeral operational queue (like the PID/lock files that share
|
|
15
|
+
* the runtime dir), NOT durable domain state, so it does not conflict with
|
|
16
|
+
* the Deep-Lake-is-the-only-durable-store rule (FR-8): the durable nectar
|
|
17
|
+
* rows live in Deep Lake; this file only tracks unreviewed candidates.
|
|
18
|
+
*/
|
|
19
|
+
import { closeSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
20
|
+
import { basename, dirname, join } from "node:path";
|
|
21
|
+
import { randomBytes } from "node:crypto";
|
|
22
|
+
export class InMemoryPendingReviewStore {
|
|
23
|
+
items = new Map();
|
|
24
|
+
/**
|
|
25
|
+
* Dedupe/replace by `(candidateNectar, newPath)` (PRD-018d NEC-036/AC-18d.7):
|
|
26
|
+
* a re-observation of the same target while a candidate for it is already
|
|
27
|
+
* pending refreshes that candidate in place instead of appending a sibling,
|
|
28
|
+
* so the queue never grows per re-observation of one path.
|
|
29
|
+
*/
|
|
30
|
+
add(candidate) {
|
|
31
|
+
for (const [id, existing] of this.items) {
|
|
32
|
+
if (id !== candidate.id &&
|
|
33
|
+
existing.candidateNectar === candidate.candidateNectar &&
|
|
34
|
+
existing.newPath === candidate.newPath) {
|
|
35
|
+
this.items.delete(id);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this.items.set(candidate.id, { ...candidate });
|
|
39
|
+
}
|
|
40
|
+
list() {
|
|
41
|
+
return [...this.items.values()].map((c) => ({ ...c }));
|
|
42
|
+
}
|
|
43
|
+
remove(id) {
|
|
44
|
+
this.items.delete(id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function isCandidate(value) {
|
|
48
|
+
if (typeof value !== "object" || value === null)
|
|
49
|
+
return false;
|
|
50
|
+
const c = value;
|
|
51
|
+
return (typeof c["id"] === "string" &&
|
|
52
|
+
typeof c["candidateNectar"] === "string" &&
|
|
53
|
+
typeof c["newPath"] === "string" &&
|
|
54
|
+
typeof c["confidence"] === "number" &&
|
|
55
|
+
(c["distance"] === null || typeof c["distance"] === "number") &&
|
|
56
|
+
typeof c["contentHash"] === "string" &&
|
|
57
|
+
typeof c["sizeBytes"] === "number" &&
|
|
58
|
+
typeof c["mtimeObserved"] === "string" &&
|
|
59
|
+
typeof c["mintedNectar"] === "string" &&
|
|
60
|
+
typeof c["createdAt"] === "string");
|
|
61
|
+
}
|
|
62
|
+
/** How long an `add()`/`remove()` waits for the advisory lock before giving up. */
|
|
63
|
+
const LOCK_MAX_WAIT_MS = 5000;
|
|
64
|
+
/** Poll interval while waiting for the advisory lock. */
|
|
65
|
+
const LOCK_RETRY_DELAY_MS = 5;
|
|
66
|
+
/**
|
|
67
|
+
* A lock file whose mtime is older than this is presumed abandoned by a
|
|
68
|
+
* crashed holder (CodeRabbit PR-18 finding #4): a crash between
|
|
69
|
+
* {@link acquireFileLock} and the caller's `finally` release used to leave
|
|
70
|
+
* `${filePath}.lock` behind forever, wedging every later `add()`/`remove()`
|
|
71
|
+
* to the full {@link LOCK_MAX_WAIT_MS} timeout. A live holder's critical
|
|
72
|
+
* section (a small JSON read-modify-write) always finishes well within
|
|
73
|
+
* `LOCK_MAX_WAIT_MS`; 3x that gives comfortable headroom over the slowest
|
|
74
|
+
* legitimate hold (another racer's full wait plus its own critical section)
|
|
75
|
+
* before this reclaims the lock as abandoned.
|
|
76
|
+
*/
|
|
77
|
+
const LOCK_STALE_MS = LOCK_MAX_WAIT_MS * 3;
|
|
78
|
+
/** A synchronous, event-loop-blocking sleep (Node allows `Atomics.wait` on the main thread; browsers do not). */
|
|
79
|
+
function sleepSyncMs(ms) {
|
|
80
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Acquire an advisory, exclusive-create file lock at `lockPath`, blocking
|
|
84
|
+
* (synchronously) until it is free or `LOCK_MAX_WAIT_MS` elapses. Mirrors the
|
|
85
|
+
* daemon's single-instance lock's exclusive-create-is-the-atomic-winner-picker
|
|
86
|
+
* idiom (`lock.ts` `acquireSingleInstanceLock`), scaled down to a short-lived
|
|
87
|
+
* critical section instead of a whole-process-lifetime lock: unlike the daemon
|
|
88
|
+
* lock, this one carries no owner identity and is never force-reclaimed, so
|
|
89
|
+
* two racing holders can never both believe they hold it (PRD-018d NEC-036 /
|
|
90
|
+
* AC-018d.6 - this is what turns the read-modify-write in {@link
|
|
91
|
+
* FilePendingReviewStore.add}/{@link FilePendingReviewStore.remove} into a
|
|
92
|
+
* SERIALIZED critical section across the daemon and the `review-matches` CLI,
|
|
93
|
+
* the store's stated two-writer use case).
|
|
94
|
+
*/
|
|
95
|
+
/** True when `lockPath`'s mtime is older than {@link LOCK_STALE_MS} (an abandoned lock). False when it no longer exists (the caller's ENOENT race: another process reclaimed first). */
|
|
96
|
+
function isLockStale(lockPath) {
|
|
97
|
+
try {
|
|
98
|
+
return Date.now() - statSync(lockPath).mtimeMs > LOCK_STALE_MS;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false; // gone already; the create-retry below will settle it
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function acquireFileLock(lockPath) {
|
|
105
|
+
mkdirSync(dirname(lockPath), { recursive: true });
|
|
106
|
+
const deadline = Date.now() + LOCK_MAX_WAIT_MS;
|
|
107
|
+
for (;;) {
|
|
108
|
+
try {
|
|
109
|
+
closeSync(openSync(lockPath, "wx"));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (err.code !== "EEXIST")
|
|
114
|
+
throw err;
|
|
115
|
+
// CodeRabbit PR-18 finding #4: reclaim an abandoned lock by mtime instead
|
|
116
|
+
// of waiting out the full timeout behind it every time.
|
|
117
|
+
if (isLockStale(lockPath)) {
|
|
118
|
+
try {
|
|
119
|
+
rmSync(lockPath);
|
|
120
|
+
}
|
|
121
|
+
catch (rmErr) {
|
|
122
|
+
// ENOENT: another process reclaimed it first between our stat and
|
|
123
|
+
// our rm; anything else is a real filesystem problem.
|
|
124
|
+
if (rmErr.code !== "ENOENT")
|
|
125
|
+
throw rmErr;
|
|
126
|
+
}
|
|
127
|
+
continue; // re-attempt the exclusive create immediately
|
|
128
|
+
}
|
|
129
|
+
if (Date.now() >= deadline) {
|
|
130
|
+
throw new Error(`timed out waiting for the pending-review lock at ${lockPath}`);
|
|
131
|
+
}
|
|
132
|
+
sleepSyncMs(LOCK_RETRY_DELAY_MS);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Release the advisory lock. Never throws (a missing lock on release is fine; the goal already holds). */
|
|
137
|
+
function releaseFileLock(lockPath) {
|
|
138
|
+
try {
|
|
139
|
+
rmSync(lockPath, { force: true });
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// best-effort; nothing more to do if removal itself fails
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** A JSON-file-backed pending-review queue in the daemon runtime dir. Fail-open on a malformed/missing file. */
|
|
146
|
+
export class FilePendingReviewStore {
|
|
147
|
+
filePath;
|
|
148
|
+
constructor(filePath) {
|
|
149
|
+
this.filePath = filePath;
|
|
150
|
+
}
|
|
151
|
+
/** Sibling lock file guarding the read-modify-write critical section in `add`/`remove`. */
|
|
152
|
+
lockPath() {
|
|
153
|
+
return `${this.filePath}.lock`;
|
|
154
|
+
}
|
|
155
|
+
read() {
|
|
156
|
+
let raw;
|
|
157
|
+
try {
|
|
158
|
+
raw = readFileSync(this.filePath, "utf8");
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
let parsed;
|
|
164
|
+
try {
|
|
165
|
+
parsed = JSON.parse(raw);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
if (!Array.isArray(parsed))
|
|
171
|
+
return [];
|
|
172
|
+
return parsed.filter(isCandidate);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Atomic write: serialize to a unique temp file in the same directory, then
|
|
176
|
+
* `renameSync` it over the target (atomic on the same filesystem). A reader
|
|
177
|
+
* therefore never sees a torn/partial file, and two concurrent writers cannot
|
|
178
|
+
* interleave bytes (last rename wins). This queue is ephemeral, last-write-wins
|
|
179
|
+
* operational state (not durable domain state, which lives in Deep Lake, FR-8).
|
|
180
|
+
* `write()` on its own only guarantees atomicity (no torn file); it is the
|
|
181
|
+
* callers `add`/`remove` that additionally guarantee no LOST update, by
|
|
182
|
+
* holding {@link acquireFileLock} across their whole read-then-write
|
|
183
|
+
* (PRD-018d AC-018d.6). The temp file is cleaned up on failure.
|
|
184
|
+
*/
|
|
185
|
+
write(items) {
|
|
186
|
+
const dir = dirname(this.filePath);
|
|
187
|
+
mkdirSync(dir, { recursive: true });
|
|
188
|
+
const tmp = join(dir, `${basename(this.filePath)}.${process.pid}.${randomBytes(6).toString("hex")}.tmp`);
|
|
189
|
+
try {
|
|
190
|
+
writeFileSync(tmp, `${JSON.stringify(items, null, 2)}\n`, "utf8");
|
|
191
|
+
renameSync(tmp, this.filePath);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
try {
|
|
195
|
+
rmSync(tmp, { force: true });
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// best-effort cleanup; surface the original write error below
|
|
199
|
+
}
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Serialized (PRD-018d AC-018d.6) read-modify-write: the advisory lock makes
|
|
205
|
+
* this critical section mutually exclusive with any other `add`/`remove`
|
|
206
|
+
* call on the same file, from this process or another, so a daemon `add()`
|
|
207
|
+
* racing a CLI `remove()` can no longer resurrect a resolved candidate or
|
|
208
|
+
* silently drop a fresh one (M5) - whichever call wins the lock re-reads
|
|
209
|
+
* AFTER acquiring it, so it always sees the other's already-applied write.
|
|
210
|
+
*
|
|
211
|
+
* Also dedupes/replaces by `(candidateNectar, newPath)` (AC-018d.7): a
|
|
212
|
+
* re-observation of the same target refreshes the existing candidate in
|
|
213
|
+
* place rather than appending a sibling, so the queue does not grow per
|
|
214
|
+
* re-observation of one path (M6).
|
|
215
|
+
*/
|
|
216
|
+
add(candidate) {
|
|
217
|
+
const lockPath = this.lockPath();
|
|
218
|
+
acquireFileLock(lockPath);
|
|
219
|
+
try {
|
|
220
|
+
const items = this.read().filter((c) => c.id !== candidate.id && !(c.candidateNectar === candidate.candidateNectar && c.newPath === candidate.newPath));
|
|
221
|
+
items.push({ ...candidate });
|
|
222
|
+
this.write(items);
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
releaseFileLock(lockPath);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
list() {
|
|
229
|
+
return this.read();
|
|
230
|
+
}
|
|
231
|
+
/** Serialized (PRD-018d AC-018d.6) the same way as {@link add}. */
|
|
232
|
+
remove(id) {
|
|
233
|
+
const lockPath = this.lockPath();
|
|
234
|
+
acquireFileLock(lockPath);
|
|
235
|
+
try {
|
|
236
|
+
this.write(this.read().filter((c) => c.id !== id));
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
releaseFileLock(lockPath);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=review-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-store.js","sourceRoot":"","sources":["../../src/registration/review-store.ts"],"names":[],"mappings":"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"}
|