@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.
Files changed (467) hide show
  1. package/LICENSE.md +662 -0
  2. package/README.md +307 -0
  3. package/dist/api/daemon-api-wiring.d.ts +72 -0
  4. package/dist/api/daemon-api-wiring.d.ts.map +1 -0
  5. package/dist/api/daemon-api-wiring.js +150 -0
  6. package/dist/api/daemon-api-wiring.js.map +1 -0
  7. package/dist/api/hive-graph-api.d.ts +136 -0
  8. package/dist/api/hive-graph-api.d.ts.map +1 -0
  9. package/dist/api/hive-graph-api.js +234 -0
  10. package/dist/api/hive-graph-api.js.map +1 -0
  11. package/dist/api/loopback-client.d.ts +27 -0
  12. package/dist/api/loopback-client.d.ts.map +1 -0
  13. package/dist/api/loopback-client.js +87 -0
  14. package/dist/api/loopback-client.js.map +1 -0
  15. package/dist/api/router.d.ts +172 -0
  16. package/dist/api/router.d.ts.map +1 -0
  17. package/dist/api/router.js +212 -0
  18. package/dist/api/router.js.map +1 -0
  19. package/dist/api/status-query.d.ts +49 -0
  20. package/dist/api/status-query.d.ts.map +1 -0
  21. package/dist/api/status-query.js +103 -0
  22. package/dist/api/status-query.js.map +1 -0
  23. package/dist/brood-guard.d.ts +24 -0
  24. package/dist/brood-guard.d.ts.map +1 -0
  25. package/dist/brood-guard.js +19 -0
  26. package/dist/brood-guard.js.map +1 -0
  27. package/dist/brood-prereqs.d.ts +62 -0
  28. package/dist/brood-prereqs.d.ts.map +1 -0
  29. package/dist/brood-prereqs.js +87 -0
  30. package/dist/brood-prereqs.js.map +1 -0
  31. package/dist/brooding/bucketing.d.ts +68 -0
  32. package/dist/brooding/bucketing.d.ts.map +1 -0
  33. package/dist/brooding/bucketing.js +122 -0
  34. package/dist/brooding/bucketing.js.map +1 -0
  35. package/dist/brooding/cli.d.ts +78 -0
  36. package/dist/brooding/cli.d.ts.map +1 -0
  37. package/dist/brooding/cli.js +140 -0
  38. package/dist/brooding/cli.js.map +1 -0
  39. package/dist/brooding/constants.d.ts +75 -0
  40. package/dist/brooding/constants.d.ts.map +1 -0
  41. package/dist/brooding/constants.js +91 -0
  42. package/dist/brooding/constants.js.map +1 -0
  43. package/dist/brooding/cost.d.ts +110 -0
  44. package/dist/brooding/cost.d.ts.map +1 -0
  45. package/dist/brooding/cost.js +96 -0
  46. package/dist/brooding/cost.js.map +1 -0
  47. package/dist/brooding/describe.d.ts +152 -0
  48. package/dist/brooding/describe.d.ts.map +1 -0
  49. package/dist/brooding/describe.js +281 -0
  50. package/dist/brooding/describe.js.map +1 -0
  51. package/dist/brooding/discovery.d.ts +116 -0
  52. package/dist/brooding/discovery.d.ts.map +1 -0
  53. package/dist/brooding/discovery.js +179 -0
  54. package/dist/brooding/discovery.js.map +1 -0
  55. package/dist/brooding/index.d.ts +23 -0
  56. package/dist/brooding/index.d.ts.map +1 -0
  57. package/dist/brooding/index.js +33 -0
  58. package/dist/brooding/index.js.map +1 -0
  59. package/dist/brooding/pipeline-async.d.ts +97 -0
  60. package/dist/brooding/pipeline-async.d.ts.map +1 -0
  61. package/dist/brooding/pipeline-async.js +364 -0
  62. package/dist/brooding/pipeline-async.js.map +1 -0
  63. package/dist/brooding/pipeline.d.ts +198 -0
  64. package/dist/brooding/pipeline.d.ts.map +1 -0
  65. package/dist/brooding/pipeline.js +454 -0
  66. package/dist/brooding/pipeline.js.map +1 -0
  67. package/dist/brooding/precheck.d.ts +52 -0
  68. package/dist/brooding/precheck.d.ts.map +1 -0
  69. package/dist/brooding/precheck.js +143 -0
  70. package/dist/brooding/precheck.js.map +1 -0
  71. package/dist/brooding/resumability.d.ts +57 -0
  72. package/dist/brooding/resumability.d.ts.map +1 -0
  73. package/dist/brooding/resumability.js +46 -0
  74. package/dist/brooding/resumability.js.map +1 -0
  75. package/dist/cli.d.ts +139 -0
  76. package/dist/cli.d.ts.map +1 -0
  77. package/dist/cli.js +912 -0
  78. package/dist/cli.js.map +1 -0
  79. package/dist/config-file.d.ts +52 -0
  80. package/dist/config-file.d.ts.map +1 -0
  81. package/dist/config-file.js +130 -0
  82. package/dist/config-file.js.map +1 -0
  83. package/dist/config.d.ts +49 -0
  84. package/dist/config.d.ts.map +1 -0
  85. package/dist/config.js +98 -0
  86. package/dist/config.js.map +1 -0
  87. package/dist/daemon.d.ts +265 -0
  88. package/dist/daemon.d.ts.map +1 -0
  89. package/dist/daemon.js +664 -0
  90. package/dist/daemon.js.map +1 -0
  91. package/dist/doctor-registry.d.ts +134 -0
  92. package/dist/doctor-registry.d.ts.map +1 -0
  93. package/dist/doctor-registry.js +173 -0
  94. package/dist/doctor-registry.js.map +1 -0
  95. package/dist/embeddings/cohere-portkey.d.ts +67 -0
  96. package/dist/embeddings/cohere-portkey.d.ts.map +1 -0
  97. package/dist/embeddings/cohere-portkey.js +171 -0
  98. package/dist/embeddings/cohere-portkey.js.map +1 -0
  99. package/dist/embeddings/config.d.ts +74 -0
  100. package/dist/embeddings/config.d.ts.map +1 -0
  101. package/dist/embeddings/config.js +131 -0
  102. package/dist/embeddings/config.js.map +1 -0
  103. package/dist/embeddings/guard.d.ts +34 -0
  104. package/dist/embeddings/guard.d.ts.map +1 -0
  105. package/dist/embeddings/guard.js +67 -0
  106. package/dist/embeddings/guard.js.map +1 -0
  107. package/dist/embeddings/hosted-portkey.d.ts +73 -0
  108. package/dist/embeddings/hosted-portkey.d.ts.map +1 -0
  109. package/dist/embeddings/hosted-portkey.js +179 -0
  110. package/dist/embeddings/hosted-portkey.js.map +1 -0
  111. package/dist/embeddings/http.d.ts +33 -0
  112. package/dist/embeddings/http.d.ts.map +1 -0
  113. package/dist/embeddings/http.js +19 -0
  114. package/dist/embeddings/http.js.map +1 -0
  115. package/dist/embeddings/index.d.ts +17 -0
  116. package/dist/embeddings/index.d.ts.map +1 -0
  117. package/dist/embeddings/index.js +17 -0
  118. package/dist/embeddings/index.js.map +1 -0
  119. package/dist/embeddings/local-nomic.d.ts +78 -0
  120. package/dist/embeddings/local-nomic.d.ts.map +1 -0
  121. package/dist/embeddings/local-nomic.js +126 -0
  122. package/dist/embeddings/local-nomic.js.map +1 -0
  123. package/dist/embeddings/provider.d.ts +79 -0
  124. package/dist/embeddings/provider.d.ts.map +1 -0
  125. package/dist/embeddings/provider.js +50 -0
  126. package/dist/embeddings/provider.js.map +1 -0
  127. package/dist/enricher/config.d.ts +43 -0
  128. package/dist/enricher/config.d.ts.map +1 -0
  129. package/dist/enricher/config.js +34 -0
  130. package/dist/enricher/config.js.map +1 -0
  131. package/dist/enricher/content-cache.d.ts +29 -0
  132. package/dist/enricher/content-cache.d.ts.map +1 -0
  133. package/dist/enricher/content-cache.js +24 -0
  134. package/dist/enricher/content-cache.js.map +1 -0
  135. package/dist/enricher/cycle.d.ts +71 -0
  136. package/dist/enricher/cycle.d.ts.map +1 -0
  137. package/dist/enricher/cycle.js +319 -0
  138. package/dist/enricher/cycle.js.map +1 -0
  139. package/dist/enricher/describe.d.ts +61 -0
  140. package/dist/enricher/describe.d.ts.map +1 -0
  141. package/dist/enricher/describe.js +175 -0
  142. package/dist/enricher/describe.js.map +1 -0
  143. package/dist/enricher/failure.d.ts +25 -0
  144. package/dist/enricher/failure.d.ts.map +1 -0
  145. package/dist/enricher/failure.js +46 -0
  146. package/dist/enricher/failure.js.map +1 -0
  147. package/dist/enricher/index.d.ts +22 -0
  148. package/dist/enricher/index.d.ts.map +1 -0
  149. package/dist/enricher/index.js +22 -0
  150. package/dist/enricher/index.js.map +1 -0
  151. package/dist/enricher/jaccard.d.ts +11 -0
  152. package/dist/enricher/jaccard.d.ts.map +1 -0
  153. package/dist/enricher/jaccard.js +29 -0
  154. package/dist/enricher/jaccard.js.map +1 -0
  155. package/dist/enricher/loop.d.ts +22 -0
  156. package/dist/enricher/loop.d.ts.map +1 -0
  157. package/dist/enricher/loop.js +34 -0
  158. package/dist/enricher/loop.js.map +1 -0
  159. package/dist/enricher/meaningful-change.d.ts +28 -0
  160. package/dist/enricher/meaningful-change.d.ts.map +1 -0
  161. package/dist/enricher/meaningful-change.js +41 -0
  162. package/dist/enricher/meaningful-change.js.map +1 -0
  163. package/dist/enricher/observability.d.ts +22 -0
  164. package/dist/enricher/observability.d.ts.map +1 -0
  165. package/dist/enricher/observability.js +55 -0
  166. package/dist/enricher/observability.js.map +1 -0
  167. package/dist/enricher/pending-query.d.ts +35 -0
  168. package/dist/enricher/pending-query.d.ts.map +1 -0
  169. package/dist/enricher/pending-query.js +54 -0
  170. package/dist/enricher/pending-query.js.map +1 -0
  171. package/dist/enricher/sql-update.d.ts +7 -0
  172. package/dist/enricher/sql-update.d.ts.map +1 -0
  173. package/dist/enricher/sql-update.js +22 -0
  174. package/dist/enricher/sql-update.js.map +1 -0
  175. package/dist/enricher/store-adapter.d.ts +98 -0
  176. package/dist/enricher/store-adapter.d.ts.map +1 -0
  177. package/dist/enricher/store-adapter.js +129 -0
  178. package/dist/enricher/store-adapter.js.map +1 -0
  179. package/dist/enricher/store.d.ts +58 -0
  180. package/dist/enricher/store.d.ts.map +1 -0
  181. package/dist/enricher/store.js +126 -0
  182. package/dist/enricher/store.js.map +1 -0
  183. package/dist/enricher/tokenize.d.ts +10 -0
  184. package/dist/enricher/tokenize.d.ts.map +1 -0
  185. package/dist/enricher/tokenize.js +28 -0
  186. package/dist/enricher/tokenize.js.map +1 -0
  187. package/dist/errors.d.ts +41 -0
  188. package/dist/errors.d.ts.map +1 -0
  189. package/dist/errors.js +56 -0
  190. package/dist/errors.js.map +1 -0
  191. package/dist/health.d.ts +147 -0
  192. package/dist/health.d.ts.map +1 -0
  193. package/dist/health.js +168 -0
  194. package/dist/health.js.map +1 -0
  195. package/dist/hive-graph/deeplake-credentials.d.ts +68 -0
  196. package/dist/hive-graph/deeplake-credentials.d.ts.map +1 -0
  197. package/dist/hive-graph/deeplake-credentials.js +135 -0
  198. package/dist/hive-graph/deeplake-credentials.js.map +1 -0
  199. package/dist/hive-graph/deeplake-heal.d.ts +63 -0
  200. package/dist/hive-graph/deeplake-heal.d.ts.map +1 -0
  201. package/dist/hive-graph/deeplake-heal.js +118 -0
  202. package/dist/hive-graph/deeplake-heal.js.map +1 -0
  203. package/dist/hive-graph/deeplake-store.d.ts +199 -0
  204. package/dist/hive-graph/deeplake-store.d.ts.map +1 -0
  205. package/dist/hive-graph/deeplake-store.js +541 -0
  206. package/dist/hive-graph/deeplake-store.js.map +1 -0
  207. package/dist/hive-graph/deeplake-transport.d.ts +89 -0
  208. package/dist/hive-graph/deeplake-transport.d.ts.map +1 -0
  209. package/dist/hive-graph/deeplake-transport.js +145 -0
  210. package/dist/hive-graph/deeplake-transport.js.map +1 -0
  211. package/dist/hive-graph/hash.d.ts +3 -0
  212. package/dist/hive-graph/hash.d.ts.map +1 -0
  213. package/dist/hive-graph/hash.js +12 -0
  214. package/dist/hive-graph/hash.js.map +1 -0
  215. package/dist/hive-graph/memory-store.d.ts +39 -0
  216. package/dist/hive-graph/memory-store.d.ts.map +1 -0
  217. package/dist/hive-graph/memory-store.js +125 -0
  218. package/dist/hive-graph/memory-store.js.map +1 -0
  219. package/dist/hive-graph/model.d.ts +109 -0
  220. package/dist/hive-graph/model.d.ts.map +1 -0
  221. package/dist/hive-graph/model.js +36 -0
  222. package/dist/hive-graph/model.js.map +1 -0
  223. package/dist/hive-graph/paths.d.ts +7 -0
  224. package/dist/hive-graph/paths.d.ts.map +1 -0
  225. package/dist/hive-graph/paths.js +26 -0
  226. package/dist/hive-graph/paths.js.map +1 -0
  227. package/dist/hive-graph/project-scope.d.ts +99 -0
  228. package/dist/hive-graph/project-scope.d.ts.map +1 -0
  229. package/dist/hive-graph/project-scope.js +286 -0
  230. package/dist/hive-graph/project-scope.js.map +1 -0
  231. package/dist/hive-graph/schema.d.ts +53 -0
  232. package/dist/hive-graph/schema.d.ts.map +1 -0
  233. package/dist/hive-graph/schema.js +139 -0
  234. package/dist/hive-graph/schema.js.map +1 -0
  235. package/dist/hive-graph/search-types.d.ts +82 -0
  236. package/dist/hive-graph/search-types.d.ts.map +1 -0
  237. package/dist/hive-graph/search-types.js +2 -0
  238. package/dist/hive-graph/search-types.js.map +1 -0
  239. package/dist/hive-graph/search.d.ts +51 -0
  240. package/dist/hive-graph/search.d.ts.map +1 -0
  241. package/dist/hive-graph/search.js +417 -0
  242. package/dist/hive-graph/search.js.map +1 -0
  243. package/dist/hive-graph/sql-guards.d.ts +99 -0
  244. package/dist/hive-graph/sql-guards.d.ts.map +1 -0
  245. package/dist/hive-graph/sql-guards.js +129 -0
  246. package/dist/hive-graph/sql-guards.js.map +1 -0
  247. package/dist/hive-graph/store.d.ts +151 -0
  248. package/dist/hive-graph/store.d.ts.map +1 -0
  249. package/dist/hive-graph/store.js +2 -0
  250. package/dist/hive-graph/store.js.map +1 -0
  251. package/dist/hive-graph/ulid.d.ts +14 -0
  252. package/dist/hive-graph/ulid.d.ts.map +1 -0
  253. package/dist/hive-graph/ulid.js +109 -0
  254. package/dist/hive-graph/ulid.js.map +1 -0
  255. package/dist/hivedoctor-registry.d.ts +111 -0
  256. package/dist/hivedoctor-registry.d.ts.map +1 -0
  257. package/dist/hivedoctor-registry.js +143 -0
  258. package/dist/hivedoctor-registry.js.map +1 -0
  259. package/dist/index.d.ts +106 -0
  260. package/dist/index.d.ts.map +1 -0
  261. package/dist/index.js +78 -0
  262. package/dist/index.js.map +1 -0
  263. package/dist/lock.d.ts +66 -0
  264. package/dist/lock.d.ts.map +1 -0
  265. package/dist/lock.js +282 -0
  266. package/dist/lock.js.map +1 -0
  267. package/dist/poll-loop.d.ts +71 -0
  268. package/dist/poll-loop.d.ts.map +1 -0
  269. package/dist/poll-loop.js +130 -0
  270. package/dist/poll-loop.js.map +1 -0
  271. package/dist/portkey/config.d.ts +46 -0
  272. package/dist/portkey/config.d.ts.map +1 -0
  273. package/dist/portkey/config.js +68 -0
  274. package/dist/portkey/config.js.map +1 -0
  275. package/dist/portkey/describe-model.d.ts +53 -0
  276. package/dist/portkey/describe-model.d.ts.map +1 -0
  277. package/dist/portkey/describe-model.js +56 -0
  278. package/dist/portkey/describe-model.js.map +1 -0
  279. package/dist/portkey/headers.d.ts +31 -0
  280. package/dist/portkey/headers.d.ts.map +1 -0
  281. package/dist/portkey/headers.js +37 -0
  282. package/dist/portkey/headers.js.map +1 -0
  283. package/dist/portkey/transport.d.ts +89 -0
  284. package/dist/portkey/transport.d.ts.map +1 -0
  285. package/dist/portkey/transport.js +167 -0
  286. package/dist/portkey/transport.js.map +1 -0
  287. package/dist/projection/format.d.ts +51 -0
  288. package/dist/projection/format.d.ts.map +1 -0
  289. package/dist/projection/format.js +81 -0
  290. package/dist/projection/format.js.map +1 -0
  291. package/dist/projection/generate.d.ts +31 -0
  292. package/dist/projection/generate.d.ts.map +1 -0
  293. package/dist/projection/generate.js +83 -0
  294. package/dist/projection/generate.js.map +1 -0
  295. package/dist/projection/inherit.d.ts +27 -0
  296. package/dist/projection/inherit.d.ts.map +1 -0
  297. package/dist/projection/inherit.js +128 -0
  298. package/dist/projection/inherit.js.map +1 -0
  299. package/dist/projection/load.d.ts +47 -0
  300. package/dist/projection/load.d.ts.map +1 -0
  301. package/dist/projection/load.js +258 -0
  302. package/dist/projection/load.js.map +1 -0
  303. package/dist/projection/store-adapter.d.ts +42 -0
  304. package/dist/projection/store-adapter.d.ts.map +1 -0
  305. package/dist/projection/store-adapter.js +42 -0
  306. package/dist/projection/store-adapter.js.map +1 -0
  307. package/dist/projection/write.d.ts +79 -0
  308. package/dist/projection/write.d.ts.map +1 -0
  309. package/dist/projection/write.js +122 -0
  310. package/dist/projection/write.js.map +1 -0
  311. package/dist/registration/classify.d.ts +33 -0
  312. package/dist/registration/classify.d.ts.map +1 -0
  313. package/dist/registration/classify.js +32 -0
  314. package/dist/registration/classify.js.map +1 -0
  315. package/dist/registration/copy-detect.d.ts +22 -0
  316. package/dist/registration/copy-detect.d.ts.map +1 -0
  317. package/dist/registration/copy-detect.js +12 -0
  318. package/dist/registration/copy-detect.js.map +1 -0
  319. package/dist/registration/disk-fs.d.ts +41 -0
  320. package/dist/registration/disk-fs.d.ts.map +1 -0
  321. package/dist/registration/disk-fs.js +175 -0
  322. package/dist/registration/disk-fs.js.map +1 -0
  323. package/dist/registration/fs-watch.d.ts +114 -0
  324. package/dist/registration/fs-watch.d.ts.map +1 -0
  325. package/dist/registration/fs-watch.js +266 -0
  326. package/dist/registration/fs-watch.js.map +1 -0
  327. package/dist/registration/ignore.d.ts +77 -0
  328. package/dist/registration/ignore.d.ts.map +1 -0
  329. package/dist/registration/ignore.js +249 -0
  330. package/dist/registration/ignore.js.map +1 -0
  331. package/dist/registration/ladder.d.ts +211 -0
  332. package/dist/registration/ladder.d.ts.map +1 -0
  333. package/dist/registration/ladder.js +378 -0
  334. package/dist/registration/ladder.js.map +1 -0
  335. package/dist/registration/paths-safe.d.ts +21 -0
  336. package/dist/registration/paths-safe.d.ts.map +1 -0
  337. package/dist/registration/paths-safe.js +88 -0
  338. package/dist/registration/paths-safe.js.map +1 -0
  339. package/dist/registration/prune-cli.d.ts +48 -0
  340. package/dist/registration/prune-cli.d.ts.map +1 -0
  341. package/dist/registration/prune-cli.js +57 -0
  342. package/dist/registration/prune-cli.js.map +1 -0
  343. package/dist/registration/review-cli.d.ts +42 -0
  344. package/dist/registration/review-cli.d.ts.map +1 -0
  345. package/dist/registration/review-cli.js +110 -0
  346. package/dist/registration/review-cli.js.map +1 -0
  347. package/dist/registration/review-store.d.ts +73 -0
  348. package/dist/registration/review-store.d.ts.map +1 -0
  349. package/dist/registration/review-store.js +243 -0
  350. package/dist/registration/review-store.js.map +1 -0
  351. package/dist/registration/service.d.ts +196 -0
  352. package/dist/registration/service.d.ts.map +1 -0
  353. package/dist/registration/service.js +384 -0
  354. package/dist/registration/service.js.map +1 -0
  355. package/dist/registration/store-bridge.d.ts +133 -0
  356. package/dist/registration/store-bridge.d.ts.map +1 -0
  357. package/dist/registration/store-bridge.js +159 -0
  358. package/dist/registration/store-bridge.js.map +1 -0
  359. package/dist/registration/tlsh.d.ts +125 -0
  360. package/dist/registration/tlsh.d.ts.map +1 -0
  361. package/dist/registration/tlsh.js +274 -0
  362. package/dist/registration/tlsh.js.map +1 -0
  363. package/dist/server.d.ts +26 -0
  364. package/dist/server.d.ts.map +1 -0
  365. package/dist/server.js +156 -0
  366. package/dist/server.js.map +1 -0
  367. package/dist/service/argv.d.ts +52 -0
  368. package/dist/service/argv.d.ts.map +1 -0
  369. package/dist/service/argv.js +127 -0
  370. package/dist/service/argv.js.map +1 -0
  371. package/dist/service/command-runner.d.ts +54 -0
  372. package/dist/service/command-runner.d.ts.map +1 -0
  373. package/dist/service/command-runner.js +55 -0
  374. package/dist/service/command-runner.js.map +1 -0
  375. package/dist/service/index.d.ts +83 -0
  376. package/dist/service/index.d.ts.map +1 -0
  377. package/dist/service/index.js +270 -0
  378. package/dist/service/index.js.map +1 -0
  379. package/dist/service/platform.d.ts +110 -0
  380. package/dist/service/platform.d.ts.map +1 -0
  381. package/dist/service/platform.js +157 -0
  382. package/dist/service/platform.js.map +1 -0
  383. package/dist/service/templates.d.ts +88 -0
  384. package/dist/service/templates.d.ts.map +1 -0
  385. package/dist/service/templates.js +212 -0
  386. package/dist/service/templates.js.map +1 -0
  387. package/dist/source-graph/deeplake-credentials.d.ts +57 -0
  388. package/dist/source-graph/deeplake-credentials.d.ts.map +1 -0
  389. package/dist/source-graph/deeplake-credentials.js +109 -0
  390. package/dist/source-graph/deeplake-credentials.js.map +1 -0
  391. package/dist/source-graph/deeplake-heal.d.ts +53 -0
  392. package/dist/source-graph/deeplake-heal.d.ts.map +1 -0
  393. package/dist/source-graph/deeplake-heal.js +41 -0
  394. package/dist/source-graph/deeplake-heal.js.map +1 -0
  395. package/dist/source-graph/deeplake-store.d.ts +151 -0
  396. package/dist/source-graph/deeplake-store.d.ts.map +1 -0
  397. package/dist/source-graph/deeplake-store.js +389 -0
  398. package/dist/source-graph/deeplake-store.js.map +1 -0
  399. package/dist/source-graph/deeplake-transport.d.ts +74 -0
  400. package/dist/source-graph/deeplake-transport.d.ts.map +1 -0
  401. package/dist/source-graph/deeplake-transport.js +107 -0
  402. package/dist/source-graph/deeplake-transport.js.map +1 -0
  403. package/dist/source-graph/hash.d.ts +3 -0
  404. package/dist/source-graph/hash.d.ts.map +1 -0
  405. package/dist/source-graph/hash.js +12 -0
  406. package/dist/source-graph/hash.js.map +1 -0
  407. package/dist/source-graph/memory-store.d.ts +32 -0
  408. package/dist/source-graph/memory-store.d.ts.map +1 -0
  409. package/dist/source-graph/memory-store.js +81 -0
  410. package/dist/source-graph/memory-store.js.map +1 -0
  411. package/dist/source-graph/model.d.ts +102 -0
  412. package/dist/source-graph/model.d.ts.map +1 -0
  413. package/dist/source-graph/model.js +36 -0
  414. package/dist/source-graph/model.js.map +1 -0
  415. package/dist/source-graph/paths.d.ts +7 -0
  416. package/dist/source-graph/paths.d.ts.map +1 -0
  417. package/dist/source-graph/paths.js +26 -0
  418. package/dist/source-graph/paths.js.map +1 -0
  419. package/dist/source-graph/schema.d.ts +44 -0
  420. package/dist/source-graph/schema.d.ts.map +1 -0
  421. package/dist/source-graph/schema.js +123 -0
  422. package/dist/source-graph/schema.js.map +1 -0
  423. package/dist/source-graph/sql-guards.d.ts +99 -0
  424. package/dist/source-graph/sql-guards.d.ts.map +1 -0
  425. package/dist/source-graph/sql-guards.js +129 -0
  426. package/dist/source-graph/sql-guards.js.map +1 -0
  427. package/dist/source-graph/store.d.ts +101 -0
  428. package/dist/source-graph/store.d.ts.map +1 -0
  429. package/dist/source-graph/store.js +2 -0
  430. package/dist/source-graph/store.js.map +1 -0
  431. package/dist/source-graph/ulid.d.ts +9 -0
  432. package/dist/source-graph/ulid.d.ts.map +1 -0
  433. package/dist/source-graph/ulid.js +61 -0
  434. package/dist/source-graph/ulid.js.map +1 -0
  435. package/dist/telemetry/checkin.d.ts +66 -0
  436. package/dist/telemetry/checkin.d.ts.map +1 -0
  437. package/dist/telemetry/checkin.js +142 -0
  438. package/dist/telemetry/checkin.js.map +1 -0
  439. package/dist/telemetry/db.d.ts +34 -0
  440. package/dist/telemetry/db.d.ts.map +1 -0
  441. package/dist/telemetry/db.js +122 -0
  442. package/dist/telemetry/db.js.map +1 -0
  443. package/dist/telemetry/index.d.ts +76 -0
  444. package/dist/telemetry/index.d.ts.map +1 -0
  445. package/dist/telemetry/index.js +98 -0
  446. package/dist/telemetry/index.js.map +1 -0
  447. package/dist/telemetry/logs.d.ts +83 -0
  448. package/dist/telemetry/logs.d.ts.map +1 -0
  449. package/dist/telemetry/logs.js +110 -0
  450. package/dist/telemetry/logs.js.map +1 -0
  451. package/dist/telemetry/metrics.d.ts +82 -0
  452. package/dist/telemetry/metrics.d.ts.map +1 -0
  453. package/dist/telemetry/metrics.js +148 -0
  454. package/dist/telemetry/metrics.js.map +1 -0
  455. package/dist/telemetry-usage/emit.d.ts +105 -0
  456. package/dist/telemetry-usage/emit.d.ts.map +1 -0
  457. package/dist/telemetry-usage/emit.js +267 -0
  458. package/dist/telemetry-usage/emit.js.map +1 -0
  459. package/dist/telemetry-usage/posthog-key.d.ts +22 -0
  460. package/dist/telemetry-usage/posthog-key.d.ts.map +1 -0
  461. package/dist/telemetry-usage/posthog-key.js +22 -0
  462. package/dist/telemetry-usage/posthog-key.js.map +1 -0
  463. package/dist/worker.d.ts +69 -0
  464. package/dist/worker.d.ts.map +1 -0
  465. package/dist/worker.js +91 -0
  466. package/dist/worker.js.map +1 -0
  467. 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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"}
@@ -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"}