sensemaking 0.15.4 → 0.17.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 (435) hide show
  1. package/README.md +33 -5
  2. package/dist/cjs/chunk/extract.d.cts +2 -0
  3. package/dist/cjs/chunk/extract.d.ts +2 -0
  4. package/dist/cjs/chunk/extract.js +139 -0
  5. package/dist/cjs/chunk/extract.js.map +1 -0
  6. package/dist/cjs/chunk/group.d.cts +4 -0
  7. package/dist/cjs/chunk/group.d.ts +4 -0
  8. package/dist/cjs/chunk/group.js +489 -0
  9. package/dist/cjs/chunk/group.js.map +1 -0
  10. package/dist/cjs/chunk/index.d.cts +8 -0
  11. package/dist/cjs/chunk/index.d.ts +8 -0
  12. package/dist/cjs/chunk/index.js +44 -0
  13. package/dist/cjs/chunk/index.js.map +1 -0
  14. package/dist/cjs/chunk/parse.d.cts +2 -0
  15. package/dist/cjs/chunk/parse.d.ts +2 -0
  16. package/dist/cjs/chunk/parse.js +71 -0
  17. package/dist/cjs/chunk/parse.js.map +1 -0
  18. package/dist/cjs/chunk/types.d.cts +19 -0
  19. package/dist/cjs/chunk/types.d.ts +19 -0
  20. package/dist/cjs/chunk/types.js +5 -0
  21. package/dist/cjs/chunk/types.js.map +1 -0
  22. package/dist/cjs/chunk/version.d.cts +1 -0
  23. package/dist/cjs/chunk/version.d.ts +1 -0
  24. package/dist/cjs/chunk/version.js +14 -0
  25. package/dist/cjs/chunk/version.js.map +1 -0
  26. package/dist/cjs/cli/download.js +12 -11
  27. package/dist/cjs/cli/download.js.map +1 -1
  28. package/dist/cjs/cli/index.d.cts +1 -1
  29. package/dist/cjs/cli/index.d.ts +1 -1
  30. package/dist/cjs/cli/index.js +1 -1
  31. package/dist/cjs/cli/index.js.map +1 -1
  32. package/dist/cjs/cli/init.js +31 -5
  33. package/dist/cjs/cli/init.js.map +1 -1
  34. package/dist/cjs/cli/map.js +1 -1
  35. package/dist/cjs/cli/map.js.map +1 -1
  36. package/dist/cjs/cli/named.js +1 -1
  37. package/dist/cjs/cli/named.js.map +1 -1
  38. package/dist/cjs/cli/path.js +2 -2
  39. package/dist/cjs/cli/path.js.map +1 -1
  40. package/dist/cjs/cli/peek.js +1 -1
  41. package/dist/cjs/cli/peek.js.map +1 -1
  42. package/dist/cjs/cli/related.js +1 -1
  43. package/dist/cjs/cli/related.js.map +1 -1
  44. package/dist/cjs/cli/search.js +1 -1
  45. package/dist/cjs/cli/search.js.map +1 -1
  46. package/dist/cjs/cli/shared.d.cts +1 -1
  47. package/dist/cjs/cli/shared.d.ts +1 -1
  48. package/dist/cjs/cli/shared.js +3 -3
  49. package/dist/cjs/cli/shared.js.map +1 -1
  50. package/dist/cjs/cli/status.js +344 -100
  51. package/dist/cjs/cli/status.js.map +1 -1
  52. package/dist/cjs/commands/map.d.cts +1 -1
  53. package/dist/cjs/commands/map.d.ts +1 -1
  54. package/dist/cjs/commands/map.js.map +1 -1
  55. package/dist/cjs/commands/peek.d.cts +1 -1
  56. package/dist/cjs/commands/peek.d.ts +1 -1
  57. package/dist/cjs/commands/peek.js +13 -6
  58. package/dist/cjs/commands/peek.js.map +1 -1
  59. package/dist/cjs/commands/related.js +17 -13
  60. package/dist/cjs/commands/related.js.map +1 -1
  61. package/dist/cjs/commands/scope.js +1 -1
  62. package/dist/cjs/commands/scope.js.map +1 -1
  63. package/dist/cjs/commands/search.d.cts +1 -1
  64. package/dist/cjs/commands/search.d.ts +1 -1
  65. package/dist/cjs/commands/search.js +28 -99
  66. package/dist/cjs/commands/search.js.map +1 -1
  67. package/dist/cjs/commands/signals.d.cts +18 -0
  68. package/dist/cjs/commands/signals.d.ts +18 -0
  69. package/dist/cjs/commands/signals.js +299 -0
  70. package/dist/cjs/commands/signals.js.map +1 -0
  71. package/dist/cjs/commands/status.d.cts +2 -2
  72. package/dist/cjs/commands/status.d.ts +2 -2
  73. package/dist/cjs/commands/status.js +1 -1
  74. package/dist/cjs/commands/status.js.map +1 -1
  75. package/dist/cjs/config/access.d.cts +8 -3
  76. package/dist/cjs/config/access.d.ts +8 -3
  77. package/dist/cjs/config/access.js +35 -17
  78. package/dist/cjs/config/access.js.map +1 -1
  79. package/dist/cjs/config/index.d.cts +5 -1
  80. package/dist/cjs/config/index.d.ts +5 -1
  81. package/dist/cjs/config/index.js +16 -2
  82. package/dist/cjs/config/index.js.map +1 -1
  83. package/dist/cjs/config/load.d.cts +6 -1
  84. package/dist/cjs/config/load.d.ts +6 -1
  85. package/dist/cjs/config/load.js +83 -8
  86. package/dist/cjs/config/load.js.map +1 -1
  87. package/dist/cjs/config/resolve.js +1 -1
  88. package/dist/cjs/config/resolve.js.map +1 -1
  89. package/dist/cjs/config/signals.d.cts +4 -0
  90. package/dist/cjs/config/signals.d.ts +4 -0
  91. package/dist/cjs/config/signals.js +30 -0
  92. package/dist/cjs/config/signals.js.map +1 -0
  93. package/dist/cjs/config/types.d.cts +7 -4
  94. package/dist/cjs/config/types.d.ts +7 -4
  95. package/dist/cjs/config/types.js +1 -1
  96. package/dist/cjs/config/types.js.map +1 -1
  97. package/dist/cjs/config/validate.d.cts +1 -0
  98. package/dist/cjs/config/validate.d.ts +1 -0
  99. package/dist/cjs/config/validate.js +127 -11
  100. package/dist/cjs/config/validate.js.map +1 -1
  101. package/dist/cjs/db/open.d.cts +1 -1
  102. package/dist/cjs/db/open.d.ts +1 -1
  103. package/dist/cjs/db/open.js +9 -4
  104. package/dist/cjs/db/open.js.map +1 -1
  105. package/dist/cjs/db/reconcile.d.cts +1 -0
  106. package/dist/cjs/db/reconcile.d.ts +1 -0
  107. package/dist/cjs/db/reconcile.js +23 -8
  108. package/dist/cjs/db/reconcile.js.map +1 -1
  109. package/dist/cjs/{sql-functions.js → db/sql-functions.js} +1 -1
  110. package/dist/cjs/db/sql-functions.js.map +1 -0
  111. package/dist/cjs/embed/cohere.d.cts +2 -0
  112. package/dist/cjs/embed/cohere.d.ts +2 -0
  113. package/dist/cjs/embed/cohere.js +238 -0
  114. package/dist/cjs/embed/cohere.js.map +1 -0
  115. package/dist/cjs/embed/http.d.cts +2 -0
  116. package/dist/cjs/embed/http.d.ts +2 -0
  117. package/dist/cjs/embed/http.js +258 -0
  118. package/dist/cjs/embed/http.js.map +1 -0
  119. package/dist/cjs/embed/identity.d.cts +13 -0
  120. package/dist/cjs/embed/identity.d.ts +13 -0
  121. package/dist/cjs/embed/identity.js +194 -0
  122. package/dist/cjs/embed/identity.js.map +1 -0
  123. package/dist/cjs/embed/langfit.d.cts +6 -0
  124. package/dist/cjs/embed/langfit.d.ts +6 -0
  125. package/dist/cjs/embed/langfit.js +286 -0
  126. package/dist/cjs/embed/langfit.js.map +1 -0
  127. package/dist/cjs/embed/languages.d.cts +3 -0
  128. package/dist/cjs/embed/languages.d.ts +3 -0
  129. package/dist/cjs/embed/languages.js +98 -0
  130. package/dist/cjs/embed/languages.js.map +1 -0
  131. package/dist/cjs/embed/openai.d.cts +2 -0
  132. package/dist/cjs/embed/openai.d.ts +2 -0
  133. package/dist/cjs/embed/openai.js +268 -0
  134. package/dist/cjs/embed/openai.js.map +1 -0
  135. package/dist/cjs/embed/query.d.cts +21 -0
  136. package/dist/cjs/embed/query.d.ts +21 -0
  137. package/dist/cjs/embed/query.js +610 -0
  138. package/dist/cjs/embed/query.js.map +1 -0
  139. package/dist/cjs/embed/registry.d.cts +3 -0
  140. package/dist/cjs/embed/registry.d.ts +3 -0
  141. package/dist/cjs/embed/registry.js +114 -0
  142. package/dist/cjs/embed/registry.js.map +1 -0
  143. package/dist/cjs/embed/static.d.cts +2 -0
  144. package/dist/cjs/embed/static.d.ts +2 -0
  145. package/dist/cjs/embed/static.js +330 -0
  146. package/dist/cjs/embed/static.js.map +1 -0
  147. package/dist/cjs/embed/store.d.cts +8 -0
  148. package/dist/cjs/embed/store.d.ts +8 -0
  149. package/dist/cjs/embed/store.js +498 -0
  150. package/dist/cjs/embed/store.js.map +1 -0
  151. package/dist/cjs/embed/types.d.cts +8 -0
  152. package/dist/cjs/embed/types.d.ts +8 -0
  153. package/dist/cjs/embed/types.js +7 -0
  154. package/dist/cjs/embed/types.js.map +1 -0
  155. package/dist/cjs/errors.d.cts +1 -1
  156. package/dist/cjs/errors.d.ts +1 -1
  157. package/dist/cjs/errors.js.map +1 -1
  158. package/dist/cjs/features/embed.d.cts +2 -28
  159. package/dist/cjs/features/embed.d.ts +2 -28
  160. package/dist/cjs/features/embed.js +39 -1027
  161. package/dist/cjs/features/embed.js.map +1 -1
  162. package/dist/cjs/{fences.js → features/fences.js} +1 -1
  163. package/dist/cjs/features/fences.js.map +1 -0
  164. package/dist/cjs/features/links.js +1 -1
  165. package/dist/cjs/features/links.js.map +1 -1
  166. package/dist/cjs/features/rank.js +1 -1
  167. package/dist/cjs/features/rank.js.map +1 -1
  168. package/dist/cjs/features/sections.js +4 -3
  169. package/dist/cjs/features/sections.js.map +1 -1
  170. package/dist/cjs/features/tags.js +1 -1
  171. package/dist/cjs/features/tags.js.map +1 -1
  172. package/dist/cjs/features/types.d.cts +4 -2
  173. package/dist/cjs/features/types.d.ts +4 -2
  174. package/dist/cjs/graph/graph.js.map +1 -0
  175. package/dist/cjs/graph/traverse.js.map +1 -0
  176. package/dist/cjs/index.d.cts +4 -4
  177. package/dist/cjs/index.d.ts +4 -4
  178. package/dist/cjs/index.js +4 -1
  179. package/dist/cjs/index.js.map +1 -1
  180. package/dist/cjs/output/column-hint.js.map +1 -0
  181. package/dist/cjs/{output.d.cts → output/output.d.cts} +2 -2
  182. package/dist/cjs/{output.d.ts → output/output.d.ts} +2 -2
  183. package/dist/cjs/{output.js → output/output.js} +9 -2
  184. package/dist/cjs/output/output.js.map +1 -0
  185. package/dist/cjs/output/progress.js.map +1 -0
  186. package/dist/cjs/{search-error.js → output/search-error.js} +1 -1
  187. package/dist/cjs/output/search-error.js.map +1 -0
  188. package/dist/cjs/scan/frontmatter.d.cts +13 -0
  189. package/dist/cjs/scan/frontmatter.d.ts +13 -0
  190. package/dist/cjs/scan/frontmatter.js +229 -0
  191. package/dist/cjs/scan/frontmatter.js.map +1 -0
  192. package/dist/cjs/scan/index.d.cts +25 -0
  193. package/dist/cjs/scan/index.d.ts +25 -0
  194. package/dist/cjs/scan/index.js +107 -0
  195. package/dist/cjs/scan/index.js.map +1 -0
  196. package/dist/cjs/scan/list.d.cts +12 -0
  197. package/dist/cjs/scan/list.d.ts +12 -0
  198. package/dist/cjs/scan/list.js +154 -0
  199. package/dist/cjs/scan/list.js.map +1 -0
  200. package/dist/cjs/text/segment.d.cts +3 -0
  201. package/dist/cjs/text/segment.d.ts +3 -0
  202. package/dist/cjs/text/segment.js +154 -0
  203. package/dist/cjs/text/segment.js.map +1 -0
  204. package/dist/cjs/text/strip.d.cts +3 -0
  205. package/dist/cjs/text/strip.d.ts +3 -0
  206. package/dist/cjs/text/strip.js +32 -0
  207. package/dist/cjs/text/strip.js.map +1 -0
  208. package/dist/esm/chunk/extract.d.ts +2 -0
  209. package/dist/esm/chunk/extract.js +114 -0
  210. package/dist/esm/chunk/extract.js.map +1 -0
  211. package/dist/esm/chunk/group.d.ts +4 -0
  212. package/dist/esm/chunk/group.js +253 -0
  213. package/dist/esm/chunk/group.js.map +1 -0
  214. package/dist/esm/chunk/index.d.ts +8 -0
  215. package/dist/esm/chunk/index.js +16 -0
  216. package/dist/esm/chunk/index.js.map +1 -0
  217. package/dist/esm/chunk/parse.d.ts +2 -0
  218. package/dist/esm/chunk/parse.js +63 -0
  219. package/dist/esm/chunk/parse.js.map +1 -0
  220. package/dist/esm/chunk/types.d.ts +19 -0
  221. package/dist/esm/chunk/types.js +2 -0
  222. package/dist/esm/chunk/types.js.map +1 -0
  223. package/dist/esm/chunk/version.d.ts +1 -0
  224. package/dist/esm/chunk/version.js +3 -0
  225. package/dist/esm/chunk/version.js.map +1 -0
  226. package/dist/esm/cli/download.js +9 -8
  227. package/dist/esm/cli/download.js.map +1 -1
  228. package/dist/esm/cli/index.d.ts +1 -1
  229. package/dist/esm/cli/index.js +1 -1
  230. package/dist/esm/cli/index.js.map +1 -1
  231. package/dist/esm/cli/init.js +32 -6
  232. package/dist/esm/cli/init.js.map +1 -1
  233. package/dist/esm/cli/map.js +1 -1
  234. package/dist/esm/cli/map.js.map +1 -1
  235. package/dist/esm/cli/named.js +1 -1
  236. package/dist/esm/cli/named.js.map +1 -1
  237. package/dist/esm/cli/path.js +2 -2
  238. package/dist/esm/cli/path.js.map +1 -1
  239. package/dist/esm/cli/peek.js +1 -1
  240. package/dist/esm/cli/peek.js.map +1 -1
  241. package/dist/esm/cli/related.js +1 -1
  242. package/dist/esm/cli/related.js.map +1 -1
  243. package/dist/esm/cli/search.js +1 -1
  244. package/dist/esm/cli/search.js.map +1 -1
  245. package/dist/esm/cli/shared.d.ts +1 -1
  246. package/dist/esm/cli/shared.js +3 -3
  247. package/dist/esm/cli/shared.js.map +1 -1
  248. package/dist/esm/cli/status.js +37 -9
  249. package/dist/esm/cli/status.js.map +1 -1
  250. package/dist/esm/commands/map.d.ts +1 -1
  251. package/dist/esm/commands/map.js.map +1 -1
  252. package/dist/esm/commands/peek.d.ts +1 -1
  253. package/dist/esm/commands/peek.js +8 -1
  254. package/dist/esm/commands/peek.js.map +1 -1
  255. package/dist/esm/commands/related.js +14 -10
  256. package/dist/esm/commands/related.js.map +1 -1
  257. package/dist/esm/commands/scope.js +1 -1
  258. package/dist/esm/commands/scope.js.map +1 -1
  259. package/dist/esm/commands/search.d.ts +1 -1
  260. package/dist/esm/commands/search.js +30 -81
  261. package/dist/esm/commands/search.js.map +1 -1
  262. package/dist/esm/commands/signals.d.ts +18 -0
  263. package/dist/esm/commands/signals.js +78 -0
  264. package/dist/esm/commands/signals.js.map +1 -0
  265. package/dist/esm/commands/status.d.ts +2 -2
  266. package/dist/esm/commands/status.js +2 -2
  267. package/dist/esm/commands/status.js.map +1 -1
  268. package/dist/esm/config/access.d.ts +8 -3
  269. package/dist/esm/config/access.js +34 -15
  270. package/dist/esm/config/access.js.map +1 -1
  271. package/dist/esm/config/index.d.ts +5 -1
  272. package/dist/esm/config/index.js +3 -1
  273. package/dist/esm/config/index.js.map +1 -1
  274. package/dist/esm/config/load.d.ts +6 -1
  275. package/dist/esm/config/load.js +67 -9
  276. package/dist/esm/config/load.js.map +1 -1
  277. package/dist/esm/config/resolve.js +2 -2
  278. package/dist/esm/config/resolve.js.map +1 -1
  279. package/dist/esm/config/signals.d.ts +4 -0
  280. package/dist/esm/config/signals.js +14 -0
  281. package/dist/esm/config/signals.js.map +1 -0
  282. package/dist/esm/config/types.d.ts +7 -4
  283. package/dist/esm/config/types.js +1 -1
  284. package/dist/esm/config/types.js.map +1 -1
  285. package/dist/esm/config/validate.d.ts +1 -0
  286. package/dist/esm/config/validate.js +65 -12
  287. package/dist/esm/config/validate.js.map +1 -1
  288. package/dist/esm/db/open.d.ts +1 -1
  289. package/dist/esm/db/open.js +11 -6
  290. package/dist/esm/db/open.js.map +1 -1
  291. package/dist/esm/db/reconcile.d.ts +1 -0
  292. package/dist/esm/db/reconcile.js +14 -4
  293. package/dist/esm/db/reconcile.js.map +1 -1
  294. package/dist/esm/{sql-functions.js → db/sql-functions.js} +1 -1
  295. package/dist/esm/db/sql-functions.js.map +1 -0
  296. package/dist/esm/embed/cohere.d.ts +2 -0
  297. package/dist/esm/embed/cohere.js +46 -0
  298. package/dist/esm/embed/cohere.js.map +1 -0
  299. package/dist/esm/embed/http.d.ts +2 -0
  300. package/dist/esm/embed/http.js +33 -0
  301. package/dist/esm/embed/http.js.map +1 -0
  302. package/dist/esm/embed/identity.d.ts +13 -0
  303. package/dist/esm/embed/identity.js +92 -0
  304. package/dist/esm/embed/identity.js.map +1 -0
  305. package/dist/esm/embed/langfit.d.ts +6 -0
  306. package/dist/esm/embed/langfit.js +44 -0
  307. package/dist/esm/embed/langfit.js.map +1 -0
  308. package/dist/esm/embed/languages.d.ts +3 -0
  309. package/dist/esm/embed/languages.js +80 -0
  310. package/dist/esm/embed/languages.js.map +1 -0
  311. package/dist/esm/embed/openai.d.ts +2 -0
  312. package/dist/esm/embed/openai.js +49 -0
  313. package/dist/esm/embed/openai.js.map +1 -0
  314. package/dist/esm/embed/query.d.ts +21 -0
  315. package/dist/esm/embed/query.js +181 -0
  316. package/dist/esm/embed/query.js.map +1 -0
  317. package/dist/esm/embed/registry.d.ts +3 -0
  318. package/dist/esm/embed/registry.js +45 -0
  319. package/dist/esm/embed/registry.js.map +1 -0
  320. package/dist/esm/embed/static.d.ts +2 -0
  321. package/dist/esm/embed/static.js +71 -0
  322. package/dist/esm/embed/static.js.map +1 -0
  323. package/dist/esm/embed/store.d.ts +8 -0
  324. package/dist/esm/embed/store.js +123 -0
  325. package/dist/esm/embed/store.js.map +1 -0
  326. package/dist/esm/embed/types.d.ts +8 -0
  327. package/dist/esm/embed/types.js +3 -0
  328. package/dist/esm/embed/types.js.map +1 -0
  329. package/dist/esm/errors.d.ts +1 -1
  330. package/dist/esm/errors.js.map +1 -1
  331. package/dist/esm/features/embed.d.ts +2 -28
  332. package/dist/esm/features/embed.js +33 -377
  333. package/dist/esm/features/embed.js.map +1 -1
  334. package/dist/esm/{fences.js → features/fences.js} +1 -1
  335. package/dist/esm/features/fences.js.map +1 -0
  336. package/dist/esm/features/links.js +1 -1
  337. package/dist/esm/features/links.js.map +1 -1
  338. package/dist/esm/features/rank.js +1 -1
  339. package/dist/esm/features/rank.js.map +1 -1
  340. package/dist/esm/features/sections.js +4 -3
  341. package/dist/esm/features/sections.js.map +1 -1
  342. package/dist/esm/features/tags.js +1 -1
  343. package/dist/esm/features/tags.js.map +1 -1
  344. package/dist/esm/features/types.d.ts +4 -2
  345. package/dist/esm/features/types.js.map +1 -1
  346. package/dist/esm/graph/graph.js.map +1 -0
  347. package/dist/esm/graph/traverse.js.map +1 -0
  348. package/dist/esm/index.d.ts +4 -4
  349. package/dist/esm/index.js +2 -2
  350. package/dist/esm/index.js.map +1 -1
  351. package/dist/esm/output/column-hint.js.map +1 -0
  352. package/dist/esm/{output.d.ts → output/output.d.ts} +2 -2
  353. package/dist/esm/{output.js → output/output.js} +6 -2
  354. package/dist/esm/output/output.js.map +1 -0
  355. package/dist/esm/output/progress.js.map +1 -0
  356. package/dist/esm/{search-error.js → output/search-error.js} +1 -1
  357. package/dist/esm/output/search-error.js.map +1 -0
  358. package/dist/esm/scan/frontmatter.d.ts +13 -0
  359. package/dist/esm/{scan.js → scan/frontmatter.js} +4 -120
  360. package/dist/esm/scan/frontmatter.js.map +1 -0
  361. package/dist/esm/scan/index.d.ts +25 -0
  362. package/dist/esm/scan/index.js +58 -0
  363. package/dist/esm/scan/index.js.map +1 -0
  364. package/dist/esm/scan/list.d.ts +12 -0
  365. package/dist/esm/scan/list.js +58 -0
  366. package/dist/esm/scan/list.js.map +1 -0
  367. package/dist/esm/text/segment.d.ts +3 -0
  368. package/dist/esm/text/segment.js +95 -0
  369. package/dist/esm/text/segment.js.map +1 -0
  370. package/dist/esm/text/strip.d.ts +3 -0
  371. package/dist/esm/text/strip.js +12 -0
  372. package/dist/esm/text/strip.js.map +1 -0
  373. package/package.json +23 -2
  374. package/schema.json +22 -8
  375. package/skills/sense/SKILL.md +21 -5
  376. package/skills/sense-setup/EXAMPLES.md +6 -6
  377. package/skills/sense-setup/SKILL.md +7 -5
  378. package/dist/cjs/column-hint.js.map +0 -1
  379. package/dist/cjs/fences.js.map +0 -1
  380. package/dist/cjs/graph.js.map +0 -1
  381. package/dist/cjs/output.js.map +0 -1
  382. package/dist/cjs/progress.js.map +0 -1
  383. package/dist/cjs/scan.d.cts +0 -35
  384. package/dist/cjs/scan.d.ts +0 -35
  385. package/dist/cjs/scan.js +0 -433
  386. package/dist/cjs/scan.js.map +0 -1
  387. package/dist/cjs/search-error.js.map +0 -1
  388. package/dist/cjs/segment.d.cts +0 -2
  389. package/dist/cjs/segment.d.ts +0 -2
  390. package/dist/cjs/segment.js +0 -98
  391. package/dist/cjs/segment.js.map +0 -1
  392. package/dist/cjs/sql-functions.js.map +0 -1
  393. package/dist/cjs/traverse.js.map +0 -1
  394. package/dist/esm/column-hint.js.map +0 -1
  395. package/dist/esm/fences.js.map +0 -1
  396. package/dist/esm/graph.js.map +0 -1
  397. package/dist/esm/output.js.map +0 -1
  398. package/dist/esm/progress.js.map +0 -1
  399. package/dist/esm/scan.d.ts +0 -35
  400. package/dist/esm/scan.js.map +0 -1
  401. package/dist/esm/search-error.js.map +0 -1
  402. package/dist/esm/segment.d.ts +0 -2
  403. package/dist/esm/segment.js +0 -65
  404. package/dist/esm/segment.js.map +0 -1
  405. package/dist/esm/sql-functions.js.map +0 -1
  406. package/dist/esm/traverse.js.map +0 -1
  407. /package/dist/cjs/{sql-functions.d.cts → db/sql-functions.d.cts} +0 -0
  408. /package/dist/cjs/{sql-functions.d.ts → db/sql-functions.d.ts} +0 -0
  409. /package/dist/cjs/{fences.d.cts → features/fences.d.cts} +0 -0
  410. /package/dist/cjs/{fences.d.ts → features/fences.d.ts} +0 -0
  411. /package/dist/cjs/{graph.d.cts → graph/graph.d.cts} +0 -0
  412. /package/dist/cjs/{graph.d.ts → graph/graph.d.ts} +0 -0
  413. /package/dist/cjs/{graph.js → graph/graph.js} +0 -0
  414. /package/dist/cjs/{traverse.d.cts → graph/traverse.d.cts} +0 -0
  415. /package/dist/cjs/{traverse.d.ts → graph/traverse.d.ts} +0 -0
  416. /package/dist/cjs/{traverse.js → graph/traverse.js} +0 -0
  417. /package/dist/cjs/{column-hint.d.cts → output/column-hint.d.cts} +0 -0
  418. /package/dist/cjs/{column-hint.d.ts → output/column-hint.d.ts} +0 -0
  419. /package/dist/cjs/{column-hint.js → output/column-hint.js} +0 -0
  420. /package/dist/cjs/{progress.d.cts → output/progress.d.cts} +0 -0
  421. /package/dist/cjs/{progress.d.ts → output/progress.d.ts} +0 -0
  422. /package/dist/cjs/{progress.js → output/progress.js} +0 -0
  423. /package/dist/cjs/{search-error.d.cts → output/search-error.d.cts} +0 -0
  424. /package/dist/cjs/{search-error.d.ts → output/search-error.d.ts} +0 -0
  425. /package/dist/esm/{sql-functions.d.ts → db/sql-functions.d.ts} +0 -0
  426. /package/dist/esm/{fences.d.ts → features/fences.d.ts} +0 -0
  427. /package/dist/esm/{graph.d.ts → graph/graph.d.ts} +0 -0
  428. /package/dist/esm/{graph.js → graph/graph.js} +0 -0
  429. /package/dist/esm/{traverse.d.ts → graph/traverse.d.ts} +0 -0
  430. /package/dist/esm/{traverse.js → graph/traverse.js} +0 -0
  431. /package/dist/esm/{column-hint.d.ts → output/column-hint.d.ts} +0 -0
  432. /package/dist/esm/{column-hint.js → output/column-hint.js} +0 -0
  433. /package/dist/esm/{progress.d.ts → output/progress.d.ts} +0 -0
  434. /package/dist/esm/{progress.js → output/progress.js} +0 -0
  435. /package/dist/esm/{search-error.d.ts → output/search-error.d.ts} +0 -0
package/README.md CHANGED
@@ -74,12 +74,12 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
74
74
  ```json
75
75
  {
76
76
  "$schema": "https://unpkg.com/sensemaking/schema.json",
77
- "version": 4,
77
+ "version": 5,
78
78
  "presets": {
79
79
  "default": { "include": ["**/*.md"], "k": 10 },
80
80
  "raw": { "include": ["raw/**/*.md"], "k": 5 }
81
81
  },
82
- "embed": { "model": "minishlab/potion-retrieval-32M", "type": "static" },
82
+ "embed": { "model": "minishlab/potion-retrieval-32M", "provider": "static" },
83
83
  "queries": {
84
84
  "dead-links": { "sql": "SELECT src, target FROM links WHERE dst IS NULL" },
85
85
  "by-tag": { "sql": "SELECT path, title FROM frontmatter WHERE has(tags, ?) ORDER BY path" },
@@ -90,7 +90,7 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
90
90
 
91
91
  | key | holds |
92
92
  |---|---|
93
- | `presets` | named bundles of `include`/`exclude` globs, `k` (result count), `semantic` (vectors for this scope, on unless `false`), `where` (a standing SQL filter). A file is indexed if any preset includes it, embedded if a model is named and some covering preset has `semantic` on; `status` shows each preset's coverage. |
93
+ | `presets` | named bundles of `include`/`exclude` globs, `k` (result count), `signals` (which engines this scope searches with -- `words`, `links`, `vectors`; every signal whose prerequisites hold, unless the preset lists them exhaustively), `where` (a standing SQL filter). A file is indexed if any preset includes it, embedded if a model is named and some covering preset's `signals` include `vectors`; `status` shows each preset's coverage. |
94
94
  | `embed` | the model vectors are built with. Naming one gives the tree vectors; omitting the block means none at all, whatever the presets say. `sense download` fetches it. |
95
95
  | `content` | settings for the `content` table. `tokenize` names the FTS5 tokenizer, defaulting to `porter unicode61`: name `trigram` for substring matching inside a Latin word, or `unicode61 tokenchars '-_'` to keep hyphenated terms whole. Languages written without word spaces (Chinese, Japanese, Thai, Khmer, Lao, Burmese) need no decision here: they are indexed per grapheme and searched as ordered phrases, substring semantics, what grep gives, needing no minimum length; naming a tokenizer turns that off, since the tree has then chosen its own scheme. Changing it rebuilds the text index only; vectors, links, and sections are kept. |
96
96
  | `queries` | entries runnable as `sense <name>`, each naming the verb it runs: `{ sql }` for SQL (`?` binds positional args) or `{ search }` for a ranked search with its settings baked in, so `sense hot` needs no flags. Running an entry validates it: a typo'd column errors and exits nonzero, and a parameterised entry validates with any argument, since preparing precedes binding. |
@@ -98,10 +98,38 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
98
98
 
99
99
  Bare commands use the `default` preset; `--preset` names another; flags override single fields. Editing a preset rebuilds the cache and says which preset caused it.
100
100
 
101
- Vectors need a model, and nothing downloads it implicitly: `sense download` fetches it once per machine into `$XDG_CACHE_HOME/sensemaking/models` (or `~/.cache/...`), one directory per model, shared by every tree (124 MB, never in the package). `embed.model` is a Hugging Face id, or a path to a directory holding `model.safetensors` and `tokenizer.json`, which `sense download` leaves to you to populate. A preset that asks for vectors without the model is an error naming `sense download`, rather than a quieter result that would make the same search answer differently before and after; a `semantic: false` preset never asks, so it is unaffected. An optional top-level `"embed": { "model", "type", "url", "key" }` block points at any Model2Vec model, local path, or OpenAI-compatible endpoint (Ollama, LM Studio, hosted). Embedding the notes themselves happens on the first semantic search, with progress.
101
+ Vectors need a model. Naming a Hugging Face id in `embed.model` is consent to fetch it: it downloads lazily, on the first vector search, with progress on stderr, into `~/.sense/models` (huggingface_hub's cache layout, one snapshot directory per resolved revision, shared by every tree, 124 MB, never in the package). `sense download` prefetches the same model ahead of time, so the wait happens on your schedule instead of the first query's; it is idempotent and prints the resolved revision. `embed.model` is a Hugging Face id, or a path to a directory holding `model.safetensors` and `tokenizer.json`, which nothing fetches for you. A preset that asks for vectors when a local model path is missing those files is an error naming the fix, rather than a quieter result that would make the same search answer differently before and after; a preset whose `signals` exclude `vectors` never asks, so it is unaffected. An optional top-level `"embed": { "model", "provider", "url", "key" }` block points at any Model2Vec model, local path, or OpenAI-compatible endpoint (Ollama, LM Studio, hosted). Embedding the notes themselves happens on the first vector search, with progress.
102
102
 
103
103
  Two custom SQL functions. `has(field, value)`: array membership on JSON-array fields, substring on strings, false on missing keys. `segment(terms)`: rewrites a run of Chinese, Japanese, Thai, Khmer, Lao, or Burmese text into the ordered grapheme phrase the sidecar columns need, leaving everything else unchanged, so it is safe to add to any hand-written `MATCH`. Frontmatter parsing is lenient: syntax errors are per-file warnings, and the values are still indexed, so one bad note never costs you the crawl.
104
104
 
105
+ ## Providers
106
+
107
+ `embed.provider` picks the wire protocol; `embed.model` names the model. [INTEGRATIONS.md](INTEGRATIONS.md) is the record of what has actually been run and verified against this codebase -- only that gets named as a recommendation.
108
+
109
+ **static** -- a local, pure-JS Model2Vec model; no network at query time.
110
+
111
+ ```json
112
+ "embed": { "model": "minishlab/potion-retrieval-32M", "provider": "static" }
113
+ ```
114
+
115
+ `model` is a Hugging Face id, fetched to `~/.sense/models` on first use, or a path to a local directory holding `model.safetensors` and `tokenizer.json`.
116
+
117
+ **openai** -- any endpoint serving an OpenAI-shaped `POST /embeddings`.
118
+
119
+ ```json
120
+ "embed": { "model": "nomic-embed-text", "provider": "openai", "url": "http://localhost:11434/v1" }
121
+ ```
122
+
123
+ Ollama serves this shape at `http://localhost:11434/v1`. LM Studio serves the same shape at `http://localhost:1234/v1`, with narrower platform support than Ollama: Apple Silicon only on Mac, AVX2 on Windows. Content stays on the machine for either. Any other OpenAI-shaped endpoint, including a hosted one, works the same way through `provider: "openai"` and its own `url`; a hosted endpoint means tree content is sent to that service.
124
+
125
+ **cohere** -- Cohere's native `/v2/embed`, which expresses the doc/query distinction (`input_type`) the OpenAI shape cannot.
126
+
127
+ ```json
128
+ "embed": { "model": "embed-v4.0", "provider": "cohere", "key": "COHERE_API_KEY" }
129
+ ```
130
+
131
+ `key` names the environment variable holding the API key; the key value itself never goes in the config. Content is sent to Cohere.
132
+
105
133
  ## Scale
106
134
 
107
135
  Every query starts with a freshness check against the cache in `.sense/`; only changed files are re-parsed. What to expect as a tree grows:
@@ -136,7 +164,7 @@ Two skills: `sense` for querying a tree (what each command is for, FTS5 syntax,
136
164
  - **RAG / vector stores:** similarity can't express `WHERE status = 'active'`. Here vectors are one signal inside `search`: same SQLite file, filters compose, every row labels its evidence (`via`), and a preset turns vectors off per layer of the tree. No second store, no daemon, no native builds.
137
165
  - **Document-OS apps (Anytype, Logseq, SilverBullet, Capacities):** full applications with their own UI and storage. `sense` is headless: your files stay files, there's no app to run.
138
166
 
139
- Dependencies: [yaml](https://github.com/eemeli/yaml), [remove-markdown](https://github.com/zuchka/remove-markdown), [@huggingface/tokenizers](https://github.com/huggingface/tokenizers.js) (pure JS), and Node's built-in SQLite. No native builds.
167
+ Dependencies: [yaml](https://github.com/eemeli/yaml), [@huggingface/tokenizers](https://github.com/huggingface/tokenizers.js), [franc-min](https://github.com/wooorm/franc), [mdast-util-from-markdown](https://github.com/syntax-tree/mdast-util-from-markdown), and the five GFM extensions it needs (not the full gfm/tagfilter bundle): [micromark-extension-gfm-autolink-literal](https://github.com/micromark/micromark-extension-gfm-autolink-literal), [micromark-extension-gfm-footnote](https://github.com/micromark/micromark-extension-gfm-footnote), [micromark-extension-gfm-strikethrough](https://github.com/micromark/micromark-extension-gfm-strikethrough), [micromark-extension-gfm-table](https://github.com/micromark/micromark-extension-gfm-table), [micromark-extension-gfm-task-list-item](https://github.com/micromark/micromark-extension-gfm-task-list-item), and their mdast counterparts [mdast-util-gfm-autolink-literal](https://github.com/syntax-tree/mdast-util-gfm-autolink-literal), [mdast-util-gfm-footnote](https://github.com/syntax-tree/mdast-util-gfm-footnote), [mdast-util-gfm-strikethrough](https://github.com/syntax-tree/mdast-util-gfm-strikethrough), [mdast-util-gfm-table](https://github.com/syntax-tree/mdast-util-gfm-table), [mdast-util-gfm-task-list-item](https://github.com/syntax-tree/mdast-util-gfm-task-list-item) (all pure JS), and Node's built-in SQLite. No native builds.
140
168
 
141
169
  ## License
142
170
 
@@ -0,0 +1,2 @@
1
+ import type { Nodes } from 'mdast';
2
+ export declare function extractText(node: Nodes): string;
@@ -0,0 +1,2 @@
1
+ import type { Nodes } from 'mdast';
2
+ export declare function extractText(node: Nodes): string;
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "extractText", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return extractText;
9
+ }
10
+ });
11
+ // mdast has no wikilink, embed, or %%comment%% node -- literal text resolved by regex passes
12
+ // over non-code text (code/inlineCode is placeholder-held and spliced back verbatim, below).
13
+ var COMMENT_PAIR = /%%[\s\S]*?%%/g;
14
+ // An embed always yields its target, whatever follows a pipe (a resize suffix, never an alias);
15
+ // must run before the wikilink regex below, bang included, or that regex matches first.
16
+ var EMBED = /!\[\[([^\]]+)\]\]/g;
17
+ var WIKILINK = /\[\[([^\]]+)\]\]/g;
18
+ // A trailing " ^id" is an Obsidian block anchor, valid only at a line's end; a caret elsewhere
19
+ // (mid-line) is ordinary text and is left alone.
20
+ var BLOCK_ID = / \^[A-Za-z0-9-]+$/gm;
21
+ // A callout marker is only ever the first thing in a blockquote's text (Obsidian's grammar),
22
+ // so this anchors to blockquote output alone -- never applied to prose in general.
23
+ var CALLOUT_MARKER = /^\[!\w[\w-]*\][+-]?[ \t]?/;
24
+ // An html node's value is raw HTML, block or inline: a full <!-- --> comment is dropped, any
25
+ // remaining tags are stripped, and the text a browser would still render survives.
26
+ var HTML_COMMENT = /<!--[\s\S]*?-->/g;
27
+ var HTML_TAG = /<[^>]+>/g;
28
+ function stripHtml(value) {
29
+ return value.replace(HTML_COMMENT, '').replace(HTML_TAG, '');
30
+ }
31
+ // A `#anchor` keeps its text (hash dropped), unlike links.ts's parseWikilinkInner (the resolver
32
+ // authority), which discards it entirely -- replicated here since that return value doesn't fit.
33
+ function anchorText(base) {
34
+ var hashIdx = base.indexOf('#');
35
+ if (hashIdx === -1) return base.trim();
36
+ var target = base.slice(0, hashIdx).trim();
37
+ var anchor = base.slice(hashIdx + 1).trim();
38
+ return target ? "".concat(target, " ").concat(anchor) : anchor;
39
+ }
40
+ function wikilinkText(inner) {
41
+ var pipeIdx = inner.indexOf('|');
42
+ return pipeIdx === -1 ? anchorText(inner) : inner.slice(pipeIdx + 1).trim();
43
+ }
44
+ function embedText(inner) {
45
+ var pipeIdx = inner.indexOf('|');
46
+ return anchorText(pipeIdx === -1 ? inner : inner.slice(0, pipeIdx));
47
+ }
48
+ function resolveFlavor(text) {
49
+ return text.replace(COMMENT_PAIR, '').replace(EMBED, function(_, inner) {
50
+ return embedText(inner);
51
+ }).replace(WIKILINK, function(_, inner) {
52
+ return wikilinkText(inner);
53
+ }).replace(BLOCK_ID, '');
54
+ }
55
+ // Sibling blocks (list items, blockquote content, footnote bodies) joined one per line;
56
+ // empties dropped so a blank child never widens the gap between its neighbors.
57
+ function joinBlocks(nodes, code) {
58
+ return nodes.map(function(n) {
59
+ return extractNode(n, code);
60
+ }).filter(function(s) {
61
+ return s.length > 0;
62
+ }).join('\n');
63
+ }
64
+ // Inline content (headings, paragraphs, emphasis, links) concatenated with no separator: the
65
+ // source text nodes already carry whatever spacing separates them.
66
+ function joinInline(nodes, code) {
67
+ return nodes.map(function(n) {
68
+ return extractNode(n, code);
69
+ }).join('');
70
+ }
71
+ // U+E000 (Private Use Area) never appears in real markdown text, so it is a collision-free
72
+ // placeholder delimiter, spliced back to the literal code value after flavor resolution.
73
+ function codePlaceholder(value, code) {
74
+ var idx = code.push(value) - 1;
75
+ return "".concat(idx, "");
76
+ }
77
+ // A GFM autolink's display text is its own target, missing only the scheme
78
+ // mdast-util-gfm-autolink-literal fills into node.url (http:// for www., mailto: for an email).
79
+ var SCHEME_PREFIX = /^[a-z][a-z0-9+.-]*:\/{0,2}/i;
80
+ function isAutolink(url, text) {
81
+ return url === text || url.replace(SCHEME_PREFIX, '') === text;
82
+ }
83
+ function extractNode(node, code) {
84
+ switch(node.type){
85
+ case 'root':
86
+ case 'list':
87
+ case 'listItem':
88
+ case 'footnoteDefinition':
89
+ return joinBlocks(node.children, code);
90
+ case 'blockquote':
91
+ return joinBlocks(node.children, code).replace(CALLOUT_MARKER, '');
92
+ case 'link':
93
+ {
94
+ var text = joinInline(node.children, code);
95
+ return isAutolink(node.url, text) ? '' : text;
96
+ }
97
+ case 'heading':
98
+ case 'paragraph':
99
+ case 'linkReference':
100
+ case 'emphasis':
101
+ case 'strong':
102
+ case 'delete':
103
+ return joinInline(node.children, code);
104
+ case 'table':
105
+ return node.children.map(function(n) {
106
+ return extractNode(n, code);
107
+ }).join('\n');
108
+ case 'tableRow':
109
+ return node.children.map(function(n) {
110
+ return extractNode(n, code);
111
+ }).join(' ');
112
+ case 'tableCell':
113
+ return joinInline(node.children, code);
114
+ case 'image':
115
+ case 'imageReference':
116
+ var _node_alt;
117
+ return (_node_alt = node.alt) !== null && _node_alt !== void 0 ? _node_alt : '';
118
+ case 'text':
119
+ return node.value;
120
+ case 'inlineCode':
121
+ case 'code':
122
+ return codePlaceholder(node.value, code);
123
+ case 'html':
124
+ return stripHtml(node.value);
125
+ case 'break':
126
+ return ' ';
127
+ default:
128
+ return '';
129
+ }
130
+ }
131
+ var CODE_PLACEHOLDER = /\uE000(\d+)\uE000/g;
132
+ function extractText(node) {
133
+ var code = [];
134
+ var resolved = resolveFlavor(extractNode(node, code));
135
+ return code.length === 0 ? resolved : resolved.replace(CODE_PLACEHOLDER, function(_, i) {
136
+ return code[Number(i)];
137
+ });
138
+ }
139
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/chunk/extract.ts"],"sourcesContent":["import type { Nodes } from 'mdast';\n\n// mdast has no wikilink, embed, or %%comment%% node -- literal text resolved by regex passes\n// over non-code text (code/inlineCode is placeholder-held and spliced back verbatim, below).\nconst COMMENT_PAIR = /%%[\\s\\S]*?%%/g;\n// An embed always yields its target, whatever follows a pipe (a resize suffix, never an alias);\n// must run before the wikilink regex below, bang included, or that regex matches first.\nconst EMBED = /!\\[\\[([^\\]]+)\\]\\]/g;\nconst WIKILINK = /\\[\\[([^\\]]+)\\]\\]/g;\n// A trailing \" ^id\" is an Obsidian block anchor, valid only at a line's end; a caret elsewhere\n// (mid-line) is ordinary text and is left alone.\nconst BLOCK_ID = / \\^[A-Za-z0-9-]+$/gm;\n// A callout marker is only ever the first thing in a blockquote's text (Obsidian's grammar),\n// so this anchors to blockquote output alone -- never applied to prose in general.\nconst CALLOUT_MARKER = /^\\[!\\w[\\w-]*\\][+-]?[ \\t]?/;\n// An html node's value is raw HTML, block or inline: a full <!-- --> comment is dropped, any\n// remaining tags are stripped, and the text a browser would still render survives.\nconst HTML_COMMENT = /<!--[\\s\\S]*?-->/g;\nconst HTML_TAG = /<[^>]+>/g;\n\nfunction stripHtml(value: string): string {\n return value.replace(HTML_COMMENT, '').replace(HTML_TAG, '');\n}\n\n// A `#anchor` keeps its text (hash dropped), unlike links.ts's parseWikilinkInner (the resolver\n// authority), which discards it entirely -- replicated here since that return value doesn't fit.\nfunction anchorText(base: string): string {\n const hashIdx = base.indexOf('#');\n if (hashIdx === -1) return base.trim();\n const target = base.slice(0, hashIdx).trim();\n const anchor = base.slice(hashIdx + 1).trim();\n return target ? `${target} ${anchor}` : anchor;\n}\n\nfunction wikilinkText(inner: string): string {\n const pipeIdx = inner.indexOf('|');\n return pipeIdx === -1 ? anchorText(inner) : inner.slice(pipeIdx + 1).trim();\n}\n\nfunction embedText(inner: string): string {\n const pipeIdx = inner.indexOf('|');\n return anchorText(pipeIdx === -1 ? inner : inner.slice(0, pipeIdx));\n}\n\nfunction resolveFlavor(text: string): string {\n return text\n .replace(COMMENT_PAIR, '')\n .replace(EMBED, (_, inner: string) => embedText(inner))\n .replace(WIKILINK, (_, inner: string) => wikilinkText(inner))\n .replace(BLOCK_ID, '');\n}\n\n// Sibling blocks (list items, blockquote content, footnote bodies) joined one per line;\n// empties dropped so a blank child never widens the gap between its neighbors.\nfunction joinBlocks(nodes: Nodes[], code: string[]): string {\n return nodes\n .map((n) => extractNode(n, code))\n .filter((s) => s.length > 0)\n .join('\\n');\n}\n\n// Inline content (headings, paragraphs, emphasis, links) concatenated with no separator: the\n// source text nodes already carry whatever spacing separates them.\nfunction joinInline(nodes: Nodes[], code: string[]): string {\n return nodes.map((n) => extractNode(n, code)).join('');\n}\n\n// U+E000 (Private Use Area) never appears in real markdown text, so it is a collision-free\n// placeholder delimiter, spliced back to the literal code value after flavor resolution.\nfunction codePlaceholder(value: string, code: string[]): string {\n const idx = code.push(value) - 1;\n return `\\uE000${idx}\\uE000`;\n}\n\n// A GFM autolink's display text is its own target, missing only the scheme\n// mdast-util-gfm-autolink-literal fills into node.url (http:// for www., mailto: for an email).\nconst SCHEME_PREFIX = /^[a-z][a-z0-9+.-]*:\\/{0,2}/i;\nfunction isAutolink(url: string, text: string): boolean {\n return url === text || url.replace(SCHEME_PREFIX, '') === text;\n}\n\nfunction extractNode(node: Nodes, code: string[]): string {\n switch (node.type) {\n case 'root':\n case 'list':\n case 'listItem':\n case 'footnoteDefinition':\n return joinBlocks(node.children, code);\n case 'blockquote':\n return joinBlocks(node.children, code).replace(CALLOUT_MARKER, '');\n case 'link': {\n const text = joinInline(node.children, code);\n return isAutolink(node.url, text) ? '' : text;\n }\n case 'heading':\n case 'paragraph':\n case 'linkReference':\n case 'emphasis':\n case 'strong':\n case 'delete':\n return joinInline(node.children, code);\n case 'table':\n return node.children.map((n) => extractNode(n, code)).join('\\n');\n case 'tableRow':\n return node.children.map((n) => extractNode(n, code)).join(' ');\n case 'tableCell':\n return joinInline(node.children, code);\n case 'image':\n case 'imageReference':\n return node.alt ?? '';\n case 'text':\n return node.value;\n case 'inlineCode':\n case 'code':\n return codePlaceholder(node.value, code);\n case 'html':\n return stripHtml(node.value);\n case 'break':\n return ' ';\n default:\n return '';\n }\n}\n\nconst CODE_PLACEHOLDER = /\\uE000(\\d+)\\uE000/g;\n\n// Plain text of one mdast node (or a whole tree): heading/list/table structure is kept as text,\n// markup (emphasis, link targets, task and callout markers) is dropped. Pure, synchronous.\nexport function extractText(node: Nodes): string {\n const code: string[] = [];\n const resolved = resolveFlavor(extractNode(node, code));\n return code.length === 0 ? resolved : resolved.replace(CODE_PLACEHOLDER, (_, i: string) => code[Number(i)]);\n}\n"],"names":["extractText","COMMENT_PAIR","EMBED","WIKILINK","BLOCK_ID","CALLOUT_MARKER","HTML_COMMENT","HTML_TAG","stripHtml","value","replace","anchorText","base","hashIdx","indexOf","trim","target","slice","anchor","wikilinkText","inner","pipeIdx","embedText","resolveFlavor","text","_","joinBlocks","nodes","code","map","n","extractNode","filter","s","length","join","joinInline","codePlaceholder","idx","push","SCHEME_PREFIX","isAutolink","url","node","type","children","alt","CODE_PLACEHOLDER","resolved","i","Number"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Block, Chunk, ChunkOptions } from './types.js';
2
+ export declare const DEFAULT_TARGET_TOKENS = 500;
3
+ export declare function estimateTokens(text: string): number;
4
+ export declare function group(blocks: Block[], body: string, opts?: ChunkOptions): Chunk[];
@@ -0,0 +1,4 @@
1
+ import type { Block, Chunk, ChunkOptions } from './types.js';
2
+ export declare const DEFAULT_TARGET_TOKENS = 500;
3
+ export declare function estimateTokens(text: string): number;
4
+ export declare function group(blocks: Block[], body: string, opts?: ChunkOptions): Chunk[];