@tenphi/akno-core 0.1.0

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 (485) hide show
  1. package/LICENSE +83 -0
  2. package/README.md +26 -0
  3. package/config/default.jsonc +548 -0
  4. package/dist/bench/answer-corpus.d.ts +48 -0
  5. package/dist/bench/answer-corpus.d.ts.map +1 -0
  6. package/dist/bench/answer-corpus.js +491 -0
  7. package/dist/bench/answer-corpus.js.map +1 -0
  8. package/dist/bench/answer.d.ts +156 -0
  9. package/dist/bench/answer.d.ts.map +1 -0
  10. package/dist/bench/answer.js +608 -0
  11. package/dist/bench/answer.js.map +1 -0
  12. package/dist/bench/auto-recall-answer-corpus.d.ts +21 -0
  13. package/dist/bench/auto-recall-answer-corpus.d.ts.map +1 -0
  14. package/dist/bench/auto-recall-answer-corpus.js +245 -0
  15. package/dist/bench/auto-recall-answer-corpus.js.map +1 -0
  16. package/dist/bench/auto-recall-answer.d.ts +198 -0
  17. package/dist/bench/auto-recall-answer.d.ts.map +1 -0
  18. package/dist/bench/auto-recall-answer.js +720 -0
  19. package/dist/bench/auto-recall-answer.js.map +1 -0
  20. package/dist/bench/auto-recall-corpus.d.ts +45 -0
  21. package/dist/bench/auto-recall-corpus.d.ts.map +1 -0
  22. package/dist/bench/auto-recall-corpus.js +221 -0
  23. package/dist/bench/auto-recall-corpus.js.map +1 -0
  24. package/dist/bench/auto-recall.d.ts +171 -0
  25. package/dist/bench/auto-recall.d.ts.map +1 -0
  26. package/dist/bench/auto-recall.js +651 -0
  27. package/dist/bench/auto-recall.js.map +1 -0
  28. package/dist/bench/entity-resolution.d.ts +37 -0
  29. package/dist/bench/entity-resolution.d.ts.map +1 -0
  30. package/dist/bench/entity-resolution.js +121 -0
  31. package/dist/bench/entity-resolution.js.map +1 -0
  32. package/dist/bench/graph.d.ts +57 -0
  33. package/dist/bench/graph.d.ts.map +1 -0
  34. package/dist/bench/graph.js +573 -0
  35. package/dist/bench/graph.js.map +1 -0
  36. package/dist/bench/llm-ranking-probe.d.ts +27 -0
  37. package/dist/bench/llm-ranking-probe.d.ts.map +1 -0
  38. package/dist/bench/llm-ranking-probe.js +105 -0
  39. package/dist/bench/llm-ranking-probe.js.map +1 -0
  40. package/dist/bench/merge-discovery-corpus.d.ts +26 -0
  41. package/dist/bench/merge-discovery-corpus.d.ts.map +1 -0
  42. package/dist/bench/merge-discovery-corpus.js +114 -0
  43. package/dist/bench/merge-discovery-corpus.js.map +1 -0
  44. package/dist/bench/merge-discovery-review.d.ts +81 -0
  45. package/dist/bench/merge-discovery-review.d.ts.map +1 -0
  46. package/dist/bench/merge-discovery-review.js +149 -0
  47. package/dist/bench/merge-discovery-review.js.map +1 -0
  48. package/dist/bench/merge-discovery.d.ts +122 -0
  49. package/dist/bench/merge-discovery.d.ts.map +1 -0
  50. package/dist/bench/merge-discovery.js +390 -0
  51. package/dist/bench/merge-discovery.js.map +1 -0
  52. package/dist/bench/mixed-retrieval.d.ts +35 -0
  53. package/dist/bench/mixed-retrieval.d.ts.map +1 -0
  54. package/dist/bench/mixed-retrieval.js +355 -0
  55. package/dist/bench/mixed-retrieval.js.map +1 -0
  56. package/dist/bench/ranking-corpus.d.ts +29 -0
  57. package/dist/bench/ranking-corpus.d.ts.map +1 -0
  58. package/dist/bench/ranking-corpus.js +514 -0
  59. package/dist/bench/ranking-corpus.js.map +1 -0
  60. package/dist/bench/ranking-end-to-end.d.ts +112 -0
  61. package/dist/bench/ranking-end-to-end.d.ts.map +1 -0
  62. package/dist/bench/ranking-end-to-end.js +479 -0
  63. package/dist/bench/ranking-end-to-end.js.map +1 -0
  64. package/dist/bench/ranking-latency.d.ts +71 -0
  65. package/dist/bench/ranking-latency.d.ts.map +1 -0
  66. package/dist/bench/ranking-latency.js +130 -0
  67. package/dist/bench/ranking-latency.js.map +1 -0
  68. package/dist/bench/ranking-matrix.d.ts +141 -0
  69. package/dist/bench/ranking-matrix.d.ts.map +1 -0
  70. package/dist/bench/ranking-matrix.js +526 -0
  71. package/dist/bench/ranking-matrix.js.map +1 -0
  72. package/dist/bench/ranking-review.d.ts +93 -0
  73. package/dist/bench/ranking-review.d.ts.map +1 -0
  74. package/dist/bench/ranking-review.js +249 -0
  75. package/dist/bench/ranking-review.js.map +1 -0
  76. package/dist/bench/ranking.d.ts +122 -0
  77. package/dist/bench/ranking.d.ts.map +1 -0
  78. package/dist/bench/ranking.js +547 -0
  79. package/dist/bench/ranking.js.map +1 -0
  80. package/dist/bench.d.ts +60 -0
  81. package/dist/bench.d.ts.map +1 -0
  82. package/dist/bench.js +167 -0
  83. package/dist/bench.js.map +1 -0
  84. package/dist/config/jsonc.d.ts +8 -0
  85. package/dist/config/jsonc.d.ts.map +1 -0
  86. package/dist/config/jsonc.js +85 -0
  87. package/dist/config/jsonc.js.map +1 -0
  88. package/dist/config/load.d.ts +43 -0
  89. package/dist/config/load.d.ts.map +1 -0
  90. package/dist/config/load.js +608 -0
  91. package/dist/config/load.js.map +1 -0
  92. package/dist/config/paths.d.ts +10 -0
  93. package/dist/config/paths.d.ts.map +1 -0
  94. package/dist/config/paths.js +38 -0
  95. package/dist/config/paths.js.map +1 -0
  96. package/dist/config/schema.d.ts +698 -0
  97. package/dist/config/schema.d.ts.map +1 -0
  98. package/dist/config/schema.js +394 -0
  99. package/dist/config/schema.js.map +1 -0
  100. package/dist/config/write-rules.d.ts +41 -0
  101. package/dist/config/write-rules.d.ts.map +1 -0
  102. package/dist/config/write-rules.js +225 -0
  103. package/dist/config/write-rules.js.map +1 -0
  104. package/dist/config/write-setup.d.ts +42 -0
  105. package/dist/config/write-setup.d.ts.map +1 -0
  106. package/dist/config/write-setup.js +358 -0
  107. package/dist/config/write-setup.js.map +1 -0
  108. package/dist/context.d.ts +64 -0
  109. package/dist/context.d.ts.map +1 -0
  110. package/dist/context.js +14 -0
  111. package/dist/context.js.map +1 -0
  112. package/dist/doctor.d.ts +115 -0
  113. package/dist/doctor.d.ts.map +1 -0
  114. package/dist/doctor.js +388 -0
  115. package/dist/doctor.js.map +1 -0
  116. package/dist/index/chunk.d.ts +62 -0
  117. package/dist/index/chunk.d.ts.map +1 -0
  118. package/dist/index/chunk.js +307 -0
  119. package/dist/index/chunk.js.map +1 -0
  120. package/dist/index/defer.d.ts +32 -0
  121. package/dist/index/defer.d.ts.map +1 -0
  122. package/dist/index/defer.js +66 -0
  123. package/dist/index/defer.js.map +1 -0
  124. package/dist/index/derive.d.ts +99 -0
  125. package/dist/index/derive.d.ts.map +1 -0
  126. package/dist/index/derive.js +378 -0
  127. package/dist/index/derive.js.map +1 -0
  128. package/dist/index/entity-resolution.d.ts +68 -0
  129. package/dist/index/entity-resolution.d.ts.map +1 -0
  130. package/dist/index/entity-resolution.js +305 -0
  131. package/dist/index/entity-resolution.js.map +1 -0
  132. package/dist/index/graph.d.ts +46 -0
  133. package/dist/index/graph.d.ts.map +1 -0
  134. package/dist/index/graph.js +618 -0
  135. package/dist/index/graph.js.map +1 -0
  136. package/dist/index/indexer.d.ts +301 -0
  137. package/dist/index/indexer.d.ts.map +1 -0
  138. package/dist/index/indexer.js +1398 -0
  139. package/dist/index/indexer.js.map +1 -0
  140. package/dist/index/revision-barrier.d.ts +30 -0
  141. package/dist/index/revision-barrier.d.ts.map +1 -0
  142. package/dist/index/revision-barrier.js +140 -0
  143. package/dist/index/revision-barrier.js.map +1 -0
  144. package/dist/index.d.ts +55 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +37 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/ingest/adoption-eligibility.d.ts +4 -0
  149. package/dist/ingest/adoption-eligibility.d.ts.map +1 -0
  150. package/dist/ingest/adoption-eligibility.js +18 -0
  151. package/dist/ingest/adoption-eligibility.js.map +1 -0
  152. package/dist/ingest/availability.d.ts +15 -0
  153. package/dist/ingest/availability.d.ts.map +1 -0
  154. package/dist/ingest/availability.js +37 -0
  155. package/dist/ingest/availability.js.map +1 -0
  156. package/dist/ingest/extract.d.ts +58 -0
  157. package/dist/ingest/extract.d.ts.map +1 -0
  158. package/dist/ingest/extract.js +255 -0
  159. package/dist/ingest/extract.js.map +1 -0
  160. package/dist/ingest/fetch.d.ts +35 -0
  161. package/dist/ingest/fetch.d.ts.map +1 -0
  162. package/dist/ingest/fetch.js +142 -0
  163. package/dist/ingest/fetch.js.map +1 -0
  164. package/dist/ingest/inbox.d.ts +53 -0
  165. package/dist/ingest/inbox.d.ts.map +1 -0
  166. package/dist/ingest/inbox.js +110 -0
  167. package/dist/ingest/inbox.js.map +1 -0
  168. package/dist/ingest/name.d.ts +72 -0
  169. package/dist/ingest/name.d.ts.map +1 -0
  170. package/dist/ingest/name.js +208 -0
  171. package/dist/ingest/name.js.map +1 -0
  172. package/dist/ingest/parts.d.ts +78 -0
  173. package/dist/ingest/parts.d.ts.map +1 -0
  174. package/dist/ingest/parts.js +52 -0
  175. package/dist/ingest/parts.js.map +1 -0
  176. package/dist/ingest/rendition.d.ts +75 -0
  177. package/dist/ingest/rendition.d.ts.map +1 -0
  178. package/dist/ingest/rendition.js +92 -0
  179. package/dist/ingest/rendition.js.map +1 -0
  180. package/dist/ingest/store.d.ts +66 -0
  181. package/dist/ingest/store.d.ts.map +1 -0
  182. package/dist/ingest/store.js +92 -0
  183. package/dist/ingest/store.js.map +1 -0
  184. package/dist/kb/folders.d.ts +37 -0
  185. package/dist/kb/folders.d.ts.map +1 -0
  186. package/dist/kb/folders.js +133 -0
  187. package/dist/kb/folders.js.map +1 -0
  188. package/dist/kb/frontmatter.d.ts +91 -0
  189. package/dist/kb/frontmatter.d.ts.map +1 -0
  190. package/dist/kb/frontmatter.js +274 -0
  191. package/dist/kb/frontmatter.js.map +1 -0
  192. package/dist/kb/line-facts.d.ts +29 -0
  193. package/dist/kb/line-facts.d.ts.map +1 -0
  194. package/dist/kb/line-facts.js +23 -0
  195. package/dist/kb/line-facts.js.map +1 -0
  196. package/dist/kb/page.d.ts +92 -0
  197. package/dist/kb/page.d.ts.map +1 -0
  198. package/dist/kb/page.js +243 -0
  199. package/dist/kb/page.js.map +1 -0
  200. package/dist/kb/scan.d.ts +38 -0
  201. package/dist/kb/scan.d.ts.map +1 -0
  202. package/dist/kb/scan.js +109 -0
  203. package/dist/kb/scan.js.map +1 -0
  204. package/dist/kb/words.d.ts +30 -0
  205. package/dist/kb/words.d.ts.map +1 -0
  206. package/dist/kb/words.js +107 -0
  207. package/dist/kb/words.js.map +1 -0
  208. package/dist/maintenance/adopt.d.ts +65 -0
  209. package/dist/maintenance/adopt.d.ts.map +1 -0
  210. package/dist/maintenance/adopt.js +238 -0
  211. package/dist/maintenance/adopt.js.map +1 -0
  212. package/dist/maintenance/budget.d.ts +55 -0
  213. package/dist/maintenance/budget.d.ts.map +1 -0
  214. package/dist/maintenance/budget.js +61 -0
  215. package/dist/maintenance/budget.js.map +1 -0
  216. package/dist/maintenance/conflicts.d.ts +105 -0
  217. package/dist/maintenance/conflicts.d.ts.map +1 -0
  218. package/dist/maintenance/conflicts.js +368 -0
  219. package/dist/maintenance/conflicts.js.map +1 -0
  220. package/dist/maintenance/contradictions.d.ts +34 -0
  221. package/dist/maintenance/contradictions.d.ts.map +1 -0
  222. package/dist/maintenance/contradictions.js +199 -0
  223. package/dist/maintenance/contradictions.js.map +1 -0
  224. package/dist/maintenance/curate.d.ts +156 -0
  225. package/dist/maintenance/curate.d.ts.map +1 -0
  226. package/dist/maintenance/curate.js +2070 -0
  227. package/dist/maintenance/curate.js.map +1 -0
  228. package/dist/maintenance/dream.d.ts +139 -0
  229. package/dist/maintenance/dream.d.ts.map +1 -0
  230. package/dist/maintenance/dream.js +1632 -0
  231. package/dist/maintenance/dream.js.map +1 -0
  232. package/dist/maintenance/graph-candidates.d.ts +19 -0
  233. package/dist/maintenance/graph-candidates.d.ts.map +1 -0
  234. package/dist/maintenance/graph-candidates.js +120 -0
  235. package/dist/maintenance/graph-candidates.js.map +1 -0
  236. package/dist/maintenance/housekeeping.d.ts +81 -0
  237. package/dist/maintenance/housekeeping.d.ts.map +1 -0
  238. package/dist/maintenance/housekeeping.js +281 -0
  239. package/dist/maintenance/housekeeping.js.map +1 -0
  240. package/dist/maintenance/link-repairs.d.ts +58 -0
  241. package/dist/maintenance/link-repairs.d.ts.map +1 -0
  242. package/dist/maintenance/link-repairs.js +281 -0
  243. package/dist/maintenance/link-repairs.js.map +1 -0
  244. package/dist/maintenance/log.d.ts +41 -0
  245. package/dist/maintenance/log.d.ts.map +1 -0
  246. package/dist/maintenance/log.js +72 -0
  247. package/dist/maintenance/log.js.map +1 -0
  248. package/dist/maintenance/managed-item-routing.d.ts +48 -0
  249. package/dist/maintenance/managed-item-routing.d.ts.map +1 -0
  250. package/dist/maintenance/managed-item-routing.js +281 -0
  251. package/dist/maintenance/managed-item-routing.js.map +1 -0
  252. package/dist/maintenance/managed-item-sources.d.ts +38 -0
  253. package/dist/maintenance/managed-item-sources.d.ts.map +1 -0
  254. package/dist/maintenance/managed-item-sources.js +324 -0
  255. package/dist/maintenance/managed-item-sources.js.map +1 -0
  256. package/dist/maintenance/managed-items.d.ts +162 -0
  257. package/dist/maintenance/managed-items.d.ts.map +1 -0
  258. package/dist/maintenance/managed-items.js +1329 -0
  259. package/dist/maintenance/managed-items.js.map +1 -0
  260. package/dist/maintenance/merge-classifier.d.ts +19 -0
  261. package/dist/maintenance/merge-classifier.d.ts.map +1 -0
  262. package/dist/maintenance/merge-classifier.js +49 -0
  263. package/dist/maintenance/merge-classifier.js.map +1 -0
  264. package/dist/maintenance/model-telemetry.d.ts +45 -0
  265. package/dist/maintenance/model-telemetry.d.ts.map +1 -0
  266. package/dist/maintenance/model-telemetry.js +107 -0
  267. package/dist/maintenance/model-telemetry.js.map +1 -0
  268. package/dist/maintenance/observe.d.ts +72 -0
  269. package/dist/maintenance/observe.d.ts.map +1 -0
  270. package/dist/maintenance/observe.js +265 -0
  271. package/dist/maintenance/observe.js.map +1 -0
  272. package/dist/maintenance/path-policy.d.ts +83 -0
  273. package/dist/maintenance/path-policy.d.ts.map +1 -0
  274. package/dist/maintenance/path-policy.js +360 -0
  275. package/dist/maintenance/path-policy.js.map +1 -0
  276. package/dist/maintenance/plans.d.ts +366 -0
  277. package/dist/maintenance/plans.d.ts.map +1 -0
  278. package/dist/maintenance/plans.js +4060 -0
  279. package/dist/maintenance/plans.js.map +1 -0
  280. package/dist/maintenance/profile.d.ts +33 -0
  281. package/dist/maintenance/profile.d.ts.map +1 -0
  282. package/dist/maintenance/profile.js +99 -0
  283. package/dist/maintenance/profile.js.map +1 -0
  284. package/dist/maintenance/recovery.d.ts +38 -0
  285. package/dist/maintenance/recovery.d.ts.map +1 -0
  286. package/dist/maintenance/recovery.js +217 -0
  287. package/dist/maintenance/recovery.js.map +1 -0
  288. package/dist/maintenance/repair.d.ts +37 -0
  289. package/dist/maintenance/repair.d.ts.map +1 -0
  290. package/dist/maintenance/repair.js +183 -0
  291. package/dist/maintenance/repair.js.map +1 -0
  292. package/dist/maintenance/rule-drift.d.ts +104 -0
  293. package/dist/maintenance/rule-drift.d.ts.map +1 -0
  294. package/dist/maintenance/rule-drift.js +507 -0
  295. package/dist/maintenance/rule-drift.js.map +1 -0
  296. package/dist/maintenance/run-verification.d.ts +44 -0
  297. package/dist/maintenance/run-verification.d.ts.map +1 -0
  298. package/dist/maintenance/run-verification.js +253 -0
  299. package/dist/maintenance/run-verification.js.map +1 -0
  300. package/dist/maintenance/runs.d.ts +142 -0
  301. package/dist/maintenance/runs.d.ts.map +1 -0
  302. package/dist/maintenance/runs.js +439 -0
  303. package/dist/maintenance/runs.js.map +1 -0
  304. package/dist/maintenance/semantic-merge-discovery.d.ts +54 -0
  305. package/dist/maintenance/semantic-merge-discovery.d.ts.map +1 -0
  306. package/dist/maintenance/semantic-merge-discovery.js +308 -0
  307. package/dist/maintenance/semantic-merge-discovery.js.map +1 -0
  308. package/dist/maintenance/temporal.d.ts +44 -0
  309. package/dist/maintenance/temporal.d.ts.map +1 -0
  310. package/dist/maintenance/temporal.js +295 -0
  311. package/dist/maintenance/temporal.js.map +1 -0
  312. package/dist/models/client.d.ts +214 -0
  313. package/dist/models/client.d.ts.map +1 -0
  314. package/dist/models/client.js +904 -0
  315. package/dist/models/client.js.map +1 -0
  316. package/dist/models/provider-api.d.ts +28 -0
  317. package/dist/models/provider-api.d.ts.map +1 -0
  318. package/dist/models/provider-api.js +320 -0
  319. package/dist/models/provider-api.js.map +1 -0
  320. package/dist/open.d.ts +163 -0
  321. package/dist/open.d.ts.map +1 -0
  322. package/dist/open.js +382 -0
  323. package/dist/open.js.map +1 -0
  324. package/dist/ops/adopt.d.ts +12 -0
  325. package/dist/ops/adopt.d.ts.map +1 -0
  326. package/dist/ops/adopt.js +138 -0
  327. package/dist/ops/adopt.js.map +1 -0
  328. package/dist/ops/answer.d.ts +29 -0
  329. package/dist/ops/answer.d.ts.map +1 -0
  330. package/dist/ops/answer.js +557 -0
  331. package/dist/ops/answer.js.map +1 -0
  332. package/dist/ops/context.d.ts +18 -0
  333. package/dist/ops/context.d.ts.map +1 -0
  334. package/dist/ops/context.js +713 -0
  335. package/dist/ops/context.js.map +1 -0
  336. package/dist/ops/folder.d.ts +23 -0
  337. package/dist/ops/folder.d.ts.map +1 -0
  338. package/dist/ops/folder.js +130 -0
  339. package/dist/ops/folder.js.map +1 -0
  340. package/dist/ops/forget.d.ts +14 -0
  341. package/dist/ops/forget.d.ts.map +1 -0
  342. package/dist/ops/forget.js +212 -0
  343. package/dist/ops/forget.js.map +1 -0
  344. package/dist/ops/graph.d.ts +10 -0
  345. package/dist/ops/graph.d.ts.map +1 -0
  346. package/dist/ops/graph.js +480 -0
  347. package/dist/ops/graph.js.map +1 -0
  348. package/dist/ops/ingest.d.ts +40 -0
  349. package/dist/ops/ingest.d.ts.map +1 -0
  350. package/dist/ops/ingest.js +434 -0
  351. package/dist/ops/ingest.js.map +1 -0
  352. package/dist/ops/list.d.ts +9 -0
  353. package/dist/ops/list.d.ts.map +1 -0
  354. package/dist/ops/list.js +217 -0
  355. package/dist/ops/list.js.map +1 -0
  356. package/dist/ops/move.d.ts +20 -0
  357. package/dist/ops/move.d.ts.map +1 -0
  358. package/dist/ops/move.js +173 -0
  359. package/dist/ops/move.js.map +1 -0
  360. package/dist/ops/read.d.ts +9 -0
  361. package/dist/ops/read.d.ts.map +1 -0
  362. package/dist/ops/read.js +271 -0
  363. package/dist/ops/read.js.map +1 -0
  364. package/dist/ops/recall.d.ts +13 -0
  365. package/dist/ops/recall.d.ts.map +1 -0
  366. package/dist/ops/recall.js +297 -0
  367. package/dist/ops/recall.js.map +1 -0
  368. package/dist/ops/remember.d.ts +34 -0
  369. package/dist/ops/remember.d.ts.map +1 -0
  370. package/dist/ops/remember.js +660 -0
  371. package/dist/ops/remember.js.map +1 -0
  372. package/dist/ops/timeline.d.ts +11 -0
  373. package/dist/ops/timeline.d.ts.map +1 -0
  374. package/dist/ops/timeline.js +111 -0
  375. package/dist/ops/timeline.js.map +1 -0
  376. package/dist/ops/undo.d.ts +9 -0
  377. package/dist/ops/undo.d.ts.map +1 -0
  378. package/dist/ops/undo.js +38 -0
  379. package/dist/ops/undo.js.map +1 -0
  380. package/dist/ops/write.d.ts +55 -0
  381. package/dist/ops/write.d.ts.map +1 -0
  382. package/dist/ops/write.js +463 -0
  383. package/dist/ops/write.js.map +1 -0
  384. package/dist/recall/assemble.d.ts +81 -0
  385. package/dist/recall/assemble.d.ts.map +1 -0
  386. package/dist/recall/assemble.js +603 -0
  387. package/dist/recall/assemble.js.map +1 -0
  388. package/dist/recall/expand.d.ts +55 -0
  389. package/dist/recall/expand.d.ts.map +1 -0
  390. package/dist/recall/expand.js +282 -0
  391. package/dist/recall/expand.js.map +1 -0
  392. package/dist/recall/graph-arm.d.ts +17 -0
  393. package/dist/recall/graph-arm.d.ts.map +1 -0
  394. package/dist/recall/graph-arm.js +227 -0
  395. package/dist/recall/graph-arm.js.map +1 -0
  396. package/dist/recall/llm-rerank.d.ts +55 -0
  397. package/dist/recall/llm-rerank.d.ts.map +1 -0
  398. package/dist/recall/llm-rerank.js +213 -0
  399. package/dist/recall/llm-rerank.js.map +1 -0
  400. package/dist/recall/reranker-calibration.d.ts +23 -0
  401. package/dist/recall/reranker-calibration.d.ts.map +1 -0
  402. package/dist/recall/reranker-calibration.js +161 -0
  403. package/dist/recall/reranker-calibration.js.map +1 -0
  404. package/dist/recall/search.d.ts +107 -0
  405. package/dist/recall/search.d.ts.map +1 -0
  406. package/dist/recall/search.js +530 -0
  407. package/dist/recall/search.js.map +1 -0
  408. package/dist/reserved.d.ts +39 -0
  409. package/dist/reserved.d.ts.map +1 -0
  410. package/dist/reserved.js +63 -0
  411. package/dist/reserved.js.map +1 -0
  412. package/dist/rules/compile.d.ts +27 -0
  413. package/dist/rules/compile.d.ts.map +1 -0
  414. package/dist/rules/compile.js +105 -0
  415. package/dist/rules/compile.js.map +1 -0
  416. package/dist/setup/model-free.d.ts +15 -0
  417. package/dist/setup/model-free.d.ts.map +1 -0
  418. package/dist/setup/model-free.js +26 -0
  419. package/dist/setup/model-free.js.map +1 -0
  420. package/dist/setup/openai.d.ts +46 -0
  421. package/dist/setup/openai.d.ts.map +1 -0
  422. package/dist/setup/openai.js +165 -0
  423. package/dist/setup/openai.js.map +1 -0
  424. package/dist/store/db.d.ts +61 -0
  425. package/dist/store/db.d.ts.map +1 -0
  426. package/dist/store/db.js +265 -0
  427. package/dist/store/db.js.map +1 -0
  428. package/dist/store/ids.d.ts +29 -0
  429. package/dist/store/ids.d.ts.map +1 -0
  430. package/dist/store/ids.js +0 -0
  431. package/dist/store/ids.js.map +1 -0
  432. package/dist/store/migrations.d.ts +54 -0
  433. package/dist/store/migrations.d.ts.map +1 -0
  434. package/dist/store/migrations.js +923 -0
  435. package/dist/store/migrations.js.map +1 -0
  436. package/dist/store/vectors.d.ts +34 -0
  437. package/dist/store/vectors.d.ts.map +1 -0
  438. package/dist/store/vectors.js +158 -0
  439. package/dist/store/vectors.js.map +1 -0
  440. package/dist/timeline/documents.d.ts +23 -0
  441. package/dist/timeline/documents.d.ts.map +1 -0
  442. package/dist/timeline/documents.js +262 -0
  443. package/dist/timeline/documents.js.map +1 -0
  444. package/dist/watch/watcher.d.ts +43 -0
  445. package/dist/watch/watcher.d.ts.map +1 -0
  446. package/dist/watch/watcher.js +143 -0
  447. package/dist/watch/watcher.js.map +1 -0
  448. package/dist/write/atomic.d.ts +34 -0
  449. package/dist/write/atomic.d.ts.map +1 -0
  450. package/dist/write/atomic.js +58 -0
  451. package/dist/write/atomic.js.map +1 -0
  452. package/dist/write/conflict.d.ts +43 -0
  453. package/dist/write/conflict.d.ts.map +1 -0
  454. package/dist/write/conflict.js +149 -0
  455. package/dist/write/conflict.js.map +1 -0
  456. package/dist/write/edit.d.ts +59 -0
  457. package/dist/write/edit.d.ts.map +1 -0
  458. package/dist/write/edit.js +231 -0
  459. package/dist/write/edit.js.map +1 -0
  460. package/dist/write/gate.d.ts +59 -0
  461. package/dist/write/gate.d.ts.map +1 -0
  462. package/dist/write/gate.js +99 -0
  463. package/dist/write/gate.js.map +1 -0
  464. package/dist/write/journal.d.ts +90 -0
  465. package/dist/write/journal.d.ts.map +1 -0
  466. package/dist/write/journal.js +187 -0
  467. package/dist/write/journal.js.map +1 -0
  468. package/dist/write/ledger.d.ts +28 -0
  469. package/dist/write/ledger.d.ts.map +1 -0
  470. package/dist/write/ledger.js +141 -0
  471. package/dist/write/ledger.js.map +1 -0
  472. package/dist/write/placement.d.ts +29 -0
  473. package/dist/write/placement.d.ts.map +1 -0
  474. package/dist/write/placement.js +140 -0
  475. package/dist/write/placement.js.map +1 -0
  476. package/dist/write/remember-fallback.d.ts +18 -0
  477. package/dist/write/remember-fallback.d.ts.map +1 -0
  478. package/dist/write/remember-fallback.js +48 -0
  479. package/dist/write/remember-fallback.js.map +1 -0
  480. package/dist/write/retain.d.ts +61 -0
  481. package/dist/write/retain.d.ts.map +1 -0
  482. package/dist/write/retain.js +272 -0
  483. package/dist/write/retain.js.map +1 -0
  484. package/package.json +50 -0
  485. package/swift/extract.swift +232 -0
@@ -0,0 +1,713 @@
1
+ import { ContextInput, } from '@tenphi/akno-protocol';
2
+ import { estimateTokens } from "../recall/assemble.js";
3
+ import { recall } from "./recall.js";
4
+ import { read } from "./read.js";
5
+ import { timeline } from "./timeline.js";
6
+ import { list } from "./list.js";
7
+ /**
8
+ * **One budget, one assembly.** `context` composes the whole pre-turn bundle
9
+ * — pinned pages, recent timeline, structure tree, and this turn's recall —
10
+ * against a single budget. Separate injections with separate budgets overrun
11
+ * together.
12
+ *
13
+ * Why this matters: with the bundle assembled, a turn like "when does
14
+ * the car insurance renew?" costs **zero tool calls**, and the assistant cannot
15
+ * invent the date because every line it was handed says which file and which line
16
+ * it came from.
17
+ */
18
+ export async function context(ctx, rawInput) {
19
+ const input = ContextInput.parse(rawInput);
20
+ if (input.profile === 'auto_recall') {
21
+ return autoRecallContext(ctx, { ...input, profile: 'auto_recall', query: input.query });
22
+ }
23
+ const budget = input.budget ?? 20_000;
24
+ let remaining = budget;
25
+ const degraded = new Set();
26
+ let droppedPinned = 0;
27
+ const droppedResults = 0;
28
+ let droppedTimeline = 0;
29
+ // ── Pinned pages first ───────────────────────────────────────────────────
30
+ // They were pinned precisely so they do not have to compete for room.
31
+ const pinned = [];
32
+ for (const slug of input.pinned ?? []) {
33
+ try {
34
+ const result = await read(ctx, { slug });
35
+ if (!result.page)
36
+ continue;
37
+ const card = cardFromPage(result.page);
38
+ const cost = estimateTokens(card);
39
+ if (cost > remaining) {
40
+ droppedPinned++;
41
+ continue;
42
+ }
43
+ pinned.push(card);
44
+ remaining -= cost;
45
+ }
46
+ catch {
47
+ // A pinned page that no longer exists should not fail the whole bundle;
48
+ // the host's pin list is allowed to go stale.
49
+ droppedPinned++;
50
+ }
51
+ }
52
+ // ── Structure outline ────────────────────────────────────────────────────
53
+ let structure;
54
+ if (input.structure !== false) {
55
+ const tree = await list(ctx, { kind: 'tree', depth: 2 });
56
+ if (tree.tree) {
57
+ const cost = Math.ceil(tree.tree.length / 4);
58
+ if (cost <= remaining * 0.15) {
59
+ structure = tree.tree;
60
+ remaining -= cost;
61
+ }
62
+ }
63
+ }
64
+ // ── Recent timeline ──────────────────────────────────────────────────────
65
+ const recentTimeline = [];
66
+ const days = input.timeline_days ?? 90;
67
+ if (days > 0) {
68
+ const since = new Date(Date.now() - days * 86_400_000).toISOString().slice(0, 10);
69
+ const ledger = await timeline(ctx, { since, limit: 60 });
70
+ // The ledger is capped at a fraction of the budget: recent history is
71
+ // context, not the answer, and a long ledger must not crowd out the cards.
72
+ let ledgerBudget = Math.floor(remaining * 0.25);
73
+ for (const [index, entry] of ledger.results.entries()) {
74
+ const content = entry.type === 'event' ? entry.summary : `${entry.path} ${entry.quote ?? ''} ${entry.date_basis}`;
75
+ const cost = Math.ceil((content.length + entry.date.length + 20) / 4);
76
+ if (cost > ledgerBudget) {
77
+ droppedTimeline = ledger.results.length - index;
78
+ break;
79
+ }
80
+ recentTimeline.push(entry);
81
+ ledgerBudget -= cost;
82
+ remaining -= cost;
83
+ }
84
+ for (const reason of ledger.degraded ?? [])
85
+ degraded.add(reason);
86
+ }
87
+ // ── This turn's recall ───────────────────────────────────────────────────
88
+ let results = [];
89
+ let searched = [];
90
+ let coverage;
91
+ let qualification;
92
+ if (input.query) {
93
+ const pinnedSlugs = new Set(pinned.map((card) => card.slug));
94
+ const result = await recall(ctx, {
95
+ query: input.query,
96
+ budget: remaining,
97
+ ...(input.mode ? { mode: input.mode } : {}),
98
+ ...(input.include ? { include: input.include } : {}),
99
+ ...(input.filter ? { filter: input.filter } : {}),
100
+ });
101
+ searched = result.searched;
102
+ if (result.coverage)
103
+ coverage = result.coverage;
104
+ if (result.qualification)
105
+ qualification = result.qualification;
106
+ for (const reason of result.degraded ?? [])
107
+ degraded.add(reason);
108
+ // A pinned page already in the bundle must not be returned twice.
109
+ results = result.results.filter((entry) => entry.type === 'document' || !pinnedSlugs.has(entry.slug));
110
+ remaining -= result.budget_used;
111
+ }
112
+ const budgetUsed = budget - Math.max(0, remaining);
113
+ const anyDropped = droppedPinned > 0 || droppedResults > 0 || droppedTimeline > 0;
114
+ const unavailableTimelineOnly = results.length === 0 &&
115
+ pinned.length === 0 &&
116
+ recentTimeline.length > 0 &&
117
+ recentTimeline.every((entry) => entry.type === 'document_evidence' && entry.availability.status === 'unavailable');
118
+ return {
119
+ status: unavailableTimelineOnly
120
+ ? 'unavailable'
121
+ : degraded.size > 0
122
+ ? 'degraded'
123
+ : results.length === 0 && pinned.length === 0 && recentTimeline.length === 0
124
+ ? 'empty'
125
+ : 'ok',
126
+ profile: 'default',
127
+ ...(!unavailableTimelineOnly && degraded.size > 0 ? { degraded: [...degraded] } : {}),
128
+ ...(unavailableTimelineOnly
129
+ ? { note: 'recent document date metadata remains, but no readable source copy is available' }
130
+ : {}),
131
+ pinned,
132
+ results,
133
+ timeline: recentTimeline,
134
+ ...(structure ? { structure } : {}),
135
+ searched,
136
+ ...(coverage ? { coverage } : {}),
137
+ ...(qualification ? { qualification } : {}),
138
+ budget_used: budgetUsed,
139
+ // Default to visible. A silent trim reads as "that's everything".
140
+ ...(anyDropped
141
+ ? { dropped: { pinned: droppedPinned, results: droppedResults, timeline: droppedTimeline } }
142
+ : {}),
143
+ };
144
+ }
145
+ export const AUTO_RECALL_POLICY_VERSION = 'auto-recall-v1';
146
+ export const AUTO_RECALL_SEMANTIC_THRESHOLD = 0.9;
147
+ // Auto-injection needs a substantially stronger boundary than explicit recall. On the invented development
148
+ // corpus, calibrated native scores for topical-but-non-answering pages reached 0.9728 while direct support
149
+ // reached 0.9999. Freezing 0.99 keeps that measured separation; the held-out gate checks it independently.
150
+ export const AUTO_RECALL_NATIVE_QUALIFICATION_THRESHOLD = 0.99;
151
+ const AUTO_RECALL_DUAL_ARM_THRESHOLD = 0.85;
152
+ const AUTO_RECALL_DEFAULT_BUDGET = 1200;
153
+ const AUTO_RECALL_CANDIDATE_LIMIT = 8;
154
+ const AUTO_RECALL_CANDIDATE_BUDGET = 6000;
155
+ const AUTO_RECALL_MAX_RESULTS = 3;
156
+ /**
157
+ * Precision-first evidence for a host turn. Unlike broad context, this profile never adds
158
+ * ambient structure, timeline entries, pins, or generated prose. It first performs cheap
159
+ * retrieval without reranking. Strong deterministic evidence can be returned immediately;
160
+ * only a plausible ambiguous boundary pays for model qualification.
161
+ */
162
+ async function autoRecallContext(ctx, input) {
163
+ const budget = input.budget ?? AUTO_RECALL_DEFAULT_BUDGET;
164
+ const resolutionContext = referenceContext(input.query, input.conversation_context ?? []);
165
+ const retrievalQuery = resolutionContext ? `${input.query}\n${resolutionContext}` : input.query;
166
+ const recallInput = {
167
+ query: retrievalQuery,
168
+ mode: input.mode ?? 'lookup',
169
+ depth: 'lines',
170
+ limit: AUTO_RECALL_CANDIDATE_LIMIT,
171
+ budget: AUTO_RECALL_CANDIDATE_BUDGET,
172
+ expand: false,
173
+ graph: false,
174
+ ...(input.include ? { include: input.include } : {}),
175
+ ...(input.filter ? { filter: input.filter } : {}),
176
+ };
177
+ const initial = await recall(ctx, { ...recallInput, rerank: false });
178
+ if (initial.status === 'unavailable') {
179
+ return emptyAutoRecall({
180
+ status: 'unavailable',
181
+ budget,
182
+ searched: [input.query],
183
+ candidates: 0,
184
+ degraded: initial.degraded,
185
+ note: initial.note ?? 'memory evidence could not be read',
186
+ });
187
+ }
188
+ const degraded = new Set(initial.degraded ?? []);
189
+ const signals = initial.results.map((result) => activationSignal(result, input.query, resolutionContext));
190
+ const mechanicalCompoundConflict = hasMechanicalCompoundConflict(signals, input.query);
191
+ const complementary = complementaryCompoundSignals(signals, input.query);
192
+ if (complementary.length > 0) {
193
+ return assembledAutoRecall({
194
+ budget,
195
+ searched: [input.query],
196
+ selected: complementary.map((signal) => signal.result),
197
+ candidates: initial.results.length,
198
+ degraded,
199
+ activationBasis: 'exact',
200
+ qualificationRun: false,
201
+ });
202
+ }
203
+ const strongSignals = signals
204
+ .filter((signal) => signal.strong)
205
+ .sort((left, right) => right.strength - left.strength);
206
+ // An exact marker, identity plus supported attribute, or exact phrase is stronger than a nearby
207
+ // semantic duplicate. Once one exists, adding semantic neighbours only increases disclosure.
208
+ const deterministic = (strongSignals.some((signal) => signal.basis === 'exact')
209
+ ? strongSignals.filter((signal) => signal.basis === 'exact')
210
+ : strongSignals).slice(0, AUTO_RECALL_MAX_RESULTS);
211
+ const ambiguousSingularFact = asksForSingularFact(input.query) && deterministic.length > 1;
212
+ const unresolvedMechanicalCompound = requestedMechanicalValueKinds(input.query).length > 1;
213
+ if (deterministic.length > 0 && !ambiguousSingularFact && !unresolvedMechanicalCompound) {
214
+ return assembledAutoRecall({
215
+ budget,
216
+ searched: [input.query],
217
+ selected: deterministic.map((signal) => signal.result),
218
+ candidates: initial.results.length,
219
+ degraded,
220
+ activationBasis: deterministic.some((signal) => signal.basis === 'exact') ? 'exact' : 'semantic',
221
+ qualificationRun: false,
222
+ });
223
+ }
224
+ const plausible = signals.some((signal) => signal.plausible);
225
+ if (!plausible) {
226
+ return emptyAutoRecall({
227
+ status: degraded.size > 0 ? 'degraded' : 'empty',
228
+ budget,
229
+ searched: [input.query],
230
+ candidates: initial.results.length,
231
+ degraded: [...degraded],
232
+ note: 'no memory evidence was strong enough for automatic injection',
233
+ });
234
+ }
235
+ const qualified = await recall(ctx, { ...recallInput, rerank: true });
236
+ for (const reason of qualified.degraded ?? [])
237
+ degraded.add(reason);
238
+ if (qualified.status === 'unavailable') {
239
+ return emptyAutoRecall({
240
+ status: 'unavailable',
241
+ budget,
242
+ searched: [input.query],
243
+ candidates: initial.results.length,
244
+ degraded: [...degraded],
245
+ qualification: qualified.qualification,
246
+ qualificationRun: true,
247
+ note: qualified.note ?? 'memory evidence could not be read during qualification',
248
+ });
249
+ }
250
+ const qualificationApplied = qualified.qualification?.applied === true;
251
+ const minimumRelevance = qualified.qualification?.model === 'llm' ? 2 / 3 : AUTO_RECALL_NATIVE_QUALIFICATION_THRESHOLD;
252
+ const qualifiedSelection = qualificationApplied
253
+ ? qualified.results
254
+ .filter((result) => temporalEvidenceEligible(result, input.query) && (result.relevance ?? 0) >= minimumRelevance)
255
+ .slice(0, AUTO_RECALL_MAX_RESULTS)
256
+ : [];
257
+ const qualifiedComplementary = complementaryCompoundSignals(qualifiedSelection.map((result) => activationSignal(result, input.query, resolutionContext)), input.query);
258
+ const selected = unresolvedMechanicalCompound
259
+ ? mechanicalCompoundConflict
260
+ ? []
261
+ : qualifiedComplementary.map((signal) => signal.result)
262
+ : qualifiedSelection;
263
+ const qualifiedReferenceAmbiguous = asksForSingularFact(input.query) && selected.length > 1;
264
+ if (selected.length === 0 || qualifiedReferenceAmbiguous) {
265
+ return emptyAutoRecall({
266
+ status: degraded.size > 0 ? 'degraded' : 'empty',
267
+ budget,
268
+ searched: [input.query],
269
+ candidates: initial.results.length,
270
+ degraded: [...degraded],
271
+ qualification: qualified.qualification,
272
+ qualificationRun: true,
273
+ note: qualifiedReferenceAmbiguous
274
+ ? 'a singular fact remained ambiguous between multiple sources'
275
+ : qualificationApplied
276
+ ? 'qualification found no evidence strong enough for automatic injection'
277
+ : 'automatic injection requires calibrated qualification for ambiguous evidence',
278
+ });
279
+ }
280
+ return assembledAutoRecall({
281
+ budget,
282
+ searched: [input.query],
283
+ selected,
284
+ candidates: initial.results.length,
285
+ degraded,
286
+ activationBasis: 'qualified',
287
+ qualification: qualified.qualification,
288
+ qualificationRun: true,
289
+ });
290
+ }
291
+ function emptyAutoRecall(options) {
292
+ return {
293
+ status: options.status,
294
+ ...(options.status === 'degraded' && options.degraded?.length ? { degraded: options.degraded } : {}),
295
+ note: options.note,
296
+ profile: 'auto_recall',
297
+ activation: {
298
+ activated: false,
299
+ basis: 'none',
300
+ candidates: options.candidates,
301
+ selected: 0,
302
+ qualification_run: options.qualificationRun ?? false,
303
+ },
304
+ pinned: [],
305
+ results: [],
306
+ timeline: [],
307
+ searched: options.searched,
308
+ ...(options.qualification ? { qualification: options.qualification } : {}),
309
+ budget_used: 0,
310
+ };
311
+ }
312
+ function assembledAutoRecall(options) {
313
+ const fitted = fitAutoRecallResults(options.selected, options.budget);
314
+ const reasons = [...options.degraded];
315
+ const activated = fitted.results.length > 0;
316
+ const dropped = options.selected.length - fitted.results.length;
317
+ return {
318
+ status: reasons.length > 0 ? 'degraded' : activated ? 'ok' : 'empty',
319
+ ...(reasons.length > 0 ? { degraded: reasons } : {}),
320
+ ...(!activated ? { note: 'relevant evidence could not fit the requested context budget' } : {}),
321
+ profile: 'auto_recall',
322
+ activation: {
323
+ activated,
324
+ basis: activated ? options.activationBasis : 'none',
325
+ candidates: options.candidates,
326
+ selected: fitted.results.length,
327
+ qualification_run: options.qualificationRun,
328
+ },
329
+ pinned: [],
330
+ results: fitted.results,
331
+ timeline: [],
332
+ searched: options.searched,
333
+ ...(options.qualification ? { qualification: options.qualification } : {}),
334
+ budget_used: fitted.budgetUsed,
335
+ ...(dropped > 0 ? { dropped: { pinned: 0, results: dropped, timeline: 0 } } : {}),
336
+ };
337
+ }
338
+ /**
339
+ * A compound answer may legitimately live on separate pages. Admit that set without lowering the global
340
+ * qualifier threshold only when the decision is mechanical: every requested value class has exactly one
341
+ * source, every source states an explicit value, and every source contains the same non-field subject tokens.
342
+ * Two candidates for one field are a conflict and therefore produce no deterministic set.
343
+ */
344
+ function complementaryCompoundSignals(signals, query) {
345
+ const kinds = requestedMechanicalValueKinds(query);
346
+ if (kinds.length < 2)
347
+ return [];
348
+ const eligible = mechanicalCompoundCandidates(signals, query);
349
+ const selected = [];
350
+ for (const kind of kinds) {
351
+ const matches = eligible.filter((signal) => evidenceSupportsMechanicalKind(evidenceText(signal.result), kind));
352
+ if (matches.length !== 1)
353
+ return [];
354
+ selected.push(matches[0]);
355
+ }
356
+ return [...new Map(selected.map((signal) => [resultIdentity(signal.result), signal])).values()].slice(0, AUTO_RECALL_MAX_RESULTS);
357
+ }
358
+ function hasMechanicalCompoundConflict(signals, query) {
359
+ const kinds = requestedMechanicalValueKinds(query);
360
+ if (kinds.length < 2)
361
+ return false;
362
+ const eligible = mechanicalCompoundCandidates(signals, query);
363
+ return kinds.some((kind) => eligible.filter((signal) => evidenceSupportsMechanicalKind(evidenceText(signal.result), kind)).length >
364
+ 1);
365
+ }
366
+ function mechanicalCompoundCandidates(signals, query) {
367
+ const subjectTokens = meaningfulTokens(query).filter((token) => !COMPOUND_FIELD_TOKENS.has(token));
368
+ if (subjectTokens.length === 0)
369
+ return [];
370
+ return signals.filter((signal) => signal.plausible &&
371
+ temporalEvidenceEligible(signal.result, query) &&
372
+ overlapRatio(subjectTokens, evidenceText(signal.result)) === 1);
373
+ }
374
+ function activationSignal(result, query, resolutionContext) {
375
+ const evidence = evidenceText(result);
376
+ const queryTokens = meaningfulTokens(query);
377
+ const contextTokens = meaningfulTokens(resolutionContext ?? '');
378
+ const overlap = overlapRatio(queryTokens, evidence);
379
+ const contextOverlap = overlapRatio(contextTokens, evidence);
380
+ const identities = result.type === 'page'
381
+ ? [result.title, result.slug.split('/').at(-1)?.replaceAll('-', ' ') ?? '']
382
+ : [
383
+ result.label,
384
+ result.path
385
+ .split('/')
386
+ .at(-1)
387
+ ?.replace(/\.[^.]+$/, '')
388
+ .replaceAll('-', ' ') ?? '',
389
+ ];
390
+ const promptHaystack = normalize(`${query} ${resolutionContext ?? ''}`);
391
+ const matchedIdentityTokens = identities.flatMap((identity) => {
392
+ const normalized = normalize(identity);
393
+ const tokens = meaningfulTokens(identity);
394
+ return tokens.length >= 2 && promptHaystack.includes(normalized) ? [tokens] : [];
395
+ });
396
+ const identityResidual = matchedIdentityTokens
397
+ .map((identityTokens) => queryTokens.filter((token) => !identityTokens.includes(token)))
398
+ .sort((left, right) => left.length - right.length)[0];
399
+ const identityRelationSupported = identityResidual !== undefined &&
400
+ (identityResidual.length === 0 || overlapRatio(identityResidual, evidence) === 1);
401
+ const exactEvidence = queryTokens.length >= 2 && overlap === 1;
402
+ const resolvedIdentity = Boolean(resolutionContext) &&
403
+ identities.some((identity) => {
404
+ const normalized = normalize(identity);
405
+ return (meaningfulTokens(identity).length >= 2 && normalize(resolutionContext ?? '').includes(normalized));
406
+ });
407
+ const semantic = result.relevance ?? 0;
408
+ const temporallyEligible = temporalEvidenceEligible(result, query);
409
+ // A topical page can repeat the requested field without containing its value: “the price record was
410
+ // reviewed” is not the price. Mechanical numeric and duration questions therefore need an explicit value
411
+ // before lexical overlap may bypass qualification. The qualifier handles less mechanical attribute/value
412
+ // boundaries.
413
+ const requestedValueMissing = (asksForNumericValue(query) && !containsExplicitNumericValue(evidence)) ||
414
+ (asksForDurationValue(query) && !containsExplicitDurationValue(evidence));
415
+ const semanticRelationSupported = identityResidual === undefined || identityRelationSupported;
416
+ const strongSemantic = !requestedValueMissing &&
417
+ semantic >= AUTO_RECALL_SEMANTIC_THRESHOLD &&
418
+ overlap >= 0.5 &&
419
+ semanticRelationSupported;
420
+ const dualArmSemantic = !requestedValueMissing &&
421
+ semantic >= AUTO_RECALL_DUAL_ARM_THRESHOLD &&
422
+ overlap >= 0.5 &&
423
+ semanticRelationSupported &&
424
+ result.matched_by?.includes('lexical') === true &&
425
+ result.matched_by.includes('vector');
426
+ const exact = !requestedValueMissing &&
427
+ (identityRelationSupported || exactEvidence || (resolvedIdentity && overlap > 0));
428
+ const strong = temporallyEligible && (exact || strongSemantic || dualArmSemantic);
429
+ const plausible = temporallyEligible && (strong || overlap > 0 || contextOverlap > 0 || semantic >= 0.45);
430
+ return {
431
+ result,
432
+ basis: exact ? 'exact' : 'semantic',
433
+ strength: exact ? 2 + Math.max(overlap, contextOverlap) : semantic + overlap,
434
+ strong,
435
+ plausible,
436
+ };
437
+ }
438
+ /** The recent turns are not a second query. They are admitted only when the current prompt has a local
439
+ * reference to resolve, and even then only the last 1,000 characters are allowed into retrieval. */
440
+ function referenceContext(query, turns) {
441
+ if (turns.length === 0 || !hasLocalReference(query))
442
+ return null;
443
+ const recent = turns
444
+ .slice(-2)
445
+ .map((turn) => turn.content.trim())
446
+ .filter(Boolean)
447
+ .join('\n');
448
+ if (!recent)
449
+ return null;
450
+ return recent.slice(-1000);
451
+ }
452
+ function hasLocalReference(query) {
453
+ return (/\b(it|its|that|this|they|them|those|these|one|other|former|latter|same)\b/i.test(query) ||
454
+ /\b(what|how) about\b/i.test(query));
455
+ }
456
+ function hasSingularReference(query) {
457
+ return /\b(it|its|that|this|one|other|former|latter|same)\b/i.test(query);
458
+ }
459
+ function asksForSingularFact(query) {
460
+ if (/\b(and|both|compare|list)\b/i.test(query) || /\bwhat are\b/i.test(query))
461
+ return false;
462
+ return (hasSingularReference(query) ||
463
+ /\bwhat (?:is|was)\b/i.test(query) ||
464
+ /\bwhen (?:does|did|is|was)\b/i.test(query) ||
465
+ /\bhow (?:long|often|much|many)\b/i.test(query) ||
466
+ /\bdoes\b/i.test(query));
467
+ }
468
+ function asksForNumericValue(query) {
469
+ return /\b(price|cost|fee|amount|total|balance|rate)\b/i.test(query);
470
+ }
471
+ function asksForDurationValue(query) {
472
+ return /\bhow (?:long|often)\b/i.test(query);
473
+ }
474
+ function containsExplicitNumericValue(evidence) {
475
+ return /(?:[$€£¥]\s*\d|\b\d+(?:[.,]\d+)?\s*(?:eur|usd|gbp|jpy|%|percent)\b)/i.test(evidence);
476
+ }
477
+ function containsExplicitDurationValue(evidence) {
478
+ return /\b(?:(?:\d+(?:[.,]\d+)?)|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)[ -](?:minute|hour|day|week|month|year)s?\b|\b(?:hourly|daily|weekly|monthly|quarterly|annually|yearly|twice a year)\b/i.test(evidence);
479
+ }
480
+ const COMPOUND_FIELD_TOKENS = new Set([
481
+ 'amount',
482
+ 'balance',
483
+ 'cost',
484
+ 'date',
485
+ 'deadline',
486
+ 'due',
487
+ 'duration',
488
+ 'fee',
489
+ 'interval',
490
+ 'next',
491
+ 'price',
492
+ 'rate',
493
+ 'renewal',
494
+ 'total',
495
+ ]);
496
+ function requestedMechanicalValueKinds(query) {
497
+ const kinds = [];
498
+ if (/\b(price|cost|fee|amount|total|balance)\b/i.test(query))
499
+ kinds.push('money');
500
+ if (/\b(date|deadline)\b/i.test(query))
501
+ kinds.push('date');
502
+ if (/\b(duration|interval|cadence)\b/i.test(query) || /\bhow (?:long|often)\b/i.test(query))
503
+ kinds.push('duration');
504
+ return kinds;
505
+ }
506
+ function evidenceSupportsMechanicalKind(evidence, kind) {
507
+ if (kind === 'money')
508
+ return containsExplicitNumericValue(evidence);
509
+ if (kind === 'duration')
510
+ return containsExplicitDurationValue(evidence);
511
+ return containsExplicitDateValue(evidence);
512
+ }
513
+ function containsExplicitDateValue(evidence) {
514
+ return /\b(?:\d{4}-\d{2}-\d{2}|\d{1,2}[/.]\d{1,2}[/.]\d{2,4}|\d{1,2}\s+(?:january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{4}|(?:january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{1,2},?\s+\d{4})\b/i.test(evidence);
515
+ }
516
+ function resultIdentity(result) {
517
+ return result.type === 'page' ? `page:${result.slug}` : `document:${result.id}`;
518
+ }
519
+ function temporalEvidenceEligible(result, query) {
520
+ if (!/\b(current|active|latest)\b/i.test(query))
521
+ return true;
522
+ if (result.type === 'page' && result.superseded)
523
+ return false;
524
+ const evidence = evidenceText(result);
525
+ const stale = /(?:^|\s)(?:the\s+)?(?:old|former|archived|superseded)\s+/im.test(evidence);
526
+ const fresh = /(?:^|\s)(?:the\s+)?(?:current|active|latest)\s+/im.test(evidence);
527
+ return !stale || fresh;
528
+ }
529
+ const AUTO_RECALL_STOPWORDS = new Set([
530
+ 'about',
531
+ 'again',
532
+ 'also',
533
+ 'and',
534
+ 'are',
535
+ 'can',
536
+ 'could',
537
+ 'does',
538
+ 'for',
539
+ 'from',
540
+ 'have',
541
+ 'how',
542
+ 'into',
543
+ 'its',
544
+ 'long',
545
+ 'many',
546
+ 'memory',
547
+ 'much',
548
+ 'often',
549
+ 'under',
550
+ 'please',
551
+ 'remember',
552
+ 'tell',
553
+ 'that',
554
+ 'the',
555
+ 'their',
556
+ 'them',
557
+ 'there',
558
+ 'these',
559
+ 'they',
560
+ 'this',
561
+ 'those',
562
+ 'was',
563
+ 'what',
564
+ 'when',
565
+ 'where',
566
+ 'which',
567
+ 'who',
568
+ 'why',
569
+ 'with',
570
+ 'would',
571
+ 'you',
572
+ ]);
573
+ function meaningfulTokens(text) {
574
+ return [
575
+ ...new Set(normalize(text)
576
+ .split(' ')
577
+ .filter((token) => token.length > 2 && !AUTO_RECALL_STOPWORDS.has(token))
578
+ .map(autoRecallRoot)),
579
+ ];
580
+ }
581
+ function normalize(text) {
582
+ return text
583
+ .toLowerCase()
584
+ .replace(/[^\p{L}\p{N}]+/gu, ' ')
585
+ .trim();
586
+ }
587
+ function overlapRatio(tokens, evidence) {
588
+ if (tokens.length === 0)
589
+ return 0;
590
+ const haystack = new Set(normalize(evidence).split(' ').map(autoRecallRoot));
591
+ return tokens.filter((token) => haystack.has(token)).length / tokens.length;
592
+ }
593
+ function autoRecallRoot(token) {
594
+ if (token.length > 5 && token.endsWith('ies'))
595
+ return token.slice(0, -3);
596
+ if (token.length > 4 && token.endsWith('es'))
597
+ return token.slice(0, -2);
598
+ if (token.length > 3 && token.endsWith('s') && !token.endsWith('ss'))
599
+ return token.slice(0, -1);
600
+ return token;
601
+ }
602
+ function evidenceText(result) {
603
+ if (result.type === 'document')
604
+ return `${result.path} ${result.label} ${result.quote ?? ''}`;
605
+ return `${result.slug} ${result.title} ${result.breadcrumb ?? ''} ${result.lines.map((line) => line.text).join(' ')}`;
606
+ }
607
+ function fitAutoRecallResults(selected, budget) {
608
+ const results = [];
609
+ let budgetUsed = 0;
610
+ for (const raw of selected) {
611
+ const remaining = budget - budgetUsed;
612
+ if (remaining <= 0)
613
+ break;
614
+ const result = fitAutoRecallResult(sanitizeAutoRecallResult(raw), remaining);
615
+ if (!result)
616
+ continue;
617
+ const cost = estimateTokens(result);
618
+ if (cost > remaining)
619
+ continue;
620
+ results.push(result);
621
+ budgetUsed += cost;
622
+ }
623
+ return { results, budgetUsed };
624
+ }
625
+ /** Clip only at exact line/quote boundaries. Auto-recall never asks a model to summarize evidence to fit. */
626
+ function fitAutoRecallResult(result, budget) {
627
+ if (estimateTokens(result) <= budget && hasExactEvidence(result))
628
+ return result;
629
+ if (result.type === 'document') {
630
+ const lines = result.quote?.split('\n') ?? [];
631
+ let fitted = null;
632
+ for (const line of lines) {
633
+ const quote = fitted ? `${fitted.quote ?? ''}\n${line}`.trim() : line;
634
+ const candidate = { ...result, quote };
635
+ if (estimateTokens(candidate) > budget)
636
+ break;
637
+ fitted = candidate;
638
+ }
639
+ return fitted;
640
+ }
641
+ let fittedLines = [];
642
+ let fittedDocuments = [];
643
+ let fitted = null;
644
+ for (const line of result.lines) {
645
+ const candidate = { ...result, lines: fittedLines.concat(line), documents: fittedDocuments };
646
+ if (estimateTokens(candidate) > budget)
647
+ break;
648
+ fittedLines = candidate.lines;
649
+ fitted = candidate;
650
+ }
651
+ for (const document of result.documents ?? []) {
652
+ if (!document.quote)
653
+ continue;
654
+ const quoteLines = document.quote.split('\n');
655
+ let clipped = { ...document, quote: '' };
656
+ for (const line of quoteLines) {
657
+ const candidateDocument = { ...clipped, quote: `${clipped.quote}\n${line}`.trim() };
658
+ const candidate = {
659
+ ...result,
660
+ lines: fittedLines,
661
+ documents: fittedDocuments.concat(candidateDocument),
662
+ };
663
+ if (estimateTokens(candidate) > budget)
664
+ break;
665
+ clipped = candidateDocument;
666
+ fitted = candidate;
667
+ }
668
+ if (clipped.quote)
669
+ fittedDocuments = fittedDocuments.concat(clipped);
670
+ }
671
+ return fitted;
672
+ }
673
+ function sanitizeAutoRecallResult(result) {
674
+ if (result.type === 'document') {
675
+ const { summary: _summary, graph_paths: _graphPaths, suggested_actions: _actions, ...exact } = result;
676
+ return exact;
677
+ }
678
+ const { links: _links, summary: _summary, superseded: _superseded, graph_paths: _graphPaths, documents, ...exact } = result;
679
+ return {
680
+ ...exact,
681
+ summary: null,
682
+ ...(documents?.some((document) => document.quote)
683
+ ? {
684
+ documents: documents
685
+ .filter((document) => document.quote)
686
+ .map(({ summary: _documentSummary, ...document }) => document),
687
+ }
688
+ : {}),
689
+ };
690
+ }
691
+ function hasExactEvidence(result) {
692
+ return result.type === 'document'
693
+ ? Boolean(result.quote?.trim())
694
+ : result.lines.length > 0 ||
695
+ result.documents?.some((document) => Boolean(document.quote?.trim())) === true;
696
+ }
697
+ /** A pinned page is delivered in the same card shape as a recalled one, so the
698
+ * host has one thing to render and the model one thing to read. */
699
+ function cardFromPage(page) {
700
+ return {
701
+ slug: page.slug,
702
+ title: page.title,
703
+ role: page.role,
704
+ summary: page.summary,
705
+ score: 1,
706
+ lines: page.lines.filter((line) => line.text.trim().length > 0),
707
+ ...(page.superseded ? { superseded: page.superseded } : {}),
708
+ ...(page.links.length > 0 ? { links: page.links } : {}),
709
+ ...(page.documents ? { documents: page.documents } : {}),
710
+ ...(page.updated ? { updated: page.updated } : {}),
711
+ };
712
+ }
713
+ //# sourceMappingURL=context.js.map