@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,31 @@
1
+ /**
2
+ * Build a portable projection from store state (PRD-011a / AC-3).
3
+ *
4
+ * Pure generation core plus a store-backed entry point via the thin adapter in
5
+ * `store-adapter.ts`.
6
+ */
7
+ import type { Tenancy } from "../hive-graph/model.js";
8
+ import type { AsyncHiveGraphStore, HiveGraphStore } from "../hive-graph/store.js";
9
+ import { type PortableProjection } from "./format.js";
10
+ import { type CollectProjectionSourcesOptions, type ProjectionNectarSource } from "./store-adapter.js";
11
+ export interface BuildProjectionOptions {
12
+ readonly generatedAt?: string;
13
+ readonly generator?: string;
14
+ }
15
+ /** Pure builder from pre-selected nectar/version rows. */
16
+ export declare function buildProjection(tenancy: Tenancy, sources: readonly ProjectionNectarSource[], opts?: BuildProjectionOptions): PortableProjection;
17
+ export interface BuildProjectionFromStoreOptions extends BuildProjectionOptions, CollectProjectionSourcesOptions {
18
+ }
19
+ /** Scan the store and build a complete projection document. */
20
+ export declare function buildProjectionFromStore(store: HiveGraphStore, tenancy: Tenancy, opts?: BuildProjectionFromStoreOptions): PortableProjection;
21
+ /**
22
+ * Scan the durable {@link AsyncHiveGraphStore} (Deep Lake) and build a
23
+ * complete projection document (PRD-011c). The async twin of
24
+ * {@link buildProjectionFromStore}: it collects the projection sources via
25
+ * {@link collectProjectionSourcesAsync} (latest described version per nectar,
26
+ * scoped to the project) and denormalizes them through the SAME pure
27
+ * {@link buildProjection} core, so the async path produces byte-identical
28
+ * output to the sync one for the same state (modulo `generated_at`).
29
+ */
30
+ export declare function buildProjectionFromAsyncStore(store: AsyncHiveGraphStore, tenancy: Tenancy, opts?: BuildProjectionOptions): Promise<PortableProjection>;
31
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/projection/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAGL,KAAK,kBAAkB,EAIxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA2CD,0DAA0D;AAC1D,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,IAAI,GAAE,sBAA2B,GAChC,kBAAkB,CAmBpB;AAED,MAAM,WAAW,+BAAgC,SAAQ,sBAAsB,EAAE,+BAA+B;CAAG;AAEnH,+DAA+D;AAC/D,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,+BAAoC,GACzC,kBAAkB,CAGpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAG7B"}
@@ -0,0 +1,83 @@
1
+ import { DEFAULT_GENERATOR, PROJECTION_SCHEMA_VERSION, } from "./format.js";
2
+ import { collectProjectionSources, collectProjectionSourcesAsync, } from "./store-adapter.js";
3
+ function parseConcepts(raw) {
4
+ if (raw === "" || raw === "[]")
5
+ return [];
6
+ try {
7
+ const parsed = JSON.parse(raw);
8
+ if (!Array.isArray(parsed))
9
+ return [];
10
+ return parsed.filter((v) => typeof v === "string");
11
+ }
12
+ catch {
13
+ return [];
14
+ }
15
+ }
16
+ function toFileEntry(version) {
17
+ const described = version.describeStatus === "described";
18
+ return {
19
+ content_hash: version.contentHash,
20
+ path: version.path,
21
+ title: described ? version.title : "",
22
+ description: described ? version.description : "",
23
+ concepts: described ? parseConcepts(version.concepts) : [],
24
+ describe_model: described ? version.describeModel : "",
25
+ described_at: described ? version.describedAt : "",
26
+ };
27
+ }
28
+ function toDerivedEntry(identity) {
29
+ if (identity.derivedFromNectar === "" && identity.forkContentHash === "")
30
+ return undefined;
31
+ if (identity.derivedFromNectar === "" || identity.forkContentHash === "")
32
+ return undefined;
33
+ return {
34
+ from_nectar: identity.derivedFromNectar,
35
+ fork_content_hash: identity.forkContentHash,
36
+ };
37
+ }
38
+ function tenancyToProject(t) {
39
+ return {
40
+ org_id: t.orgId,
41
+ workspace_id: t.workspaceId,
42
+ project_id: t.projectId,
43
+ };
44
+ }
45
+ /** Pure builder from pre-selected nectar/version rows. */
46
+ export function buildProjection(tenancy, sources, opts = {}) {
47
+ const files = {};
48
+ const derived = {};
49
+ const sorted = [...sources].sort((a, b) => a.identity.nectar.localeCompare(b.identity.nectar));
50
+ for (const { identity, version } of sorted) {
51
+ files[identity.nectar] = toFileEntry(version);
52
+ const d = toDerivedEntry(identity);
53
+ if (d !== undefined)
54
+ derived[identity.nectar] = d;
55
+ }
56
+ return {
57
+ version: PROJECTION_SCHEMA_VERSION,
58
+ generated_at: opts.generatedAt ?? new Date().toISOString(),
59
+ generator: opts.generator ?? DEFAULT_GENERATOR,
60
+ project: tenancyToProject(tenancy),
61
+ files,
62
+ derived,
63
+ };
64
+ }
65
+ /** Scan the store and build a complete projection document. */
66
+ export function buildProjectionFromStore(store, tenancy, opts = {}) {
67
+ const sources = collectProjectionSources(store, tenancy, opts);
68
+ return buildProjection(tenancy, sources, opts);
69
+ }
70
+ /**
71
+ * Scan the durable {@link AsyncHiveGraphStore} (Deep Lake) and build a
72
+ * complete projection document (PRD-011c). The async twin of
73
+ * {@link buildProjectionFromStore}: it collects the projection sources via
74
+ * {@link collectProjectionSourcesAsync} (latest described version per nectar,
75
+ * scoped to the project) and denormalizes them through the SAME pure
76
+ * {@link buildProjection} core, so the async path produces byte-identical
77
+ * output to the sync one for the same state (modulo `generated_at`).
78
+ */
79
+ export async function buildProjectionFromAsyncStore(store, tenancy, opts = {}) {
80
+ const sources = await collectProjectionSourcesAsync(store, tenancy);
81
+ return buildProjection(tenancy, sources, opts);
82
+ }
83
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/projection/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { HiveGraphRow, HiveGraphVersionRow, Tenancy } from "../hive-graph/model.js";
2
+ import type { PortableProjection } from "./format.js";
3
+ /** Repo-relative path -> content hash (from disk scan). */
4
+ export type DiskHashMap = ReadonlyMap<string, string>;
5
+ export interface InheritRow {
6
+ readonly identity: HiveGraphRow;
7
+ readonly version: HiveGraphVersionRow;
8
+ }
9
+ export interface InheritSummary {
10
+ readonly inherited: number;
11
+ readonly unmatched: number;
12
+ readonly skippedExisting: number;
13
+ readonly rows: readonly InheritRow[];
14
+ }
15
+ export interface InheritFromProjectionOptions {
16
+ readonly tenancy: Tenancy;
17
+ readonly nowIso?: string;
18
+ /** Nectars already present in the local store; never overwritten. */
19
+ readonly existingNectars?: ReadonlySet<string>;
20
+ }
21
+ /**
22
+ * Given a validated projection and on-disk hashes, produce rows to insert for
23
+ * hash-matched paths. Unmatched disk files are counted but not mutated here
24
+ * (the re-association ladder handles them in PRD-006).
25
+ */
26
+ export declare function inheritFromProjection(doc: PortableProjection, diskHashes: DiskHashMap, opts: InheritFromProjectionOptions): InheritSummary;
27
+ //# sourceMappingURL=inherit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inherit.d.ts","sourceRoot":"","sources":["../../src/projection/inherit.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,aAAa,CAAC;AAG3E,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChD;AAyED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,WAAW,EACvB,IAAI,EAAE,4BAA4B,GACjC,cAAc,CAsDhB"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Fresh-clone inheritance from a validated projection (PRD-011b / AC-6).
3
+ *
4
+ * Hash-matched files inherit nectar + description with zero LLM calls and zero
5
+ * fuzzy matches. Writes are additive only: existing local nectars are never
6
+ * overwritten.
7
+ */
8
+ import { mintNectar, nectarCreatedAt } from "../hive-graph/ulid.js";
9
+ import { buildContentHashMultiIndex } from "./load.js";
10
+ function conceptsToJson(concepts) {
11
+ return JSON.stringify([...concepts]);
12
+ }
13
+ function toIdentity(nectar, entry, derived, tenancy) {
14
+ const d = derived[nectar];
15
+ return {
16
+ nectar,
17
+ kind: "file",
18
+ createdAt: nectarCreatedAt(nectar),
19
+ derivedFromNectar: d?.from_nectar ?? "",
20
+ forkContentHash: d?.fork_content_hash ?? "",
21
+ orgId: tenancy.orgId,
22
+ workspaceId: tenancy.workspaceId,
23
+ projectId: tenancy.projectId,
24
+ lastUpdateDate: "",
25
+ };
26
+ }
27
+ function filenameOf(path) {
28
+ const slash = path.lastIndexOf("/");
29
+ return slash >= 0 ? path.slice(slash + 1) : path;
30
+ }
31
+ function extOf(path) {
32
+ const name = filenameOf(path);
33
+ const dot = name.lastIndexOf(".");
34
+ if (dot <= 0)
35
+ return "";
36
+ return name.slice(dot + 1).toLowerCase();
37
+ }
38
+ function toVersion(nectar, entry, tenancy, observedAt) {
39
+ // PRD-018i / NEC-019 AC-018i.5: inherited rows land in the enricher's
40
+ // pending-selector-visible state (`pending`) with title/description/concepts
41
+ // PRESERVED, and `embedding: null`. The enricher's re-embed path then computes
42
+ // a 768-dim vector over the inherited `title + description` with NO LLM
43
+ // describe call (AC-018i.6) and stamps `embed_model` on completion. Writing
44
+ // them `described` (as before) left them invisible to the pending selector, so
45
+ // a fresh clone's vector arm stayed permanently empty.
46
+ return {
47
+ nectar,
48
+ contentHash: entry.content_hash,
49
+ seq: 0,
50
+ path: entry.path,
51
+ filename: filenameOf(entry.path),
52
+ ext: extOf(entry.path),
53
+ sizeBytes: 0,
54
+ mtimeObserved: observedAt,
55
+ title: entry.title,
56
+ description: entry.description,
57
+ concepts: conceptsToJson(entry.concepts),
58
+ embedding: null,
59
+ embedModel: null,
60
+ confidence: null,
61
+ fingerprint: null,
62
+ describedAt: entry.described_at,
63
+ describeModel: entry.describe_model,
64
+ describeStatus: "pending",
65
+ observedAt,
66
+ orgId: tenancy.orgId,
67
+ workspaceId: tenancy.workspaceId,
68
+ projectId: tenancy.projectId,
69
+ lastUpdateDate: observedAt,
70
+ };
71
+ }
72
+ /**
73
+ * Given a validated projection and on-disk hashes, produce rows to insert for
74
+ * hash-matched paths. Unmatched disk files are counted but not mutated here
75
+ * (the re-association ladder handles them in PRD-006).
76
+ */
77
+ export function inheritFromProjection(doc, diskHashes, opts) {
78
+ const index = buildContentHashMultiIndex(doc);
79
+ const existing = opts.existingNectars ?? new Set();
80
+ const observedAt = opts.nowIso ?? new Date().toISOString();
81
+ const rows = [];
82
+ let inherited = 0;
83
+ let unmatched = 0;
84
+ let skippedExisting = 0;
85
+ // PRD-018i / NEC-037 AC-018i.9/.10: consume one projection entry per matched
86
+ // path for a shared content hash so duplicate-content files each keep their own
87
+ // nectar; when the on-disk duplicates outnumber the projection entries for that
88
+ // hash, the surplus paths mint FRESH nectars (inheriting the identical
89
+ // content's description) rather than reusing an already-consumed one.
90
+ const consumed = new Map();
91
+ for (const [path, hash] of diskHashes) {
92
+ const list = index.get(hash);
93
+ if (list === undefined || list.length === 0) {
94
+ unmatched += 1;
95
+ continue;
96
+ }
97
+ const used = consumed.get(hash) ?? 0;
98
+ if (used < list.length) {
99
+ const hit = list[used];
100
+ consumed.set(hash, used + 1);
101
+ if (existing.has(hit.nectar)) {
102
+ skippedExisting += 1;
103
+ continue;
104
+ }
105
+ const entry = { ...hit.entry, path };
106
+ rows.push({
107
+ identity: toIdentity(hit.nectar, entry, doc.derived, opts.tenancy),
108
+ version: toVersion(hit.nectar, entry, opts.tenancy, observedAt),
109
+ });
110
+ inherited += 1;
111
+ }
112
+ else {
113
+ // Surplus duplicate path: mint a fresh nectar carrying the identical
114
+ // content's description. The originally-minted nectars are not reused, so
115
+ // none is orphaned by a double assignment (AC-018i.10).
116
+ const template = list[0];
117
+ const nectar = mintNectar();
118
+ const entry = { ...template.entry, path };
119
+ rows.push({
120
+ identity: toIdentity(nectar, entry, doc.derived, opts.tenancy),
121
+ version: toVersion(nectar, entry, opts.tenancy, observedAt),
122
+ });
123
+ inherited += 1;
124
+ }
125
+ }
126
+ return { inherited, unmatched, skippedExisting, rows };
127
+ }
128
+ //# sourceMappingURL=inherit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inherit.js","sourceRoot":"","sources":["../../src/projection/inherit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAwBvD,SAAS,cAAc,CAAC,QAA2B;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,KAA0B,EAAE,OAAsC,EAAE,OAAgB;IACtH,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO;QACL,MAAM;QACN,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC;QAClC,iBAAiB,EAAE,CAAC,EAAE,WAAW,IAAI,EAAE;QACvC,eAAe,EAAE,CAAC,EAAE,iBAAiB,IAAI,EAAE;QAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAChB,MAAc,EACd,KAA0B,EAC1B,OAAgB,EAChB,UAAkB;IAElB,sEAAsE;IACtE,6EAA6E;IAC7E,+EAA+E;IAC/E,wEAAwE;IACxE,4EAA4E;IAC5E,+EAA+E;IAC/E,uDAAuD;IACvD,OAAO;QACL,MAAM;QACN,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACtB,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,UAAU;QACzB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxC,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,aAAa,EAAE,KAAK,CAAC,cAAc;QACnC,cAAc,EAAE,SAAS;QACzB,UAAU;QACV,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAuB,EACvB,UAAuB,EACvB,IAAkC;IAElC,MAAM,KAAK,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,GAAG,EAAU,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3D,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,6EAA6E;IAC7E,gFAAgF;IAChF,gFAAgF;IAChF,uEAAuE;IACvE,sEAAsE;IACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,SAAS,IAAI,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAmD,CAAC;YACzE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,eAAe,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC;gBACR,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;gBAClE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;aAChE,CAAC,CAAC;YACH,SAAS,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,qEAAqE;YACrE,0EAA0E;YAC1E,wDAAwD;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAmD,CAAC;YAC3E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC;gBACR,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;gBAC9D,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;aAC5D,CAAC,CAAC;YACH,SAAS,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Tenancy } from "../hive-graph/model.js";
2
+ import { type PortableProjection, type ProjectionFileEntry } from "./format.js";
3
+ /**
4
+ * Defensive ceiling on `.honeycomb/nectars.json` before it is read into memory
5
+ * (CWE-400): the file is untrusted (committed content from a cloned repo), and
6
+ * nothing about the projection format needs to exceed this to hold a legitimate
7
+ * per-file description index for even a very large monorepo.
8
+ */
9
+ export declare const MAX_PROJECTION_FILE_BYTES: number;
10
+ export type LoadIgnoreReason = "file_missing" | "file_too_large" | "invalid_json" | "invalid_shape" | "future_version" | "project_mismatch" | "invalid_nectar_key" | "invalid_content_hash" | "invalid_derived_entry";
11
+ export type LoadProjectionResult = {
12
+ readonly ok: true;
13
+ readonly doc: PortableProjection;
14
+ } | {
15
+ readonly ok: false;
16
+ readonly reason: LoadIgnoreReason;
17
+ readonly detail: string;
18
+ };
19
+ /**
20
+ * Validate a parsed projection against the current tenancy. All checks are a
21
+ * single gate: any failure rejects the whole document (AC-5).
22
+ */
23
+ export declare function validateProjection(doc: PortableProjection, tenancy: Tenancy): LoadProjectionResult;
24
+ export interface LoadProjectionFromFileOptions {
25
+ readonly tenancy: Tenancy;
26
+ }
27
+ /** Read and validate a projection file. Never throws on validation failure. */
28
+ export declare function loadProjectionFromFile(filePath: string, opts: LoadProjectionFromFileOptions): LoadProjectionResult;
29
+ /** Validate an in-memory projection document (for tests and daemon boot). */
30
+ export declare function loadProjection(doc: PortableProjection, tenancy: Tenancy): LoadProjectionResult;
31
+ /** Build a content_hash -> nectar index after validation passes (AC-6, last-writer-wins presence check). */
32
+ export declare function buildContentHashIndex(doc: PortableProjection): ReadonlyMap<string, {
33
+ nectar: string;
34
+ entry: ProjectionFileEntry;
35
+ }>;
36
+ /**
37
+ * Build a `content_hash -> nectar[]` multi-index (PRD-018i / NEC-037 AC-018i.9):
38
+ * every projection entry sharing a content hash is retained, in file-declaration
39
+ * order, so duplicate-content files each keep their own nectar on inherit instead
40
+ * of collapsing onto one (the last-writer-wins {@link buildContentHashIndex} is
41
+ * kept for the presence-only precheck).
42
+ */
43
+ export declare function buildContentHashMultiIndex(doc: PortableProjection): ReadonlyMap<string, {
44
+ nectar: string;
45
+ entry: ProjectionFileEntry;
46
+ }[]>;
47
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/projection/load.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAIL,KAAK,kBAAkB,EAEvB,KAAK,mBAAmB,EAEzB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAAoB,CAAC;AAK3D,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,CAAC;AAE5B,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAwFvF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,GAAG,oBAAoB,CA+DlG;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,6BAA6B,GAClC,oBAAoB,CA0CtB;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,OAAO,GACf,oBAAoB,CAEtB;AAED,4GAA4G;AAC5G,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,GACtB,WAAW,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAMrE;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,kBAAkB,GACtB,WAAW,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,EAAE,CAAC,CAQvE"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Projection validation on load (PRD-011b).
3
+ *
4
+ * A projection that fails any check is ignored with a typed reason; it is never
5
+ * partially loaded and this module never throws on validation failure (AC-4,
6
+ * AC-5).
7
+ *
8
+ * `.honeycomb/nectars.json` is a committed file that travels with a cloned repo,
9
+ * so it must be treated as untrusted input: {@link loadProjectionFromFile} rejects
10
+ * a file over {@link MAX_PROJECTION_FILE_BYTES} before it is ever read into memory
11
+ * (CWE-400), and the parser below rejects the whole document (fail-closed, never
12
+ * a partial parse) the moment a `files`/`derived` key would hijack the
13
+ * destination object's own prototype (`__proto__`, `constructor`, `prototype`) -
14
+ * these keys never reach a bare `obj[key] = value` assignment.
15
+ */
16
+ import { readFileSync, statSync } from "node:fs";
17
+ import { isValidNectar } from "../hive-graph/ulid.js";
18
+ import { PROJECTION_SCHEMA_VERSION, isValidContentHash, parseProjectionJson, } from "./format.js";
19
+ /**
20
+ * Defensive ceiling on `.honeycomb/nectars.json` before it is read into memory
21
+ * (CWE-400): the file is untrusted (committed content from a cloned repo), and
22
+ * nothing about the projection format needs to exceed this to hold a legitimate
23
+ * per-file description index for even a very large monorepo.
24
+ */
25
+ export const MAX_PROJECTION_FILE_BYTES = 100 * 1024 * 1024;
26
+ /** Keys that would hijack a plain object's own prototype via `obj[key] = value` (CWE-1321). */
27
+ const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
28
+ function isRecord(v) {
29
+ return typeof v === "object" && v !== null && !Array.isArray(v);
30
+ }
31
+ function isString(v) {
32
+ return typeof v === "string";
33
+ }
34
+ function isStringArray(v) {
35
+ return Array.isArray(v) && v.every((x) => typeof x === "string");
36
+ }
37
+ function parseProject(raw) {
38
+ if (!isRecord(raw))
39
+ return null;
40
+ if (!isString(raw.org_id) || !isString(raw.workspace_id) || !isString(raw.project_id))
41
+ return null;
42
+ return { org_id: raw.org_id, workspace_id: raw.workspace_id, project_id: raw.project_id };
43
+ }
44
+ function parseFileEntry(raw) {
45
+ if (!isRecord(raw))
46
+ return null;
47
+ if (!isString(raw.content_hash) || !isString(raw.path))
48
+ return null;
49
+ if (!isString(raw.title) || !isString(raw.description))
50
+ return null;
51
+ if (!isStringArray(raw.concepts))
52
+ return null;
53
+ if (!isString(raw.describe_model) || !isString(raw.described_at))
54
+ return null;
55
+ return {
56
+ content_hash: raw.content_hash,
57
+ path: raw.path,
58
+ title: raw.title,
59
+ description: raw.description,
60
+ concepts: raw.concepts,
61
+ describe_model: raw.describe_model,
62
+ described_at: raw.described_at,
63
+ };
64
+ }
65
+ function parseDerivedEntry(raw) {
66
+ if (!isRecord(raw))
67
+ return null;
68
+ if (!isString(raw.from_nectar) || !isString(raw.fork_content_hash))
69
+ return null;
70
+ return { from_nectar: raw.from_nectar, fork_content_hash: raw.fork_content_hash };
71
+ }
72
+ function parsePortableProjection(raw) {
73
+ if (!isRecord(raw))
74
+ return null;
75
+ if (typeof raw.version !== "number")
76
+ return null;
77
+ if (!isString(raw.generated_at) || !isString(raw.generator))
78
+ return null;
79
+ const project = parseProject(raw.project);
80
+ if (project === null)
81
+ return null;
82
+ if (!isRecord(raw.files) || !isRecord(raw.derived))
83
+ return null;
84
+ const files = {};
85
+ for (const [nectar, entryRaw] of Object.entries(raw.files)) {
86
+ // Reject the whole document rather than skip: a `__proto__`/`constructor`/`prototype`
87
+ // key would hijack `files`'s own prototype via the assignment below rather than
88
+ // becoming an inert own property, and a silent skip would be a partial load (AC-5).
89
+ if (DANGEROUS_KEYS.has(nectar))
90
+ return null;
91
+ const entry = parseFileEntry(entryRaw);
92
+ if (entry === null)
93
+ return null;
94
+ files[nectar] = entry;
95
+ }
96
+ const derived = {};
97
+ for (const [nectar, entryRaw] of Object.entries(raw.derived)) {
98
+ if (DANGEROUS_KEYS.has(nectar))
99
+ return null;
100
+ const entry = parseDerivedEntry(entryRaw);
101
+ if (entry === null)
102
+ return null;
103
+ derived[nectar] = entry;
104
+ }
105
+ return {
106
+ version: raw.version,
107
+ generated_at: raw.generated_at,
108
+ generator: raw.generator,
109
+ project,
110
+ files,
111
+ derived,
112
+ };
113
+ }
114
+ function tenancyMatchesProject(tenancy, project) {
115
+ return (tenancy.orgId === project.org_id &&
116
+ tenancy.workspaceId === project.workspace_id &&
117
+ tenancy.projectId === project.project_id);
118
+ }
119
+ /**
120
+ * Validate a parsed projection against the current tenancy. All checks are a
121
+ * single gate: any failure rejects the whole document (AC-5).
122
+ */
123
+ export function validateProjection(doc, tenancy) {
124
+ if (doc.version > PROJECTION_SCHEMA_VERSION) {
125
+ return {
126
+ ok: false,
127
+ reason: "future_version",
128
+ detail: `projection version ${doc.version} exceeds daemon schema ${PROJECTION_SCHEMA_VERSION}`,
129
+ };
130
+ }
131
+ if (!tenancyMatchesProject(tenancy, doc.project)) {
132
+ return {
133
+ ok: false,
134
+ reason: "project_mismatch",
135
+ detail: "projection project triple does not match current context",
136
+ };
137
+ }
138
+ for (const nectar of Object.keys(doc.files)) {
139
+ if (!isValidNectar(nectar)) {
140
+ return {
141
+ ok: false,
142
+ reason: "invalid_nectar_key",
143
+ detail: `invalid nectar key in files: ${nectar}`,
144
+ };
145
+ }
146
+ const entry = doc.files[nectar];
147
+ if (entry === undefined)
148
+ continue;
149
+ if (!isValidContentHash(entry.content_hash)) {
150
+ return {
151
+ ok: false,
152
+ reason: "invalid_content_hash",
153
+ detail: `invalid content_hash for nectar ${nectar}`,
154
+ };
155
+ }
156
+ }
157
+ for (const nectar of Object.keys(doc.derived)) {
158
+ if (!isValidNectar(nectar)) {
159
+ return {
160
+ ok: false,
161
+ reason: "invalid_nectar_key",
162
+ detail: `invalid nectar key in derived: ${nectar}`,
163
+ };
164
+ }
165
+ const entry = doc.derived[nectar];
166
+ if (entry === undefined)
167
+ continue;
168
+ if (!isValidNectar(entry.from_nectar)) {
169
+ return {
170
+ ok: false,
171
+ reason: "invalid_nectar_key",
172
+ detail: `invalid from_nectar in derived[${nectar}]`,
173
+ };
174
+ }
175
+ if (!isValidContentHash(entry.fork_content_hash)) {
176
+ return {
177
+ ok: false,
178
+ reason: "invalid_content_hash",
179
+ detail: `invalid fork_content_hash in derived[${nectar}]`,
180
+ };
181
+ }
182
+ }
183
+ return { ok: true, doc };
184
+ }
185
+ /** Read and validate a projection file. Never throws on validation failure. */
186
+ export function loadProjectionFromFile(filePath, opts) {
187
+ try {
188
+ const stat = statSync(filePath);
189
+ if (stat.size > MAX_PROJECTION_FILE_BYTES) {
190
+ return {
191
+ ok: false,
192
+ reason: "file_too_large",
193
+ detail: `projection file exceeds ${MAX_PROJECTION_FILE_BYTES} bytes (${stat.size}): ${filePath}`,
194
+ };
195
+ }
196
+ }
197
+ catch (err) {
198
+ const code = err.code;
199
+ if (code === "ENOENT") {
200
+ return { ok: false, reason: "file_missing", detail: `projection not found: ${filePath}` };
201
+ }
202
+ throw err;
203
+ }
204
+ let text;
205
+ try {
206
+ text = readFileSync(filePath, "utf8");
207
+ }
208
+ catch (err) {
209
+ const code = err.code;
210
+ if (code === "ENOENT") {
211
+ return { ok: false, reason: "file_missing", detail: `projection not found: ${filePath}` };
212
+ }
213
+ throw err;
214
+ }
215
+ let parsed;
216
+ try {
217
+ parsed = parseProjectionJson(text);
218
+ }
219
+ catch {
220
+ return { ok: false, reason: "invalid_json", detail: "projection file is not valid JSON" };
221
+ }
222
+ const doc = parsePortableProjection(parsed);
223
+ if (doc === null) {
224
+ return { ok: false, reason: "invalid_shape", detail: "projection JSON does not match the expected shape" };
225
+ }
226
+ return validateProjection(doc, opts.tenancy);
227
+ }
228
+ /** Validate an in-memory projection document (for tests and daemon boot). */
229
+ export function loadProjection(doc, tenancy) {
230
+ return validateProjection(doc, tenancy);
231
+ }
232
+ /** Build a content_hash -> nectar index after validation passes (AC-6, last-writer-wins presence check). */
233
+ export function buildContentHashIndex(doc) {
234
+ const index = new Map();
235
+ for (const [nectar, entry] of Object.entries(doc.files)) {
236
+ index.set(entry.content_hash, { nectar, entry });
237
+ }
238
+ return index;
239
+ }
240
+ /**
241
+ * Build a `content_hash -> nectar[]` multi-index (PRD-018i / NEC-037 AC-018i.9):
242
+ * every projection entry sharing a content hash is retained, in file-declaration
243
+ * order, so duplicate-content files each keep their own nectar on inherit instead
244
+ * of collapsing onto one (the last-writer-wins {@link buildContentHashIndex} is
245
+ * kept for the presence-only precheck).
246
+ */
247
+ export function buildContentHashMultiIndex(doc) {
248
+ const index = new Map();
249
+ for (const [nectar, entry] of Object.entries(doc.files)) {
250
+ const list = index.get(entry.content_hash);
251
+ if (list === undefined)
252
+ index.set(entry.content_hash, [{ nectar, entry }]);
253
+ else
254
+ list.push({ nectar, entry });
255
+ }
256
+ return index;
257
+ }
258
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/projection/load.ts"],"names":[],"mappings":"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"}