oh-my-second-brain 0.2.0 → 0.6.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 (494) hide show
  1. package/.claude-plugin/marketplace.json +41 -0
  2. package/{adapters/claude-code/.claude-plugin → .claude-plugin}/plugin.json +7 -8
  3. package/{adapters/codex/.codex-plugin → .codex-plugin}/plugin.json +4 -4
  4. package/ACKNOWLEDGMENTS.md +162 -0
  5. package/CHANGELOG-assets.md +23 -0
  6. package/CHANGELOG-cli.md +24 -0
  7. package/CHANGELOG-kernel.md +48 -0
  8. package/CHANGELOG-mcp.md +36 -0
  9. package/CHANGELOG-vendors.md +26 -0
  10. package/CHANGELOG.md +51 -7
  11. package/README.ko.md +2 -2
  12. package/README.md +16 -16
  13. package/{adapters/claude-code → assets/claude}/CLAUDE.md +4 -4
  14. package/{adapters → assets}/codex/AGENTS.md +3 -3
  15. package/{adapters → assets}/codex/rules/oms.md +5 -5
  16. package/{adapters → assets}/hermes/README.md +1 -1
  17. package/{adapters → assets}/hermes/SOUL.md +3 -3
  18. package/{adapters/hermes/manifest.json → assets/hermes-manifest.json} +3 -4
  19. package/assets/skills/distill/SKILL.md +20 -0
  20. package/assets/skills/doctor/SKILL.md +23 -0
  21. package/assets/skills/link/SKILL.md +24 -0
  22. package/assets/skills/search/SKILL.md +25 -0
  23. package/assets/skills/status/SKILL.md +22 -0
  24. package/assets/skills/write/SKILL.md +30 -0
  25. package/core/ontology/schemas/README.md +20 -14
  26. package/dist/assets/shared-skills.d.ts +4 -0
  27. package/dist/assets/shared-skills.js +8 -0
  28. package/dist/assets/shared-skills.js.map +1 -0
  29. package/dist/cli/args.d.ts +3 -1
  30. package/dist/cli/args.js +14 -1
  31. package/dist/cli/args.js.map +1 -1
  32. package/dist/cli/audit.js +3 -3
  33. package/dist/cli/audit.js.map +1 -1
  34. package/dist/cli/claude-install-plan.js +2 -2
  35. package/dist/cli/claude-install-plan.js.map +1 -1
  36. package/dist/cli/doctor-lint.js +8 -8
  37. package/dist/cli/doctor-lint.js.map +1 -1
  38. package/dist/cli/global-writeback.js +1 -1
  39. package/dist/cli/global-writeback.js.map +1 -1
  40. package/dist/cli/host-commands.d.ts +1 -1
  41. package/dist/cli/host-commands.js +24 -5
  42. package/dist/cli/host-commands.js.map +1 -1
  43. package/dist/cli/link-command.d.ts +1 -1
  44. package/dist/cli/link-command.js +2 -2
  45. package/dist/cli/link-command.js.map +1 -1
  46. package/dist/cli/linkify.js +16 -71
  47. package/dist/cli/linkify.js.map +1 -1
  48. package/dist/cli/oms.d.ts +1 -1
  49. package/dist/cli/oms.js +45 -11
  50. package/dist/cli/oms.js.map +1 -1
  51. package/dist/cli/semantic-args.d.ts +1 -1
  52. package/dist/cli/semantic-args.js +102 -3
  53. package/dist/cli/semantic-args.js.map +1 -1
  54. package/dist/cli/semantic-http.js +3 -3
  55. package/dist/cli/semantic-http.js.map +1 -1
  56. package/dist/cli/semantic-usage.js +1 -1
  57. package/dist/cli/semantic-usage.js.map +1 -1
  58. package/dist/cli/semantic.js +31 -12
  59. package/dist/cli/semantic.js.map +1 -1
  60. package/dist/cli/setup-command.d.ts +17 -0
  61. package/dist/cli/setup-command.js +89 -145
  62. package/dist/cli/setup-command.js.map +1 -1
  63. package/dist/cli/update-notice.d.ts +1 -1
  64. package/dist/cli/update-notice.js +2 -2
  65. package/dist/cli/update-notice.js.map +1 -1
  66. package/dist/cli/usage.d.ts +1 -1
  67. package/dist/cli/usage.js +2 -2
  68. package/dist/cli/usage.js.map +1 -1
  69. package/dist/{capture → kernel/capture}/safe.d.ts +11 -1
  70. package/dist/{capture → kernel/capture}/safe.js +3 -3
  71. package/dist/kernel/capture/safe.js.map +1 -0
  72. package/dist/kernel/contracts/index.d.ts +144 -0
  73. package/dist/kernel/contracts/index.js +401 -0
  74. package/dist/kernel/contracts/index.js.map +1 -0
  75. package/dist/kernel/conventions/frontmatter.js.map +1 -0
  76. package/dist/kernel/conventions/lint.js.map +1 -0
  77. package/dist/kernel/conventions/report.js.map +1 -0
  78. package/dist/{conventions → kernel/conventions}/validate.d.ts +1 -1
  79. package/dist/kernel/conventions/validate.js.map +1 -0
  80. package/dist/kernel/conventions/vault-walk.js.map +1 -0
  81. package/dist/{conventions → kernel/conventions}/write-contract.d.ts +1 -1
  82. package/dist/kernel/conventions/write-contract.js.map +1 -0
  83. package/dist/kernel/conventions/write-protocol.js.map +1 -0
  84. package/dist/kernel/doctor/service.d.ts +71 -0
  85. package/dist/kernel/doctor/service.js +70 -0
  86. package/dist/kernel/doctor/service.js.map +1 -0
  87. package/dist/{engine → kernel/engine}/assemble.d.ts +46 -1
  88. package/dist/kernel/engine/assemble.js +483 -0
  89. package/dist/kernel/engine/assemble.js.map +1 -0
  90. package/dist/kernel/engine/axes/store.d.ts +90 -0
  91. package/dist/kernel/engine/axes/store.js +400 -0
  92. package/dist/kernel/engine/axes/store.js.map +1 -0
  93. package/dist/{engine → kernel/engine}/conventions/vault-lint.d.ts +1 -1
  94. package/dist/{engine → kernel/engine}/conventions/vault-lint.js +1 -1
  95. package/dist/kernel/engine/conventions/vault-lint.js.map +1 -0
  96. package/dist/kernel/engine/embed/chunker.js.map +1 -0
  97. package/dist/kernel/engine/embed/deferred.js.map +1 -0
  98. package/dist/{engine → kernel/engine}/embed/hash-stub.test-helper.d.ts +1 -1
  99. package/dist/{engine → kernel/engine}/embed/hash-stub.test-helper.js +1 -1
  100. package/dist/kernel/engine/embed/hash-stub.test-helper.js.map +1 -0
  101. package/dist/kernel/engine/embed/identity.d.ts +21 -0
  102. package/dist/kernel/engine/embed/identity.js +47 -0
  103. package/dist/kernel/engine/embed/identity.js.map +1 -0
  104. package/dist/kernel/engine/embed/model.d.ts +134 -0
  105. package/dist/kernel/engine/embed/model.js +302 -0
  106. package/dist/kernel/engine/embed/model.js.map +1 -0
  107. package/dist/{engine → kernel/engine}/embed/provider.d.ts +36 -5
  108. package/dist/kernel/engine/embed/provider.js +403 -0
  109. package/dist/kernel/engine/embed/provider.js.map +1 -0
  110. package/dist/{engine → kernel/engine}/embed/store.d.ts +13 -1
  111. package/dist/kernel/engine/embed/store.js +730 -0
  112. package/dist/kernel/engine/embed/store.js.map +1 -0
  113. package/dist/kernel/engine/embed/sync.d.ts +100 -0
  114. package/dist/kernel/engine/embed/sync.js +753 -0
  115. package/dist/kernel/engine/embed/sync.js.map +1 -0
  116. package/dist/{engine → kernel/engine}/graph/builder.d.ts +9 -5
  117. package/dist/{engine → kernel/engine}/graph/builder.js +213 -79
  118. package/dist/kernel/engine/graph/builder.js.map +1 -0
  119. package/dist/kernel/engine/graph/explore.js.map +1 -0
  120. package/dist/{engine → kernel/engine}/graph/node.d.ts +49 -1
  121. package/dist/kernel/engine/graph/node.js +315 -0
  122. package/dist/kernel/engine/graph/node.js.map +1 -0
  123. package/dist/kernel/engine/graph/resolver.js.map +1 -0
  124. package/dist/kernel/engine/graph/traverse.js.map +1 -0
  125. package/dist/kernel/engine/linkify/apply.js.map +1 -0
  126. package/dist/kernel/engine/linkify/josa.js.map +1 -0
  127. package/dist/kernel/engine/linkify/mask.js.map +1 -0
  128. package/dist/kernel/engine/linkify/suggest.js.map +1 -0
  129. package/dist/kernel/engine/linkify/types.js.map +1 -0
  130. package/dist/{engine → kernel/engine}/mcp/facade.d.ts +27 -1
  131. package/dist/kernel/engine/mcp/facade.js +1144 -0
  132. package/dist/kernel/engine/mcp/facade.js.map +1 -0
  133. package/dist/kernel/engine/mcp/op-mappers.js.map +1 -0
  134. package/dist/{engine → kernel/engine}/mcp/query-mapper.d.ts +27 -2
  135. package/dist/kernel/engine/mcp/query-mapper.js +247 -0
  136. package/dist/kernel/engine/mcp/query-mapper.js.map +1 -0
  137. package/dist/{engine → kernel/engine}/mcp/types.d.ts +69 -2
  138. package/dist/kernel/engine/mcp/types.js.map +1 -0
  139. package/dist/{engine → kernel/engine}/retrieval/dispatcher.d.ts +23 -1
  140. package/dist/{engine → kernel/engine}/retrieval/dispatcher.js +92 -14
  141. package/dist/kernel/engine/retrieval/dispatcher.js.map +1 -0
  142. package/dist/{engine → kernel/engine}/retrieval/index.d.ts +4 -1
  143. package/dist/{engine → kernel/engine}/retrieval/index.js +6 -3
  144. package/dist/kernel/engine/retrieval/index.js.map +1 -0
  145. package/dist/kernel/engine/retrieval/reranker.d.ts +124 -0
  146. package/dist/kernel/engine/retrieval/reranker.js +204 -0
  147. package/dist/kernel/engine/retrieval/reranker.js.map +1 -0
  148. package/dist/{engine → kernel/engine}/retrieval/rrf.d.ts +10 -2
  149. package/dist/kernel/engine/retrieval/rrf.js +77 -0
  150. package/dist/kernel/engine/retrieval/rrf.js.map +1 -0
  151. package/dist/{engine → kernel/engine}/tracer.d.ts +13 -0
  152. package/dist/{engine → kernel/engine}/tracer.js +63 -6
  153. package/dist/kernel/engine/tracer.js.map +1 -0
  154. package/dist/{engine → kernel/engine}/types.d.ts +4 -4
  155. package/dist/kernel/engine/types.js.map +1 -0
  156. package/dist/{graph → kernel/graph}/cache.d.ts +1 -1
  157. package/dist/{graph → kernel/graph}/cache.js +165 -21
  158. package/dist/kernel/graph/cache.js.map +1 -0
  159. package/dist/kernel/graph/explore.js.map +1 -0
  160. package/dist/{harness → kernel/harness}/surface-registry.d.ts +0 -1
  161. package/dist/kernel/harness/surface-registry.js +170 -0
  162. package/dist/kernel/harness/surface-registry.js.map +1 -0
  163. package/dist/{harness → kernel/harness}/validation.js +67 -4
  164. package/dist/kernel/harness/validation.js.map +1 -0
  165. package/dist/kernel/index.d.ts +13 -0
  166. package/dist/kernel/index.js +14 -0
  167. package/dist/kernel/index.js.map +1 -0
  168. package/dist/{install → kernel/install}/adapter-source.d.ts +10 -1
  169. package/dist/kernel/install/adapter-source.js +76 -0
  170. package/dist/kernel/install/adapter-source.js.map +1 -0
  171. package/dist/kernel/install/common.js.map +1 -0
  172. package/dist/{install → kernel/install}/hosts.d.ts +3 -3
  173. package/dist/{install → kernel/install}/hosts.js +3 -22
  174. package/dist/kernel/install/hosts.js.map +1 -0
  175. package/dist/{core/ontology → kernel/install}/types.js.map +1 -1
  176. package/dist/{link → kernel/link}/convention-note.js +2 -2
  177. package/dist/kernel/link/convention-note.js.map +1 -0
  178. package/dist/kernel/link/global-config.js.map +1 -0
  179. package/dist/kernel/link/link.js.map +1 -0
  180. package/dist/kernel/link/workflow.d.ts +55 -0
  181. package/dist/kernel/link/workflow.js +107 -0
  182. package/dist/kernel/link/workflow.js.map +1 -0
  183. package/dist/kernel/measurement/no-default-contract.d.ts +17 -0
  184. package/dist/kernel/measurement/no-default-contract.js +84 -0
  185. package/dist/kernel/measurement/no-default-contract.js.map +1 -0
  186. package/dist/{ontology → kernel/ontology}/active.d.ts +1 -1
  187. package/dist/{ontology → kernel/ontology}/active.js +2 -2
  188. package/dist/kernel/ontology/active.js.map +1 -0
  189. package/dist/kernel/ontology/loader.js.map +1 -0
  190. package/dist/kernel/ontology/resolver.js.map +1 -0
  191. package/dist/{install → kernel/ontology}/types.js.map +1 -1
  192. package/dist/kernel/plugin/index.d.ts +1 -0
  193. package/dist/kernel/plugin/index.js +2 -0
  194. package/dist/kernel/plugin/index.js.map +1 -0
  195. package/dist/{core → kernel}/runtime/assets.d.ts +2 -4
  196. package/dist/{core → kernel}/runtime/assets.js +1 -3
  197. package/dist/kernel/runtime/assets.js.map +1 -0
  198. package/dist/kernel/search/morning-test-fixtures.js.map +1 -0
  199. package/dist/{retrieve → kernel/search}/morning.d.ts +0 -1
  200. package/dist/kernel/search/morning.js.map +1 -0
  201. package/dist/kernel/search/semantic-contract.js.map +1 -0
  202. package/dist/kernel/searchbackend/engine-search-backend.d.ts +28 -0
  203. package/dist/kernel/searchbackend/engine-search-backend.js +153 -0
  204. package/dist/kernel/searchbackend/engine-search-backend.js.map +1 -0
  205. package/dist/kernel/searchbackend/index.d.ts +2 -0
  206. package/dist/kernel/searchbackend/index.js +2 -0
  207. package/dist/kernel/searchbackend/index.js.map +1 -0
  208. package/dist/kernel/searchbackend/search-backend.d.ts +57 -0
  209. package/dist/kernel/searchbackend/search-backend.js +110 -0
  210. package/dist/kernel/searchbackend/search-backend.js.map +1 -0
  211. package/dist/{mcp → kernel/semantic}/semantic-engine.d.ts +3 -2
  212. package/dist/kernel/semantic/semantic-engine.js +78 -0
  213. package/dist/kernel/semantic/semantic-engine.js.map +1 -0
  214. package/dist/{mcp → kernel/semantic}/semantic-retrieve-args.d.ts +20 -3
  215. package/dist/{mcp → kernel/semantic}/semantic-retrieve-args.js +81 -15
  216. package/dist/kernel/semantic/semantic-retrieve-args.js.map +1 -0
  217. package/dist/{mcp → kernel/semantic}/semantic-retrieve-schema.d.ts +0 -24
  218. package/dist/{mcp → kernel/semantic}/semantic-retrieve-schema.js +0 -8
  219. package/dist/kernel/semantic/semantic-retrieve-schema.js.map +1 -0
  220. package/dist/{mcp → kernel/semantic}/semantic-retrieve.js +5 -9
  221. package/dist/kernel/semantic/semantic-retrieve.js.map +1 -0
  222. package/dist/kernel/semantic/semantic-schemas.js.map +1 -0
  223. package/dist/{mcp → kernel/semantic}/semantic-tool-schemas.js +0 -28
  224. package/dist/kernel/semantic/semantic-tool-schemas.js.map +1 -0
  225. package/dist/{setup → kernel/setup}/axis.d.ts +1 -1
  226. package/dist/{setup → kernel/setup}/axis.js +1 -1
  227. package/dist/kernel/setup/axis.js.map +1 -0
  228. package/dist/{cli/setup-documents.d.ts → kernel/setup/documents.d.ts} +1 -1
  229. package/dist/{cli/setup-documents.js → kernel/setup/documents.js} +15 -49
  230. package/dist/kernel/setup/documents.js.map +1 -0
  231. package/dist/kernel/setup/service.d.ts +44 -0
  232. package/dist/kernel/setup/service.js +97 -0
  233. package/dist/kernel/setup/service.js.map +1 -0
  234. package/dist/{update → kernel/update}/update.d.ts +7 -0
  235. package/dist/{update → kernel/update}/update.js +106 -8
  236. package/dist/kernel/update/update.js.map +1 -0
  237. package/dist/mcp/engine-morning-backend.d.ts +4 -4
  238. package/dist/mcp/engine-morning-backend.js +4 -18
  239. package/dist/mcp/engine-morning-backend.js.map +1 -1
  240. package/dist/mcp/link-tools.d.ts +9 -56
  241. package/dist/mcp/link-tools.js +5 -129
  242. package/dist/mcp/link-tools.js.map +1 -1
  243. package/dist/mcp/server.d.ts +9 -2
  244. package/dist/mcp/server.js +373 -324
  245. package/dist/mcp/server.js.map +1 -1
  246. package/dist/mcp/update-notice.d.ts +1 -1
  247. package/dist/mcp/update-notice.js +1 -1
  248. package/dist/mcp/update-notice.js.map +1 -1
  249. package/dist/{install → vendors/claude}/claude-hooks.d.ts +1 -1
  250. package/dist/{install → vendors/claude}/claude-hooks.js +1 -1
  251. package/dist/vendors/claude/claude-hooks.js.map +1 -0
  252. package/dist/{install → vendors/claude}/claude-marketplace.d.ts +3 -3
  253. package/dist/{install → vendors/claude}/claude-marketplace.js +6 -9
  254. package/dist/vendors/claude/claude-marketplace.js.map +1 -0
  255. package/dist/{install → vendors/claude}/claude.d.ts +2 -2
  256. package/dist/{install → vendors/claude}/claude.js +2 -2
  257. package/dist/vendors/claude/claude.js.map +1 -0
  258. package/dist/{hook → vendors/claude/hook}/post-tool-use.js +5 -5
  259. package/dist/vendors/claude/hook/post-tool-use.js.map +1 -0
  260. package/dist/vendors/claude/hook/pre-tool-use.js.map +1 -0
  261. package/dist/vendors/claude/hook/stdin.js.map +1 -0
  262. package/dist/vendors/codex/codex.d.ts +10 -0
  263. package/dist/{install → vendors/codex}/codex.js +19 -37
  264. package/dist/vendors/codex/codex.js.map +1 -0
  265. package/dist/{install → vendors/hermes}/hermes.d.ts +2 -2
  266. package/dist/{install → vendors/hermes}/hermes.js +15 -7
  267. package/dist/vendors/hermes/hermes.js.map +1 -0
  268. package/docs/adapters.md +15 -0
  269. package/docs/install.md +10 -11
  270. package/package.json +23 -10
  271. package/adapters/README.md +0 -99
  272. package/adapters/claude-code/skills/compile/SKILL.md +0 -27
  273. package/adapters/claude-code/skills/define/SKILL.md +0 -51
  274. package/adapters/claude-code/skills/distill/SKILL.md +0 -28
  275. package/adapters/claude-code/skills/doctor/SKILL.md +0 -58
  276. package/adapters/claude-code/skills/link/SKILL.md +0 -87
  277. package/adapters/claude-code/skills/retrieve/SKILL.md +0 -99
  278. package/adapters/claude-code/skills/setup/SKILL.md +0 -78
  279. package/adapters/claude-code/skills/uninstall/SKILL.md +0 -34
  280. package/adapters/claude-code/skills/update/SKILL.md +0 -45
  281. package/adapters/claude-code/skills/vault-decision-record/SKILL.md +0 -52
  282. package/adapters/claude-code/skills/vault-lint/SKILL.md +0 -47
  283. package/adapters/claude-code/skills/vault-scaffold/SKILL.md +0 -47
  284. package/adapters/claude-code/skills/wiki/SKILL.md +0 -82
  285. package/adapters/claude-code/skills/write/SKILL.md +0 -16
  286. package/adapters/codex/skills/oms-compile/SKILL.md +0 -16
  287. package/adapters/codex/skills/oms-distill/SKILL.md +0 -14
  288. package/adapters/codex/skills/oms-doctor/SKILL.md +0 -14
  289. package/adapters/codex/skills/oms-install/SKILL.md +0 -19
  290. package/adapters/codex/skills/oms-link/SKILL.md +0 -35
  291. package/adapters/codex/skills/oms-retrieve/SKILL.md +0 -32
  292. package/adapters/codex/skills/oms-setup/SKILL.md +0 -34
  293. package/adapters/codex/skills/oms-uninstall/SKILL.md +0 -20
  294. package/adapters/codex/skills/oms-update/SKILL.md +0 -22
  295. package/adapters/codex/skills/oms-vault-lint/SKILL.md +0 -19
  296. package/adapters/codex/skills/oms-wiki/SKILL.md +0 -39
  297. package/adapters/codex/skills/oms-write/SKILL.md +0 -10
  298. package/adapters/hermes/skills/compile/SKILL.md +0 -13
  299. package/adapters/hermes/skills/distill/SKILL.md +0 -10
  300. package/adapters/hermes/skills/doctor/SKILL.md +0 -14
  301. package/adapters/hermes/skills/install/SKILL.md +0 -19
  302. package/adapters/hermes/skills/link/SKILL.md +0 -18
  303. package/adapters/hermes/skills/retrieve/SKILL.md +0 -32
  304. package/adapters/hermes/skills/setup/SKILL.md +0 -37
  305. package/adapters/hermes/skills/uninstall/SKILL.md +0 -20
  306. package/adapters/hermes/skills/update/SKILL.md +0 -22
  307. package/adapters/hermes/skills/wiki/SKILL.md +0 -14
  308. package/adapters/hermes/skills/write/SKILL.md +0 -10
  309. package/core/agents/librarian.md +0 -44
  310. package/core/agents/retriever.md +0 -62
  311. package/core/skills/compile/CHANGELOG.md +0 -24
  312. package/core/skills/compile/SKILL.md +0 -57
  313. package/core/skills/define/SKILL.md +0 -59
  314. package/core/skills/distill/CHANGELOG.md +0 -39
  315. package/core/skills/distill/SKILL.md +0 -62
  316. package/core/skills/doctor/SKILL.md +0 -49
  317. package/core/skills/link/SKILL.md +0 -130
  318. package/core/skills/retrieve/SKILL.md +0 -78
  319. package/core/skills/setup/CHANGELOG.md +0 -49
  320. package/core/skills/setup/SKILL.md +0 -246
  321. package/core/skills/uninstall/SKILL.md +0 -34
  322. package/core/skills/vault-decision-record/CHANGELOG.md +0 -24
  323. package/core/skills/vault-decision-record/SKILL.md +0 -93
  324. package/core/skills/vault-lint/CHANGELOG.md +0 -35
  325. package/core/skills/vault-lint/SKILL.md +0 -58
  326. package/core/skills/vault-scaffold/CHANGELOG.md +0 -21
  327. package/core/skills/vault-scaffold/SKILL.md +0 -72
  328. package/core/skills/wiki/CHANGELOG.md +0 -23
  329. package/core/skills/wiki/SKILL.md +0 -159
  330. package/core/skills/write/SKILL.md +0 -15
  331. package/dist/capture/safe.js.map +0 -1
  332. package/dist/cli/setup-documents.js.map +0 -1
  333. package/dist/conventions/frontmatter.js.map +0 -1
  334. package/dist/conventions/lint.js.map +0 -1
  335. package/dist/conventions/report.js.map +0 -1
  336. package/dist/conventions/validate.js.map +0 -1
  337. package/dist/conventions/vault-walk.js.map +0 -1
  338. package/dist/conventions/write-contract.js.map +0 -1
  339. package/dist/conventions/write-protocol.js.map +0 -1
  340. package/dist/core/ontology/loader.js.map +0 -1
  341. package/dist/core/ontology/resolver.js.map +0 -1
  342. package/dist/core/runtime/assets.js.map +0 -1
  343. package/dist/engine/assemble.js +0 -162
  344. package/dist/engine/assemble.js.map +0 -1
  345. package/dist/engine/conventions/vault-lint.js.map +0 -1
  346. package/dist/engine/embed/chunker.js.map +0 -1
  347. package/dist/engine/embed/deferred.js.map +0 -1
  348. package/dist/engine/embed/hash-stub.test-helper.js.map +0 -1
  349. package/dist/engine/embed/identity.d.ts +0 -11
  350. package/dist/engine/embed/identity.js +0 -15
  351. package/dist/engine/embed/identity.js.map +0 -1
  352. package/dist/engine/embed/provider.js +0 -266
  353. package/dist/engine/embed/provider.js.map +0 -1
  354. package/dist/engine/embed/store.js +0 -416
  355. package/dist/engine/embed/store.js.map +0 -1
  356. package/dist/engine/embed/sync.d.ts +0 -45
  357. package/dist/engine/embed/sync.js +0 -321
  358. package/dist/engine/embed/sync.js.map +0 -1
  359. package/dist/engine/graph/builder.js.map +0 -1
  360. package/dist/engine/graph/explore.js.map +0 -1
  361. package/dist/engine/graph/node.js +0 -110
  362. package/dist/engine/graph/node.js.map +0 -1
  363. package/dist/engine/graph/resolver.js.map +0 -1
  364. package/dist/engine/graph/traverse.js.map +0 -1
  365. package/dist/engine/linkify/apply.js.map +0 -1
  366. package/dist/engine/linkify/josa.js.map +0 -1
  367. package/dist/engine/linkify/mask.js.map +0 -1
  368. package/dist/engine/linkify/suggest.js.map +0 -1
  369. package/dist/engine/linkify/types.js.map +0 -1
  370. package/dist/engine/mcp/facade.js +0 -628
  371. package/dist/engine/mcp/facade.js.map +0 -1
  372. package/dist/engine/mcp/op-mappers.js.map +0 -1
  373. package/dist/engine/mcp/query-mapper.js +0 -102
  374. package/dist/engine/mcp/query-mapper.js.map +0 -1
  375. package/dist/engine/mcp/types.js.map +0 -1
  376. package/dist/engine/retrieval/dispatcher.js.map +0 -1
  377. package/dist/engine/retrieval/index.js.map +0 -1
  378. package/dist/engine/retrieval/reranker.d.ts +0 -46
  379. package/dist/engine/retrieval/reranker.js +0 -29
  380. package/dist/engine/retrieval/reranker.js.map +0 -1
  381. package/dist/engine/retrieval/rrf.js +0 -54
  382. package/dist/engine/retrieval/rrf.js.map +0 -1
  383. package/dist/engine/tracer.js.map +0 -1
  384. package/dist/engine/types.js.map +0 -1
  385. package/dist/graph/cache.js.map +0 -1
  386. package/dist/graph/explore.js.map +0 -1
  387. package/dist/harness/surface-registry.js +0 -397
  388. package/dist/harness/surface-registry.js.map +0 -1
  389. package/dist/harness/validation.js.map +0 -1
  390. package/dist/hook/post-tool-use.js.map +0 -1
  391. package/dist/hook/pre-tool-use.js.map +0 -1
  392. package/dist/hook/stdin.js.map +0 -1
  393. package/dist/index.d.ts +0 -12
  394. package/dist/index.js +0 -13
  395. package/dist/index.js.map +0 -1
  396. package/dist/install/adapter-source.js +0 -45
  397. package/dist/install/adapter-source.js.map +0 -1
  398. package/dist/install/claude-hooks.js.map +0 -1
  399. package/dist/install/claude-marketplace.js.map +0 -1
  400. package/dist/install/claude.js.map +0 -1
  401. package/dist/install/codex.d.ts +0 -24
  402. package/dist/install/codex.js.map +0 -1
  403. package/dist/install/common.js.map +0 -1
  404. package/dist/install/hermes.js.map +0 -1
  405. package/dist/install/hosts.js.map +0 -1
  406. package/dist/link/convention-note.js.map +0 -1
  407. package/dist/link/global-config.js.map +0 -1
  408. package/dist/link/link.js.map +0 -1
  409. package/dist/mcp/semantic-engine.js +0 -52
  410. package/dist/mcp/semantic-engine.js.map +0 -1
  411. package/dist/mcp/semantic-retrieve-args.js.map +0 -1
  412. package/dist/mcp/semantic-retrieve-schema.js.map +0 -1
  413. package/dist/mcp/semantic-retrieve.js.map +0 -1
  414. package/dist/mcp/semantic-schemas.js.map +0 -1
  415. package/dist/mcp/semantic-tool-schemas.js.map +0 -1
  416. package/dist/ontology/active.js.map +0 -1
  417. package/dist/retrieve/morning-test-fixtures.js.map +0 -1
  418. package/dist/retrieve/morning.js.map +0 -1
  419. package/dist/retrieve/semantic-contract.js.map +0 -1
  420. package/dist/setup/axis.js.map +0 -1
  421. package/dist/update/update.js.map +0 -1
  422. package/docs/release.md +0 -188
  423. /package/{adapters/codex/.mcp.json → .mcp.codex.json} +0 -0
  424. /package/{adapters/claude-code/.mcp.json → .mcp.json} +0 -0
  425. /package/{adapters/claude-code → assets/claude}/hooks/oms-guard.mjs +0 -0
  426. /package/{adapters/claude-code → assets/claude}/hooks/oms-post-guard.mjs +0 -0
  427. /package/dist/{conventions → kernel/conventions}/frontmatter.d.ts +0 -0
  428. /package/dist/{conventions → kernel/conventions}/frontmatter.js +0 -0
  429. /package/dist/{conventions → kernel/conventions}/lint.d.ts +0 -0
  430. /package/dist/{conventions → kernel/conventions}/lint.js +0 -0
  431. /package/dist/{conventions → kernel/conventions}/report.d.ts +0 -0
  432. /package/dist/{conventions → kernel/conventions}/report.js +0 -0
  433. /package/dist/{conventions → kernel/conventions}/validate.js +0 -0
  434. /package/dist/{conventions → kernel/conventions}/vault-walk.d.ts +0 -0
  435. /package/dist/{conventions → kernel/conventions}/vault-walk.js +0 -0
  436. /package/dist/{conventions → kernel/conventions}/write-contract.js +0 -0
  437. /package/dist/{conventions → kernel/conventions}/write-protocol.d.ts +0 -0
  438. /package/dist/{conventions → kernel/conventions}/write-protocol.js +0 -0
  439. /package/dist/{engine → kernel/engine}/embed/chunker.d.ts +0 -0
  440. /package/dist/{engine → kernel/engine}/embed/chunker.js +0 -0
  441. /package/dist/{engine → kernel/engine}/embed/deferred.d.ts +0 -0
  442. /package/dist/{engine → kernel/engine}/embed/deferred.js +0 -0
  443. /package/dist/{engine → kernel/engine}/graph/explore.d.ts +0 -0
  444. /package/dist/{engine → kernel/engine}/graph/explore.js +0 -0
  445. /package/dist/{engine → kernel/engine}/graph/resolver.d.ts +0 -0
  446. /package/dist/{engine → kernel/engine}/graph/resolver.js +0 -0
  447. /package/dist/{engine → kernel/engine}/graph/traverse.d.ts +0 -0
  448. /package/dist/{engine → kernel/engine}/graph/traverse.js +0 -0
  449. /package/dist/{engine → kernel/engine}/linkify/apply.d.ts +0 -0
  450. /package/dist/{engine → kernel/engine}/linkify/apply.js +0 -0
  451. /package/dist/{engine → kernel/engine}/linkify/josa.d.ts +0 -0
  452. /package/dist/{engine → kernel/engine}/linkify/josa.js +0 -0
  453. /package/dist/{engine → kernel/engine}/linkify/mask.d.ts +0 -0
  454. /package/dist/{engine → kernel/engine}/linkify/mask.js +0 -0
  455. /package/dist/{engine → kernel/engine}/linkify/suggest.d.ts +0 -0
  456. /package/dist/{engine → kernel/engine}/linkify/suggest.js +0 -0
  457. /package/dist/{engine → kernel/engine}/linkify/types.d.ts +0 -0
  458. /package/dist/{engine → kernel/engine}/linkify/types.js +0 -0
  459. /package/dist/{engine → kernel/engine}/mcp/op-mappers.d.ts +0 -0
  460. /package/dist/{engine → kernel/engine}/mcp/op-mappers.js +0 -0
  461. /package/dist/{engine → kernel/engine}/mcp/types.js +0 -0
  462. /package/dist/{engine → kernel/engine}/types.js +0 -0
  463. /package/dist/{graph → kernel/graph}/explore.d.ts +0 -0
  464. /package/dist/{graph → kernel/graph}/explore.js +0 -0
  465. /package/dist/{harness → kernel/harness}/validation.d.ts +0 -0
  466. /package/dist/{install → kernel/install}/common.d.ts +0 -0
  467. /package/dist/{install → kernel/install}/common.js +0 -0
  468. /package/dist/{install → kernel/install}/types.d.ts +0 -0
  469. /package/dist/{core/ontology → kernel/install}/types.js +0 -0
  470. /package/dist/{link → kernel/link}/convention-note.d.ts +0 -0
  471. /package/dist/{link → kernel/link}/global-config.d.ts +0 -0
  472. /package/dist/{link → kernel/link}/global-config.js +0 -0
  473. /package/dist/{link → kernel/link}/link.d.ts +0 -0
  474. /package/dist/{link → kernel/link}/link.js +0 -0
  475. /package/dist/{core → kernel}/ontology/loader.d.ts +0 -0
  476. /package/dist/{core → kernel}/ontology/loader.js +0 -0
  477. /package/dist/{core → kernel}/ontology/resolver.d.ts +0 -0
  478. /package/dist/{core → kernel}/ontology/resolver.js +0 -0
  479. /package/dist/{core → kernel}/ontology/types.d.ts +0 -0
  480. /package/dist/{install → kernel/ontology}/types.js +0 -0
  481. /package/dist/{retrieve → kernel/search}/morning-test-fixtures.d.ts +0 -0
  482. /package/dist/{retrieve → kernel/search}/morning-test-fixtures.js +0 -0
  483. /package/dist/{retrieve → kernel/search}/morning.js +0 -0
  484. /package/dist/{retrieve → kernel/search}/semantic-contract.d.ts +0 -0
  485. /package/dist/{retrieve → kernel/search}/semantic-contract.js +0 -0
  486. /package/dist/{mcp → kernel/semantic}/semantic-retrieve.d.ts +0 -0
  487. /package/dist/{mcp → kernel/semantic}/semantic-schemas.d.ts +0 -0
  488. /package/dist/{mcp → kernel/semantic}/semantic-schemas.js +0 -0
  489. /package/dist/{mcp → kernel/semantic}/semantic-tool-schemas.d.ts +0 -0
  490. /package/dist/{hook → vendors/claude/hook}/post-tool-use.d.ts +0 -0
  491. /package/dist/{hook → vendors/claude/hook}/pre-tool-use.d.ts +0 -0
  492. /package/dist/{hook → vendors/claude/hook}/pre-tool-use.js +0 -0
  493. /package/dist/{hook → vendors/claude/hook}/stdin.d.ts +0 -0
  494. /package/dist/{hook → vendors/claude/hook}/stdin.js +0 -0
@@ -11,6 +11,23 @@
11
11
  * every async step.
12
12
  */
13
13
  import { fuseRRF } from "./rrf.js";
14
+ function assertFiniteVector(vector, expectedDimensions) {
15
+ if (!(vector instanceof Float32Array)) {
16
+ throw new Error("Embedding provider returned a vector that is not a Float32Array.");
17
+ }
18
+ if (vector.length !== expectedDimensions) {
19
+ throw new Error(`Embedding provider returned ${vector.length} dimensions; expected ${expectedDimensions}.`);
20
+ }
21
+ for (let index = 0; index < vector.length; index += 1) {
22
+ if (!Number.isFinite(vector[index])) {
23
+ throw new Error(`Embedding provider returned a non-finite vector value at index ${index}.`);
24
+ }
25
+ }
26
+ }
27
+ async function embedQuery(provider, text) {
28
+ const queryProvider = provider;
29
+ return queryProvider.embedQuery?.(text) ?? provider.embed(text);
30
+ }
14
31
  /** Create a new mutable cancel token. */
15
32
  export function createCancelToken() {
16
33
  let cancelled = false;
@@ -59,23 +76,47 @@ const PROVENANCE_BOOST = {
59
76
  curated: 0.01, // deliberately imported / curated references
60
77
  "external-raw": 0, // raw external content — no boost
61
78
  };
79
+ /**
80
+ * Apply the provenance signal without putting it on a different scale from
81
+ * RRF. RRF scores are bounded by the number of lists and `rrfK` (roughly
82
+ * 0.016 for one rank-1 list with k=60), so adding a raw 0.02 would let a
83
+ * low-ranked authored hit leap over a stronger multi-list result. A
84
+ * multiplicative adjustment keeps the signal monotonic and proportional to
85
+ * the fused score.
86
+ */
87
+ export function applyProvenanceBoost(score, provenance) {
88
+ const boost = provenance === undefined ? 0 : PROVENANCE_BOOST[provenance];
89
+ return score * (1 + boost);
90
+ }
91
+ export const DISPATCHER_POLICIES = Object.freeze([
92
+ "boost-additive",
93
+ "boost-k-scale",
94
+ "boost-per-list",
95
+ "boost-zero",
96
+ ]);
97
+ export const PREREGISTERED_ARM_POLICIES = Object.freeze(["boost-k-scale", "boost-per-list", "boost-zero"]);
98
+ export const DEFAULT_DISPATCHER_POLICY = "boost-additive";
62
99
  // ---------------------------------------------------------------------------
63
100
  // Per-type dispatch
64
101
  // ---------------------------------------------------------------------------
65
- async function dispatchOne(sub, deps, k, cancel) {
102
+ async function dispatchOne(sub, deps, k, cancel, collection) {
66
103
  switch (sub.type) {
67
104
  case "lex": {
68
- return withRetry(() => Promise.resolve(deps.store.queryLex(sub.query, k)), cancel);
105
+ return withRetry(() => Promise.resolve(collection === undefined
106
+ ? deps.store.queryLex(sub.query, k)
107
+ : deps.store.queryLex(sub.query, k, collection)), cancel);
69
108
  }
70
109
  case "vec": {
71
- const vec = await withRetry(() => deps.embed.embed(sub.query), cancel);
72
- return withRetry(() => Promise.resolve(deps.store.queryVec(vec, k)), cancel);
110
+ const vec = await withRetry(() => embedQuery(deps.embed, sub.query), cancel);
111
+ assertFiniteVector(vec, deps.embed.dimensions);
112
+ return withRetry(() => Promise.resolve(collection === undefined ? deps.store.queryVec(vec, k) : deps.store.queryVec(vec, k, collection)), cancel);
73
113
  }
74
114
  case "hyde": {
75
115
  const generator = deps.hydeGenerator ?? defaultHydeGenerator;
76
116
  const hypoDoc = await withRetry(() => generator(sub.query), cancel);
77
- const vec = await withRetry(() => deps.embed.embed(hypoDoc), cancel);
78
- return withRetry(() => Promise.resolve(deps.store.queryVec(vec, k)), cancel);
117
+ const vec = await withRetry(() => embedQuery(deps.embed, hypoDoc), cancel);
118
+ assertFiniteVector(vec, deps.embed.dimensions);
119
+ return withRetry(() => Promise.resolve(collection === undefined ? deps.store.queryVec(vec, k) : deps.store.queryVec(vec, k, collection)), cancel);
79
120
  }
80
121
  case "graph": {
81
122
  if (!deps.graphTraverse)
@@ -89,6 +130,22 @@ async function dispatchOne(sub, deps, k, cancel) {
89
130
  }
90
131
  }
91
132
  }
133
+ /**
134
+ * Apply the per-list policy before RRF ranking. RRF consumes rank positions,
135
+ * so the weighted score must be used to establish each list's order rather
136
+ * than applied after fusion (which would be the k-scale policy).
137
+ */
138
+ function rankListForPolicy(list, deps, policy) {
139
+ if (policy !== "boost-per-list")
140
+ return list;
141
+ return [...list].sort((left, right) => {
142
+ const leftScore = applyProvenanceBoost(left.score, deps.provenanceMap?.(left.docPath));
143
+ const rightScore = applyProvenanceBoost(right.score, deps.provenanceMap?.(right.docPath));
144
+ return rightScore - leftScore ||
145
+ left.docPath.localeCompare(right.docPath) ||
146
+ left.chunkOrdinal - right.chunkOrdinal;
147
+ });
148
+ }
92
149
  // ---------------------------------------------------------------------------
93
150
  // Public API
94
151
  // ---------------------------------------------------------------------------
@@ -101,19 +158,30 @@ async function dispatchOne(sub, deps, k, cancel) {
101
158
  * @param cancel - Optional cancel token; a fresh token is created if absent.
102
159
  * @returns Fused and provenance-boosted RetrievalResult[], sorted descending by score.
103
160
  */
104
- export async function dispatch(subQueries, deps, k = 10, cancel) {
161
+ export async function dispatch(subQueries, deps, k = 10, cancel, collection) {
105
162
  const token = cancel ?? createCancelToken();
106
163
  const rrfK = deps.rrfK ?? 60;
164
+ const policy = deps.policy ?? DEFAULT_DISPATCHER_POLICY;
165
+ if (!Number.isSafeInteger(k) || k < 0) {
166
+ throw new Error("Retrieval candidate count k must be a non-negative safe integer.");
167
+ }
168
+ if (!Number.isFinite(rrfK) || rrfK < 0) {
169
+ throw new Error("RRF smoothing constant k must be a finite non-negative number.");
170
+ }
171
+ if (!DISPATCHER_POLICIES.includes(policy)) {
172
+ throw new Error(`Unknown dispatcher policy: ${String(policy)}`);
173
+ }
107
174
  if (subQueries.length === 0)
108
175
  return [];
109
176
  // Execute all sub-queries in parallel (each with its own retry envelope)
110
- const rankedLists = await Promise.all(subQueries.map((sub) => dispatchOne(sub, deps, k, token)));
177
+ const rankedLists = await Promise.all(subQueries.map((sub) => dispatchOne(sub, deps, k, token, collection)));
178
+ const policyLists = rankedLists.map((list) => rankListForPolicy(list, deps, policy));
111
179
  // Build per-type score index for the perTypeScores field
112
180
  // key = "docPath\0chunkOrdinal" → type → max raw score from that type
113
181
  const typeScores = new Map();
114
182
  for (let i = 0; i < subQueries.length; i++) {
115
183
  const type = subQueries[i].type;
116
- const list = rankedLists[i];
184
+ const list = policyLists[i];
117
185
  for (const hit of list) {
118
186
  const key = `${hit.docPath}\x00${hit.chunkOrdinal}`;
119
187
  const perType = typeScores.get(key) ?? new Map();
@@ -124,22 +192,32 @@ export async function dispatch(subQueries, deps, k = 10, cancel) {
124
192
  }
125
193
  }
126
194
  // Fuse with RRF
127
- const fused = fuseRRF(rankedLists, rrfK);
128
- // Build final results with provenance boost and per-type breakdown
129
- return fused.map((hit) => {
195
+ const fused = fuseRRF(policyLists, rrfK, {
196
+ preserveInputOrder: policy === "boost-per-list",
197
+ });
198
+ // Build final results with provenance boost and per-type breakdown.
199
+ const results = fused.map((hit) => {
130
200
  const key = `${hit.docPath}\x00${hit.chunkOrdinal}`;
131
201
  const provenance = deps.provenanceMap?.(hit.docPath);
132
- const boost = provenance !== undefined ? PROVENANCE_BOOST[provenance] : 0;
202
+ const boost = provenance === undefined ? 0 : PROVENANCE_BOOST[provenance];
133
203
  const perTypeMap = typeScores.get(key);
134
204
  const perTypeScores = perTypeMap !== undefined && perTypeMap.size > 0
135
205
  ? Object.fromEntries(perTypeMap)
136
206
  : undefined;
137
207
  return {
138
208
  docPath: hit.docPath,
139
- score: hit.score + boost,
209
+ score: policy === "boost-additive"
210
+ ? hit.score + boost
211
+ : policy === "boost-k-scale"
212
+ ? applyProvenanceBoost(hit.score, provenance)
213
+ : hit.score,
140
214
  provenance,
141
215
  perTypeScores,
142
216
  };
143
217
  });
218
+ if (policy === "boost-additive")
219
+ return results;
220
+ return results.sort((a, b) => b.score - a.score ||
221
+ a.docPath.localeCompare(b.docPath));
144
222
  }
145
223
  //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../../src/kernel/engine/retrieval/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,8 @@
11
11
  */
12
12
  export { fuseRRF } from "./rrf.js";
13
13
  export type { Reranker } from "./reranker.js";
14
- export { PassthroughReranker, passthroughReranker } from "./reranker.js";
14
+ export { createLlamaReranker, DEFAULT_RERANKER_CANDIDATE_CAP, LlamaReranker, PassthroughReranker, passthroughReranker, } from "./reranker.js";
15
+ export type { LlamaModelLoader, LlamaRerankerOptions, RankingContext, RankingModel, } from "./reranker.js";
15
16
  export { dispatch, createCancelToken, } from "./dispatcher.js";
16
17
  export type { CancelToken, DispatcherDeps, HydeGenerator } from "./dispatcher.js";
17
18
  import type { RetrievalResult } from "../types.js";
@@ -39,6 +40,8 @@ export interface RetrieveOptions {
39
40
  query?: string;
40
41
  /** Optional cancel token to abort in-flight retrieval. */
41
42
  cancel?: CancelToken;
43
+ /** Optional vault-relative collection path that constrains backend candidates. */
44
+ collection?: string;
42
45
  }
43
46
  /**
44
47
  * Execute a hybrid retrieval query and return a ranked result list.
@@ -10,7 +10,7 @@
10
10
  * - DispatcherDeps — dependency-injection bag for backends
11
11
  */
12
12
  export { fuseRRF } from "./rrf.js";
13
- export { PassthroughReranker, passthroughReranker } from "./reranker.js";
13
+ export { createLlamaReranker, DEFAULT_RERANKER_CANDIDATE_CAP, LlamaReranker, PassthroughReranker, passthroughReranker, } from "./reranker.js";
14
14
  export { dispatch, createCancelToken, } from "./dispatcher.js";
15
15
  import { dispatch } from "./dispatcher.js";
16
16
  /**
@@ -27,7 +27,7 @@ import { dispatch } from "./dispatcher.js";
27
27
  */
28
28
  export async function retrieve(opts) {
29
29
  // Step 1–3: dispatch + RRF fusion + provenance boost
30
- const results = await dispatch(opts.subQueries, opts.deps, opts.k, opts.cancel);
30
+ const results = await dispatch(opts.subQueries, opts.deps, opts.k, opts.cancel, opts.collection);
31
31
  // Step 4: optional cross-encoder reranking
32
32
  if (!opts.reranker)
33
33
  return results;
@@ -37,7 +37,10 @@ export async function retrieve(opts) {
37
37
  chunkOrdinal: 0,
38
38
  score: r.score,
39
39
  }));
40
- const reranked = await opts.reranker.rerank(opts.query ?? "", hits);
40
+ if (!opts.query?.trim()) {
41
+ throw new Error("reranking requires a non-empty natural-language query.");
42
+ }
43
+ const reranked = await opts.reranker.rerank(opts.query, hits);
41
44
  // Reconstruct RetrievalResult[] in the reranker's order with new scores
42
45
  const resultByPath = new Map(results.map((r) => [r.docPath, r]));
43
46
  return reranked
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/kernel/engine/retrieval/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,QAAQ,EACR,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAkC3C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAqB;IAClD,qDAAqD;IACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAEjG,2CAA2C;IAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC;IAEnC,2EAA2E;IAC3E,MAAM,IAAI,GAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE9D,wEAAwE;IACxE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAA4B,CAAC;IACjE,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Cross-encoder reranker hook.
3
+ *
4
+ * This module defines the Reranker interface and ships a passthrough (no-op)
5
+ * default so the precision-mode pipeline is wired end-to-end without
6
+ * requiring a loaded reranker model. The node-llama-cpp implementation below
7
+ * is explicitly opt-in and lazy: constructing it never loads a model or
8
+ * creates a ranking context.
9
+ *
10
+ * Intended production implementations (inject at the integrate phase):
11
+ * - bge-reranker-v2-m3 (BAAI, Apache-2.0) — strong multilingual reranker,
12
+ * ~570 M params, load via node-llama-cpp or a local REST endpoint.
13
+ * - Qwen3-Reranker-0.6B (Alibaba Cloud, Apache-2.0) — lightweight reranker,
14
+ * good for low-latency on-device use; also loadable via node-llama-cpp.
15
+ *
16
+ * Wire a real impl by passing it to retrieve() as `opts.reranker`.
17
+ */
18
+ import type { LlamaRankingContextOptions } from "node-llama-cpp";
19
+ import type { ScoredHit } from "../types.js";
20
+ /**
21
+ * Opt-in cross-encoder reranker hook.
22
+ *
23
+ * A reranker receives the original query string and a candidate hit list
24
+ * (already fused by RRF) and returns a re-scored / re-ordered list.
25
+ * Implementations may call an external model or REST endpoint; the caller
26
+ * awaits the result before returning the final RetrievalResult[].
27
+ */
28
+ export interface Reranker {
29
+ /**
30
+ * Re-score and reorder `hits` with respect to `query`.
31
+ *
32
+ * @param query - The original natural-language query string.
33
+ * @param hits - RRF-fused candidate list, sorted descending by fused score.
34
+ * @returns A new list sorted descending by the reranker's cross-encoder score.
35
+ * The returned list may be shorter than `hits` (e.g. top-k precision cut).
36
+ */
37
+ rerank(query: string, hits: ScoredHit[], cancel?: {
38
+ readonly cancelled: boolean;
39
+ }): Promise<ScoredHit[]>;
40
+ }
41
+ /**
42
+ * Narrow seam around node-llama-cpp used by the lazy implementation.
43
+ *
44
+ * Keeping the seam injectable makes the lifecycle contract testable without
45
+ * downloading or loading a model. Production uses the default dynamic loader.
46
+ */
47
+ export interface RankingContext {
48
+ rankAll(query: string, documents: string[]): Promise<readonly number[]>;
49
+ dispose(): Promise<void>;
50
+ }
51
+ export interface RankingModel {
52
+ createRankingContext(options?: LlamaRankingContextOptions): Promise<RankingContext>;
53
+ dispose(): Promise<void>;
54
+ }
55
+ export type LlamaModelLoader = (modelPath: string) => Promise<RankingModel>;
56
+ /** Conservative candidate budget; reranking is opt-in and default-off. */
57
+ export declare const DEFAULT_RERANKER_CANDIDATE_CAP = 50;
58
+ /**
59
+ * Options for {@link createLlamaReranker}.
60
+ *
61
+ * `idleUnloadMs` is disabled by default (`0`). Enabling it is useful for
62
+ * memory-constrained hosts, but the model is otherwise retained after its
63
+ * first requested rerank so repeated opt-in calls do not reload native state.
64
+ */
65
+ export interface LlamaRerankerOptions {
66
+ readonly modelPath: string;
67
+ readonly candidateCap?: number;
68
+ readonly idleUnloadMs?: number;
69
+ readonly contextOptions?: LlamaRankingContextOptions;
70
+ /** Test seam; production callers should omit this. */
71
+ readonly loadModel?: LlamaModelLoader;
72
+ }
73
+ /**
74
+ * A lazy node-llama-cpp cross-encoder reranker.
75
+ *
76
+ * The model and `LlamaRankingContext` are created only by the first
77
+ * `rerank()` call. Only the first `candidateCap` fused hits are sent to the
78
+ * cross-encoder; hits beyond that safety budget are intentionally omitted.
79
+ * Scores are replaced with the cross-encoder scores and returned descending.
80
+ */
81
+ export declare class LlamaReranker implements Reranker {
82
+ private readonly modelPath;
83
+ private readonly candidateCap;
84
+ private readonly idleUnloadMs;
85
+ private readonly contextOptions;
86
+ private readonly loadModel;
87
+ private model;
88
+ private context;
89
+ private loadPromise;
90
+ private idleTimer;
91
+ private activeCalls;
92
+ private activeDone;
93
+ private resolveActiveDone;
94
+ private disposed;
95
+ private disposePromise;
96
+ constructor(options: LlamaRerankerOptions);
97
+ private clearIdleTimer;
98
+ private scheduleIdleUnload;
99
+ private ensureContext;
100
+ private unload;
101
+ /** Release model/context resources; safe before the first rerank call. */
102
+ dispose(): Promise<void>;
103
+ rerank(query: string, hits: ScoredHit[], cancel?: {
104
+ readonly cancelled: boolean;
105
+ }): Promise<ScoredHit[]>;
106
+ }
107
+ /**
108
+ * Construct a lazy reranker. No model import, native load, or context
109
+ * creation occurs until the returned reranker's `rerank()` is requested.
110
+ */
111
+ export declare function createLlamaReranker(options: LlamaRerankerOptions): LlamaReranker;
112
+ /**
113
+ * Passthrough (no-op) reranker — returns hits unchanged.
114
+ *
115
+ * Preserves the RRF-fused order and scores. Use this when no reranker model
116
+ * is available or when reranking overhead is not desired.
117
+ */
118
+ export declare class PassthroughReranker implements Reranker {
119
+ rerank(_query: string, hits: ScoredHit[], cancel?: {
120
+ readonly cancelled: boolean;
121
+ }): Promise<ScoredHit[]>;
122
+ }
123
+ /** Shared singleton passthrough instance — safe to reuse across calls. */
124
+ export declare const passthroughReranker: Reranker;
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Cross-encoder reranker hook.
3
+ *
4
+ * This module defines the Reranker interface and ships a passthrough (no-op)
5
+ * default so the precision-mode pipeline is wired end-to-end without
6
+ * requiring a loaded reranker model. The node-llama-cpp implementation below
7
+ * is explicitly opt-in and lazy: constructing it never loads a model or
8
+ * creates a ranking context.
9
+ *
10
+ * Intended production implementations (inject at the integrate phase):
11
+ * - bge-reranker-v2-m3 (BAAI, Apache-2.0) — strong multilingual reranker,
12
+ * ~570 M params, load via node-llama-cpp or a local REST endpoint.
13
+ * - Qwen3-Reranker-0.6B (Alibaba Cloud, Apache-2.0) — lightweight reranker,
14
+ * good for low-latency on-device use; also loadable via node-llama-cpp.
15
+ *
16
+ * Wire a real impl by passing it to retrieve() as `opts.reranker`.
17
+ */
18
+ /** Conservative candidate budget; reranking is opt-in and default-off. */
19
+ export const DEFAULT_RERANKER_CANDIDATE_CAP = 50;
20
+ async function loadLlamaModel(modelPath) {
21
+ const { getLlama } = await import("node-llama-cpp");
22
+ const llama = await getLlama();
23
+ return llama.loadModel({ modelPath });
24
+ }
25
+ /**
26
+ * A lazy node-llama-cpp cross-encoder reranker.
27
+ *
28
+ * The model and `LlamaRankingContext` are created only by the first
29
+ * `rerank()` call. Only the first `candidateCap` fused hits are sent to the
30
+ * cross-encoder; hits beyond that safety budget are intentionally omitted.
31
+ * Scores are replaced with the cross-encoder scores and returned descending.
32
+ */
33
+ export class LlamaReranker {
34
+ modelPath;
35
+ candidateCap;
36
+ idleUnloadMs;
37
+ contextOptions;
38
+ loadModel;
39
+ model = null;
40
+ context = null;
41
+ loadPromise = null;
42
+ idleTimer = null;
43
+ activeCalls = 0;
44
+ activeDone = null;
45
+ resolveActiveDone = null;
46
+ disposed = false;
47
+ disposePromise = null;
48
+ constructor(options) {
49
+ const candidateCap = options.candidateCap ?? DEFAULT_RERANKER_CANDIDATE_CAP;
50
+ if (!Number.isSafeInteger(candidateCap) || candidateCap < 1) {
51
+ throw new Error("reranker candidateCap must be a positive safe integer.");
52
+ }
53
+ const idleUnloadMs = options.idleUnloadMs ?? 0;
54
+ if (!Number.isFinite(idleUnloadMs) || idleUnloadMs < 0) {
55
+ throw new Error("reranker idleUnloadMs must be a non-negative number.");
56
+ }
57
+ if (options.modelPath.trim().length === 0) {
58
+ throw new Error("reranker modelPath must be non-empty.");
59
+ }
60
+ this.modelPath = options.modelPath;
61
+ this.candidateCap = candidateCap;
62
+ this.idleUnloadMs = idleUnloadMs;
63
+ this.contextOptions = options.contextOptions;
64
+ this.loadModel = options.loadModel ?? loadLlamaModel;
65
+ }
66
+ clearIdleTimer() {
67
+ if (this.idleTimer !== null) {
68
+ clearTimeout(this.idleTimer);
69
+ this.idleTimer = null;
70
+ }
71
+ }
72
+ scheduleIdleUnload() {
73
+ this.clearIdleTimer();
74
+ if (this.disposed || this.idleUnloadMs <= 0 || this.context === null)
75
+ return;
76
+ this.idleTimer = setTimeout(() => {
77
+ this.idleTimer = null;
78
+ if (this.activeCalls > 0) {
79
+ this.scheduleIdleUnload();
80
+ return;
81
+ }
82
+ void this.unload().catch(() => undefined);
83
+ }, this.idleUnloadMs);
84
+ }
85
+ async ensureContext() {
86
+ if (this.disposed)
87
+ throw new Error("Reranker has been disposed.");
88
+ if (this.context !== null)
89
+ return this.context;
90
+ if (this.loadPromise !== null)
91
+ return this.loadPromise;
92
+ this.loadPromise = (async () => {
93
+ const model = await this.loadModel(this.modelPath);
94
+ this.model = model;
95
+ try {
96
+ const context = await model.createRankingContext(this.contextOptions);
97
+ this.context = context;
98
+ return context;
99
+ }
100
+ catch (error) {
101
+ this.model = null;
102
+ await model.dispose().catch(() => undefined);
103
+ throw error;
104
+ }
105
+ })().finally(() => {
106
+ this.loadPromise = null;
107
+ });
108
+ return this.loadPromise;
109
+ }
110
+ async unload() {
111
+ this.clearIdleTimer();
112
+ const context = this.context;
113
+ const model = this.model;
114
+ this.context = null;
115
+ this.model = null;
116
+ if (context !== null)
117
+ await context.dispose().catch(() => undefined);
118
+ if (model !== null)
119
+ await model.dispose().catch(() => undefined);
120
+ }
121
+ /** Release model/context resources; safe before the first rerank call. */
122
+ async dispose() {
123
+ if (this.disposePromise !== null) {
124
+ return this.disposePromise;
125
+ }
126
+ this.disposed = true;
127
+ this.clearIdleTimer();
128
+ this.disposePromise = (async () => {
129
+ if (this.loadPromise !== null) {
130
+ await this.loadPromise.catch(() => undefined);
131
+ }
132
+ // Context disposal must never race a native rankAll() call. Calls
133
+ // already admitted before dispose() drain before unloading resources.
134
+ if (this.activeDone !== null)
135
+ await this.activeDone;
136
+ await this.unload();
137
+ })();
138
+ return this.disposePromise;
139
+ }
140
+ async rerank(query, hits, cancel) {
141
+ if (hits.length === 0)
142
+ return [];
143
+ if (this.disposed)
144
+ throw new Error("Reranker has been disposed.");
145
+ if (cancel?.cancelled)
146
+ throw new Error("Retrieval cancelled");
147
+ const candidates = hits.slice(0, this.candidateCap);
148
+ this.activeCalls += 1;
149
+ if (this.activeCalls === 1) {
150
+ this.activeDone = new Promise((resolve) => {
151
+ this.resolveActiveDone = resolve;
152
+ });
153
+ }
154
+ try {
155
+ const context = await this.ensureContext();
156
+ if (cancel?.cancelled)
157
+ throw new Error("Retrieval cancelled");
158
+ const scores = await context.rankAll(query, candidates.map((hit) => hit.docPath));
159
+ if (cancel?.cancelled)
160
+ throw new Error("Retrieval cancelled");
161
+ if (scores.length !== candidates.length) {
162
+ throw new Error(`reranker returned ${scores.length} scores for ${candidates.length} candidates.`);
163
+ }
164
+ if (scores.some((score) => !Number.isFinite(score))) {
165
+ throw new Error("reranker returned a non-finite score.");
166
+ }
167
+ return candidates
168
+ .map((hit, index) => ({ ...hit, score: scores[index] }))
169
+ .sort((left, right) => right.score - left.score);
170
+ }
171
+ finally {
172
+ this.activeCalls -= 1;
173
+ if (this.activeCalls === 0) {
174
+ this.resolveActiveDone?.();
175
+ this.resolveActiveDone = null;
176
+ this.activeDone = null;
177
+ }
178
+ this.scheduleIdleUnload();
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Construct a lazy reranker. No model import, native load, or context
184
+ * creation occurs until the returned reranker's `rerank()` is requested.
185
+ */
186
+ export function createLlamaReranker(options) {
187
+ return new LlamaReranker(options);
188
+ }
189
+ /**
190
+ * Passthrough (no-op) reranker — returns hits unchanged.
191
+ *
192
+ * Preserves the RRF-fused order and scores. Use this when no reranker model
193
+ * is available or when reranking overhead is not desired.
194
+ */
195
+ export class PassthroughReranker {
196
+ async rerank(_query, hits, cancel) {
197
+ if (cancel?.cancelled)
198
+ throw new Error("Retrieval cancelled");
199
+ return hits;
200
+ }
201
+ }
202
+ /** Shared singleton passthrough instance — safe to reuse across calls. */
203
+ export const passthroughReranker = new PassthroughReranker();
204
+ //# sourceMappingURL=reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../../../src/kernel/engine/retrieval/reranker.ts"],"names":[],"mappings":"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"}
@@ -14,10 +14,18 @@ import type { ScoredHit } from "../types.js";
14
14
  * Fuse multiple ranked lists into a single list using Reciprocal Rank Fusion.
15
15
  *
16
16
  * @param rankedLists - Per-modality ranked hit lists. Each inner list need not be
17
- * pre-sorted; fuseRRF sorts each list descending by score before ranking.
17
+ * pre-sorted unless `preserveInputOrder` is enabled.
18
18
  * @param k - RRF smoothing constant (default 60). Higher values reduce the impact
19
19
  * of rank position; typical range is 50–70.
20
+ * @param options - Ranking behavior for each input list.
20
21
  * @returns Fused list sorted descending by RRF score. Ties are broken
21
22
  * lexicographically by the composite key `"docPath\0chunkOrdinal"`.
22
23
  */
23
- export declare function fuseRRF(rankedLists: ScoredHit[][], k?: number): ScoredHit[];
24
+ export interface FuseRRFOptions {
25
+ /**
26
+ * Treat each list as already ranked and use its supplied order. This is
27
+ * required when a caller has established rank with a non-score policy.
28
+ */
29
+ preserveInputOrder?: boolean;
30
+ }
31
+ export declare function fuseRRF(rankedLists: ScoredHit[][], k?: number, options?: FuseRRFOptions): ScoredHit[];