@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,308 @@
1
+ import fsp from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { parsePage } from "../kb/page.js";
4
+ import { sha256 } from "../store/ids.js";
5
+ import { judgeSemanticMergeCandidate, SEMANTIC_MERGE_MAX_PAGE_CHARS, SEMANTIC_MERGE_EMBEDDING_VERSION, SEMANTIC_MERGE_PREFILTER_THRESHOLD, SEMANTIC_MERGE_PROMPT_VERSION, SEMANTIC_MERGE_SIGNATURE_VERSION, } from "./merge-classifier.js";
6
+ /**
7
+ * Similarity creates a bounded queue; only the strict classifier can emit a candidate. Exact
8
+ * content/model/prompt fingerprints cache both outcomes without retaining text or rationale.
9
+ */
10
+ export async function discoverSemanticMergeCandidates(ctx, sources, options) {
11
+ const metrics = emptySemanticMergeDiscoveryMetrics(sources.length);
12
+ const empty = () => ({
13
+ pairs: [],
14
+ degraded: [],
15
+ warnings: [],
16
+ metrics,
17
+ });
18
+ if (sources.length < 2 || options.candidateLimit <= 0)
19
+ return empty();
20
+ if (!ctx.models.embedding.available) {
21
+ return {
22
+ ...empty(),
23
+ degraded: [{ reason: 'no_embedding_model', failure: 'unavailable' }],
24
+ };
25
+ }
26
+ if (!ctx.models.derive.available) {
27
+ return {
28
+ ...empty(),
29
+ degraded: [{ reason: 'no_derive_model', failure: 'unavailable' }],
30
+ };
31
+ }
32
+ const embeddingEndpoint = ctx.models.embedding.endpointFingerprint;
33
+ const prepared = [];
34
+ let oversize = 0;
35
+ let unreadable = 0;
36
+ for (const source of sources) {
37
+ if (source.bytes > SEMANTIC_MERGE_MAX_PAGE_CHARS * 4) {
38
+ oversize++;
39
+ continue;
40
+ }
41
+ const content = await fsp
42
+ .readFile(path.join(ctx.config.aknoPath, source.relPath), 'utf8')
43
+ .catch(() => null);
44
+ if (content === null) {
45
+ unreadable++;
46
+ continue;
47
+ }
48
+ const parsed = parsePage(source.relPath, content);
49
+ const body = parsed.body.trim();
50
+ if (body.length === 0 || body.length > SEMANTIC_MERGE_MAX_PAGE_CHARS) {
51
+ oversize++;
52
+ continue;
53
+ }
54
+ const embeddingText = /^#\s+/m.test(body) ? body : `# ${source.title}\n\n${body}`;
55
+ const modelPage = { slug: source.slug, title: source.title, content: body };
56
+ const sourceHash = sha256(embeddingText);
57
+ prepared.push({
58
+ source,
59
+ embeddingText,
60
+ embeddingFingerprint: embeddingFingerprint(source.id, sourceHash, embeddingEndpoint),
61
+ semanticInputHash: sha256(JSON.stringify(modelPage)),
62
+ modelPage,
63
+ });
64
+ }
65
+ metrics.pagesPrepared = prepared.length;
66
+ metrics.pagesSkipped = oversize + unreadable;
67
+ const warnings = [
68
+ ...(oversize > 0
69
+ ? [
70
+ `semantic merge discovery skipped ${oversize} page(s) outside the ${SEMANTIC_MERGE_MAX_PAGE_CHARS}-character complete-page limit`,
71
+ ]
72
+ : []),
73
+ ...(unreadable > 0 ? [`semantic merge discovery could not read ${unreadable} eligible page(s)`] : []),
74
+ ];
75
+ if (prepared.length < 2)
76
+ return { ...empty(), warnings };
77
+ const vectors = new Array(prepared.length);
78
+ const missingIndexes = [];
79
+ const readEmbedding = ctx.store.db.prepare('SELECT dimensions, embedding FROM semantic_merge_embeddings WHERE fingerprint = ?');
80
+ const expectedDimensions = ctx.config.models.embedding.dimensions ?? ctx.store.vectors.dimensions;
81
+ for (const [index, entry] of prepared.entries()) {
82
+ const cached = readEmbedding.get(entry.embeddingFingerprint);
83
+ const vector = cached ? decodeEmbedding(cached, expectedDimensions) : null;
84
+ if (vector) {
85
+ vectors[index] = vector;
86
+ metrics.embeddingCacheHits++;
87
+ }
88
+ else {
89
+ missingIndexes.push(index);
90
+ }
91
+ }
92
+ metrics.embeddingInputs = missingIndexes.length;
93
+ const batchSize = Math.max(1, ctx.config.models.embedding.batch ?? 32);
94
+ const writeEmbedding = ctx.store.readOnly
95
+ ? null
96
+ : ctx.store.db.prepare(`INSERT OR REPLACE INTO semantic_merge_embeddings(
97
+ fingerprint, page_id, source_hash, embedding_endpoint, signature_version,
98
+ dimensions, embedding, created_at
99
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
100
+ const deleteStaleEmbedding = ctx.store.readOnly
101
+ ? null
102
+ : ctx.store.db.prepare('DELETE FROM semantic_merge_embeddings WHERE page_id = ? AND fingerprint != ?');
103
+ for (let offset = 0; offset < missingIndexes.length; offset += batchSize) {
104
+ const batchIndexes = missingIndexes.slice(offset, offset + batchSize);
105
+ const batch = batchIndexes.map((index) => prepared[index]);
106
+ metrics.embeddingCalls++;
107
+ const embedded = await ctx.models.embedding.embed(batch.map((entry) => entry.embeddingText));
108
+ if (!embedded.ok || !embedded.value) {
109
+ return {
110
+ pairs: [],
111
+ warnings,
112
+ metrics,
113
+ degraded: [
114
+ {
115
+ reason: ctx.models.embedding.degradedReason(embedded),
116
+ failure: embedded.reason ?? 'request_failed',
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ const returnedVectors = Array.from({ length: batch.length }, (_, index) => embedded.value[index]);
122
+ if (embedded.value.length !== batch.length ||
123
+ returnedVectors.some((vector) => !vector || vector.length !== expectedDimensions)) {
124
+ ctx.models.embedding.reportInvalidResponse();
125
+ return {
126
+ pairs: [],
127
+ warnings,
128
+ metrics,
129
+ degraded: [{ reason: 'embedding_failed', failure: 'bad_response' }],
130
+ };
131
+ }
132
+ const createdAt = new Date().toISOString();
133
+ const retainBatch = () => {
134
+ for (const [batchIndex, returnedVector] of returnedVectors.entries()) {
135
+ const vector = returnedVector;
136
+ const preparedIndex = batchIndexes[batchIndex];
137
+ const entry = prepared[preparedIndex];
138
+ vectors[preparedIndex] = vector;
139
+ deleteStaleEmbedding?.run(entry.source.id, entry.embeddingFingerprint);
140
+ writeEmbedding?.run(entry.embeddingFingerprint, entry.source.id, sha256(entry.embeddingText), embeddingEndpoint, SEMANTIC_MERGE_EMBEDDING_VERSION, vector.length, encodeEmbedding(vector), createdAt);
141
+ }
142
+ };
143
+ if (writeEmbedding)
144
+ ctx.store.transaction(retainBatch);
145
+ else
146
+ retainBatch();
147
+ }
148
+ const scored = [];
149
+ for (let leftIndex = 0; leftIndex < prepared.length; leftIndex++) {
150
+ for (let rightIndex = leftIndex + 1; rightIndex < prepared.length; rightIndex++) {
151
+ const left = prepared[leftIndex];
152
+ const right = prepared[rightIndex];
153
+ if (path.posix.dirname(left.source.slug) !== path.posix.dirname(right.source.slug))
154
+ continue;
155
+ if (options.excludedPairKeys.has(semanticMergePairKey(left.source.id, right.source.id)))
156
+ continue;
157
+ metrics.pairsCompared++;
158
+ const score = cosine(vectors[leftIndex], vectors[rightIndex]);
159
+ if (Number.isFinite(score) && score >= SEMANTIC_MERGE_PREFILTER_THRESHOLD) {
160
+ scored.push({ left, right, score });
161
+ }
162
+ }
163
+ }
164
+ metrics.prefilteredPairs = scored.length;
165
+ scored.sort((left, right) => right.score - left.score ||
166
+ semanticMergePairKey(left.left.source.id, left.right.source.id).localeCompare(semanticMergePairKey(right.left.source.id, right.right.source.id)));
167
+ const classifierEndpoint = ctx.models.derive.endpointFingerprint;
168
+ const readCached = ctx.store.db.prepare('SELECT outcome FROM semantic_merge_verdicts WHERE fingerprint = ?');
169
+ const writeCached = ctx.store.readOnly
170
+ ? null
171
+ : ctx.store.db.prepare(`INSERT OR REPLACE INTO semantic_merge_verdicts(
172
+ fingerprint, left_page, right_page, score, outcome, embedding_endpoint,
173
+ classifier_endpoint, prompt_version, signature_version, created_at
174
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
175
+ const deleteStaleVerdict = ctx.store.readOnly
176
+ ? null
177
+ : ctx.store.db.prepare(`DELETE FROM semantic_merge_verdicts
178
+ WHERE left_page = ? AND right_page = ? AND fingerprint != ?`);
179
+ const pairs = [];
180
+ const degraded = [];
181
+ const classifierCandidates = scored.slice(0, options.candidateLimit);
182
+ metrics.classifierCandidates = classifierCandidates.length;
183
+ for (const pair of classifierCandidates) {
184
+ const ordered = [pair.left, pair.right].sort((left, right) => left.source.id.localeCompare(right.source.id));
185
+ const fingerprint = verdictFingerprint(ordered[0], ordered[1], embeddingEndpoint, classifierEndpoint);
186
+ const cached = readCached.get(fingerprint);
187
+ let outcome = cached?.outcome ?? null;
188
+ let decisionSource = 'cache';
189
+ if (outcome) {
190
+ metrics.classifierCacheHits++;
191
+ }
192
+ else {
193
+ decisionSource = 'model';
194
+ metrics.classifierCalls++;
195
+ const judged = await judgeSemanticMergeCandidate(ctx.models.derive, pair.left.modelPage, pair.right.modelPage);
196
+ if (!judged.ok || !judged.value) {
197
+ degraded.push({
198
+ reason: ctx.models.derive.degradedReason(judged),
199
+ failure: judged.reason ?? 'bad_response',
200
+ });
201
+ continue;
202
+ }
203
+ outcome = judged.value.outcome;
204
+ deleteStaleVerdict?.run(ordered[0].source.id, ordered[1].source.id, fingerprint);
205
+ writeCached?.run(fingerprint, ordered[0].source.id, ordered[1].source.id, pair.score, outcome, embeddingEndpoint, classifierEndpoint, SEMANTIC_MERGE_PROMPT_VERSION, SEMANTIC_MERGE_SIGNATURE_VERSION, new Date().toISOString());
206
+ }
207
+ if (outcome !== 'same_subject')
208
+ continue;
209
+ metrics.qualifiedPairs++;
210
+ const [canonical, duplicate] = [pair.left.source, pair.right.source].sort((left, right) => right.bytes - left.bytes || left.slug.localeCompare(right.slug));
211
+ pairs.push({ canonical: canonical, duplicate: duplicate, score: pair.score, decisionSource });
212
+ }
213
+ return { pairs, degraded, warnings, metrics };
214
+ }
215
+ function emptySemanticMergeDiscoveryMetrics(pagesConsidered = 0) {
216
+ return {
217
+ pagesConsidered,
218
+ pagesPrepared: 0,
219
+ pagesSkipped: 0,
220
+ embeddingCacheHits: 0,
221
+ embeddingInputs: 0,
222
+ embeddingCalls: 0,
223
+ pairsCompared: 0,
224
+ prefilteredPairs: 0,
225
+ classifierCandidates: 0,
226
+ classifierCacheHits: 0,
227
+ classifierCalls: 0,
228
+ qualifiedPairs: 0,
229
+ };
230
+ }
231
+ export function addSemanticMergeDiscoveryMetrics(current, next) {
232
+ if (!current)
233
+ return next ? { ...next } : null;
234
+ if (!next)
235
+ return { ...current };
236
+ return {
237
+ pagesConsidered: current.pagesConsidered + next.pagesConsidered,
238
+ pagesPrepared: current.pagesPrepared + next.pagesPrepared,
239
+ pagesSkipped: current.pagesSkipped + next.pagesSkipped,
240
+ embeddingCacheHits: current.embeddingCacheHits + next.embeddingCacheHits,
241
+ embeddingInputs: current.embeddingInputs + next.embeddingInputs,
242
+ embeddingCalls: current.embeddingCalls + next.embeddingCalls,
243
+ pairsCompared: current.pairsCompared + next.pairsCompared,
244
+ prefilteredPairs: current.prefilteredPairs + next.prefilteredPairs,
245
+ classifierCandidates: current.classifierCandidates + next.classifierCandidates,
246
+ classifierCacheHits: current.classifierCacheHits + next.classifierCacheHits,
247
+ classifierCalls: current.classifierCalls + next.classifierCalls,
248
+ qualifiedPairs: current.qualifiedPairs + next.qualifiedPairs,
249
+ };
250
+ }
251
+ export function semanticMergePairKey(leftId, rightId) {
252
+ return [leftId, rightId].sort().join('|');
253
+ }
254
+ function verdictFingerprint(left, right, embeddingEndpoint, classifierEndpoint) {
255
+ return sha256(JSON.stringify({
256
+ signatureVersion: SEMANTIC_MERGE_SIGNATURE_VERSION,
257
+ promptVersion: SEMANTIC_MERGE_PROMPT_VERSION,
258
+ threshold: SEMANTIC_MERGE_PREFILTER_THRESHOLD,
259
+ embeddingEndpoint,
260
+ classifierEndpoint,
261
+ pages: [
262
+ { id: left.source.id, semanticInputHash: left.semanticInputHash },
263
+ { id: right.source.id, semanticInputHash: right.semanticInputHash },
264
+ ],
265
+ }));
266
+ }
267
+ function embeddingFingerprint(pageId, sourceHash, embeddingEndpoint) {
268
+ return sha256(JSON.stringify({
269
+ signatureVersion: SEMANTIC_MERGE_EMBEDDING_VERSION,
270
+ embeddingEndpoint,
271
+ pageId,
272
+ sourceHash,
273
+ }));
274
+ }
275
+ function encodeEmbedding(vector) {
276
+ const buffer = Buffer.allocUnsafe(vector.length * 4);
277
+ for (let index = 0; index < vector.length; index++)
278
+ buffer.writeFloatLE(vector[index], index * 4);
279
+ return buffer;
280
+ }
281
+ function decodeEmbedding(row, expectedDimensions) {
282
+ if (row.dimensions !== expectedDimensions ||
283
+ !Buffer.isBuffer(row.embedding) ||
284
+ row.embedding.byteLength !== expectedDimensions * 4) {
285
+ return null;
286
+ }
287
+ const vector = new Float32Array(expectedDimensions);
288
+ for (let index = 0; index < expectedDimensions; index++) {
289
+ const value = row.embedding.readFloatLE(index * 4);
290
+ if (!Number.isFinite(value))
291
+ return null;
292
+ vector[index] = value;
293
+ }
294
+ return vector;
295
+ }
296
+ function cosine(left, right) {
297
+ let dot = 0;
298
+ let leftNorm = 0;
299
+ let rightNorm = 0;
300
+ const length = Math.min(left.length, right.length);
301
+ for (let index = 0; index < length; index++) {
302
+ dot += left[index] * right[index];
303
+ leftNorm += left[index] * left[index];
304
+ rightNorm += right[index] * right[index];
305
+ }
306
+ return leftNorm === 0 || rightNorm === 0 ? 0 : dot / Math.sqrt(leftNorm * rightNorm);
307
+ }
308
+ //# sourceMappingURL=semantic-merge-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-merge-discovery.js","sourceRoot":"","sources":["../../src/maintenance/semantic-merge-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface TemporalMetadata {
2
+ kind: 'event';
3
+ start?: string;
4
+ until: string;
5
+ timezone?: string;
6
+ }
7
+ export interface TemporalClock {
8
+ now: string;
9
+ timezone: string;
10
+ localDate: string;
11
+ }
12
+ export interface TemporalInferenceInput {
13
+ slug: string;
14
+ title: string;
15
+ frontmatter: Record<string, unknown>;
16
+ body: string;
17
+ }
18
+ export interface TemporalDeclaration {
19
+ metadata: TemporalMetadata | null;
20
+ disabled: boolean;
21
+ invalid: boolean;
22
+ }
23
+ export declare function temporalClock(now?: Date, timezone?: string): TemporalClock;
24
+ export declare function readTemporalDeclaration(frontmatter: Record<string, unknown>): TemporalDeclaration;
25
+ /**
26
+ * Infers only boundaries whose complete date is already present in structured metadata, a
27
+ * date-range slug, or nearby event language. It never turns the latest historical date on an
28
+ * evergreen subject page into that page's expiry date.
29
+ */
30
+ export declare function inferTemporalMetadata(input: TemporalInferenceInput): TemporalMetadata | null;
31
+ /** Date candidates are passed to the model, which may select one but may not invent another. */
32
+ export declare function temporalBoundaryCandidates(input: TemporalInferenceInput): string[];
33
+ export declare function cleanTemporalProposal(value: unknown, candidates: string[]): {
34
+ metadata: TemporalMetadata | null;
35
+ issue: string | null;
36
+ };
37
+ export declare function temporalState(metadata: TemporalMetadata, clock: TemporalClock): 'active' | 'past';
38
+ export declare function temporalPrompt(metadata: TemporalMetadata | null, clock: TemporalClock): string;
39
+ /**
40
+ * Adds only Akno's own temporal key without parsing and re-emitting the rest of the YAML.
41
+ * An unusual inline `akno: {...}` declaration is left for a human rather than duplicated.
42
+ */
43
+ export declare function withTemporalMetadata(content: string, metadata: TemporalMetadata): string | null;
44
+ //# sourceMappingURL=temporal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal.d.ts","sourceRoot":"","sources":["../../src/maintenance/temporal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAiCD,wBAAgB,aAAa,CAAC,GAAG,OAAa,EAAE,QAAQ,SAAmB,GAAG,aAAa,CAM1F;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAQjG;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB,GAAG,IAAI,CAiB5F;AAED,gGAAgG;AAChG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAclF;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,MAAM,EAAE,GACnB;IAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAe7D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,CAMjG;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAQ9F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAoB/F"}
@@ -0,0 +1,295 @@
1
+ import { parseFrontmatter } from "../kb/frontmatter.js";
2
+ const MONTHS = new Map([
3
+ ['january', 1],
4
+ ['february', 2],
5
+ ['march', 3],
6
+ ['april', 4],
7
+ ['may', 5],
8
+ ['june', 6],
9
+ ['july', 7],
10
+ ['august', 8],
11
+ ['september', 9],
12
+ ['october', 10],
13
+ ['november', 11],
14
+ ['december', 12],
15
+ ['jan', 1],
16
+ ['feb', 2],
17
+ ['mar', 3],
18
+ ['apr', 4],
19
+ ['jun', 6],
20
+ ['jul', 7],
21
+ ['aug', 8],
22
+ ['sep', 9],
23
+ ['sept', 9],
24
+ ['oct', 10],
25
+ ['nov', 11],
26
+ ['dec', 12],
27
+ ]);
28
+ const MONTH_PATTERN = 'January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec';
29
+ const EVENT_LANGUAGE = /\b(?:event|trip|travel|vacation|visit|concert|conference|appointment|stay|itinerary)\b/i;
30
+ export function temporalClock(now = new Date(), timezone = systemTimezone()) {
31
+ return {
32
+ now: now.toISOString(),
33
+ timezone,
34
+ localDate: dateInTimezone(now, timezone),
35
+ };
36
+ }
37
+ export function readTemporalDeclaration(frontmatter) {
38
+ const akno = objectValue(frontmatter.akno);
39
+ if (!akno || !Object.hasOwn(akno, 'temporal')) {
40
+ return { metadata: null, disabled: false, invalid: false };
41
+ }
42
+ if (akno.temporal === false)
43
+ return { metadata: null, disabled: true, invalid: false };
44
+ const metadata = cleanTemporal(akno.temporal);
45
+ return { metadata, disabled: false, invalid: metadata === null };
46
+ }
47
+ /**
48
+ * Infers only boundaries whose complete date is already present in structured metadata, a
49
+ * date-range slug, or nearby event language. It never turns the latest historical date on an
50
+ * evergreen subject page into that page's expiry date.
51
+ */
52
+ export function inferTemporalMetadata(input) {
53
+ const declaration = readTemporalDeclaration(input.frontmatter);
54
+ if (declaration.metadata || declaration.disabled || declaration.invalid)
55
+ return declaration.metadata;
56
+ const timezone = readTimezone(input.frontmatter);
57
+ const dates = typeof input.frontmatter.dates === 'string' ? input.frontmatter.dates : '';
58
+ const structured = isoRange(dates);
59
+ if (structured)
60
+ return withTimezone(structured, timezone);
61
+ const text = `${input.title}\n${input.body.slice(0, 12_000)}`;
62
+ const proseRange = rangeNearEventLanguage(text);
63
+ if (proseRange)
64
+ return withTimezone(proseRange, timezone);
65
+ // Filenames are useful structure but can outlive a changed itinerary. Page-authored dates
66
+ // therefore outrank the slug, which is the safe fallback rather than the authority.
67
+ const slugRange = rangeFromSlug(input.slug);
68
+ return slugRange ? withTimezone(slugRange, timezone) : null;
69
+ }
70
+ /** Date candidates are passed to the model, which may select one but may not invent another. */
71
+ export function temporalBoundaryCandidates(input) {
72
+ const out = new Set();
73
+ const add = (metadata) => {
74
+ if (!metadata)
75
+ return;
76
+ if (metadata.start)
77
+ out.add(datePart(metadata.start));
78
+ out.add(datePart(metadata.until));
79
+ };
80
+ add(isoRange(typeof input.frontmatter.dates === 'string' ? input.frontmatter.dates : ''));
81
+ add(rangeFromSlug(input.slug));
82
+ add(rangeNearEventLanguage(`${input.title}\n${input.body.slice(0, 12_000)}`));
83
+ for (const match of `${input.title}\n${input.body.slice(0, 12_000)}`.matchAll(/\b\d{4}-\d{2}-\d{2}\b/g)) {
84
+ if (validDate(match[0]))
85
+ out.add(match[0]);
86
+ }
87
+ return [...out].sort();
88
+ }
89
+ export function cleanTemporalProposal(value, candidates) {
90
+ if (value === undefined || value === null || value === false)
91
+ return { metadata: null, issue: null };
92
+ const metadata = cleanTemporal(value);
93
+ if (!metadata)
94
+ return { metadata: null, issue: 'the proposed temporal boundary is malformed' };
95
+ const allowed = new Set(candidates);
96
+ if (!allowed.has(datePart(metadata.until))) {
97
+ return { metadata: null, issue: `the proposed event end is not supplied by the page: ${metadata.until}` };
98
+ }
99
+ if (metadata.start && !allowed.has(datePart(metadata.start))) {
100
+ return {
101
+ metadata: null,
102
+ issue: `the proposed event start is not supplied by the page: ${metadata.start}`,
103
+ };
104
+ }
105
+ return { metadata, issue: null };
106
+ }
107
+ export function temporalState(metadata, clock) {
108
+ if (isDate(metadata.until)) {
109
+ const local = dateInTimezone(new Date(clock.now), metadata.timezone ?? clock.timezone);
110
+ return local > metadata.until ? 'past' : 'active';
111
+ }
112
+ return Date.parse(clock.now) > Date.parse(metadata.until) ? 'past' : 'active';
113
+ }
114
+ export function temporalPrompt(metadata, clock) {
115
+ const lines = [`Current time: ${clock.now}`, `System timezone: ${clock.timezone}`];
116
+ if (metadata) {
117
+ lines.push(`Temporal page: event`, ...(metadata.start ? [`Starts: ${metadata.start}`] : []));
118
+ lines.push(`Ends: ${metadata.until}`, `Temporal state: ${temporalState(metadata, clock)}`);
119
+ if (metadata.timezone)
120
+ lines.push(`Event timezone: ${metadata.timezone}`);
121
+ }
122
+ return lines.join('\n');
123
+ }
124
+ /**
125
+ * Adds only Akno's own temporal key without parsing and re-emitting the rest of the YAML.
126
+ * An unusual inline `akno: {...}` declaration is left for a human rather than duplicated.
127
+ */
128
+ export function withTemporalMetadata(content, metadata) {
129
+ const fm = parseFrontmatter(content);
130
+ const declaration = readTemporalDeclaration(fm.data);
131
+ if (declaration.metadata || declaration.disabled || declaration.invalid)
132
+ return content;
133
+ const block = temporalYaml(metadata);
134
+ if (!fm.present)
135
+ return `---\nakno:\n${block}---\n\n${content}`;
136
+ const head = content.slice(0, fm.bodyOffset);
137
+ const akno = /^akno:[ \t]*\r?$/m.exec(head);
138
+ if (akno?.index !== undefined) {
139
+ const newline = head.indexOf('\n', akno.index);
140
+ if (newline < 0)
141
+ return null;
142
+ return `${head.slice(0, newline + 1)}${block}${head.slice(newline + 1)}${content.slice(fm.bodyOffset)}`;
143
+ }
144
+ if (objectValue(fm.data.akno))
145
+ return null;
146
+ const close = head.lastIndexOf('---');
147
+ if (close <= 0)
148
+ return null;
149
+ return `${head.slice(0, close)}akno:\n${block}${head.slice(close)}${content.slice(fm.bodyOffset)}`;
150
+ }
151
+ function temporalYaml(metadata) {
152
+ return (` temporal:\n` +
153
+ ` kind: event\n` +
154
+ (metadata.start ? ` start: ${JSON.stringify(metadata.start)}\n` : '') +
155
+ ` until: ${JSON.stringify(metadata.until)}\n` +
156
+ (metadata.timezone ? ` timezone: ${JSON.stringify(metadata.timezone)}\n` : ''));
157
+ }
158
+ function cleanTemporal(value) {
159
+ const record = objectValue(value);
160
+ if (!record || record.kind !== 'event' || typeof record.until !== 'string')
161
+ return null;
162
+ const until = cleanBoundary(record.until);
163
+ const start = typeof record.start === 'string' ? cleanBoundary(record.start) : null;
164
+ if (!until || (typeof record.start === 'string' && !start))
165
+ return null;
166
+ if (start && Date.parse(boundaryInstant(start, false)) > Date.parse(boundaryInstant(until, true)))
167
+ return null;
168
+ const timezone = typeof record.timezone === 'string' && validTimezone(record.timezone) ? record.timezone : null;
169
+ return {
170
+ kind: 'event',
171
+ ...(start ? { start } : {}),
172
+ until,
173
+ ...(timezone ? { timezone } : {}),
174
+ };
175
+ }
176
+ function cleanBoundary(value) {
177
+ if (isDate(value))
178
+ return validDate(value) ? value : null;
179
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/.test(value)) {
180
+ return null;
181
+ }
182
+ return Number.isNaN(Date.parse(value)) ? null : value;
183
+ }
184
+ function isoRange(text) {
185
+ const match = /(\d{4}-\d{2}-\d{2})\s*(?:to|through|[-–‑—])\s*(\d{4}-\d{2}-\d{2})/i.exec(text);
186
+ if (!match || !validDate(match[1]) || !validDate(match[2]))
187
+ return null;
188
+ return orderedRange(match[1], match[2]);
189
+ }
190
+ function rangeFromSlug(slug) {
191
+ const basename = slug.split('/').at(-1) ?? slug;
192
+ const match = /^(\d{4})-(\d{2})-(\d{2})-(\d{2})(?:-|$)/.exec(basename);
193
+ if (!match)
194
+ return null;
195
+ const year = Number(match[1]);
196
+ const month = Number(match[2]);
197
+ const first = Number(match[3]);
198
+ const last = Number(match[4]);
199
+ const start = ymd(year, month, first);
200
+ const endDate = new Date(Date.UTC(year, month - 1 + (last < first ? 1 : 0), last));
201
+ const until = endDate.toISOString().slice(0, 10);
202
+ return start && validDate(until) ? orderedRange(start, until) : null;
203
+ }
204
+ function rangeNearEventLanguage(text) {
205
+ const sameMonth = new RegExp(`\\b(${MONTH_PATTERN})\\s+(\\d{1,2})\\s*[-–‑—]\\s*(\\d{1,2})(?:,)?\\s+(\\d{4})\\b`, 'i');
206
+ const crossMonth = new RegExp(`\\b(${MONTH_PATTERN})\\s+(\\d{1,2})\\s*[-–‑—]\\s*(${MONTH_PATTERN})\\s+(\\d{1,2})(?:,)?\\s+(\\d{4})\\b`, 'i');
207
+ for (const pattern of [crossMonth, sameMonth]) {
208
+ const match = pattern.exec(text);
209
+ if (!match || match.index === undefined)
210
+ continue;
211
+ const nearby = text.slice(Math.max(0, match.index - 100), match.index + match[0].length + 100);
212
+ if (!EVENT_LANGUAGE.test(nearby))
213
+ continue;
214
+ if (pattern === crossMonth) {
215
+ const year = Number(match[5]);
216
+ const start = ymd(year, monthNumber(match[1]), Number(match[2]));
217
+ const until = ymd(year, monthNumber(match[3]), Number(match[4]));
218
+ if (start && until)
219
+ return orderedRange(start, until);
220
+ }
221
+ else {
222
+ const year = Number(match[4]);
223
+ const month = monthNumber(match[1]);
224
+ const start = ymd(year, month, Number(match[2]));
225
+ const until = ymd(year, month, Number(match[3]));
226
+ if (start && until)
227
+ return orderedRange(start, until);
228
+ }
229
+ }
230
+ return null;
231
+ }
232
+ function orderedRange(start, until) {
233
+ return Date.parse(`${start}T00:00:00Z`) <= Date.parse(`${until}T23:59:59Z`)
234
+ ? { kind: 'event', start, until }
235
+ : null;
236
+ }
237
+ function withTimezone(metadata, timezone) {
238
+ return timezone ? { ...metadata, timezone } : metadata;
239
+ }
240
+ function readTimezone(frontmatter) {
241
+ const value = frontmatter.timezone;
242
+ return typeof value === 'string' && validTimezone(value) ? value : null;
243
+ }
244
+ function monthNumber(value) {
245
+ return MONTHS.get(value.toLowerCase()) ?? 0;
246
+ }
247
+ function ymd(year, month, day) {
248
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day))
249
+ return null;
250
+ const value = `${String(year).padStart(4, '0')}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
251
+ return validDate(value) ? value : null;
252
+ }
253
+ function validDate(value) {
254
+ if (!isDate(value))
255
+ return false;
256
+ const parsed = new Date(`${value}T00:00:00Z`);
257
+ return !Number.isNaN(parsed.getTime()) && parsed.toISOString().slice(0, 10) === value;
258
+ }
259
+ function isDate(value) {
260
+ return /^\d{4}-\d{2}-\d{2}$/.test(value);
261
+ }
262
+ function datePart(value) {
263
+ return value.slice(0, 10);
264
+ }
265
+ function boundaryInstant(value, endOfDay) {
266
+ return isDate(value) ? `${value}T${endOfDay ? '23:59:59' : '00:00:00'}Z` : value;
267
+ }
268
+ function objectValue(value) {
269
+ return value && typeof value === 'object' && !Array.isArray(value)
270
+ ? value
271
+ : null;
272
+ }
273
+ function systemTimezone() {
274
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
275
+ }
276
+ function validTimezone(value) {
277
+ try {
278
+ new Intl.DateTimeFormat('en', { timeZone: value }).format();
279
+ return true;
280
+ }
281
+ catch {
282
+ return false;
283
+ }
284
+ }
285
+ function dateInTimezone(value, timezone) {
286
+ const parts = new Intl.DateTimeFormat('en-CA', {
287
+ timeZone: timezone,
288
+ year: 'numeric',
289
+ month: '2-digit',
290
+ day: '2-digit',
291
+ }).formatToParts(value);
292
+ const part = (type) => parts.find((entry) => entry.type === type)?.value ?? '';
293
+ return `${part('year')}-${part('month')}-${part('day')}`;
294
+ }
295
+ //# sourceMappingURL=temporal.js.map