@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,274 @@
|
|
|
1
|
+
/** Fingerprint format tag. Distinguishes this in-repo digest from a byte-exact TLSH string. */
|
|
2
|
+
export const FINGERPRINT_PREFIX = "H1";
|
|
3
|
+
const BUCKETS = 128; // 2 bits per bucket -> 256-bit body (32 bytes, 64 hex chars).
|
|
4
|
+
const BODY_HEX_LEN = 64;
|
|
5
|
+
const FINGERPRINT_LEN = FINGERPRINT_PREFIX.length + 4 + BODY_HEX_LEN; // prefix + header(4) + body(64).
|
|
6
|
+
/** Per-bucket max weighted diff (a mod-4 code distance of 3 is weighted 6). */
|
|
7
|
+
const BODY_MAX = BUCKETS * 6; // 768
|
|
8
|
+
const LEN_MAX = 32; // capped length-code contribution
|
|
9
|
+
const CHK_MAX = 1; // checksum-differs contribution
|
|
10
|
+
/** Theoretical maximum distance; the normalization denominator for confidence (algorithmic, not a threshold). */
|
|
11
|
+
export const MAX_DISTANCE = BODY_MAX + LEN_MAX + CHK_MAX; // 801
|
|
12
|
+
function toBytes(content) {
|
|
13
|
+
return typeof content === "string" ? new Uint8Array(Buffer.from(content, "utf8")) : content;
|
|
14
|
+
}
|
|
15
|
+
function byteLengthOf(content) {
|
|
16
|
+
return typeof content === "string" ? Buffer.byteLength(content, "utf8") : content.length;
|
|
17
|
+
}
|
|
18
|
+
function toHexByte(n) {
|
|
19
|
+
return (n & 0xff).toString(16).padStart(2, "0");
|
|
20
|
+
}
|
|
21
|
+
/** Log-scaled 1-byte length code so near-length files share it and far-length files differ. */
|
|
22
|
+
function lengthCode(len) {
|
|
23
|
+
return Math.min(255, Math.round(Math.log2(len + 1) * 8));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compute the locality-sensitive fingerprint of the given content. Deterministic
|
|
27
|
+
* (no randomness), so identical bytes always produce an identical string.
|
|
28
|
+
*/
|
|
29
|
+
export function computeFingerprint(content) {
|
|
30
|
+
const bytes = toBytes(content);
|
|
31
|
+
const counts = new Array(BUCKETS).fill(0);
|
|
32
|
+
let checksum = 0;
|
|
33
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
34
|
+
checksum = (checksum + bytes[i]) & 0xff;
|
|
35
|
+
}
|
|
36
|
+
// Contiguous byte-trigram histogram: a small edit only perturbs a handful of
|
|
37
|
+
// trigrams, so most bucket counts (and thus the quartile codes) are stable.
|
|
38
|
+
for (let i = 0; i + 2 < bytes.length; i++) {
|
|
39
|
+
const h = ((bytes[i] * 31 + bytes[i + 1]) * 31 + bytes[i + 2]) >>> 0;
|
|
40
|
+
const bucket = h % BUCKETS;
|
|
41
|
+
counts[bucket] = counts[bucket] + 1;
|
|
42
|
+
}
|
|
43
|
+
const sorted = [...counts].sort((a, b) => a - b);
|
|
44
|
+
const q1 = quartile(sorted, 0.25);
|
|
45
|
+
const q2 = quartile(sorted, 0.5);
|
|
46
|
+
const q3 = quartile(sorted, 0.75);
|
|
47
|
+
// Encode each bucket into a 2-bit quartile code, pack 4 codes per byte.
|
|
48
|
+
let bodyHex = "";
|
|
49
|
+
for (let b = 0; b < BUCKETS; b += 4) {
|
|
50
|
+
let packed = 0;
|
|
51
|
+
for (let j = 0; j < 4; j++) {
|
|
52
|
+
packed = (packed << 2) | quartileCode(counts[b + j], q1, q2, q3);
|
|
53
|
+
}
|
|
54
|
+
bodyHex += toHexByte(packed);
|
|
55
|
+
}
|
|
56
|
+
const header = toHexByte(checksum) + toHexByte(lengthCode(bytes.length));
|
|
57
|
+
return FINGERPRINT_PREFIX + header + bodyHex;
|
|
58
|
+
}
|
|
59
|
+
function quartile(sortedAsc, fraction) {
|
|
60
|
+
if (sortedAsc.length === 0)
|
|
61
|
+
return 0;
|
|
62
|
+
const idx = Math.min(sortedAsc.length - 1, Math.floor(fraction * sortedAsc.length));
|
|
63
|
+
return sortedAsc[idx];
|
|
64
|
+
}
|
|
65
|
+
function quartileCode(count, q1, q2, q3) {
|
|
66
|
+
if (count <= q1)
|
|
67
|
+
return 0;
|
|
68
|
+
if (count <= q2)
|
|
69
|
+
return 1;
|
|
70
|
+
if (count <= q3)
|
|
71
|
+
return 2;
|
|
72
|
+
return 3;
|
|
73
|
+
}
|
|
74
|
+
function parse(fp) {
|
|
75
|
+
if (!fp.startsWith(FINGERPRINT_PREFIX) || fp.length !== FINGERPRINT_LEN)
|
|
76
|
+
return null;
|
|
77
|
+
const checksum = Number.parseInt(fp.slice(2, 4), 16);
|
|
78
|
+
const lenCode = Number.parseInt(fp.slice(4, 6), 16);
|
|
79
|
+
if (Number.isNaN(checksum) || Number.isNaN(lenCode))
|
|
80
|
+
return null;
|
|
81
|
+
const bodyHex = fp.slice(6);
|
|
82
|
+
const codes = [];
|
|
83
|
+
for (let i = 0; i < bodyHex.length; i += 2) {
|
|
84
|
+
const byte = Number.parseInt(bodyHex.slice(i, i + 2), 16);
|
|
85
|
+
if (Number.isNaN(byte))
|
|
86
|
+
return null;
|
|
87
|
+
codes.push((byte >> 6) & 3, (byte >> 4) & 3, (byte >> 2) & 3, byte & 3);
|
|
88
|
+
}
|
|
89
|
+
return { checksum, lengthCode: lenCode, codes };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Distance between two fingerprints. 0 for identical content; small for a small
|
|
93
|
+
* edit; large for unrelated content. Returns {@link MAX_DISTANCE} when either
|
|
94
|
+
* fingerprint is malformed (treated as maximally distant, never a false match).
|
|
95
|
+
*/
|
|
96
|
+
export function fingerprintDistance(a, b) {
|
|
97
|
+
const pa = parse(a);
|
|
98
|
+
const pb = parse(b);
|
|
99
|
+
if (pa === null || pb === null)
|
|
100
|
+
return MAX_DISTANCE;
|
|
101
|
+
let bodyDist = 0;
|
|
102
|
+
for (let i = 0; i < BUCKETS; i++) {
|
|
103
|
+
const diff = Math.abs(pa.codes[i] - pb.codes[i]);
|
|
104
|
+
bodyDist += diff === 3 ? 6 : diff;
|
|
105
|
+
}
|
|
106
|
+
const lenDist = Math.min(LEN_MAX, Math.abs(pa.lengthCode - pb.lengthCode));
|
|
107
|
+
const chkDist = pa.checksum === pb.checksum ? 0 : CHK_MAX;
|
|
108
|
+
return bodyDist + lenDist + chkDist;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Map a fingerprint distance to a [0,1] confidence. `maxDistance` is the
|
|
112
|
+
* normalization denominator; it defaults to the fixed {@link MAX_DISTANCE} so
|
|
113
|
+
* existing callers that score two same-order-of-magnitude-sized inputs (or
|
|
114
|
+
* that pre-compute their own denominator) are unaffected. Step 4 itself always
|
|
115
|
+
* passes a size-aware denominator via {@link achievableMaxDistance} (NEC-010) -
|
|
116
|
+
* see that function's docstring for why a fixed denominator over-inflates
|
|
117
|
+
* confidence for small inputs.
|
|
118
|
+
*/
|
|
119
|
+
export function distanceToConfidence(distance, maxDistance = MAX_DISTANCE) {
|
|
120
|
+
if (distance <= 0)
|
|
121
|
+
return 1;
|
|
122
|
+
const denom = maxDistance > 0 ? maxDistance : MAX_DISTANCE;
|
|
123
|
+
const c = 1 - distance / denom;
|
|
124
|
+
return c < 0 ? 0 : c > 1 ? 1 : c;
|
|
125
|
+
}
|
|
126
|
+
/** Number of byte-trigrams a content of `sizeBytes` bytes can produce (0 for content shorter than one trigram). */
|
|
127
|
+
function trigramCount(sizeBytes) {
|
|
128
|
+
return Math.max(0, sizeBytes - 2);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* NEC-010 fix: the size-aware achievable maximum BODY distance for comparing
|
|
132
|
+
* two contents of the given byte sizes.
|
|
133
|
+
*
|
|
134
|
+
* The fixed `BODY_MAX` (768) assumes every one of the 128 buckets can carry a
|
|
135
|
+
* maximally-different quartile code, which is only reachable when both
|
|
136
|
+
* contents have enough trigrams to populate every bucket. A content of N bytes
|
|
137
|
+
* produces at most N-2 trigrams, so it can populate at most `min(N-2, BUCKETS)`
|
|
138
|
+
* distinct buckets; the other buckets stay at quartile code 0 on both sides and
|
|
139
|
+
* cannot contribute to the distance. Two contents can differ in at most the
|
|
140
|
+
* union of their populated buckets, so the achievable body distance is capped
|
|
141
|
+
* at `6 * (min(trigrams(A), BUCKETS) + min(trigrams(B), BUCKETS))` - the exact
|
|
142
|
+
* worst case the change-detection review measured for two ~10-byte files
|
|
143
|
+
* (H5: body distance <= 96 for two 8-trigram inputs, not the fixed 768).
|
|
144
|
+
*
|
|
145
|
+
* Once both sides carry >= BUCKETS trigrams (size >= 130 bytes), this collapses
|
|
146
|
+
* back to the fixed `BODY_MAX`, so content at or above the existing
|
|
147
|
+
* `tlsh.test.ts` fixture sizes (roughly 1000+ bytes) scores IDENTICALLY to
|
|
148
|
+
* before this fix (AC-018d.3): this function changes nothing for genuinely
|
|
149
|
+
* comparable inputs, only for evidence-starved tiny ones.
|
|
150
|
+
*/
|
|
151
|
+
function achievableBodyDistance(sizeA, sizeB) {
|
|
152
|
+
const populated = Math.min(BUCKETS, trigramCount(sizeA)) + Math.min(BUCKETS, trigramCount(sizeB));
|
|
153
|
+
return Math.min(BODY_MAX, populated * 6);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* NEC-010 fix: the size-aware achievable maximum total distance for comparing
|
|
157
|
+
* two contents. Only the body term scales down for small inputs
|
|
158
|
+
* ({@link achievableBodyDistance}); `LEN_MAX`/`CHK_MAX` stay fixed because the
|
|
159
|
+
* length code and checksum are stable signals regardless of content size (they
|
|
160
|
+
* are not trigram-histogram evidence). This is the denominator step 4 feeds
|
|
161
|
+
* {@link distanceToConfidence} so a tiny input's confidence reflects how much
|
|
162
|
+
* distance the digest could actually have produced, not the corpus-wide
|
|
163
|
+
* theoretical maximum.
|
|
164
|
+
*/
|
|
165
|
+
export function achievableMaxDistance(sizeA, sizeB) {
|
|
166
|
+
return achievableBodyDistance(sizeA, sizeB) + LEN_MAX + CHK_MAX;
|
|
167
|
+
}
|
|
168
|
+
/** The +/-20% size-bucket half-width from the corpus (brooding-pipeline.md), an algorithmic optimization, not a threshold. */
|
|
169
|
+
export const SIZE_BUCKET_TOLERANCE = 0.2;
|
|
170
|
+
/**
|
|
171
|
+
* Minimum content length (bytes) for a meaningful fuzzy comparison. Content
|
|
172
|
+
* shorter than one byte-trigram records no trigram, so distinct tiny contents
|
|
173
|
+
* would collapse to the same fingerprint (distance 0, perfect confidence) and
|
|
174
|
+
* could be auto-carried without evidence.
|
|
175
|
+
*
|
|
176
|
+
* This is the absolute floor against a distance-0 fingerprint collapse, NOT
|
|
177
|
+
* the evidence floor the fuzzy step actually gates on - see
|
|
178
|
+
* {@link MIN_FUZZY_EVIDENCE_BYTES} (NEC-010), which is strictly larger and
|
|
179
|
+
* supersedes this one for the step-4 abstain decision. Kept as a named
|
|
180
|
+
* constant for the narrower guarantee it documents.
|
|
181
|
+
*/
|
|
182
|
+
export const MIN_FUZZY_BYTES = 3;
|
|
183
|
+
/**
|
|
184
|
+
* NEC-010 fix (evidence gate, AC-018d.2): the byte floor below which a
|
|
185
|
+
* content's trigram histogram carries too little evidence for a meaningful
|
|
186
|
+
* fuzzy comparison, regardless of the computed digest distance. The
|
|
187
|
+
* change-detection review found that two unrelated ~10-byte files can score
|
|
188
|
+
* confidence >= 0.879 under the old fixed-`MAX_DISTANCE` mapping - well above
|
|
189
|
+
* the `highConfidence` default of 0.85 - because so few trigrams exist that
|
|
190
|
+
* the quartile-coded body is little more than an 8-of-128 occupancy bitmap.
|
|
191
|
+
* `MIN_FUZZY_BYTES` (3) only blocks a literal fingerprint collapse; this floor
|
|
192
|
+
* is deliberately much larger (in the review's suggested 50-100 byte
|
|
193
|
+
* neighborhood) so the fuzzy step abstains outright on any input too small to
|
|
194
|
+
* carry real signal, INDEPENDENT of {@link achievableMaxDistance}'s
|
|
195
|
+
* normalization fix (defense in depth: AC-018d.1's ~10-byte case is caught by
|
|
196
|
+
* both). Content at or above this floor - including every existing
|
|
197
|
+
* `tlsh.test.ts` fixture (roughly 1000+ bytes) - is unaffected (AC-018d.3).
|
|
198
|
+
* This is the mapping/gate, not the tunable `highConfidence`/`reviewFloor`
|
|
199
|
+
* band edges (`DEFAULT_TUNABLE_FUZZY_CONFIG`), which stay operator-tunable.
|
|
200
|
+
*/
|
|
201
|
+
export const MIN_FUZZY_EVIDENCE_BYTES = 50;
|
|
202
|
+
/**
|
|
203
|
+
* OPERATOR DEFAULT, tunable during brooding (PRD-007). This is NOT a
|
|
204
|
+
* spec-pinned threshold: PRD-006d and identity-and-reassociation.md deliberately
|
|
205
|
+
* pin no number ("configurable, default tuned during brooding"). These values
|
|
206
|
+
* exist only so the daemon has a runnable fuzzy step out of the box; an operator
|
|
207
|
+
* overrides them via daemon config, and brooding calibrates them against the
|
|
208
|
+
* actual codebase's near-duplicate distribution. Do NOT treat these as the spec.
|
|
209
|
+
*/
|
|
210
|
+
export const DEFAULT_TUNABLE_FUZZY_CONFIG = {
|
|
211
|
+
highConfidence: 0.85,
|
|
212
|
+
reviewFloor: 0.55,
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Build the concrete, pure-TS step-4 fuzzy matcher. Size-buckets the candidates
|
|
216
|
+
* by +/-20% of the new content's byte length, fingerprints the new content,
|
|
217
|
+
* scores each in-bucket candidate that carries a fingerprint, and bands the best
|
|
218
|
+
* score by the injected {@link FuzzyConfig}. The band edges come from `config`;
|
|
219
|
+
* this function pins none.
|
|
220
|
+
*/
|
|
221
|
+
export function createTlshFuzzyStep(config) {
|
|
222
|
+
return {
|
|
223
|
+
match(content, candidates) {
|
|
224
|
+
const newSize = byteLengthOf(content);
|
|
225
|
+
// Evidence gate (NEC-010, AC-018d.2): below the evidence floor the
|
|
226
|
+
// trigram histogram carries too little signal for a meaningful fuzzy
|
|
227
|
+
// comparison, so abstain unconditionally - regardless of digest
|
|
228
|
+
// distance. Strictly supersedes the narrower MIN_FUZZY_BYTES collapse
|
|
229
|
+
// guard.
|
|
230
|
+
if (newSize < MIN_FUZZY_EVIDENCE_BYTES)
|
|
231
|
+
return { kind: "none" };
|
|
232
|
+
const lo = newSize * (1 - SIZE_BUCKET_TOLERANCE);
|
|
233
|
+
const hi = newSize * (1 + SIZE_BUCKET_TOLERANCE);
|
|
234
|
+
const newFingerprint = computeFingerprint(content);
|
|
235
|
+
let best = null;
|
|
236
|
+
// Whether the current best confidence is held by more than one candidate.
|
|
237
|
+
// A shared top score is evidence-free (which one to carry would depend on
|
|
238
|
+
// store iteration order), so a tie is never auto-carried.
|
|
239
|
+
let bestIsTied = false;
|
|
240
|
+
for (const candidate of candidates) {
|
|
241
|
+
if (candidate.fingerprint === null)
|
|
242
|
+
continue;
|
|
243
|
+
const size = candidate.version.sizeBytes;
|
|
244
|
+
if (size < MIN_FUZZY_EVIDENCE_BYTES)
|
|
245
|
+
continue; // the candidate side lacks evidence too (NEC-010)
|
|
246
|
+
if (size < lo || size > hi)
|
|
247
|
+
continue; // outside the +/-20% size bucket
|
|
248
|
+
const distance = fingerprintDistance(newFingerprint, candidate.fingerprint);
|
|
249
|
+
// Size-aware denominator (NEC-010): reflects how much distance THIS
|
|
250
|
+
// pair could actually produce, not the corpus-wide fixed maximum.
|
|
251
|
+
const confidence = distanceToConfidence(distance, achievableMaxDistance(newSize, size));
|
|
252
|
+
if (best === null || confidence > best.confidence) {
|
|
253
|
+
best = { nectar: candidate.identity.nectar, confidence, distance };
|
|
254
|
+
bestIsTied = false;
|
|
255
|
+
}
|
|
256
|
+
else if (confidence === best.confidence) {
|
|
257
|
+
bestIsTied = true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (best === null)
|
|
261
|
+
return { kind: "none" };
|
|
262
|
+
// A uniquely-best candidate above the high band auto-carries; a tie for the
|
|
263
|
+
// top score downgrades to review (>= reviewFloor) or none, never a match.
|
|
264
|
+
if (best.confidence >= config.highConfidence && !bestIsTied) {
|
|
265
|
+
return { kind: "match", nectar: best.nectar, confidence: best.confidence, distance: best.distance };
|
|
266
|
+
}
|
|
267
|
+
if (best.confidence >= config.reviewFloor) {
|
|
268
|
+
return { kind: "review", nectar: best.nectar, confidence: best.confidence, distance: best.distance };
|
|
269
|
+
}
|
|
270
|
+
return { kind: "none" };
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=tlsh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tlsh.js","sourceRoot":"","sources":["../../src/registration/tlsh.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type HealthState } from "./health.js";
|
|
2
|
+
import { type NectarRouter } from "./api/router.js";
|
|
3
|
+
/**
|
|
4
|
+
* Grace (ms) before `close()` force-destroys still-active connections
|
|
5
|
+
* (daemon-api review H3 / AC-018a.6). Without this a single in-flight request
|
|
6
|
+
* (for example an old synchronous `/build`) keeps `server.close()` pending until
|
|
7
|
+
* the supervisor SIGKILLs the process, leaving a stale lock.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_CLOSE_GRACE_MS = 5000;
|
|
10
|
+
export interface HttpServer {
|
|
11
|
+
listen(): Promise<number>;
|
|
12
|
+
/** Close the socket. After `graceMs` any still-active connections are force-closed so shutdown is bounded. */
|
|
13
|
+
close(graceMs?: number): Promise<void>;
|
|
14
|
+
readonly port: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build the daemon's HTTP server. `GET /health` returns 200 + the health body
|
|
18
|
+
* when ok and 503 when degraded (unprotected, exactly as shipped). When a
|
|
19
|
+
* {@link NectarRouter} is supplied, any path under a mounted route group
|
|
20
|
+
* (`/api/hive-graph/*`) is dispatched through it — running the group's
|
|
21
|
+
* permission middleware, then the attached handler, or the root 501 scaffold
|
|
22
|
+
* for an unfilled path. Any other path is 404 (JSON). Importing this module
|
|
23
|
+
* never binds a socket; `listen()` does.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createHttpServer(health: HealthState, host: string, port: number, router?: NectarRouter): HttpServer;
|
|
26
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,aAAa,CAAC;AACjE,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAEzB;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,8GAA8G;IAC9G,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,YAAY,GACpB,UAAU,CA6GZ"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The nectar HTTP surface.
|
|
3
|
+
*
|
|
4
|
+
* PRD-002a mounts an unprotected `/health` route (PRD-003a) on a loopback
|
|
5
|
+
* socket. Implemented on `node:http` (zero runtime dependencies, mirroring
|
|
6
|
+
* doctor's built-ins-only ethos) rather than importing honeycomb's Hono
|
|
7
|
+
* runtime, honoring the process-boundary rule in ADR-0002 / decision #4. The
|
|
8
|
+
* daemon API route groups (`/api/hive-graph/*`) are PRD-008: they mount after
|
|
9
|
+
* `/health` through nectar's own in-repo router seam ({@link NectarRouter}),
|
|
10
|
+
* which mirrors honeycomb's `ROUTE_GROUPS` + permission-inheritance pattern
|
|
11
|
+
* across the process boundary without importing Hono.
|
|
12
|
+
*/
|
|
13
|
+
import { createServer } from "node:http";
|
|
14
|
+
import { healthHttpStatus } from "./health.js";
|
|
15
|
+
import { BodyTooLargeError, buildRouteContext, } from "./api/router.js";
|
|
16
|
+
/**
|
|
17
|
+
* Grace (ms) before `close()` force-destroys still-active connections
|
|
18
|
+
* (daemon-api review H3 / AC-018a.6). Without this a single in-flight request
|
|
19
|
+
* (for example an old synchronous `/build`) keeps `server.close()` pending until
|
|
20
|
+
* the supervisor SIGKILLs the process, leaving a stale lock.
|
|
21
|
+
*/
|
|
22
|
+
export const DEFAULT_CLOSE_GRACE_MS = 5_000;
|
|
23
|
+
function writeJson(res, code, payload, extraHeaders = {}) {
|
|
24
|
+
res.writeHead(code, {
|
|
25
|
+
"content-type": "application/json; charset=utf-8",
|
|
26
|
+
"content-length": Buffer.byteLength(payload),
|
|
27
|
+
...extraHeaders,
|
|
28
|
+
});
|
|
29
|
+
res.end(payload);
|
|
30
|
+
}
|
|
31
|
+
function writeRouteResponse(res, response) {
|
|
32
|
+
res.writeHead(response.status, {
|
|
33
|
+
"content-type": response.contentType,
|
|
34
|
+
"content-length": Buffer.byteLength(response.body),
|
|
35
|
+
"cache-control": "no-store",
|
|
36
|
+
});
|
|
37
|
+
res.end(response.body);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build the daemon's HTTP server. `GET /health` returns 200 + the health body
|
|
41
|
+
* when ok and 503 when degraded (unprotected, exactly as shipped). When a
|
|
42
|
+
* {@link NectarRouter} is supplied, any path under a mounted route group
|
|
43
|
+
* (`/api/hive-graph/*`) is dispatched through it — running the group's
|
|
44
|
+
* permission middleware, then the attached handler, or the root 501 scaffold
|
|
45
|
+
* for an unfilled path. Any other path is 404 (JSON). Importing this module
|
|
46
|
+
* never binds a socket; `listen()` does.
|
|
47
|
+
*/
|
|
48
|
+
export function createHttpServer(health, host, port, router) {
|
|
49
|
+
let bound = port;
|
|
50
|
+
const handle = async (req, res) => {
|
|
51
|
+
const url = req.url ?? "/";
|
|
52
|
+
const path = url.split("?", 1)[0] ?? "/";
|
|
53
|
+
if (req.method === "GET" && path === "/health") {
|
|
54
|
+
const body = health.snapshot();
|
|
55
|
+
const code = healthHttpStatus(body.status);
|
|
56
|
+
writeJson(res, code, JSON.stringify(body), { "cache-control": "no-store" });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (router !== undefined && router.matchGroup(path) !== undefined) {
|
|
60
|
+
let response;
|
|
61
|
+
try {
|
|
62
|
+
const ctx = await buildRouteContext(req, path, url);
|
|
63
|
+
response = await router.dispatch(ctx);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (err instanceof BodyTooLargeError) {
|
|
67
|
+
writeJson(res, 413, JSON.stringify({ error: "payload_too_large" }));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// A malformed request the dispatcher never saw (e.g. a stream error):
|
|
71
|
+
// fail soft with a structured 400 rather than crashing the daemon.
|
|
72
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
73
|
+
writeJson(res, 400, JSON.stringify({ error: "bad_request", reason }));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (response !== undefined) {
|
|
77
|
+
writeRouteResponse(res, response);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
writeJson(res, 404, JSON.stringify({ error: "not_found", path }));
|
|
82
|
+
};
|
|
83
|
+
const server = createServer((req, res) => {
|
|
84
|
+
void handle(req, res).catch((err) => {
|
|
85
|
+
// Last-resort guard: never let a handler rejection crash the process.
|
|
86
|
+
if (!res.headersSent) {
|
|
87
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
88
|
+
writeJson(res, 500, JSON.stringify({ error: "internal_error", reason }));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
res.end();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
get port() {
|
|
97
|
+
return bound;
|
|
98
|
+
},
|
|
99
|
+
listen() {
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
const cleanup = () => {
|
|
102
|
+
server.removeListener("listening", onListening);
|
|
103
|
+
server.removeListener("error", onError);
|
|
104
|
+
server.removeListener("close", onClose);
|
|
105
|
+
};
|
|
106
|
+
const onError = (err) => {
|
|
107
|
+
cleanup();
|
|
108
|
+
reject(err);
|
|
109
|
+
};
|
|
110
|
+
const onListening = () => {
|
|
111
|
+
cleanup();
|
|
112
|
+
const addr = server.address();
|
|
113
|
+
if (addr && typeof addr === "object")
|
|
114
|
+
bound = addr.port;
|
|
115
|
+
resolve(bound);
|
|
116
|
+
};
|
|
117
|
+
// If a concurrent shutdown closes the server before the bind completes,
|
|
118
|
+
// `listen()` must still settle (M6): otherwise `start()` hangs forever at
|
|
119
|
+
// its `await server.listen()` and never reaches the closed-check unwind.
|
|
120
|
+
const onClose = () => {
|
|
121
|
+
cleanup();
|
|
122
|
+
reject(new Error("server closed before it finished binding"));
|
|
123
|
+
};
|
|
124
|
+
server.once("error", onError);
|
|
125
|
+
server.once("listening", onListening);
|
|
126
|
+
server.once("close", onClose);
|
|
127
|
+
server.listen(port, host);
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
close(graceMs = DEFAULT_CLOSE_GRACE_MS) {
|
|
131
|
+
return new Promise((resolve) => {
|
|
132
|
+
let settled = false;
|
|
133
|
+
const finish = () => {
|
|
134
|
+
if (settled)
|
|
135
|
+
return;
|
|
136
|
+
settled = true;
|
|
137
|
+
clearTimeout(graceTimer);
|
|
138
|
+
resolve();
|
|
139
|
+
};
|
|
140
|
+
// Stop accepting new connections; resolve once existing ones drain.
|
|
141
|
+
server.close(() => finish());
|
|
142
|
+
// Close idle keep-alive sockets so the process can exit promptly.
|
|
143
|
+
server.closeIdleConnections?.();
|
|
144
|
+
// NEC-021: if a request is still active after the grace, force-close every
|
|
145
|
+
// remaining connection so shutdown is bounded regardless of request work.
|
|
146
|
+
// server.close()'s callback then fires; we also resolve here defensively.
|
|
147
|
+
const graceTimer = setTimeout(() => {
|
|
148
|
+
server.closeAllConnections?.();
|
|
149
|
+
finish();
|
|
150
|
+
}, graceMs);
|
|
151
|
+
graceTimer.unref?.();
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAoB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAS5C,SAAS,SAAS,CAAC,GAAmB,EAAE,IAAY,EAAE,OAAe,EAAE,eAAuC,EAAE;IAC9G,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;QAClB,cAAc,EAAE,iCAAiC;QACjD,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAC5C,GAAG,YAAY;KAChB,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAmB,EAAE,QAAuB;IACtE,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC7B,cAAc,EAAE,QAAQ,CAAC,WAAW;QACpC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClD,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAmB,EACnB,IAAY,EACZ,IAAY,EACZ,MAAqB;IAErB,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,MAAM,MAAM,GAAG,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAiB,EAAE;QAChF,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAEzC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAClE,IAAI,QAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACpD,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;oBACrC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;oBACpE,OAAO;gBACT,CAAC;gBACD,sEAAsE;gBACtE,mEAAmE;gBACnE,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;QACH,CAAC;QAED,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,MAAM,GAAW,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC3C,sEAAsE;YACtE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,IAAI;YACN,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM;YACJ,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC7C,MAAM,OAAO,GAAG,GAAS,EAAE;oBACzB,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAChD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACxC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC,CAAC;gBACF,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;oBAC7B,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC;gBACF,MAAM,WAAW,GAAG,GAAG,EAAE;oBACvB,OAAO,EAAE,CAAC;oBACV,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC9B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;wBAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;oBACxD,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,CAAC;gBACF,wEAAwE;gBACxE,0EAA0E;gBAC1E,yEAAyE;gBACzE,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,UAAkB,sBAAsB;YAC5C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,MAAM,MAAM,GAAG,GAAS,EAAE;oBACxB,IAAI,OAAO;wBAAE,OAAO;oBACpB,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,CAAC,UAAU,CAAC,CAAC;oBACzB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBACF,oEAAoE;gBACpE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7B,kEAAkE;gBAClE,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBAChC,2EAA2E;gBAC3E,0EAA0E;gBAC1E,0EAA0E;gBAC1E,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;oBACjC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;oBAC/B,MAAM,EAAE,CAAC;gBACX,CAAC,EAAE,OAAO,CAAC,CAAC;gBACZ,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact argv construction for every service-manager command (PRD-003b).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors doctor's `service/argv.ts` with nectar's unit/task names. Each
|
|
5
|
+
* operation - install, uninstall, status - maps to one or more ordered argv arrays.
|
|
6
|
+
* This module is the single source of truth for those argv arrays; it is pure (a
|
|
7
|
+
* {@link ServicePlan} in, argv arrays out) so a test asserts the EXACT command line
|
|
8
|
+
* per platform without ever executing it.
|
|
9
|
+
*
|
|
10
|
+
* Every command goes through the injected {@link CommandRunner} (execFile, no shell),
|
|
11
|
+
* so a unit path or label can never be re-parsed as a shell metacharacter.
|
|
12
|
+
*
|
|
13
|
+
* launchd: `launchctl bootstrap gui/<uid> <plist>` (modern) to load, `bootout` to unload.
|
|
14
|
+
* systemd: `systemctl --user enable --now nectar.service` to install+start,
|
|
15
|
+
* `disable --now` to remove, `is-active` for status.
|
|
16
|
+
* schtasks: `/Create /XML <file> /TN nectar /F` (per-user, no admin),
|
|
17
|
+
* `/Delete /TN nectar /F`, `/Query /TN nectar` for status.
|
|
18
|
+
* sc.exe: `create` + `start` (system service, enterprise opt-in), `stop`+`delete`,
|
|
19
|
+
* `query` for status.
|
|
20
|
+
*
|
|
21
|
+
* Built-ins only; pure functions.
|
|
22
|
+
*/
|
|
23
|
+
import { type ServicePlan } from "./platform.js";
|
|
24
|
+
/** A single command: the executable + its argv (no shell). */
|
|
25
|
+
export interface ServiceCommand {
|
|
26
|
+
/** The binary to exec (e.g. `launchctl`, `systemctl`, `schtasks`, `sc`). */
|
|
27
|
+
readonly command: string;
|
|
28
|
+
/** The argv array (no shell parsing). */
|
|
29
|
+
readonly args: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
/** Build the launchd `gui/<uid>` domain-target string used by bootstrap/bootout. */
|
|
32
|
+
export declare function launchdDomainTarget(plan: ServicePlan, uid: number): string;
|
|
33
|
+
/** The launchd service target (`<domain>/<label>`) used by `bootout` + `kickstart`. */
|
|
34
|
+
export declare function launchdServiceTarget(plan: ServicePlan, uid: number): string;
|
|
35
|
+
/**
|
|
36
|
+
* The argv to INSTALL (register + start) the service for this plan. Returns the
|
|
37
|
+
* ordered list of commands to run; the caller writes the unit file first (when the
|
|
38
|
+
* plan has a unitPath), then runs these.
|
|
39
|
+
*/
|
|
40
|
+
export declare function installCommands(plan: ServicePlan, uid: number): readonly ServiceCommand[];
|
|
41
|
+
/** The argv to UNINSTALL (stop + remove) the service for this plan, in order. */
|
|
42
|
+
export declare function uninstallCommands(plan: ServicePlan, uid: number): readonly ServiceCommand[];
|
|
43
|
+
/**
|
|
44
|
+
* The argv to deregister the PRE-decision-#32 unit names (`com.hivenectar.daemon` /
|
|
45
|
+
* `hivenectar.service` / `HivenectarDaemon`). Run best-effort at the start of every
|
|
46
|
+
* install so a re-run migrates a legacy unit; when no legacy unit exists these
|
|
47
|
+
* commands fail harmlessly and the install proceeds.
|
|
48
|
+
*/
|
|
49
|
+
export declare function legacyUninstallCommands(plan: ServicePlan, uid: number): readonly ServiceCommand[];
|
|
50
|
+
/** The single argv to QUERY status. The caller interprets the command's exit/stdout. */
|
|
51
|
+
export declare function statusCommand(plan: ServicePlan, uid: number): ServiceCommand;
|
|
52
|
+
//# sourceMappingURL=argv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argv.d.ts","sourceRoot":"","sources":["../../src/service/argv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAEvB,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAiCzF;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAgB3F;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAgBjG;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAa5E"}
|