@remnic/core 9.66.2 → 9.66.3

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 (564) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +27 -27
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +1 -1
  5. package/dist/access-authorization-probe.js +28 -28
  6. package/dist/access-boundary.d.ts +1 -1
  7. package/dist/access-boundary.js +27 -27
  8. package/dist/access-cli.js +95 -95
  9. package/dist/access-extraction-force-flush.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.js +27 -27
  11. package/dist/access-http-lcm-compaction.d.ts +1 -1
  12. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  13. package/dist/access-http-offline-stream.d.ts +1 -1
  14. package/dist/access-http-query.js +29 -29
  15. package/dist/access-http.d.ts +2 -2
  16. package/dist/access-http.js +44 -44
  17. package/dist/access-identity-continuity-surface.js +27 -27
  18. package/dist/access-lcm-surface.d.ts +1 -1
  19. package/dist/access-lcm-surface.js +27 -27
  20. package/dist/access-mcp.d.ts +1 -1
  21. package/dist/access-mcp.js +35 -35
  22. package/dist/access-namespace-preflight.js +27 -27
  23. package/dist/access-observe-write-surface.d.ts +1 -1
  24. package/dist/access-observe-write-surface.js +27 -27
  25. package/dist/access-operations-batch.js +30 -30
  26. package/dist/access-operations.d.ts +6 -6
  27. package/dist/access-operations.js +34 -34
  28. package/dist/access-recall-concurrency.d.ts +1 -1
  29. package/dist/access-recall-concurrency.js +27 -27
  30. package/dist/access-recall-response.d.ts +1 -1
  31. package/dist/access-recall-response.js +27 -27
  32. package/dist/access-recall-surface.d.ts +1 -1
  33. package/dist/access-recall-surface.js +27 -27
  34. package/dist/access-schema.d.ts +89 -89
  35. package/dist/access-schema.js +3 -3
  36. package/dist/access-service-helpers.d.ts +1 -1
  37. package/dist/access-service.d.ts +1 -1
  38. package/dist/access-service.js +27 -27
  39. package/dist/access-surface-catalog.d.ts +1 -1
  40. package/dist/access-surface-catalog.js +29 -29
  41. package/dist/active-recall.js +3 -3
  42. package/dist/adapters/index.js +4 -4
  43. package/dist/adapters/registry.js +2 -2
  44. package/dist/briefing.js +8 -8
  45. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  46. package/dist/causal-behavior.js +2 -2
  47. package/dist/causal-chain.js +2 -2
  48. package/dist/causal-consolidation.js +11 -11
  49. package/dist/causal-retrieval.js +2 -2
  50. package/dist/causal-trajectory-graph.js +2 -2
  51. package/dist/causal-trajectory.js +1 -1
  52. package/dist/{chunk-F4W5HTED.js → chunk-3HHTN5X7.js} +2 -2
  53. package/dist/{chunk-47WWTCJY.js → chunk-3PO35HUU.js} +313 -99
  54. package/dist/chunk-3PO35HUU.js.map +1 -0
  55. package/dist/{chunk-UHQE37NI.js → chunk-3Z4SFJA5.js} +2 -2
  56. package/dist/{chunk-PP7R754B.js → chunk-4PTTMTTQ.js} +1 -1
  57. package/dist/{chunk-AI5M4FVQ.js → chunk-4XESAT4V.js} +2 -2
  58. package/dist/{chunk-6545JDIM.js → chunk-5KGLNBUB.js} +2 -2
  59. package/dist/{chunk-2QSGJTDG.js → chunk-5XRZANCW.js} +10 -10
  60. package/dist/{chunk-LSR5LQXN.js → chunk-6DODJYBY.js} +2 -2
  61. package/dist/{chunk-D2YNNDML.js → chunk-73CAEYI3.js} +2 -2
  62. package/dist/{chunk-J2R275FN.js → chunk-7DXW5V2W.js} +2 -2
  63. package/dist/{chunk-25OLNWYG.js → chunk-7JJHIVMG.js} +2 -2
  64. package/dist/{chunk-65HXVEVG.js → chunk-7NNMRMLZ.js} +2 -2
  65. package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
  66. package/dist/{chunk-ZBIEX4XN.js → chunk-B2OKCCXX.js} +1 -1
  67. package/dist/{chunk-U4HZEW2B.js → chunk-B7AGLMGP.js} +7 -7
  68. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  69. package/dist/{chunk-OLBZ2WGG.js → chunk-C2JCVZWX.js} +2 -2
  70. package/dist/{chunk-D3DUA64S.js → chunk-D4R3OUZA.js} +2 -2
  71. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  72. package/dist/{chunk-EQRD4NMH.js → chunk-EGGNFLAT.js} +2 -2
  73. package/dist/{chunk-FFWONAAW.js → chunk-ESDOAP7W.js} +3 -3
  74. package/dist/{chunk-UMZUKOJU.js → chunk-EZWIEFYD.js} +7 -7
  75. package/dist/{chunk-OIDICRH7.js → chunk-F5H5QINZ.js} +2 -2
  76. package/dist/{chunk-UVYL5G7A.js → chunk-FPSOXMLK.js} +3 -3
  77. package/dist/{chunk-ER2UPUMG.js → chunk-G5UKF2GJ.js} +2 -2
  78. package/dist/{chunk-JJ6ZEFXC.js → chunk-GGY2747C.js} +2 -2
  79. package/dist/{chunk-Y2YM4C75.js → chunk-GZPGI45F.js} +2 -2
  80. package/dist/{chunk-CDLPF3PX.js → chunk-IDEPEHUG.js} +2 -2
  81. package/dist/{chunk-W5IYHQA5.js → chunk-IN5EUWCA.js} +3 -3
  82. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  83. package/dist/{chunk-6BYJQ3L2.js → chunk-JJAOVJ3E.js} +8 -8
  84. package/dist/{chunk-ZXROBS53.js → chunk-JWCS3VYQ.js} +48 -48
  85. package/dist/{chunk-JMXHVJ2V.js → chunk-KE23ZIEW.js} +13 -13
  86. package/dist/{chunk-RCPKBW7K.js → chunk-KWJNEWTM.js} +5 -5
  87. package/dist/chunk-MKD3OMPS.js +20 -0
  88. package/dist/chunk-MKD3OMPS.js.map +1 -0
  89. package/dist/{chunk-VSMSYDIH.js → chunk-MLTGALDY.js} +2 -2
  90. package/dist/{chunk-B4B3QDV3.js → chunk-OKGQDI4Y.js} +24 -24
  91. package/dist/{chunk-BIJAWZYW.js → chunk-OLT3YTDH.js} +4 -4
  92. package/dist/{chunk-NZPFCP5A.js → chunk-OPQKVVYG.js} +2 -2
  93. package/dist/{chunk-D6Q5EPOV.js → chunk-PGD3DXZP.js} +2 -2
  94. package/dist/{chunk-ZMVW2HJJ.js → chunk-Q6LC3ZD5.js} +2 -2
  95. package/dist/{chunk-4PG2CKI6.js → chunk-QELYSDAU.js} +2 -2
  96. package/dist/{chunk-RH3XLQG4.js → chunk-S6PRJGQL.js} +2 -2
  97. package/dist/{chunk-NTFXBILO.js → chunk-TCJO7LOG.js} +5 -5
  98. package/dist/{chunk-F2JXJABQ.js → chunk-TO5U47YK.js} +2 -2
  99. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  100. package/dist/{chunk-PRRUK2ZH.js → chunk-U3L6GRUX.js} +2 -2
  101. package/dist/{chunk-VKDBDJIX.js → chunk-U4RGSLI4.js} +3 -3
  102. package/dist/{chunk-BLHKR4GJ.js → chunk-UH53XVQ3.js} +2 -2
  103. package/dist/{chunk-YZ5VC2JJ.js → chunk-UXERIBOJ.js} +2 -2
  104. package/dist/{chunk-CQ6IWZDI.js → chunk-VA2CSIPC.js} +2 -2
  105. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  106. package/dist/{chunk-EH7BNIUN.js → chunk-VPJNGE2R.js} +2 -2
  107. package/dist/{chunk-6PUF7LUO.js → chunk-VTJZSLDR.js} +2 -2
  108. package/dist/{chunk-PW3GKWH3.js → chunk-WHFFAS4A.js} +4 -4
  109. package/dist/{chunk-WKWY7YF3.js → chunk-WVNETF4Q.js} +2 -2
  110. package/dist/{chunk-C3ZYZKDJ.js → chunk-XSTMPZMY.js} +2 -2
  111. package/dist/{chunk-OUKBMQ2O.js → chunk-Z3SQEEB6.js} +2 -2
  112. package/dist/{chunk-36HJ36FK.js → chunk-ZBYOXIIF.js} +3 -3
  113. package/dist/{chunk-DSEHPUID.js → chunk-ZC5IHL5X.js} +2 -2
  114. package/dist/{chunk-R2Q6FTOX.js → chunk-ZDMTCO7N.js} +2 -2
  115. package/dist/{chunk-OERZXNSK.js → chunk-ZET6A3OF.js} +2 -2
  116. package/dist/{chunk-2VZHB5US.js → chunk-ZVAKRZZD.js} +2 -2
  117. package/dist/{cli-BOuEb4Ia.d.ts → cli-CsfFMe6n.d.ts} +1 -1
  118. package/dist/cli.d.ts +2 -2
  119. package/dist/cli.js +68 -68
  120. package/dist/coding/export-okf-codegraph.js +8 -8
  121. package/dist/coding/pre-action-gate.js +2 -2
  122. package/dist/compounding/engine.js +8 -8
  123. package/dist/config.js +3 -3
  124. package/dist/connectors/codex-materialize-runner.js +8 -8
  125. package/dist/connectors/index.js +8 -8
  126. package/dist/convergence-refresh.js +10 -10
  127. package/dist/conversation-index/backend.js +2 -2
  128. package/dist/corpus-watermark.js +10 -10
  129. package/dist/entity-retrieval.js +8 -8
  130. package/dist/external-wiki-access.d.ts +1 -1
  131. package/dist/external-wiki-access.js +28 -28
  132. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  133. package/dist/extraction-span-bench.d.ts +14 -0
  134. package/dist/extraction-span-bench.js +17 -0
  135. package/dist/extraction-span-bench.js.map +1 -0
  136. package/dist/extraction-span-clip.d.ts +22 -0
  137. package/dist/extraction-span-clip.js +19 -0
  138. package/dist/extraction-span-clip.js.map +1 -0
  139. package/dist/extraction-span-contains.d.ts +12 -0
  140. package/dist/extraction-span-contains.js +17 -0
  141. package/dist/extraction-span-contains.js.map +1 -0
  142. package/dist/extraction-span-join.d.ts +23 -0
  143. package/dist/extraction-span-join.js +19 -0
  144. package/dist/extraction-span-join.js.map +1 -0
  145. package/dist/extraction-span-length.d.ts +11 -0
  146. package/dist/extraction-span-length.js +17 -0
  147. package/dist/extraction-span-length.js.map +1 -0
  148. package/dist/extraction-span-overlap.d.ts +14 -0
  149. package/dist/extraction-span-overlap.js +16 -0
  150. package/dist/extraction-span-overlap.js.map +1 -0
  151. package/dist/extraction-span-shift.d.ts +15 -0
  152. package/dist/extraction-span-shift.js +17 -0
  153. package/dist/extraction-span-shift.js.map +1 -0
  154. package/dist/extraction-span-slice.d.ts +12 -0
  155. package/dist/extraction-span-slice.js +17 -0
  156. package/dist/extraction-span-slice.js.map +1 -0
  157. package/dist/extraction-span-validate.d.ts +20 -0
  158. package/dist/extraction-span-validate.js +20 -0
  159. package/dist/extraction-span-validate.js.map +1 -0
  160. package/dist/extraction.js +8 -8
  161. package/dist/{graph-edge-decay-FXGELBFA.js → graph-edge-decay-DGTBFALQ.js} +4 -4
  162. package/dist/graph-snapshot.js +3 -3
  163. package/dist/graph.js +2 -2
  164. package/dist/harmonic-retrieval.js +1 -1
  165. package/dist/index.d.ts +861 -681
  166. package/dist/index.js +137 -109
  167. package/dist/lcm/engine.js +3 -3
  168. package/dist/lcm/index.js +8 -8
  169. package/dist/location/index.js +10 -10
  170. package/dist/maintenance/memory-governance.js +8 -8
  171. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
  172. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  173. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  174. package/dist/memory-subject-cli.d.ts +1 -1
  175. package/dist/memory-subject.d.ts +1 -1
  176. package/dist/namespaces/migrate.js +9 -9
  177. package/dist/namespaces/search.js +6 -6
  178. package/dist/namespaces/storage.js +8 -8
  179. package/dist/operator-doctor-corpus.js +11 -11
  180. package/dist/operator-toolkit.js +21 -21
  181. package/dist/orchestration/maintenance.js +16 -16
  182. package/dist/orchestrator.js +97 -97
  183. package/dist/{public-http-CmQRjQCD.d.ts → public-http-Cwvl4QZr.d.ts} +1 -1
  184. package/dist/recall-deep-budget-left.d.ts +8 -0
  185. package/dist/recall-deep-budget-left.js +15 -0
  186. package/dist/recall-deep-budget-left.js.map +1 -0
  187. package/dist/recall-deep-budget.d.ts +9 -0
  188. package/dist/recall-deep-budget.js +15 -0
  189. package/dist/recall-deep-budget.js.map +1 -0
  190. package/dist/recall-deep-expand.d.ts +12 -0
  191. package/dist/recall-deep-expand.js +17 -0
  192. package/dist/recall-deep-expand.js.map +1 -0
  193. package/dist/recall-deep-policy.d.ts +17 -0
  194. package/dist/recall-deep-policy.js +18 -0
  195. package/dist/recall-deep-policy.js.map +1 -0
  196. package/dist/recall-deep-query.d.ts +15 -0
  197. package/dist/recall-deep-query.js +12 -0
  198. package/dist/recall-deep-query.js.map +1 -0
  199. package/dist/recall-deep-refine.d.ts +12 -0
  200. package/dist/recall-deep-refine.js +17 -0
  201. package/dist/recall-deep-refine.js.map +1 -0
  202. package/dist/recall-deep-step-count.d.ts +8 -0
  203. package/dist/recall-deep-step-count.js +15 -0
  204. package/dist/recall-deep-step-count.js.map +1 -0
  205. package/dist/recall-deep-stop-reason.d.ts +17 -0
  206. package/dist/recall-deep-stop-reason.js +23 -0
  207. package/dist/recall-deep-stop-reason.js.map +1 -0
  208. package/dist/recall-deep-stop.d.ts +17 -0
  209. package/dist/recall-deep-stop.js +23 -0
  210. package/dist/recall-deep-stop.js.map +1 -0
  211. package/dist/recall-deep-working-set.d.ts +9 -0
  212. package/dist/recall-deep-working-set.js +14 -0
  213. package/dist/recall-deep-working-set.js.map +1 -0
  214. package/dist/recall-navigate-access.d.ts +39 -0
  215. package/dist/recall-navigate-access.js +31 -0
  216. package/dist/recall-navigate-access.js.map +1 -0
  217. package/dist/recall-navigate-action.d.ts +17 -0
  218. package/dist/recall-navigate-action.js +14 -0
  219. package/dist/recall-navigate-action.js.map +1 -0
  220. package/dist/recall-navigate-budget.d.ts +16 -0
  221. package/dist/recall-navigate-budget.js +18 -0
  222. package/dist/recall-navigate-budget.js.map +1 -0
  223. package/dist/recall-navigate-cost.d.ts +8 -0
  224. package/dist/recall-navigate-cost.js +15 -0
  225. package/dist/recall-navigate-cost.js.map +1 -0
  226. package/dist/recall-navigate-depth.d.ts +8 -0
  227. package/dist/recall-navigate-depth.js +15 -0
  228. package/dist/recall-navigate-depth.js.map +1 -0
  229. package/dist/recall-navigate-link.d.ts +17 -0
  230. package/dist/recall-navigate-link.js +20 -0
  231. package/dist/recall-navigate-link.js.map +1 -0
  232. package/dist/recall-navigate-max-children.d.ts +8 -0
  233. package/dist/recall-navigate-max-children.js +15 -0
  234. package/dist/recall-navigate-max-children.js.map +1 -0
  235. package/dist/recall-navigate-node.d.ts +15 -0
  236. package/dist/recall-navigate-node.js +13 -0
  237. package/dist/recall-navigate-node.js.map +1 -0
  238. package/dist/recall-navigate-path.d.ts +9 -0
  239. package/dist/recall-navigate-path.js +14 -0
  240. package/dist/recall-navigate-path.js.map +1 -0
  241. package/dist/recall-navigate-render.d.ts +15 -0
  242. package/dist/recall-navigate-render.js +23 -0
  243. package/dist/recall-navigate-render.js.map +1 -0
  244. package/dist/recall-state-view-current.d.ts +18 -0
  245. package/dist/recall-state-view-current.js +14 -0
  246. package/dist/recall-state-view-current.js.map +1 -0
  247. package/dist/recall-state-view-inject.d.ts +15 -0
  248. package/dist/recall-state-view-inject.js +16 -0
  249. package/dist/recall-state-view-inject.js.map +1 -0
  250. package/dist/recall-state-view-kind.d.ts +17 -0
  251. package/dist/recall-state-view-kind.js +14 -0
  252. package/dist/recall-state-view-kind.js.map +1 -0
  253. package/dist/recall-state-view-label.d.ts +17 -0
  254. package/dist/recall-state-view-label.js +16 -0
  255. package/dist/recall-state-view-label.js.map +1 -0
  256. package/dist/recall-state-view-render.js +3 -14
  257. package/dist/recall-state-view-render.js.map +1 -1
  258. package/dist/recall-state-view-successor.d.ts +15 -0
  259. package/dist/recall-state-view-successor.js +13 -0
  260. package/dist/recall-state-view-successor.js.map +1 -0
  261. package/dist/recall-state-view-superseded.d.ts +15 -0
  262. package/dist/recall-state-view-superseded.js +14 -0
  263. package/dist/recall-state-view-superseded.js.map +1 -0
  264. package/dist/recall-state-view-transition.d.ts +18 -0
  265. package/dist/recall-state-view-transition.js +14 -0
  266. package/dist/recall-state-view-transition.js.map +1 -0
  267. package/dist/resume-bundles.js +4 -4
  268. package/dist/schemas.d.ts +176 -176
  269. package/dist/search/factory.js +5 -5
  270. package/dist/search/index.js +9 -9
  271. package/dist/semantic-consolidation.js +9 -9
  272. package/dist/semantic-rule-promotion.js +8 -8
  273. package/dist/semantic-rule-verifier.js +8 -8
  274. package/dist/shared-context/manager.d.ts +6 -6
  275. package/dist/source-agent-qualifier.js +8 -8
  276. package/dist/storage.js +7 -7
  277. package/dist/support-passport/index.d.ts +4 -4
  278. package/dist/support-passport/index.js +30 -30
  279. package/dist/transfer/backup.js +2 -2
  280. package/dist/transfer/capsule-export.js +2 -2
  281. package/dist/transfer/capsule-import.js +2 -2
  282. package/dist/transfer/export-okf.js +9 -9
  283. package/dist/transfer/types.d.ts +78 -78
  284. package/dist/verified-recall.js +8 -8
  285. package/dist/who-knows-cli.d.ts +1 -1
  286. package/dist/who-knows-cli.js +9 -9
  287. package/dist/who-knows.d.ts +1 -1
  288. package/dist/who-knows.js +8 -8
  289. package/package.json +2 -2
  290. package/src/activity/dwell.test.ts +28 -0
  291. package/src/activity/dwell.ts +22 -0
  292. package/src/activity/from-ms.test.ts +25 -0
  293. package/src/activity/from-ms.ts +13 -0
  294. package/src/activity/heading-level.test.ts +23 -0
  295. package/src/activity/heading-level.ts +21 -0
  296. package/src/activity/heading-title.test.ts +21 -0
  297. package/src/activity/heading-title.ts +26 -0
  298. package/src/activity/index.ts +6 -0
  299. package/src/activity/journal-heading.test.ts +22 -0
  300. package/src/activity/journal-heading.ts +18 -0
  301. package/src/activity/journal-mode.test.ts +32 -0
  302. package/src/activity/journal-mode.ts +20 -0
  303. package/src/activity/journal-path.test.ts +25 -0
  304. package/src/activity/journal-path.ts +27 -0
  305. package/src/activity/journal-section.test.ts +37 -0
  306. package/src/activity/journal-section.ts +75 -0
  307. package/src/activity/journal-source.test.ts +37 -0
  308. package/src/activity/journal-source.ts +23 -0
  309. package/src/activity/privacy-enabled.test.ts +30 -0
  310. package/src/activity/privacy-enabled.ts +33 -0
  311. package/src/activity/privacy-keys.test.ts +22 -0
  312. package/src/activity/privacy-keys.ts +12 -0
  313. package/src/activity/privacy-redact.test.ts +25 -0
  314. package/src/activity/privacy-redact.ts +23 -0
  315. package/src/activity/privacy-window.test.ts +49 -0
  316. package/src/activity/privacy-window.ts +32 -0
  317. package/src/activity/retain-days.test.ts +20 -0
  318. package/src/activity/retain-days.ts +14 -0
  319. package/src/activity/timeline/analysis-claim.test.ts +33 -0
  320. package/src/activity/timeline/analysis-claim.ts +16 -0
  321. package/src/activity/timeline/analysis-dup.test.ts +28 -0
  322. package/src/activity/timeline/analysis-dup.ts +10 -0
  323. package/src/activity/timeline/analysis-empty.test.ts +21 -0
  324. package/src/activity/timeline/analysis-empty.ts +14 -0
  325. package/src/activity/timeline/analysis-evidence.test.ts +32 -0
  326. package/src/activity/timeline/analysis-evidence.ts +20 -0
  327. package/src/activity/timeline/analysis-max.test.ts +26 -0
  328. package/src/activity/timeline/analysis-max.ts +14 -0
  329. package/src/activity/timeline/analysis-order.test.ts +28 -0
  330. package/src/activity/timeline/analysis-order.ts +10 -0
  331. package/src/activity/timeline/analysis-prompt.test.ts +50 -0
  332. package/src/activity/timeline/analysis-prompt.ts +24 -0
  333. package/src/activity/timeline/index.ts +8 -0
  334. package/src/activity/timeline/recap-card-id.test.ts +21 -0
  335. package/src/activity/timeline/recap-card-id.ts +16 -0
  336. package/src/activity/timeline/recap-date.test.ts +21 -0
  337. package/src/activity/timeline/recap-date.ts +19 -0
  338. package/src/activity/timeline/recap-empty.test.ts +21 -0
  339. package/src/activity/timeline/recap-empty.ts +14 -0
  340. package/src/activity/timeline/recap-export.test.ts +78 -0
  341. package/src/activity/timeline/recap-export.ts +41 -0
  342. package/src/activity/timeline/recap-id.test.ts +28 -0
  343. package/src/activity/timeline/recap-id.ts +10 -0
  344. package/src/activity/timeline/recap-markdown.test.ts +56 -0
  345. package/src/activity/timeline/recap-markdown.ts +26 -0
  346. package/src/activity/timeline/recap-sort-key.test.ts +18 -0
  347. package/src/activity/timeline/recap-sort-key.ts +14 -0
  348. package/src/activity/timeline/recap-tz.test.ts +35 -0
  349. package/src/activity/timeline/recap-tz.ts +19 -0
  350. package/src/activity/timeline/week-count.test.ts +19 -0
  351. package/src/activity/timeline/week-count.ts +13 -0
  352. package/src/activity/timeline/week-days.test.ts +26 -0
  353. package/src/activity/timeline/week-days.ts +23 -0
  354. package/src/activity/timeline/week-export.test.ts +59 -0
  355. package/src/activity/timeline/week-export.ts +44 -0
  356. package/src/activity/timeline/week-iso.test.ts +29 -0
  357. package/src/activity/timeline/week-iso.ts +20 -0
  358. package/src/activity/timeline/week-monday.test.ts +17 -0
  359. package/src/activity/timeline/week-monday.ts +12 -0
  360. package/src/activity/timeline/week-range.test.ts +23 -0
  361. package/src/activity/timeline/week-range.ts +26 -0
  362. package/src/activity/timeline/week-snapshot.test.ts +66 -0
  363. package/src/activity/timeline/week-snapshot.ts +40 -0
  364. package/src/activity/timeline/week-sunday.test.ts +17 -0
  365. package/src/activity/timeline/week-sunday.ts +12 -0
  366. package/src/activity/to-ms.test.ts +25 -0
  367. package/src/activity/to-ms.ts +13 -0
  368. package/src/activity/vault-begin.test.ts +20 -0
  369. package/src/activity/vault-begin.ts +13 -0
  370. package/src/activity/vault-end.test.ts +20 -0
  371. package/src/activity/vault-end.ts +13 -0
  372. package/src/activity/vault-frontmatter.test.ts +28 -0
  373. package/src/activity/vault-frontmatter.ts +39 -0
  374. package/src/activity/vault-join.test.ts +21 -0
  375. package/src/activity/vault-join.ts +31 -0
  376. package/src/activity/vault-marker.test.ts +23 -0
  377. package/src/activity/vault-marker.ts +27 -0
  378. package/src/activity/vault-name-trim.test.ts +22 -0
  379. package/src/activity/vault-name-trim.ts +16 -0
  380. package/src/activity/vault-region-pair.test.ts +26 -0
  381. package/src/activity/vault-region-pair.ts +24 -0
  382. package/src/activity/vault-region.test.ts +24 -0
  383. package/src/activity/vault-region.ts +24 -0
  384. package/src/activity/vault-suffix.test.ts +20 -0
  385. package/src/activity/vault-suffix.ts +12 -0
  386. package/src/activity/vault-wikilink.test.ts +27 -0
  387. package/src/activity/vault-wikilink.ts +28 -0
  388. package/src/activity/window-order.test.ts +27 -0
  389. package/src/activity/window-order.ts +24 -0
  390. package/src/dedup/merge-count.test.ts +19 -0
  391. package/src/dedup/merge-count.ts +13 -0
  392. package/src/dedup/merge-dup.test.ts +21 -0
  393. package/src/dedup/merge-dup.ts +16 -0
  394. package/src/dedup/merge-empty.test.ts +22 -0
  395. package/src/dedup/merge-empty.ts +18 -0
  396. package/src/dedup/merge-id.test.ts +18 -0
  397. package/src/dedup/merge-id.ts +14 -0
  398. package/src/dedup/merge-min-score.test.ts +37 -0
  399. package/src/dedup/merge-min-score.ts +22 -0
  400. package/src/dedup/merge-pair.test.ts +19 -0
  401. package/src/dedup/merge-pair.ts +13 -0
  402. package/src/dedup/merge-score.test.ts +20 -0
  403. package/src/dedup/merge-score.ts +14 -0
  404. package/src/dedup/merge-self.test.ts +19 -0
  405. package/src/dedup/merge-self.ts +17 -0
  406. package/src/dedup/merge-threshold.test.ts +46 -0
  407. package/src/dedup/merge-threshold.ts +26 -0
  408. package/src/dedup/merge-tie.test.ts +22 -0
  409. package/src/dedup/merge-tie.ts +13 -0
  410. package/src/extraction-span-bench.test.ts +27 -0
  411. package/src/extraction-span-bench.ts +28 -0
  412. package/src/extraction-span-clip.test.ts +71 -0
  413. package/src/extraction-span-clip.ts +26 -0
  414. package/src/extraction-span-contains.test.ts +30 -0
  415. package/src/extraction-span-contains.ts +20 -0
  416. package/src/extraction-span-join.test.ts +50 -0
  417. package/src/extraction-span-join.ts +30 -0
  418. package/src/extraction-span-length.test.ts +25 -0
  419. package/src/extraction-span-length.ts +16 -0
  420. package/src/extraction-span-overlap.test.ts +34 -0
  421. package/src/extraction-span-overlap.ts +23 -0
  422. package/src/extraction-span-shift.test.ts +25 -0
  423. package/src/extraction-span-shift.ts +20 -0
  424. package/src/extraction-span-slice.test.ts +32 -0
  425. package/src/extraction-span-slice.ts +20 -0
  426. package/src/extraction-span-validate.test.ts +42 -0
  427. package/src/extraction-span-validate.ts +27 -0
  428. package/src/recall-deep-budget-left.test.ts +20 -0
  429. package/src/recall-deep-budget-left.ts +13 -0
  430. package/src/recall-deep-budget.test.ts +19 -0
  431. package/src/recall-deep-budget.ts +14 -0
  432. package/src/recall-deep-expand.test.ts +23 -0
  433. package/src/recall-deep-expand.ts +19 -0
  434. package/src/recall-deep-policy.test.ts +32 -0
  435. package/src/recall-deep-policy.ts +22 -0
  436. package/src/recall-deep-query.test.ts +23 -0
  437. package/src/recall-deep-query.ts +15 -0
  438. package/src/recall-deep-refine.test.ts +23 -0
  439. package/src/recall-deep-refine.ts +19 -0
  440. package/src/recall-deep-step-count.test.ts +20 -0
  441. package/src/recall-deep-step-count.ts +13 -0
  442. package/src/recall-deep-stop-reason.test.ts +46 -0
  443. package/src/recall-deep-stop-reason.ts +27 -0
  444. package/src/recall-deep-stop.test.ts +34 -0
  445. package/src/recall-deep-stop.ts +31 -0
  446. package/src/recall-deep-working-set.test.ts +21 -0
  447. package/src/recall-deep-working-set.ts +14 -0
  448. package/src/recall-navigate-access.test.ts +73 -0
  449. package/src/recall-navigate-access.ts +48 -0
  450. package/src/recall-navigate-action.test.ts +32 -0
  451. package/src/recall-navigate-action.ts +20 -0
  452. package/src/recall-navigate-budget.test.ts +23 -0
  453. package/src/recall-navigate-budget.ts +22 -0
  454. package/src/recall-navigate-cost.test.ts +20 -0
  455. package/src/recall-navigate-cost.ts +13 -0
  456. package/src/recall-navigate-depth.test.ts +20 -0
  457. package/src/recall-navigate-depth.ts +13 -0
  458. package/src/recall-navigate-link.test.ts +19 -0
  459. package/src/recall-navigate-link.ts +26 -0
  460. package/src/recall-navigate-max-children.test.ts +20 -0
  461. package/src/recall-navigate-max-children.ts +13 -0
  462. package/src/recall-navigate-node.test.ts +21 -0
  463. package/src/recall-navigate-node.ts +16 -0
  464. package/src/recall-navigate-path.test.ts +21 -0
  465. package/src/recall-navigate-path.ts +14 -0
  466. package/src/recall-navigate-render.test.ts +63 -0
  467. package/src/recall-navigate-render.ts +31 -0
  468. package/src/recall-state-view-current.test.ts +23 -0
  469. package/src/recall-state-view-current.ts +24 -0
  470. package/src/recall-state-view-inject.test.ts +32 -0
  471. package/src/recall-state-view-inject.ts +14 -0
  472. package/src/recall-state-view-kind.test.ts +19 -0
  473. package/src/recall-state-view-kind.ts +20 -0
  474. package/src/recall-state-view-label.test.ts +36 -0
  475. package/src/recall-state-view-label.ts +22 -0
  476. package/src/recall-state-view-successor.test.ts +21 -0
  477. package/src/recall-state-view-successor.ts +16 -0
  478. package/src/recall-state-view-superseded.test.ts +20 -0
  479. package/src/recall-state-view-superseded.ts +17 -0
  480. package/src/recall-state-view-transition.test.ts +30 -0
  481. package/src/recall-state-view-transition.ts +24 -0
  482. package/src/shared-context/authority.test.ts +35 -0
  483. package/src/shared-context/authority.ts +25 -0
  484. package/src/shared-context/claim-key.test.ts +21 -0
  485. package/src/shared-context/claim-key.ts +16 -0
  486. package/src/shared-context/contradictions.test.ts +39 -0
  487. package/src/shared-context/contradictions.ts +32 -0
  488. package/src/shared-context/envelope-actor.test.ts +21 -0
  489. package/src/shared-context/envelope-actor.ts +16 -0
  490. package/src/shared-context/envelope-at.test.ts +19 -0
  491. package/src/shared-context/envelope-at.ts +17 -0
  492. package/src/shared-context/envelope-id.test.ts +21 -0
  493. package/src/shared-context/envelope-id.ts +16 -0
  494. package/src/shared-context/envelope-required.test.ts +24 -0
  495. package/src/shared-context/envelope-required.ts +15 -0
  496. package/src/shared-context/envelope-ttl.test.ts +29 -0
  497. package/src/shared-context/envelope-ttl.ts +35 -0
  498. package/src/shared-context/provenance.test.ts +35 -0
  499. package/src/shared-context/provenance.ts +68 -0
  500. package/dist/chunk-47WWTCJY.js.map +0 -1
  501. package/dist/{access-service-Dz6I9AZ-.d.ts → access-service-C2tV2-uL.d.ts} +64 -64
  502. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  503. /package/dist/{chunk-F4W5HTED.js.map → chunk-3HHTN5X7.js.map} +0 -0
  504. /package/dist/{chunk-UHQE37NI.js.map → chunk-3Z4SFJA5.js.map} +0 -0
  505. /package/dist/{chunk-PP7R754B.js.map → chunk-4PTTMTTQ.js.map} +0 -0
  506. /package/dist/{chunk-AI5M4FVQ.js.map → chunk-4XESAT4V.js.map} +0 -0
  507. /package/dist/{chunk-6545JDIM.js.map → chunk-5KGLNBUB.js.map} +0 -0
  508. /package/dist/{chunk-2QSGJTDG.js.map → chunk-5XRZANCW.js.map} +0 -0
  509. /package/dist/{chunk-LSR5LQXN.js.map → chunk-6DODJYBY.js.map} +0 -0
  510. /package/dist/{chunk-D2YNNDML.js.map → chunk-73CAEYI3.js.map} +0 -0
  511. /package/dist/{chunk-J2R275FN.js.map → chunk-7DXW5V2W.js.map} +0 -0
  512. /package/dist/{chunk-25OLNWYG.js.map → chunk-7JJHIVMG.js.map} +0 -0
  513. /package/dist/{chunk-65HXVEVG.js.map → chunk-7NNMRMLZ.js.map} +0 -0
  514. /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
  515. /package/dist/{chunk-ZBIEX4XN.js.map → chunk-B2OKCCXX.js.map} +0 -0
  516. /package/dist/{chunk-U4HZEW2B.js.map → chunk-B7AGLMGP.js.map} +0 -0
  517. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  518. /package/dist/{chunk-OLBZ2WGG.js.map → chunk-C2JCVZWX.js.map} +0 -0
  519. /package/dist/{chunk-D3DUA64S.js.map → chunk-D4R3OUZA.js.map} +0 -0
  520. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  521. /package/dist/{chunk-EQRD4NMH.js.map → chunk-EGGNFLAT.js.map} +0 -0
  522. /package/dist/{chunk-FFWONAAW.js.map → chunk-ESDOAP7W.js.map} +0 -0
  523. /package/dist/{chunk-UMZUKOJU.js.map → chunk-EZWIEFYD.js.map} +0 -0
  524. /package/dist/{chunk-OIDICRH7.js.map → chunk-F5H5QINZ.js.map} +0 -0
  525. /package/dist/{chunk-UVYL5G7A.js.map → chunk-FPSOXMLK.js.map} +0 -0
  526. /package/dist/{chunk-ER2UPUMG.js.map → chunk-G5UKF2GJ.js.map} +0 -0
  527. /package/dist/{chunk-JJ6ZEFXC.js.map → chunk-GGY2747C.js.map} +0 -0
  528. /package/dist/{chunk-Y2YM4C75.js.map → chunk-GZPGI45F.js.map} +0 -0
  529. /package/dist/{chunk-CDLPF3PX.js.map → chunk-IDEPEHUG.js.map} +0 -0
  530. /package/dist/{chunk-W5IYHQA5.js.map → chunk-IN5EUWCA.js.map} +0 -0
  531. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  532. /package/dist/{chunk-6BYJQ3L2.js.map → chunk-JJAOVJ3E.js.map} +0 -0
  533. /package/dist/{chunk-ZXROBS53.js.map → chunk-JWCS3VYQ.js.map} +0 -0
  534. /package/dist/{chunk-JMXHVJ2V.js.map → chunk-KE23ZIEW.js.map} +0 -0
  535. /package/dist/{chunk-RCPKBW7K.js.map → chunk-KWJNEWTM.js.map} +0 -0
  536. /package/dist/{chunk-VSMSYDIH.js.map → chunk-MLTGALDY.js.map} +0 -0
  537. /package/dist/{chunk-B4B3QDV3.js.map → chunk-OKGQDI4Y.js.map} +0 -0
  538. /package/dist/{chunk-BIJAWZYW.js.map → chunk-OLT3YTDH.js.map} +0 -0
  539. /package/dist/{chunk-NZPFCP5A.js.map → chunk-OPQKVVYG.js.map} +0 -0
  540. /package/dist/{chunk-D6Q5EPOV.js.map → chunk-PGD3DXZP.js.map} +0 -0
  541. /package/dist/{chunk-ZMVW2HJJ.js.map → chunk-Q6LC3ZD5.js.map} +0 -0
  542. /package/dist/{chunk-4PG2CKI6.js.map → chunk-QELYSDAU.js.map} +0 -0
  543. /package/dist/{chunk-RH3XLQG4.js.map → chunk-S6PRJGQL.js.map} +0 -0
  544. /package/dist/{chunk-NTFXBILO.js.map → chunk-TCJO7LOG.js.map} +0 -0
  545. /package/dist/{chunk-F2JXJABQ.js.map → chunk-TO5U47YK.js.map} +0 -0
  546. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  547. /package/dist/{chunk-PRRUK2ZH.js.map → chunk-U3L6GRUX.js.map} +0 -0
  548. /package/dist/{chunk-VKDBDJIX.js.map → chunk-U4RGSLI4.js.map} +0 -0
  549. /package/dist/{chunk-BLHKR4GJ.js.map → chunk-UH53XVQ3.js.map} +0 -0
  550. /package/dist/{chunk-YZ5VC2JJ.js.map → chunk-UXERIBOJ.js.map} +0 -0
  551. /package/dist/{chunk-CQ6IWZDI.js.map → chunk-VA2CSIPC.js.map} +0 -0
  552. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  553. /package/dist/{chunk-EH7BNIUN.js.map → chunk-VPJNGE2R.js.map} +0 -0
  554. /package/dist/{chunk-6PUF7LUO.js.map → chunk-VTJZSLDR.js.map} +0 -0
  555. /package/dist/{chunk-PW3GKWH3.js.map → chunk-WHFFAS4A.js.map} +0 -0
  556. /package/dist/{chunk-WKWY7YF3.js.map → chunk-WVNETF4Q.js.map} +0 -0
  557. /package/dist/{chunk-C3ZYZKDJ.js.map → chunk-XSTMPZMY.js.map} +0 -0
  558. /package/dist/{chunk-OUKBMQ2O.js.map → chunk-Z3SQEEB6.js.map} +0 -0
  559. /package/dist/{chunk-36HJ36FK.js.map → chunk-ZBYOXIIF.js.map} +0 -0
  560. /package/dist/{chunk-DSEHPUID.js.map → chunk-ZC5IHL5X.js.map} +0 -0
  561. /package/dist/{chunk-R2Q6FTOX.js.map → chunk-ZDMTCO7N.js.map} +0 -0
  562. /package/dist/{chunk-OERZXNSK.js.map → chunk-ZET6A3OF.js.map} +0 -0
  563. /package/dist/{chunk-2VZHB5US.js.map → chunk-ZVAKRZZD.js.map} +0 -0
  564. /package/dist/{graph-edge-decay-FXGELBFA.js.map → graph-edge-decay-DGTBFALQ.js.map} +0 -0
@@ -0,0 +1,34 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { shouldStopDeepRecall } from "./recall-deep-stop.js";
5
+
6
+ test("budgetLeft 0 stops", () => {
7
+ assert.equal(shouldStopDeepRecall({ budgetLeft: 0, policy: "expand-once" }), true);
8
+ });
9
+
10
+ test("stop policy stops", () => {
11
+ assert.equal(shouldStopDeepRecall({ budgetLeft: 3, policy: "stop" }), true);
12
+ });
13
+
14
+ test("expand-once stops only after one expansion", () => {
15
+ assert.equal(
16
+ shouldStopDeepRecall({ budgetLeft: 3, policy: "expand-once", alreadyExpanded: false }),
17
+ false,
18
+ );
19
+ assert.equal(
20
+ shouldStopDeepRecall({ budgetLeft: 3, policy: "expand-once", alreadyExpanded: true }),
21
+ true,
22
+ );
23
+ });
24
+
25
+ test("unknown policy throws", () => {
26
+ assert.throws(
27
+ () => shouldStopDeepRecall({ budgetLeft: 3, policy: "refine-twice" }),
28
+ /unknown deep recall stop policy/,
29
+ );
30
+ assert.throws(
31
+ () => shouldStopDeepRecall({ budgetLeft: 3, policy: "refine-twice" }),
32
+ /stop, expand-once/,
33
+ );
34
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Deep-recall stop predicate (issue #2332 leftover).
3
+ *
4
+ * Pure. Surfaces wait. Budget 0, stop policy, and expand-once after
5
+ * one expansion halt. Unknown policy throws.
6
+ */
7
+
8
+ export const DEEP_RECALL_STOP_POLICIES = ["stop", "expand-once"] as const;
9
+
10
+ export type DeepRecallStopPolicy = (typeof DEEP_RECALL_STOP_POLICIES)[number];
11
+
12
+ export interface DeepRecallStopInput {
13
+ budgetLeft: number;
14
+ policy: string;
15
+ alreadyExpanded?: boolean;
16
+ }
17
+
18
+ export function isDeepRecallStopPolicy(value: unknown): value is DeepRecallStopPolicy {
19
+ return typeof value === "string" && (DEEP_RECALL_STOP_POLICIES as readonly string[]).includes(value);
20
+ }
21
+
22
+ export function shouldStopDeepRecall(input: DeepRecallStopInput): boolean {
23
+ if (!isDeepRecallStopPolicy(input.policy)) {
24
+ throw new Error(
25
+ `unknown deep recall stop policy: ${JSON.stringify(input.policy)}. Valid: ${DEEP_RECALL_STOP_POLICIES.join(", ")}`,
26
+ );
27
+ }
28
+ if (input.budgetLeft <= 0) return true;
29
+ if (input.policy === "stop") return true;
30
+ return input.alreadyExpanded === true;
31
+ }
@@ -0,0 +1,21 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { isEmptyWorkingSet } from "./recall-deep-working-set.js";
5
+
6
+ test("null, undefined, and empty array are empty", () => {
7
+ assert.equal(isEmptyWorkingSet(null), true);
8
+ assert.equal(isEmptyWorkingSet(undefined), true);
9
+ assert.equal(isEmptyWorkingSet([]), true);
10
+ });
11
+
12
+ test("a non-empty array is not empty", () => {
13
+ assert.equal(isEmptyWorkingSet([{ id: 1 }]), false);
14
+ assert.equal(isEmptyWorkingSet([0]), false);
15
+ });
16
+
17
+ test("a non-array throws", () => {
18
+ assert.throws(() => isEmptyWorkingSet({}), TypeError);
19
+ assert.throws(() => isEmptyWorkingSet("items"), TypeError);
20
+ assert.throws(() => isEmptyWorkingSet(1), TypeError);
21
+ });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Empty-set guard for a deep-recall working set (issue #2332 leftover).
3
+ *
4
+ * null, undefined, and [] are empty. A non-array throws. Any other array is not empty.
5
+ */
6
+
7
+ /** True when the working set is absent or has no items. */
8
+ export function isEmptyWorkingSet(items: unknown): boolean {
9
+ if (items == null) return true;
10
+ if (!Array.isArray(items)) {
11
+ throw new TypeError("items must be an array");
12
+ }
13
+ return items.length === 0;
14
+ }
@@ -0,0 +1,73 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { runRecallNavigateAccess } from "./recall-navigate-access.js";
5
+ import type { RecallNavNode } from "./recall-navigate.js";
6
+
7
+ function node(extra: Partial<RecallNavNode> = {}): RecallNavNode {
8
+ return {
9
+ id: "m1",
10
+ disclosure: "chunk",
11
+ ...extra,
12
+ };
13
+ }
14
+
15
+ test("expand re-renders the next disclosure for the given nodeId", () => {
16
+ const result = runRecallNavigateAccess({
17
+ action: "expand",
18
+ nodeId: "m1",
19
+ budget: 10,
20
+ node: node({ payloads: { section: "full section body" } }),
21
+ });
22
+ assert.equal(result.ok, true);
23
+ if (!result.ok) return;
24
+ assert.deepEqual(result.result, {
25
+ status: "ok",
26
+ node: { id: "m1", disclosure: "section", text: "full section body" },
27
+ });
28
+ });
29
+
30
+ test("traverse returns typed neighbors for the given nodeId", () => {
31
+ const result = runRecallNavigateAccess({
32
+ action: "traverse",
33
+ nodeId: "m1",
34
+ budget: 10,
35
+ linkType: "contradicts",
36
+ node: node({
37
+ links: [
38
+ { targetId: "z-mem", linkType: "contradicts" },
39
+ { targetId: "a-mem", linkType: "contradicts" },
40
+ { targetId: "skip-me", linkType: "supports" },
41
+ ],
42
+ }),
43
+ });
44
+ assert.equal(result.ok, true);
45
+ if (!result.ok) return;
46
+ assert.equal(result.result.status, "ok");
47
+ if (result.result.status !== "ok") return;
48
+ assert.ok("neighbors" in result.result);
49
+ assert.deepEqual(
50
+ result.result.neighbors.map((row) => row.id),
51
+ ["a-mem", "z-mem"],
52
+ );
53
+ });
54
+
55
+ test("budget 0 is exhausted before any expand or traverse", () => {
56
+ const result = runRecallNavigateAccess({
57
+ action: "expand",
58
+ nodeId: "m1",
59
+ budget: 0,
60
+ node: node({ payloads: { section: "full section body" } }),
61
+ });
62
+ assert.deepEqual(result, { ok: false, error: "budget_exhausted" });
63
+ });
64
+
65
+ test("unknown action is rejected", () => {
66
+ const result = runRecallNavigateAccess({
67
+ action: "zoom",
68
+ nodeId: "m1",
69
+ budget: 10,
70
+ node: node(),
71
+ });
72
+ assert.deepEqual(result, { ok: false, error: "unknown_action" });
73
+ });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Recall navigation access wrapper (issue #1956 leftover slice).
3
+ *
4
+ * Validates the request, gates the budget, and delegates to the pure
5
+ * helpers in recall-navigate.ts. Never calls orchestrator.recall — the
6
+ * caller supplies the node for `nodeId`.
7
+ */
8
+ import {
9
+ expandRecallNode,
10
+ traverseRecallLink,
11
+ type RecallNavExpandResult,
12
+ type RecallNavNode,
13
+ type RecallNavTraverseResult,
14
+ } from "./recall-navigate.js";
15
+
16
+ export type RecallNavigateAccessAction = "expand" | "traverse";
17
+
18
+ export interface RecallNavigateAccessRequest {
19
+ action: string;
20
+ nodeId: string;
21
+ budget: number;
22
+ node?: RecallNavNode;
23
+ linkType?: string;
24
+ }
25
+
26
+ export type RecallNavigateAccessResult =
27
+ | { ok: true; result: RecallNavExpandResult | RecallNavTraverseResult }
28
+ | { ok: false; error: "budget_exhausted" | "unknown_action" | "node_not_found" };
29
+
30
+ export function runRecallNavigateAccess(request: RecallNavigateAccessRequest): RecallNavigateAccessResult {
31
+ if (request.action !== "expand" && request.action !== "traverse") {
32
+ return { ok: false, error: "unknown_action" };
33
+ }
34
+ if (!Number.isFinite(request.budget) || request.budget <= 0) {
35
+ return { ok: false, error: "budget_exhausted" };
36
+ }
37
+ const node = request.node;
38
+ if (node === undefined || node.id !== request.nodeId) {
39
+ return { ok: false, error: "node_not_found" };
40
+ }
41
+ if (request.action === "expand") {
42
+ return { ok: true, result: expandRecallNode(node, { budget: request.budget }) };
43
+ }
44
+ return {
45
+ ok: true,
46
+ result: traverseRecallLink(node, request.linkType ?? "", { budget: request.budget }),
47
+ };
48
+ }
@@ -0,0 +1,32 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseNavigateAction } from "./recall-navigate-action.js";
5
+
6
+ test("expand is allowed", () => {
7
+ assert.deepEqual(parseNavigateAction("expand"), {
8
+ ok: true,
9
+ action: "expand",
10
+ });
11
+ });
12
+
13
+ test("traverse is allowed", () => {
14
+ assert.deepEqual(parseNavigateAction("traverse"), {
15
+ ok: true,
16
+ action: "traverse",
17
+ });
18
+ });
19
+
20
+ test("unknown action is unknown_action", () => {
21
+ assert.deepEqual(parseNavigateAction("refine"), {
22
+ ok: false,
23
+ error: "unknown_action",
24
+ });
25
+ });
26
+
27
+ test("empty action is unknown_action", () => {
28
+ assert.deepEqual(parseNavigateAction(""), {
29
+ ok: false,
30
+ error: "unknown_action",
31
+ });
32
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Recall navigation action parse (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. Unknown or empty is unknown_action.
5
+ */
6
+
7
+ const NAVIGATE_ACTIONS = ["expand", "traverse"] as const;
8
+
9
+ export type NavigateAction = (typeof NAVIGATE_ACTIONS)[number];
10
+
11
+ export type ParseNavigateActionResult =
12
+ | { ok: true; action: NavigateAction }
13
+ | { ok: false; error: "unknown_action" };
14
+
15
+ export function parseNavigateAction(value: string): ParseNavigateActionResult {
16
+ if ((NAVIGATE_ACTIONS as readonly string[]).includes(value)) {
17
+ return { ok: true, action: value as NavigateAction };
18
+ }
19
+ return { ok: false, error: "unknown_action" };
20
+ }
@@ -0,0 +1,23 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { takeNavigateBudget } from "./recall-navigate-budget.js";
5
+
6
+ test("budget 0 is exhausted", () => {
7
+ assert.deepEqual(takeNavigateBudget(0, 0), { ok: false, error: "budget_exhausted" });
8
+ assert.deepEqual(takeNavigateBudget(0, 1), { ok: false, error: "budget_exhausted" });
9
+ });
10
+
11
+ test("cost above budget is exhausted", () => {
12
+ assert.deepEqual(takeNavigateBudget(3, 4), { ok: false, error: "budget_exhausted" });
13
+ });
14
+
15
+ test("remaining is budget minus cost", () => {
16
+ assert.deepEqual(takeNavigateBudget(5, 2), { ok: true, remaining: 3 });
17
+ assert.deepEqual(takeNavigateBudget(4, 4), { ok: true, remaining: 0 });
18
+ });
19
+
20
+ test("negative budget or cost throws", () => {
21
+ assert.throws(() => takeNavigateBudget(-1, 0));
22
+ assert.throws(() => takeNavigateBudget(3, -1));
23
+ });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Recall navigation budget take (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. Budget 0 or cost above budget is exhausted.
5
+ * Negative budget or cost throws.
6
+ */
7
+
8
+ export type NavigateBudgetResult =
9
+ | { ok: true; remaining: number }
10
+ | { ok: false; error: "budget_exhausted" };
11
+
12
+ export function takeNavigateBudget(budget: number, cost: number): NavigateBudgetResult {
13
+ if (budget < 0 || cost < 0) {
14
+ throw new Error(
15
+ `navigate budget and cost must be non-negative; got budget=${JSON.stringify(budget)} cost=${JSON.stringify(cost)}`,
16
+ );
17
+ }
18
+ if (budget === 0 || cost > budget) {
19
+ return { ok: false, error: "budget_exhausted" };
20
+ }
21
+ return { ok: true, remaining: budget - cost };
22
+ }
@@ -0,0 +1,20 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseNavigateCost } from "./recall-navigate-cost.js";
5
+
6
+ test("cost 0 is allowed", () => {
7
+ assert.equal(parseNavigateCost(0), 0);
8
+ });
9
+
10
+ test("cost 2 is returned", () => {
11
+ assert.equal(parseNavigateCost(2), 2);
12
+ });
13
+
14
+ test("negative cost throws", () => {
15
+ assert.throws(() => parseNavigateCost(-1), /non-negative integer/);
16
+ });
17
+
18
+ test("float cost throws", () => {
19
+ assert.throws(() => parseNavigateCost(1.5), /non-negative integer/);
20
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Recall navigation cost parse (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. 0 is allowed. Negative or non-integer throws.
5
+ */
6
+ export function parseNavigateCost(value: unknown): number {
7
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
8
+ throw new Error(
9
+ `navigate cost must be a non-negative integer; got ${JSON.stringify(value)}`,
10
+ );
11
+ }
12
+ return value;
13
+ }
@@ -0,0 +1,20 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseNavigateDepth } from "./recall-navigate-depth.js";
5
+
6
+ test("depth 0 is allowed", () => {
7
+ assert.equal(parseNavigateDepth(0), 0);
8
+ });
9
+
10
+ test("depth 3 is returned", () => {
11
+ assert.equal(parseNavigateDepth(3), 3);
12
+ });
13
+
14
+ test("negative depth throws", () => {
15
+ assert.throws(() => parseNavigateDepth(-1), /non-negative integer/);
16
+ });
17
+
18
+ test("float depth throws", () => {
19
+ assert.throws(() => parseNavigateDepth(1.5), /non-negative integer/);
20
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Recall navigation depth parse (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. 0 is allowed. Negative or non-integer throws.
5
+ */
6
+ export function parseNavigateDepth(value: unknown): number {
7
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
8
+ throw new Error(
9
+ `navigate depth must be a non-negative integer; got ${JSON.stringify(value)}`,
10
+ );
11
+ }
12
+ return value;
13
+ }
@@ -0,0 +1,19 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseNavigateLinkType } from "./recall-navigate-link.js";
5
+
6
+ test("parses each allowed link type", () => {
7
+ for (const type of ["supports", "contradicts", "elaborates", "causes", "caused_by"] as const) {
8
+ assert.deepEqual(parseNavigateLinkType(type), { ok: true, type });
9
+ }
10
+ });
11
+
12
+ test("unknown link is unknown_link", () => {
13
+ assert.deepEqual(parseNavigateLinkType("supersedes"), { ok: false, error: "unknown_link" });
14
+ assert.deepEqual(parseNavigateLinkType("related"), { ok: false, error: "unknown_link" });
15
+ });
16
+
17
+ test("empty link is unknown_link", () => {
18
+ assert.deepEqual(parseNavigateLinkType(""), { ok: false, error: "unknown_link" });
19
+ });
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Recall navigation link-type parse (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. Unknown or empty is unknown_link.
5
+ */
6
+
7
+ const NAVIGATE_LINK_TYPES = [
8
+ "supports",
9
+ "contradicts",
10
+ "elaborates",
11
+ "causes",
12
+ "caused_by",
13
+ ] as const;
14
+
15
+ export type NavigateLinkType = (typeof NAVIGATE_LINK_TYPES)[number];
16
+
17
+ export type ParseNavigateLinkTypeResult =
18
+ | { ok: true; type: NavigateLinkType }
19
+ | { ok: false; error: "unknown_link" };
20
+
21
+ export function parseNavigateLinkType(value: string): ParseNavigateLinkTypeResult {
22
+ if ((NAVIGATE_LINK_TYPES as readonly string[]).includes(value)) {
23
+ return { ok: true, type: value as NavigateLinkType };
24
+ }
25
+ return { ok: false, error: "unknown_link" };
26
+ }
@@ -0,0 +1,20 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseMaxChildren } from "./recall-navigate-max-children.js";
5
+
6
+ test("max children 0 is allowed", () => {
7
+ assert.equal(parseMaxChildren(0), 0);
8
+ });
9
+
10
+ test("max children 10 is returned", () => {
11
+ assert.equal(parseMaxChildren(10), 10);
12
+ });
13
+
14
+ test("negative max children throws", () => {
15
+ assert.throws(() => parseMaxChildren(-1), /non-negative integer/);
16
+ });
17
+
18
+ test("float max children throws", () => {
19
+ assert.throws(() => parseMaxChildren(1.5), /non-negative integer/);
20
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Recall navigation max-children parse (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. 0 is allowed. Negative or non-integer throws.
5
+ */
6
+ export function parseMaxChildren(value: unknown): number {
7
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
8
+ throw new Error(
9
+ `max children must be a non-negative integer; got ${JSON.stringify(value)}`,
10
+ );
11
+ }
12
+ return value;
13
+ }
@@ -0,0 +1,21 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseNavigateNodeId } from "./recall-navigate-node.js";
5
+
6
+ test("ok node id returns trimmed nodeId", () => {
7
+ assert.deepEqual(parseNavigateNodeId("mem-1"), { ok: true, nodeId: "mem-1" });
8
+ });
9
+
10
+ test("empty node id is missing_node", () => {
11
+ assert.deepEqual(parseNavigateNodeId(""), { ok: false, error: "missing_node" });
12
+ assert.deepEqual(parseNavigateNodeId(" "), { ok: false, error: "missing_node" });
13
+ });
14
+
15
+ test("newline in node id is invalid_node", () => {
16
+ assert.deepEqual(parseNavigateNodeId("mem-1\nmem-2"), { ok: false, error: "invalid_node" });
17
+ });
18
+
19
+ test("trims surrounding whitespace", () => {
20
+ assert.deepEqual(parseNavigateNodeId(" mem-1 "), { ok: true, nodeId: "mem-1" });
21
+ });
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Recall navigation node-id parse (issue #1956 leftover).
3
+ *
4
+ * Pure. Surfaces wait. Empty is missing_node. Newline is invalid_node.
5
+ */
6
+
7
+ export type ParseNavigateNodeIdResult =
8
+ | { ok: true; nodeId: string }
9
+ | { ok: false; error: "missing_node" | "invalid_node" };
10
+
11
+ export function parseNavigateNodeId(value: string): ParseNavigateNodeIdResult {
12
+ const nodeId = value.trim();
13
+ if (nodeId.length === 0) return { ok: false, error: "missing_node" };
14
+ if (nodeId.includes("\n")) return { ok: false, error: "invalid_node" };
15
+ return { ok: true, nodeId };
16
+ }
@@ -0,0 +1,21 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { isEmptyNavigatePath } from "./recall-navigate-path.js";
5
+
6
+ test("null, undefined, and empty array are empty", () => {
7
+ assert.equal(isEmptyNavigatePath(null), true);
8
+ assert.equal(isEmptyNavigatePath(undefined), true);
9
+ assert.equal(isEmptyNavigatePath([]), true);
10
+ });
11
+
12
+ test("a non-empty array is not empty", () => {
13
+ assert.equal(isEmptyNavigatePath([{ id: 1 }]), false);
14
+ assert.equal(isEmptyNavigatePath([0]), false);
15
+ });
16
+
17
+ test("a non-array throws", () => {
18
+ assert.throws(() => isEmptyNavigatePath({}), TypeError);
19
+ assert.throws(() => isEmptyNavigatePath("nodes"), TypeError);
20
+ assert.throws(() => isEmptyNavigatePath(1), TypeError);
21
+ });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Empty-set guard for a recall-navigate path (issue #1956 leftover).
3
+ *
4
+ * null, undefined, and [] are empty. A non-array throws. Any other array is not empty.
5
+ */
6
+
7
+ /** True when the navigate path is absent or has no nodes. */
8
+ export function isEmptyNavigatePath(nodes: unknown): boolean {
9
+ if (nodes == null) return true;
10
+ if (!Array.isArray(nodes)) {
11
+ throw new TypeError("nodes must be an array");
12
+ }
13
+ return nodes.length === 0;
14
+ }
@@ -0,0 +1,63 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { renderNavigateResult } from "./recall-navigate-render.js";
5
+
6
+ test("expand empty children prints (empty)", () => {
7
+ assert.equal(
8
+ renderNavigateResult({
9
+ action: "expand",
10
+ nodeId: "m1",
11
+ children: [],
12
+ stopReason: "empty",
13
+ }),
14
+ [
15
+ "# Navigate",
16
+ "",
17
+ "- action: expand",
18
+ "- nodeId: m1",
19
+ "- children: (empty)",
20
+ "- stop: empty",
21
+ "",
22
+ ].join("\n"),
23
+ );
24
+ });
25
+
26
+ test("traverse path lists node ids in order", () => {
27
+ assert.equal(
28
+ renderNavigateResult({
29
+ action: "traverse",
30
+ nodeId: "m1",
31
+ path: ["a-mem", "z-mem"],
32
+ stopReason: "ok",
33
+ }),
34
+ [
35
+ "# Navigate",
36
+ "",
37
+ "- action: traverse",
38
+ "- nodeId: m1",
39
+ "- path: a-mem, z-mem",
40
+ "- stop: ok",
41
+ "",
42
+ ].join("\n"),
43
+ );
44
+ });
45
+
46
+ test("error prints the stop reason", () => {
47
+ assert.equal(
48
+ renderNavigateResult({
49
+ action: "expand",
50
+ nodeId: "missing",
51
+ stopReason: "node_not_found",
52
+ }),
53
+ [
54
+ "# Navigate",
55
+ "",
56
+ "- action: expand",
57
+ "- nodeId: missing",
58
+ "- children: (empty)",
59
+ "- stop: node_not_found",
60
+ "",
61
+ ].join("\n"),
62
+ );
63
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Markdown renderer for a recall navigate step (issue #1956 leftover).
3
+ *
4
+ * Deterministic. Surfaces wait. Empty children prints (empty).
5
+ */
6
+
7
+ export type NavigateResult = {
8
+ action: string;
9
+ nodeId: string;
10
+ children?: readonly string[];
11
+ path?: readonly string[];
12
+ stopReason: string;
13
+ };
14
+
15
+ function formatList(items: readonly string[] | undefined): string {
16
+ if (items === undefined || items.length === 0) return "(empty)";
17
+ return items.join(", ");
18
+ }
19
+
20
+ export function renderNavigateResult(result: NavigateResult): string {
21
+ const usePath = result.action === "traverse" || result.path !== undefined;
22
+ return [
23
+ "# Navigate",
24
+ "",
25
+ `- action: ${result.action}`,
26
+ `- nodeId: ${result.nodeId}`,
27
+ usePath ? `- path: ${formatList(result.path)}` : `- children: ${formatList(result.children)}`,
28
+ `- stop: ${result.stopReason}`,
29
+ "",
30
+ ].join("\n");
31
+ }