@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,127 @@
|
|
|
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 { LEGACY_SERVICE_LABEL, LEGACY_SYSTEMD_UNIT_NAME, LEGACY_WINDOWS_TASK_NAME, SYSTEMD_UNIT_NAME, WINDOWS_TASK_NAME, } from "./platform.js";
|
|
24
|
+
/** Build the launchd `gui/<uid>` domain-target string used by bootstrap/bootout. */
|
|
25
|
+
export function launchdDomainTarget(plan, uid) {
|
|
26
|
+
return plan.scope === "system" ? "system" : `gui/${uid}`;
|
|
27
|
+
}
|
|
28
|
+
/** The launchd service target (`<domain>/<label>`) used by `bootout` + `kickstart`. */
|
|
29
|
+
export function launchdServiceTarget(plan, uid) {
|
|
30
|
+
return `${launchdDomainTarget(plan, uid)}/${plan.label}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The argv to INSTALL (register + start) the service for this plan. Returns the
|
|
34
|
+
* ordered list of commands to run; the caller writes the unit file first (when the
|
|
35
|
+
* plan has a unitPath), then runs these.
|
|
36
|
+
*/
|
|
37
|
+
export function installCommands(plan, uid) {
|
|
38
|
+
switch (plan.manager) {
|
|
39
|
+
case "launchd": {
|
|
40
|
+
const domain = launchdDomainTarget(plan, uid);
|
|
41
|
+
return [
|
|
42
|
+
{ command: "launchctl", args: ["bootstrap", domain, plan.unitPath] },
|
|
43
|
+
{ command: "launchctl", args: ["kickstart", "-k", launchdServiceTarget(plan, uid)] },
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
case "systemd": {
|
|
47
|
+
const scopeArgs = plan.scope === "user" ? ["--user"] : [];
|
|
48
|
+
// NEC-042 item 3 / AC-018l.10: `daemon-reload` BEFORE `enable --now`, so a
|
|
49
|
+
// reinstall over a changed unit file makes systemd re-read it instead of
|
|
50
|
+
// keeping the cached (stale) unit definition running.
|
|
51
|
+
return [
|
|
52
|
+
{ command: "systemctl", args: [...scopeArgs, "daemon-reload"] },
|
|
53
|
+
{ command: "systemctl", args: [...scopeArgs, "enable", "--now", SYSTEMD_UNIT_NAME] },
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
case "schtasks": {
|
|
57
|
+
return [
|
|
58
|
+
{ command: "schtasks", args: ["/Create", "/XML", plan.unitPath, "/TN", WINDOWS_TASK_NAME, "/F"] },
|
|
59
|
+
{ command: "schtasks", args: ["/Run", "/TN", WINDOWS_TASK_NAME] },
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
case "sc": {
|
|
63
|
+
const binPath = `"${process.execPath}" "${plan.execPath}" daemon`;
|
|
64
|
+
return [
|
|
65
|
+
{ command: "sc", args: ["create", WINDOWS_TASK_NAME, `binPath=${binPath}`, "start=", "auto"] },
|
|
66
|
+
{ command: "sc", args: ["start", WINDOWS_TASK_NAME] },
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** The argv to UNINSTALL (stop + remove) the service for this plan, in order. */
|
|
72
|
+
export function uninstallCommands(plan, uid) {
|
|
73
|
+
switch (plan.manager) {
|
|
74
|
+
case "launchd":
|
|
75
|
+
return [{ command: "launchctl", args: ["bootout", launchdServiceTarget(plan, uid)] }];
|
|
76
|
+
case "systemd": {
|
|
77
|
+
const scopeArgs = plan.scope === "user" ? ["--user"] : [];
|
|
78
|
+
return [{ command: "systemctl", args: [...scopeArgs, "disable", "--now", SYSTEMD_UNIT_NAME] }];
|
|
79
|
+
}
|
|
80
|
+
case "schtasks":
|
|
81
|
+
return [{ command: "schtasks", args: ["/Delete", "/TN", WINDOWS_TASK_NAME, "/F"] }];
|
|
82
|
+
case "sc":
|
|
83
|
+
return [
|
|
84
|
+
{ command: "sc", args: ["stop", WINDOWS_TASK_NAME] },
|
|
85
|
+
{ command: "sc", args: ["delete", WINDOWS_TASK_NAME] },
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The argv to deregister the PRE-decision-#32 unit names (`com.hivenectar.daemon` /
|
|
91
|
+
* `hivenectar.service` / `HivenectarDaemon`). Run best-effort at the start of every
|
|
92
|
+
* install so a re-run migrates a legacy unit; when no legacy unit exists these
|
|
93
|
+
* commands fail harmlessly and the install proceeds.
|
|
94
|
+
*/
|
|
95
|
+
export function legacyUninstallCommands(plan, uid) {
|
|
96
|
+
switch (plan.manager) {
|
|
97
|
+
case "launchd":
|
|
98
|
+
return [{ command: "launchctl", args: ["bootout", `${launchdDomainTarget(plan, uid)}/${LEGACY_SERVICE_LABEL}`] }];
|
|
99
|
+
case "systemd": {
|
|
100
|
+
const scopeArgs = plan.scope === "user" ? ["--user"] : [];
|
|
101
|
+
return [{ command: "systemctl", args: [...scopeArgs, "disable", "--now", LEGACY_SYSTEMD_UNIT_NAME] }];
|
|
102
|
+
}
|
|
103
|
+
case "schtasks":
|
|
104
|
+
return [{ command: "schtasks", args: ["/Delete", "/TN", LEGACY_WINDOWS_TASK_NAME, "/F"] }];
|
|
105
|
+
case "sc":
|
|
106
|
+
return [
|
|
107
|
+
{ command: "sc", args: ["stop", LEGACY_WINDOWS_TASK_NAME] },
|
|
108
|
+
{ command: "sc", args: ["delete", LEGACY_WINDOWS_TASK_NAME] },
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** The single argv to QUERY status. The caller interprets the command's exit/stdout. */
|
|
113
|
+
export function statusCommand(plan, uid) {
|
|
114
|
+
switch (plan.manager) {
|
|
115
|
+
case "launchd":
|
|
116
|
+
return { command: "launchctl", args: ["print", launchdServiceTarget(plan, uid)] };
|
|
117
|
+
case "systemd": {
|
|
118
|
+
const scopeArgs = plan.scope === "user" ? ["--user"] : [];
|
|
119
|
+
return { command: "systemctl", args: [...scopeArgs, "is-active", SYSTEMD_UNIT_NAME] };
|
|
120
|
+
}
|
|
121
|
+
case "schtasks":
|
|
122
|
+
return { command: "schtasks", args: ["/Query", "/TN", WINDOWS_TASK_NAME] };
|
|
123
|
+
case "sc":
|
|
124
|
+
return { command: "sc", args: ["query", WINDOWS_TASK_NAME] };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=argv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../src/service/argv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable command-runner boundary for the service module (PRD-003b).
|
|
3
|
+
*
|
|
4
|
+
* Every OS-service shell-out (`launchctl`, `systemctl`, `schtasks`, `sc`) goes
|
|
5
|
+
* through this {@link CommandRunner} interface so the service module is hermetic
|
|
6
|
+
* and testable: a unit test injects a fake that records the argv and returns a
|
|
7
|
+
* canned {@link CommandResult}, and the CLI wires the real built-in runner
|
|
8
|
+
* ({@link createExecFileRunner}) in production.
|
|
9
|
+
*
|
|
10
|
+
* The real runner uses `node:child_process.execFile` (NOT `exec`): execFile takes
|
|
11
|
+
* an argv array and does NOT spawn a shell, so a unit path or label can never be
|
|
12
|
+
* interpreted as a shell metacharacter. Mirrors doctor's `CommandRunner` seam
|
|
13
|
+
* (doctor/src/rungs/command-runner.ts), scoped to nectar's OS-service
|
|
14
|
+
* commands (no npm-launch special-casing needed here).
|
|
15
|
+
*
|
|
16
|
+
* Crash-safety: `run` resolves to a {@link CommandResult} for BOTH success and
|
|
17
|
+
* failure - a non-zero exit, a spawn error (manager not found), or a timeout all
|
|
18
|
+
* become a result with `ok:false`, never a thrown error.
|
|
19
|
+
*
|
|
20
|
+
* Built-ins only: node:child_process.
|
|
21
|
+
*/
|
|
22
|
+
/** The outcome of running one external command. Never throws; failure is a value. */
|
|
23
|
+
export interface CommandResult {
|
|
24
|
+
/** True iff the process exited 0 within the timeout and did not fail to spawn. */
|
|
25
|
+
readonly ok: boolean;
|
|
26
|
+
/** The exit code, or null when the process was killed / failed to spawn. */
|
|
27
|
+
readonly code: number | null;
|
|
28
|
+
/** Captured stdout (size-capped). */
|
|
29
|
+
readonly stdout: string;
|
|
30
|
+
/** Captured stderr (size-capped). */
|
|
31
|
+
readonly stderr: string;
|
|
32
|
+
/** A short failure note (spawn error class / timeout), when `ok` is false. */
|
|
33
|
+
readonly detail?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Options for a single {@link CommandRunner.run} call. */
|
|
36
|
+
export interface CommandRunOptions {
|
|
37
|
+
/** Hard timeout in ms; the process is killed and the result is `ok:false` after it. */
|
|
38
|
+
readonly timeoutMs?: number;
|
|
39
|
+
}
|
|
40
|
+
/** The injectable boundary the service module calls. */
|
|
41
|
+
export interface CommandRunner {
|
|
42
|
+
/**
|
|
43
|
+
* Run `command` with `args` (argv, no shell). Resolves to a {@link CommandResult}
|
|
44
|
+
* for success AND failure - NEVER rejects.
|
|
45
|
+
*/
|
|
46
|
+
run(command: string, args: readonly string[], options?: CommandRunOptions): Promise<CommandResult>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build the REAL command runner over `node:child_process.execFile`, no shell. Every
|
|
50
|
+
* failure mode (non-zero exit, ENOENT spawn failure, timeout kill) is mapped to a
|
|
51
|
+
* {@link CommandResult} rather than a thrown error.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createExecFileRunner(): CommandRunner;
|
|
54
|
+
//# sourceMappingURL=command-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-runner.d.ts","sourceRoot":"","sources":["../../src/service/command-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACpG;AAQD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,CA4BpD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable command-runner boundary for the service module (PRD-003b).
|
|
3
|
+
*
|
|
4
|
+
* Every OS-service shell-out (`launchctl`, `systemctl`, `schtasks`, `sc`) goes
|
|
5
|
+
* through this {@link CommandRunner} interface so the service module is hermetic
|
|
6
|
+
* and testable: a unit test injects a fake that records the argv and returns a
|
|
7
|
+
* canned {@link CommandResult}, and the CLI wires the real built-in runner
|
|
8
|
+
* ({@link createExecFileRunner}) in production.
|
|
9
|
+
*
|
|
10
|
+
* The real runner uses `node:child_process.execFile` (NOT `exec`): execFile takes
|
|
11
|
+
* an argv array and does NOT spawn a shell, so a unit path or label can never be
|
|
12
|
+
* interpreted as a shell metacharacter. Mirrors doctor's `CommandRunner` seam
|
|
13
|
+
* (doctor/src/rungs/command-runner.ts), scoped to nectar's OS-service
|
|
14
|
+
* commands (no npm-launch special-casing needed here).
|
|
15
|
+
*
|
|
16
|
+
* Crash-safety: `run` resolves to a {@link CommandResult} for BOTH success and
|
|
17
|
+
* failure - a non-zero exit, a spawn error (manager not found), or a timeout all
|
|
18
|
+
* become a result with `ok:false`, never a thrown error.
|
|
19
|
+
*
|
|
20
|
+
* Built-ins only: node:child_process.
|
|
21
|
+
*/
|
|
22
|
+
import { execFile } from "node:child_process";
|
|
23
|
+
/** The default per-command timeout (these are fast, local commands): 15 seconds. */
|
|
24
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
25
|
+
/** Cap captured output so a chatty service manager can never balloon memory. */
|
|
26
|
+
const MAX_BUFFER_BYTES = 1024 * 1024;
|
|
27
|
+
/**
|
|
28
|
+
* Build the REAL command runner over `node:child_process.execFile`, no shell. Every
|
|
29
|
+
* failure mode (non-zero exit, ENOENT spawn failure, timeout kill) is mapped to a
|
|
30
|
+
* {@link CommandResult} rather than a thrown error.
|
|
31
|
+
*/
|
|
32
|
+
export function createExecFileRunner() {
|
|
33
|
+
return {
|
|
34
|
+
run(command, args, options) {
|
|
35
|
+
const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
execFile(command, args, { timeout, maxBuffer: MAX_BUFFER_BYTES, shell: false, windowsHide: true }, (error, stdout, stderr) => {
|
|
38
|
+
if (error === null) {
|
|
39
|
+
resolve({ ok: true, code: 0, stdout, stderr });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const errWithMeta = error;
|
|
43
|
+
const numericCode = typeof errWithMeta.code === "number" ? errWithMeta.code : null;
|
|
44
|
+
const detail = typeof errWithMeta.code === "string"
|
|
45
|
+
? errWithMeta.code
|
|
46
|
+
: error instanceof Error
|
|
47
|
+
? error.message
|
|
48
|
+
: "command-failed";
|
|
49
|
+
resolve({ ok: false, code: numericCode, stdout, stderr, detail });
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=command-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../src/service/command-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA+B9C,oFAAoF;AACpF,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,gFAAgF;AAChF,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,GAAG,CAAC,OAAe,EAAE,IAAuB,EAAE,OAA2B;YACvE,MAAM,OAAO,GAAG,OAAO,EAAE,SAAS,IAAI,kBAAkB,CAAC;YACzD,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;gBAC5C,QAAQ,CACN,OAAO,EACP,IAAI,EACJ,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EACzE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;oBACxB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACnB,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC/C,OAAO;oBACT,CAAC;oBACD,MAAM,WAAW,GAAG,KAA2D,CAAC;oBAChF,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBACnF,MAAM,MAAM,GACV,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ;wBAClC,CAAC,CAAC,WAAW,CAAC,IAAI;wBAClB,CAAC,CAAC,KAAK,YAAY,KAAK;4BACtB,CAAC,CAAC,KAAK,CAAC,OAAO;4BACf,CAAC,CAAC,gBAAgB,CAAC;oBACzB,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpE,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nectar's OS-service manager (PRD-003b) - the module the CLI's `install` /
|
|
3
|
+
* `uninstall` commands delegate to.
|
|
4
|
+
*
|
|
5
|
+
* It does the three things PRD-003b's Goals describe:
|
|
6
|
+
* - install() : resolve the platform plan, write the unit file (when file-based),
|
|
7
|
+
* then run the manager's install argv. Userland scope by default,
|
|
8
|
+
* privileged fallback ordering computed in {@link resolveServicePlan}.
|
|
9
|
+
* - uninstall() : run the manager's uninstall argv, then delete the unit file, so
|
|
10
|
+
* the unit does not resurrect on next boot (US-003b.4).
|
|
11
|
+
* - status() : run the manager's status argv and classify the result.
|
|
12
|
+
*
|
|
13
|
+
* Crash-safe: every shell-out is the injected {@link CommandRunner} (execFile, no
|
|
14
|
+
* shell) which never throws; every fs call is behind the injected {@link ServiceFs}
|
|
15
|
+
* and wrapped, so a permission error becomes a returned {@link ServiceResult}, never
|
|
16
|
+
* a thrown stack. Mirrors doctor's service module (doctor/src/service/index.ts)
|
|
17
|
+
* with nectar's own templates/argv/run command.
|
|
18
|
+
*
|
|
19
|
+
* Built-ins only: the production fs uses node:fs, the runner uses node:child_process.
|
|
20
|
+
*/
|
|
21
|
+
import { type CommandRunner } from "./command-runner.js";
|
|
22
|
+
import { type ServiceEnvironment } from "./platform.js";
|
|
23
|
+
/** A coarse, classified service status (what `nectar service-status` reports). */
|
|
24
|
+
export type ServiceStatus = "running" | "not-running" | "unknown";
|
|
25
|
+
/** The outcome of an install/uninstall call. */
|
|
26
|
+
export interface ServiceResult {
|
|
27
|
+
/** True iff the operation fully succeeded. */
|
|
28
|
+
readonly ok: boolean;
|
|
29
|
+
/** A human-readable, secret-free result line. */
|
|
30
|
+
readonly message: string;
|
|
31
|
+
}
|
|
32
|
+
/** The minimal filesystem surface the service module needs (injected so tests are hermetic). */
|
|
33
|
+
export interface ServiceFs {
|
|
34
|
+
/** Create a directory (recursive). Must be idempotent (no throw if it already exists). */
|
|
35
|
+
mkdirp(dir: string): void;
|
|
36
|
+
/** Write a file's text content, overwriting. */
|
|
37
|
+
writeFile(path: string, content: string): void;
|
|
38
|
+
/** Remove a file. Must NOT throw when the file is already absent. */
|
|
39
|
+
removeFile(path: string): void;
|
|
40
|
+
}
|
|
41
|
+
/** The production {@link ServiceFs} over node:fs. */
|
|
42
|
+
export declare function createNodeServiceFs(): ServiceFs;
|
|
43
|
+
/** Construction deps for {@link createServiceModule}. All have production defaults. */
|
|
44
|
+
export interface ServiceModuleDeps {
|
|
45
|
+
/** The absolute path to the `nectar` bin the unit execs. */
|
|
46
|
+
readonly execPath: string;
|
|
47
|
+
/** Opt into a system-scoped unit when privileged (enterprise path). Default false. */
|
|
48
|
+
readonly preferSystemScope?: boolean;
|
|
49
|
+
/** The command runner (execFile, no shell). Default: the real {@link createExecFileRunner}. */
|
|
50
|
+
readonly runner?: CommandRunner;
|
|
51
|
+
/** The filesystem seam. Default: the real {@link createNodeServiceFs}. */
|
|
52
|
+
readonly fs?: ServiceFs;
|
|
53
|
+
/** The numeric uid for launchd's `gui/<uid>` domain. Default: live uid (0 when unavailable). */
|
|
54
|
+
readonly uid?: number;
|
|
55
|
+
/** Override the resolved environment (tests inject a fixed platform/home/privilege). */
|
|
56
|
+
readonly environment?: ServiceEnvironment;
|
|
57
|
+
/** Structured log sink; defaults to a no-op. */
|
|
58
|
+
readonly log?: (line: Record<string, unknown>) => void;
|
|
59
|
+
}
|
|
60
|
+
/** The service module surface: install / uninstall the OS service unit. */
|
|
61
|
+
export interface ServiceModule {
|
|
62
|
+
install(): Promise<ServiceResult>;
|
|
63
|
+
uninstall(): Promise<ServiceResult>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build the real {@link ServiceModule}. The CLI injects the resolved exec path;
|
|
67
|
+
* tests inject the runner + fs + a fixed environment so nothing real runs.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createServiceModule(deps: ServiceModuleDeps): ServiceModule;
|
|
70
|
+
/**
|
|
71
|
+
* Probe the current service status. Returns a coarse {@link ServiceStatus}; never
|
|
72
|
+
* throws.
|
|
73
|
+
*/
|
|
74
|
+
export declare function serviceStatus(deps: ServiceModuleDeps): Promise<ServiceStatus>;
|
|
75
|
+
export { resolveServicePlan, resolveServiceContext } from "./platform.js";
|
|
76
|
+
export type { ServicePlan, ServiceEnvironment } from "./platform.js";
|
|
77
|
+
export { SERVICE_LABEL, SYSTEMD_UNIT_NAME, WINDOWS_TASK_NAME, LEGACY_SERVICE_LABEL, LEGACY_SYSTEMD_UNIT_NAME, LEGACY_WINDOWS_TASK_NAME, legacyUnitPath, } from "./platform.js";
|
|
78
|
+
export { NECTAR_RUN_COMMAND, RESTART_SEC, WINDOWS_RESTART_INTERVAL, renderUnit } from "./templates.js";
|
|
79
|
+
export { installCommands, uninstallCommands, legacyUninstallCommands, statusCommand } from "./argv.js";
|
|
80
|
+
export type { ServiceCommand } from "./argv.js";
|
|
81
|
+
export { createExecFileRunner } from "./command-runner.js";
|
|
82
|
+
export type { CommandRunner, CommandResult, CommandRunOptions } from "./command-runner.js";
|
|
83
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQnG,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AAGvB,kFAAkF;AAClF,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAElE,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAKD,gGAAgG;AAChG,MAAM,WAAW,SAAS;IACxB,0FAA0F;IAC1F,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gDAAgD;IAChD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,qEAAqE;IACrE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,IAAI,SAAS,CAY/C;AAED,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IACxB,gGAAgG;IAChG,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C,gDAAgD;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACxD;AAqED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAqI1E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqBnF;AAED,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvG,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nectar's OS-service manager (PRD-003b) - the module the CLI's `install` /
|
|
3
|
+
* `uninstall` commands delegate to.
|
|
4
|
+
*
|
|
5
|
+
* It does the three things PRD-003b's Goals describe:
|
|
6
|
+
* - install() : resolve the platform plan, write the unit file (when file-based),
|
|
7
|
+
* then run the manager's install argv. Userland scope by default,
|
|
8
|
+
* privileged fallback ordering computed in {@link resolveServicePlan}.
|
|
9
|
+
* - uninstall() : run the manager's uninstall argv, then delete the unit file, so
|
|
10
|
+
* the unit does not resurrect on next boot (US-003b.4).
|
|
11
|
+
* - status() : run the manager's status argv and classify the result.
|
|
12
|
+
*
|
|
13
|
+
* Crash-safe: every shell-out is the injected {@link CommandRunner} (execFile, no
|
|
14
|
+
* shell) which never throws; every fs call is behind the injected {@link ServiceFs}
|
|
15
|
+
* and wrapped, so a permission error becomes a returned {@link ServiceResult}, never
|
|
16
|
+
* a thrown stack. Mirrors doctor's service module (doctor/src/service/index.ts)
|
|
17
|
+
* with nectar's own templates/argv/run command.
|
|
18
|
+
*
|
|
19
|
+
* Built-ins only: the production fs uses node:fs, the runner uses node:child_process.
|
|
20
|
+
*/
|
|
21
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
22
|
+
import { dirname } from "node:path";
|
|
23
|
+
import { createExecFileRunner } from "./command-runner.js";
|
|
24
|
+
import { installCommands, legacyUninstallCommands, statusCommand, uninstallCommands, } from "./argv.js";
|
|
25
|
+
import { legacyUnitPath, resolveServiceContext, resolveServicePlan, } from "./platform.js";
|
|
26
|
+
import { renderUnit, launchdLogDir } from "./templates.js";
|
|
27
|
+
/** Per-command timeout for a service-manager shell-out (these are fast, local commands). */
|
|
28
|
+
const SERVICE_COMMAND_TIMEOUT_MS = 15_000;
|
|
29
|
+
/** The production {@link ServiceFs} over node:fs. */
|
|
30
|
+
export function createNodeServiceFs() {
|
|
31
|
+
return {
|
|
32
|
+
mkdirp(dir) {
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
},
|
|
35
|
+
writeFile(path, content) {
|
|
36
|
+
writeFileSync(path, content, { encoding: "utf8" });
|
|
37
|
+
},
|
|
38
|
+
removeFile(path) {
|
|
39
|
+
rmSync(path, { force: true });
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Read the live numeric uid, defaulting to 0 when the platform does not expose it. */
|
|
44
|
+
function liveUid() {
|
|
45
|
+
try {
|
|
46
|
+
const getuid = process.getuid;
|
|
47
|
+
return typeof getuid === "function" ? getuid() : 0;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Human-readable scope phrase for the result line. */
|
|
54
|
+
function scopePhrase(plan) {
|
|
55
|
+
const base = plan.scope === "user" ? "user scope" : "system scope";
|
|
56
|
+
return plan.fellBackToUser ? `${base} (fell back from system - unprivileged)` : base;
|
|
57
|
+
}
|
|
58
|
+
/** Cap how much of a command's own output we ever echo back in a result message. */
|
|
59
|
+
const MAX_FAILURE_DETAIL_CHARS = 200;
|
|
60
|
+
/**
|
|
61
|
+
* Reduce a failed {@link CommandResult} to one short, secret-free line worth
|
|
62
|
+
* surfacing to the operator (e.g. "Access is denied.", "ENOENT"). Prefers the
|
|
63
|
+
* runner's own `detail` (a spawn-error code or timeout marker); otherwise falls
|
|
64
|
+
* back to the last non-empty line of stderr, then stdout, since most service
|
|
65
|
+
* managers (schtasks, launchctl, systemctl) print their real error there and a
|
|
66
|
+
* generic "a command failed" with no reason is not actionable. Output is a
|
|
67
|
+
* fixed-format OS/service-manager message, never a credential, but is still
|
|
68
|
+
* length-capped defensively in case a manager is unexpectedly chatty.
|
|
69
|
+
*/
|
|
70
|
+
function describeFailure(result) {
|
|
71
|
+
if (result === null)
|
|
72
|
+
return "unknown error";
|
|
73
|
+
const candidate = result.detail ?? lastNonEmptyLine(result.stderr) ?? lastNonEmptyLine(result.stdout) ?? "unknown error";
|
|
74
|
+
return candidate.length > MAX_FAILURE_DETAIL_CHARS
|
|
75
|
+
? `${candidate.slice(0, MAX_FAILURE_DETAIL_CHARS)}...`
|
|
76
|
+
: candidate;
|
|
77
|
+
}
|
|
78
|
+
function lastNonEmptyLine(text) {
|
|
79
|
+
const lines = text
|
|
80
|
+
.split(/\r?\n/)
|
|
81
|
+
.map((line) => line.trim())
|
|
82
|
+
.filter((line) => line !== "");
|
|
83
|
+
return lines.length > 0 ? (lines[lines.length - 1] ?? null) : null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run an ordered list of commands, stopping at nothing (every result is recorded)
|
|
87
|
+
* but reporting the first hard failure (and its result, for {@link describeFailure}).
|
|
88
|
+
* Never throws (the runner never does).
|
|
89
|
+
*/
|
|
90
|
+
async function runAll(runner, commands) {
|
|
91
|
+
let firstFailure = null;
|
|
92
|
+
let firstFailureResult = null;
|
|
93
|
+
for (const cmd of commands) {
|
|
94
|
+
const result = await runner.run(cmd.command, cmd.args, { timeoutMs: SERVICE_COMMAND_TIMEOUT_MS });
|
|
95
|
+
if (!result.ok && firstFailure === null) {
|
|
96
|
+
firstFailure = cmd;
|
|
97
|
+
firstFailureResult = result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { allOk: firstFailure === null, firstFailure, firstFailureResult };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Build the real {@link ServiceModule}. The CLI injects the resolved exec path;
|
|
104
|
+
* tests inject the runner + fs + a fixed environment so nothing real runs.
|
|
105
|
+
*/
|
|
106
|
+
export function createServiceModule(deps) {
|
|
107
|
+
const runner = deps.runner ?? createExecFileRunner();
|
|
108
|
+
const fs = deps.fs ?? createNodeServiceFs();
|
|
109
|
+
const log = deps.log ?? (() => { });
|
|
110
|
+
const uid = deps.uid ?? liveUid();
|
|
111
|
+
const environment = deps.environment ?? resolveServiceContext(deps.execPath, deps.preferSystemScope ?? false);
|
|
112
|
+
function plan() {
|
|
113
|
+
return resolveServicePlan(environment);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
async install() {
|
|
117
|
+
let p;
|
|
118
|
+
try {
|
|
119
|
+
p = plan();
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
message: `Could not register the nectar service: ${error instanceof Error ? error.message : "unknown error"}.`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// 0) Migrate away from the pre-decision-#32 unit names: best-effort deregister the
|
|
128
|
+
// legacy unit (`com.hivenectar.daemon` / `hivenectar.service` / `HivenectarDaemon`)
|
|
129
|
+
// and remove its unit file, so a re-run never leaves two units racing over one
|
|
130
|
+
// daemon. Expected to fail harmlessly when no legacy unit exists; never blocks
|
|
131
|
+
// the install.
|
|
132
|
+
await runAll(runner, legacyUninstallCommands(p, uid));
|
|
133
|
+
try {
|
|
134
|
+
const legacyPath = legacyUnitPath(p);
|
|
135
|
+
if (legacyPath !== "")
|
|
136
|
+
fs.removeFile(legacyPath);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Best-effort migration cleanup only; a remove failure never blocks the install.
|
|
140
|
+
}
|
|
141
|
+
// 1) Write the unit file FIRST (when this manager is file-based). schtasks consumes the
|
|
142
|
+
// XML file too, so a non-empty unitPath OR the schtasks manager means we lay down text.
|
|
143
|
+
const needsFile = p.unitPath !== "" || p.manager === "schtasks";
|
|
144
|
+
let unitTarget = p.unitPath;
|
|
145
|
+
if (needsFile) {
|
|
146
|
+
try {
|
|
147
|
+
if (p.manager === "schtasks" && unitTarget === "") {
|
|
148
|
+
unitTarget = `${p.home}/.honeycomb/nectar/nectar-task.xml`;
|
|
149
|
+
}
|
|
150
|
+
fs.mkdirp(dirname(unitTarget));
|
|
151
|
+
fs.writeFile(unitTarget, renderUnit(p));
|
|
152
|
+
// NEC-042 item 2 / AC-018l.9: launchd writes stdout/stderr into
|
|
153
|
+
// `<home>/.honeycomb/nectar`, but the plist lives under LaunchAgents,
|
|
154
|
+
// so mkdirp(dirname(unitTarget)) above only created LaunchAgents. Create
|
|
155
|
+
// the log directory too, or the daemon's macOS logs are silently lost.
|
|
156
|
+
if (p.manager === "launchd")
|
|
157
|
+
fs.mkdirp(launchdLogDir(p.home));
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return {
|
|
161
|
+
ok: false,
|
|
162
|
+
message: `Could not write the nectar unit file at ${unitTarget}: ${error instanceof Error ? error.message : "unknown error"}.`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// 2) Run the manager's install argv. For schtasks the staged file path is the unit path.
|
|
167
|
+
const planForArgv = unitTarget === p.unitPath ? p : { ...p, unitPath: unitTarget };
|
|
168
|
+
const { allOk, firstFailure, firstFailureResult } = await runAll(runner, installCommands(planForArgv, uid));
|
|
169
|
+
if (!allOk) {
|
|
170
|
+
const detail = describeFailure(firstFailureResult);
|
|
171
|
+
log({
|
|
172
|
+
level: "warn",
|
|
173
|
+
scope: "service",
|
|
174
|
+
msg: "install_command_failed",
|
|
175
|
+
command: firstFailure?.command,
|
|
176
|
+
detail,
|
|
177
|
+
});
|
|
178
|
+
return {
|
|
179
|
+
ok: false,
|
|
180
|
+
message: `Registered the nectar unit but a service-manager command failed (${firstFailure?.command ?? "unknown"}): ${detail}. It will start at next login/boot; run \`nectar service-status\` to check.`,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
log({ level: "info", scope: "service", msg: "installed", manager: p.manager, scope2: p.scope });
|
|
184
|
+
return {
|
|
185
|
+
ok: true,
|
|
186
|
+
message: `nectar registered as a ${p.manager} service (${scopePhrase(p)}) and started. It will restart on crash and start on boot.`,
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
async uninstall() {
|
|
190
|
+
let p;
|
|
191
|
+
try {
|
|
192
|
+
p = plan();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return {
|
|
196
|
+
ok: false,
|
|
197
|
+
message: `Could not unregister the nectar service: ${error instanceof Error ? error.message : "unknown error"}.`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const { allOk, firstFailure, firstFailureResult } = await runAll(runner, uninstallCommands(p, uid));
|
|
201
|
+
const stagedXml = p.manager === "schtasks" ? `${p.home}/.honeycomb/nectar/nectar-task.xml` : "";
|
|
202
|
+
try {
|
|
203
|
+
if (p.unitPath !== "")
|
|
204
|
+
fs.removeFile(p.unitPath);
|
|
205
|
+
if (stagedXml !== "")
|
|
206
|
+
fs.removeFile(stagedXml);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
log({
|
|
210
|
+
level: "warn",
|
|
211
|
+
scope: "service",
|
|
212
|
+
msg: "unit_remove_failed",
|
|
213
|
+
reason: error instanceof Error ? error.message : "unknown",
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (!allOk) {
|
|
217
|
+
const detail = describeFailure(firstFailureResult);
|
|
218
|
+
log({
|
|
219
|
+
level: "warn",
|
|
220
|
+
scope: "service",
|
|
221
|
+
msg: "uninstall_command_failed",
|
|
222
|
+
command: firstFailure?.command,
|
|
223
|
+
detail,
|
|
224
|
+
});
|
|
225
|
+
return {
|
|
226
|
+
ok: false,
|
|
227
|
+
message: `Removed the nectar unit file; a deregister command (${firstFailure?.command ?? "unknown"}) reported an error (often because it was already gone): ${detail}.`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
log({ level: "info", scope: "service", msg: "uninstalled", manager: p.manager, scope2: p.scope });
|
|
231
|
+
return {
|
|
232
|
+
ok: true,
|
|
233
|
+
message: `nectar service unregistered (${p.manager}, ${scopePhrase(p)}). It will not start on next boot.`,
|
|
234
|
+
};
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Probe the current service status. Returns a coarse {@link ServiceStatus}; never
|
|
240
|
+
* throws.
|
|
241
|
+
*/
|
|
242
|
+
export async function serviceStatus(deps) {
|
|
243
|
+
const runner = deps.runner ?? createExecFileRunner();
|
|
244
|
+
const uid = deps.uid ?? liveUid();
|
|
245
|
+
const environment = deps.environment ?? resolveServiceContext(deps.execPath, deps.preferSystemScope ?? false);
|
|
246
|
+
let p;
|
|
247
|
+
try {
|
|
248
|
+
p = resolveServicePlan(environment);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return "unknown";
|
|
252
|
+
}
|
|
253
|
+
const cmd = statusCommand(p, uid);
|
|
254
|
+
const result = await runner.run(cmd.command, cmd.args, { timeoutMs: SERVICE_COMMAND_TIMEOUT_MS });
|
|
255
|
+
if (!result.ok) {
|
|
256
|
+
if (result.detail !== undefined && /ENOENT|spawn/i.test(result.detail))
|
|
257
|
+
return "unknown";
|
|
258
|
+
return "not-running";
|
|
259
|
+
}
|
|
260
|
+
if (p.manager === "systemd") {
|
|
261
|
+
return /\bactive\b/.test(result.stdout) && !/inactive|failed/.test(result.stdout) ? "running" : "not-running";
|
|
262
|
+
}
|
|
263
|
+
return "running";
|
|
264
|
+
}
|
|
265
|
+
export { resolveServicePlan, resolveServiceContext } from "./platform.js";
|
|
266
|
+
export { SERVICE_LABEL, SYSTEMD_UNIT_NAME, WINDOWS_TASK_NAME, LEGACY_SERVICE_LABEL, LEGACY_SYSTEMD_UNIT_NAME, LEGACY_WINDOWS_TASK_NAME, legacyUnitPath, } from "./platform.js";
|
|
267
|
+
export { NECTAR_RUN_COMMAND, RESTART_SEC, WINDOWS_RESTART_INTERVAL, renderUnit } from "./templates.js";
|
|
268
|
+
export { installCommands, uninstallCommands, legacyUninstallCommands, statusCommand } from "./argv.js";
|
|
269
|
+
export { createExecFileRunner } from "./command-runner.js";
|
|
270
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"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"}
|