sensemaking 0.25.1 → 0.26.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 (316) hide show
  1. package/README.md +13 -9
  2. package/dist/cjs/cli/index.d.cts +1 -1
  3. package/dist/cjs/cli/index.d.ts +1 -1
  4. package/dist/cjs/cli/index.js +1 -1
  5. package/dist/cjs/cli/index.js.map +1 -1
  6. package/dist/cjs/cli/path.js +5 -29
  7. package/dist/cjs/cli/path.js.map +1 -1
  8. package/dist/cjs/cli/related.js +4 -3
  9. package/dist/cjs/cli/related.js.map +1 -1
  10. package/dist/cjs/commands/index.d.cts +6 -3
  11. package/dist/cjs/commands/index.d.ts +6 -3
  12. package/dist/cjs/commands/index.js +4 -0
  13. package/dist/cjs/commands/index.js.map +1 -1
  14. package/dist/cjs/commands/map.d.cts +14 -5
  15. package/dist/cjs/commands/map.d.ts +14 -5
  16. package/dist/cjs/commands/map.js +42 -35
  17. package/dist/cjs/commands/map.js.map +1 -1
  18. package/dist/cjs/commands/path.d.cts +14 -0
  19. package/dist/cjs/commands/path.d.ts +14 -0
  20. package/dist/cjs/commands/path.js +209 -0
  21. package/dist/cjs/commands/path.js.map +1 -0
  22. package/dist/cjs/commands/peek.d.cts +16 -1
  23. package/dist/cjs/commands/peek.d.ts +16 -1
  24. package/dist/cjs/commands/peek.js +71 -33
  25. package/dist/cjs/commands/peek.js.map +1 -1
  26. package/dist/cjs/commands/related.d.cts +16 -3
  27. package/dist/cjs/commands/related.d.ts +16 -3
  28. package/dist/cjs/commands/related.js +131 -98
  29. package/dist/cjs/commands/related.js.map +1 -1
  30. package/dist/cjs/commands/scope.d.cts +1 -0
  31. package/dist/cjs/commands/scope.d.ts +1 -0
  32. package/dist/cjs/commands/scope.js +149 -0
  33. package/dist/cjs/commands/scope.js.map +1 -1
  34. package/dist/cjs/commands/search.d.cts +26 -3
  35. package/dist/cjs/commands/search.d.ts +26 -3
  36. package/dist/cjs/commands/search.js +211 -71
  37. package/dist/cjs/commands/search.js.map +1 -1
  38. package/dist/cjs/commands/signals.d.cts +4 -3
  39. package/dist/cjs/commands/signals.d.ts +4 -3
  40. package/dist/cjs/commands/signals.js +13 -4
  41. package/dist/cjs/commands/signals.js.map +1 -1
  42. package/dist/cjs/commands/snapshot.d.cts +3 -0
  43. package/dist/cjs/commands/snapshot.d.ts +3 -0
  44. package/dist/cjs/commands/snapshot.js +180 -0
  45. package/dist/cjs/commands/snapshot.js.map +1 -0
  46. package/dist/cjs/embed/cohere.js +41 -16
  47. package/dist/cjs/embed/cohere.js.map +1 -1
  48. package/dist/cjs/embed/endpoint.d.cts +2 -0
  49. package/dist/cjs/embed/endpoint.d.ts +2 -0
  50. package/dist/cjs/embed/endpoint.js +30 -0
  51. package/dist/cjs/embed/endpoint.js.map +1 -0
  52. package/dist/cjs/embed/handoff.d.cts +7 -2
  53. package/dist/cjs/embed/handoff.d.ts +7 -2
  54. package/dist/cjs/embed/handoff.js +10 -0
  55. package/dist/cjs/embed/handoff.js.map +1 -1
  56. package/dist/cjs/embed/http.d.cts +18 -1
  57. package/dist/cjs/embed/http.d.ts +18 -1
  58. package/dist/cjs/embed/http.js +239 -40
  59. package/dist/cjs/embed/http.js.map +1 -1
  60. package/dist/cjs/embed/openai.js +39 -17
  61. package/dist/cjs/embed/openai.js.map +1 -1
  62. package/dist/cjs/embed/query.d.cts +9 -3
  63. package/dist/cjs/embed/query.d.ts +9 -3
  64. package/dist/cjs/embed/query.js +257 -90
  65. package/dist/cjs/embed/query.js.map +1 -1
  66. package/dist/cjs/embed/registry.d.cts +2 -2
  67. package/dist/cjs/embed/registry.d.ts +2 -2
  68. package/dist/cjs/embed/registry.js +36 -4
  69. package/dist/cjs/embed/registry.js.map +1 -1
  70. package/dist/cjs/embed/static.js +6 -2
  71. package/dist/cjs/embed/static.js.map +1 -1
  72. package/dist/cjs/embed/store.js +42 -77
  73. package/dist/cjs/embed/store.js.map +1 -1
  74. package/dist/cjs/embed/types.d.cts +5 -2
  75. package/dist/cjs/embed/types.d.ts +5 -2
  76. package/dist/cjs/embed/types.js.map +1 -1
  77. package/dist/cjs/features/embed.js +290 -43
  78. package/dist/cjs/features/embed.js.map +1 -1
  79. package/dist/cjs/graph/traverse.d.cts +2 -2
  80. package/dist/cjs/graph/traverse.d.ts +2 -2
  81. package/dist/cjs/graph/traverse.js +15 -5
  82. package/dist/cjs/graph/traverse.js.map +1 -1
  83. package/dist/cjs/index.d.cts +2 -2
  84. package/dist/cjs/index.d.ts +2 -2
  85. package/dist/cjs/index.js +6 -0
  86. package/dist/cjs/index.js.map +1 -1
  87. package/dist/cjs/output/output.d.cts +4 -36
  88. package/dist/cjs/output/output.d.ts +4 -36
  89. package/dist/cjs/output/output.js +1 -2
  90. package/dist/cjs/output/output.js.map +1 -1
  91. package/dist/cjs/scan/pool.d.cts +2 -1
  92. package/dist/cjs/scan/pool.d.ts +2 -1
  93. package/dist/cjs/scan/pool.js +116 -27
  94. package/dist/cjs/scan/pool.js.map +1 -1
  95. package/dist/cjs/scan/reparse.d.cts +1 -0
  96. package/dist/cjs/scan/reparse.d.ts +1 -0
  97. package/dist/cjs/scan/reparse.js +75 -21
  98. package/dist/cjs/scan/reparse.js.map +1 -1
  99. package/dist/cjs/store/builder.d.cts +11 -21
  100. package/dist/cjs/store/builder.d.ts +11 -21
  101. package/dist/cjs/store/builder.js +1077 -438
  102. package/dist/cjs/store/builder.js.map +1 -1
  103. package/dist/cjs/store/duckdb/connection.js +16 -2
  104. package/dist/cjs/store/duckdb/connection.js.map +1 -1
  105. package/dist/cjs/store/duckdb/open.d.cts +1 -1
  106. package/dist/cjs/store/duckdb/open.d.ts +1 -1
  107. package/dist/cjs/store/duckdb/open.js +73 -65
  108. package/dist/cjs/store/duckdb/open.js.map +1 -1
  109. package/dist/cjs/store/duckdb/reconcile.js +533 -15
  110. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  111. package/dist/cjs/store/embed-scope.js +19 -9
  112. package/dist/cjs/store/embed-scope.js.map +1 -1
  113. package/dist/cjs/store/index.d.cts +6 -0
  114. package/dist/cjs/store/index.d.ts +6 -0
  115. package/dist/cjs/store/index.js +8 -4
  116. package/dist/cjs/store/index.js.map +1 -1
  117. package/dist/cjs/store/open.d.cts +6 -1
  118. package/dist/cjs/store/open.d.ts +6 -1
  119. package/dist/cjs/store/open.js +230 -307
  120. package/dist/cjs/store/open.js.map +1 -1
  121. package/dist/cjs/store/readiness.d.cts +5 -0
  122. package/dist/cjs/store/readiness.d.ts +5 -0
  123. package/dist/cjs/store/readiness.js +39 -0
  124. package/dist/cjs/store/readiness.js.map +1 -0
  125. package/dist/cjs/store/reconcile.d.cts +26 -1
  126. package/dist/cjs/store/reconcile.d.ts +26 -1
  127. package/dist/cjs/store/reconcile.js +670 -576
  128. package/dist/cjs/store/reconcile.js.map +1 -1
  129. package/dist/cjs/store/signature.d.cts +1 -0
  130. package/dist/cjs/store/signature.d.ts +1 -0
  131. package/dist/cjs/store/signature.js +9 -0
  132. package/dist/cjs/store/signature.js.map +1 -1
  133. package/dist/cjs/store/sqlite/open.d.cts +1 -1
  134. package/dist/cjs/store/sqlite/open.d.ts +1 -1
  135. package/dist/cjs/store/sqlite/open.js +84 -90
  136. package/dist/cjs/store/sqlite/open.js.map +1 -1
  137. package/dist/cjs/store/sqlite/reconcile.js.map +1 -1
  138. package/dist/cjs/store/sqlite/store.js +63 -60
  139. package/dist/cjs/store/sqlite/store.js.map +1 -1
  140. package/dist/cjs/store/sqlite/vectors.d.cts +2 -2
  141. package/dist/cjs/store/sqlite/vectors.d.ts +2 -2
  142. package/dist/cjs/store/sqlite/vectors.js +8 -4
  143. package/dist/cjs/store/sqlite/vectors.js.map +1 -1
  144. package/dist/cjs/store/stages.js.map +1 -1
  145. package/dist/cjs/store/turso/connection.d.cts +1 -0
  146. package/dist/cjs/store/turso/connection.d.ts +1 -0
  147. package/dist/cjs/store/turso/connection.js +319 -94
  148. package/dist/cjs/store/turso/connection.js.map +1 -1
  149. package/dist/cjs/store/turso/open.d.cts +1 -1
  150. package/dist/cjs/store/turso/open.d.ts +1 -1
  151. package/dist/cjs/store/turso/open.js +70 -74
  152. package/dist/cjs/store/turso/open.js.map +1 -1
  153. package/dist/cjs/store/turso/store.js +25 -23
  154. package/dist/cjs/store/turso/store.js.map +1 -1
  155. package/dist/cjs/store/turso/vectors.d.cts +2 -2
  156. package/dist/cjs/store/turso/vectors.d.ts +2 -2
  157. package/dist/cjs/store/turso/vectors.js +26 -16
  158. package/dist/cjs/store/turso/vectors.js.map +1 -1
  159. package/dist/cjs/store/types.d.cts +4 -1
  160. package/dist/cjs/store/types.d.ts +4 -1
  161. package/dist/cjs/store/types.js.map +1 -1
  162. package/dist/cjs/store/vectors.d.cts +14 -1
  163. package/dist/cjs/store/vectors.d.ts +14 -1
  164. package/dist/cjs/store/vectors.js +61 -0
  165. package/dist/cjs/store/vectors.js.map +1 -1
  166. package/dist/cjs/watch.d.cts +6 -0
  167. package/dist/cjs/watch.d.ts +6 -0
  168. package/dist/cjs/watch.js +42 -10
  169. package/dist/cjs/watch.js.map +1 -1
  170. package/dist/cjs/workers/parse.d.cts +4 -3
  171. package/dist/cjs/workers/parse.d.ts +4 -3
  172. package/dist/cjs/workers/parse.js +19 -17
  173. package/dist/cjs/workers/parse.js.map +1 -1
  174. package/dist/esm/cli/index.d.ts +1 -1
  175. package/dist/esm/cli/index.js +1 -1
  176. package/dist/esm/cli/index.js.map +1 -1
  177. package/dist/esm/cli/path.js +4 -10
  178. package/dist/esm/cli/path.js.map +1 -1
  179. package/dist/esm/cli/related.js +5 -3
  180. package/dist/esm/cli/related.js.map +1 -1
  181. package/dist/esm/commands/index.d.ts +6 -3
  182. package/dist/esm/commands/index.js +1 -0
  183. package/dist/esm/commands/index.js.map +1 -1
  184. package/dist/esm/commands/map.d.ts +14 -5
  185. package/dist/esm/commands/map.js +2 -0
  186. package/dist/esm/commands/map.js.map +1 -1
  187. package/dist/esm/commands/path.d.ts +14 -0
  188. package/dist/esm/commands/path.js +33 -0
  189. package/dist/esm/commands/path.js.map +1 -0
  190. package/dist/esm/commands/peek.d.ts +16 -1
  191. package/dist/esm/commands/peek.js +35 -9
  192. package/dist/esm/commands/peek.js.map +1 -1
  193. package/dist/esm/commands/related.d.ts +16 -3
  194. package/dist/esm/commands/related.js +45 -28
  195. package/dist/esm/commands/related.js.map +1 -1
  196. package/dist/esm/commands/scope.d.ts +1 -0
  197. package/dist/esm/commands/scope.js +58 -0
  198. package/dist/esm/commands/scope.js.map +1 -1
  199. package/dist/esm/commands/search.d.ts +26 -3
  200. package/dist/esm/commands/search.js +85 -18
  201. package/dist/esm/commands/search.js.map +1 -1
  202. package/dist/esm/commands/signals.d.ts +4 -3
  203. package/dist/esm/commands/signals.js +11 -4
  204. package/dist/esm/commands/signals.js.map +1 -1
  205. package/dist/esm/commands/snapshot.d.ts +3 -0
  206. package/dist/esm/commands/snapshot.js +25 -0
  207. package/dist/esm/commands/snapshot.js.map +1 -0
  208. package/dist/esm/embed/cohere.js +35 -10
  209. package/dist/esm/embed/cohere.js.map +1 -1
  210. package/dist/esm/embed/endpoint.d.ts +2 -0
  211. package/dist/esm/embed/endpoint.js +11 -0
  212. package/dist/esm/embed/endpoint.js.map +1 -0
  213. package/dist/esm/embed/handoff.d.ts +7 -2
  214. package/dist/esm/embed/handoff.js +7 -0
  215. package/dist/esm/embed/handoff.js.map +1 -1
  216. package/dist/esm/embed/http.d.ts +18 -1
  217. package/dist/esm/embed/http.js +137 -17
  218. package/dist/esm/embed/http.js.map +1 -1
  219. package/dist/esm/embed/openai.js +34 -12
  220. package/dist/esm/embed/openai.js.map +1 -1
  221. package/dist/esm/embed/query.d.ts +9 -3
  222. package/dist/esm/embed/query.js +98 -26
  223. package/dist/esm/embed/query.js.map +1 -1
  224. package/dist/esm/embed/registry.d.ts +2 -2
  225. package/dist/esm/embed/registry.js +34 -5
  226. package/dist/esm/embed/registry.js.map +1 -1
  227. package/dist/esm/embed/static.js +10 -2
  228. package/dist/esm/embed/static.js.map +1 -1
  229. package/dist/esm/embed/store.js +30 -21
  230. package/dist/esm/embed/store.js.map +1 -1
  231. package/dist/esm/embed/types.d.ts +5 -2
  232. package/dist/esm/embed/types.js.map +1 -1
  233. package/dist/esm/features/embed.js +82 -21
  234. package/dist/esm/features/embed.js.map +1 -1
  235. package/dist/esm/graph/traverse.d.ts +2 -2
  236. package/dist/esm/graph/traverse.js +4 -2
  237. package/dist/esm/graph/traverse.js.map +1 -1
  238. package/dist/esm/index.d.ts +2 -2
  239. package/dist/esm/index.js +1 -1
  240. package/dist/esm/index.js.map +1 -1
  241. package/dist/esm/output/output.d.ts +4 -36
  242. package/dist/esm/output/output.js +1 -2
  243. package/dist/esm/output/output.js.map +1 -1
  244. package/dist/esm/scan/pool.d.ts +2 -1
  245. package/dist/esm/scan/pool.js +80 -23
  246. package/dist/esm/scan/pool.js.map +1 -1
  247. package/dist/esm/scan/reparse.d.ts +1 -0
  248. package/dist/esm/scan/reparse.js +40 -12
  249. package/dist/esm/scan/reparse.js.map +1 -1
  250. package/dist/esm/store/builder.d.ts +11 -21
  251. package/dist/esm/store/builder.js +337 -133
  252. package/dist/esm/store/builder.js.map +1 -1
  253. package/dist/esm/store/duckdb/connection.js +9 -1
  254. package/dist/esm/store/duckdb/connection.js.map +1 -1
  255. package/dist/esm/store/duckdb/open.d.ts +1 -1
  256. package/dist/esm/store/duckdb/open.js +13 -9
  257. package/dist/esm/store/duckdb/open.js.map +1 -1
  258. package/dist/esm/store/duckdb/reconcile.js +145 -10
  259. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  260. package/dist/esm/store/embed-scope.js +16 -6
  261. package/dist/esm/store/embed-scope.js.map +1 -1
  262. package/dist/esm/store/index.d.ts +6 -0
  263. package/dist/esm/store/index.js +10 -4
  264. package/dist/esm/store/index.js.map +1 -1
  265. package/dist/esm/store/open.d.ts +6 -1
  266. package/dist/esm/store/open.js +77 -87
  267. package/dist/esm/store/open.js.map +1 -1
  268. package/dist/esm/store/readiness.d.ts +5 -0
  269. package/dist/esm/store/readiness.js +11 -0
  270. package/dist/esm/store/readiness.js.map +1 -0
  271. package/dist/esm/store/reconcile.d.ts +26 -1
  272. package/dist/esm/store/reconcile.js +142 -120
  273. package/dist/esm/store/reconcile.js.map +1 -1
  274. package/dist/esm/store/signature.d.ts +1 -0
  275. package/dist/esm/store/signature.js +8 -0
  276. package/dist/esm/store/signature.js.map +1 -1
  277. package/dist/esm/store/sqlite/open.d.ts +1 -1
  278. package/dist/esm/store/sqlite/open.js +12 -12
  279. package/dist/esm/store/sqlite/open.js.map +1 -1
  280. package/dist/esm/store/sqlite/reconcile.js +2 -2
  281. package/dist/esm/store/sqlite/reconcile.js.map +1 -1
  282. package/dist/esm/store/sqlite/store.js +21 -18
  283. package/dist/esm/store/sqlite/store.js.map +1 -1
  284. package/dist/esm/store/sqlite/vectors.d.ts +2 -2
  285. package/dist/esm/store/sqlite/vectors.js +7 -5
  286. package/dist/esm/store/sqlite/vectors.js.map +1 -1
  287. package/dist/esm/store/stages.js.map +1 -1
  288. package/dist/esm/store/turso/connection.d.ts +1 -0
  289. package/dist/esm/store/turso/connection.js +97 -28
  290. package/dist/esm/store/turso/connection.js.map +1 -1
  291. package/dist/esm/store/turso/open.d.ts +1 -1
  292. package/dist/esm/store/turso/open.js +9 -8
  293. package/dist/esm/store/turso/open.js.map +1 -1
  294. package/dist/esm/store/turso/store.js +16 -14
  295. package/dist/esm/store/turso/store.js.map +1 -1
  296. package/dist/esm/store/turso/vectors.d.ts +2 -2
  297. package/dist/esm/store/turso/vectors.js +27 -17
  298. package/dist/esm/store/turso/vectors.js.map +1 -1
  299. package/dist/esm/store/types.d.ts +4 -1
  300. package/dist/esm/store/types.js.map +1 -1
  301. package/dist/esm/store/vectors.d.ts +14 -1
  302. package/dist/esm/store/vectors.js +55 -0
  303. package/dist/esm/store/vectors.js.map +1 -1
  304. package/dist/esm/watch.d.ts +6 -0
  305. package/dist/esm/watch.js +40 -14
  306. package/dist/esm/watch.js.map +1 -1
  307. package/dist/esm/workers/parse.d.ts +4 -3
  308. package/dist/esm/workers/parse.js +19 -17
  309. package/dist/esm/workers/parse.js.map +1 -1
  310. package/package.json +1 -1
  311. package/skills/sense/SKILL.md +4 -2
  312. package/skills/sense/references/stores/duckdb.md +1 -1
  313. package/skills/sense-setup/SKILL.md +2 -2
  314. package/skills/sense-setup/references/embeddings.md +1 -1
  315. package/skills/sense-setup/references/store-benchmarks.md +5 -5
  316. package/skills/sense-setup/references/stores/duckdb.md +1 -1
@@ -1,3 +1,5 @@
1
+ import type { TreeMap } from '../commands/map.js';
2
+ import type { Peek } from '../commands/peek.js';
1
3
  export type Row = Record<string, unknown>;
2
4
  export type Format = 'table' | 'json';
3
5
  export type RowFormat = Format | 'csv';
@@ -15,39 +17,5 @@ export declare function presetsLines(presets: Array<{
15
17
  embedded: number;
16
18
  signals: Record<string, number>;
17
19
  }>): string[];
18
- export declare function renderMap(result: {
19
- docs: {
20
- count: number;
21
- bytes: number;
22
- };
23
- fields: Row[];
24
- fieldsTotal: number;
25
- features: {
26
- on: string[];
27
- off: string[];
28
- };
29
- presets: Array<{
30
- name: string;
31
- files: number;
32
- embedded: number;
33
- signals: Record<string, number>;
34
- }>;
35
- hubs: Row[];
36
- recent: Row[];
37
- recentCaveat: string | null;
38
- }): string;
39
- export declare function renderPeek(result: {
40
- path: string;
41
- tokens: number;
42
- frontmatter: Row;
43
- parseError?: string | null;
44
- sections: Row[];
45
- outbound: string[];
46
- backlinks: string[];
47
- unresolved: string[];
48
- sectionsTotal: number;
49
- outboundTotal: number;
50
- backlinksTotal: number;
51
- unresolvedTotal: number;
52
- off: string[];
53
- }): string;
20
+ export declare function renderMap(result: TreeMap): string;
21
+ export declare function renderPeek(result: Peek): string;
@@ -1,3 +1,5 @@
1
+ import type { TreeMap } from '../commands/map.js';
2
+ import type { Peek } from '../commands/peek.js';
1
3
  export type Row = Record<string, unknown>;
2
4
  export type Format = 'table' | 'json';
3
5
  export type RowFormat = Format | 'csv';
@@ -15,39 +17,5 @@ export declare function presetsLines(presets: Array<{
15
17
  embedded: number;
16
18
  signals: Record<string, number>;
17
19
  }>): string[];
18
- export declare function renderMap(result: {
19
- docs: {
20
- count: number;
21
- bytes: number;
22
- };
23
- fields: Row[];
24
- fieldsTotal: number;
25
- features: {
26
- on: string[];
27
- off: string[];
28
- };
29
- presets: Array<{
30
- name: string;
31
- files: number;
32
- embedded: number;
33
- signals: Record<string, number>;
34
- }>;
35
- hubs: Row[];
36
- recent: Row[];
37
- recentCaveat: string | null;
38
- }): string;
39
- export declare function renderPeek(result: {
40
- path: string;
41
- tokens: number;
42
- frontmatter: Row;
43
- parseError?: string | null;
44
- sections: Row[];
45
- outbound: string[];
46
- backlinks: string[];
47
- unresolved: string[];
48
- sectionsTotal: number;
49
- outboundTotal: number;
50
- backlinksTotal: number;
51
- unresolvedTotal: number;
52
- off: string[];
53
- }): string;
20
+ export declare function renderMap(result: TreeMap): string;
21
+ export declare function renderPeek(result: Peek): string;
@@ -1,4 +1,3 @@
1
- // rows -> table (default) | json | csv
2
1
  "use strict";
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: true
@@ -713,7 +712,7 @@ function renderRows(rows, format) {
713
712
  var columns = Object.keys(rows[0]);
714
713
  var linesByCell = rows.map(function(row) {
715
714
  return columns.map(function(col) {
716
- return cellLines(row[col]);
715
+ return cellLines(Reflect.get(row, col));
717
716
  });
718
717
  });
719
718
  var heights = linesByCell.map(function(cellsInRow) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/output/output.ts"],"sourcesContent":["// rows -> table (default) | json | csv\n\nexport type Row = Record<string, unknown>;\n\n// map/peek/status/path render structures rather than a row set, so csv has nothing to mean\n// there; the commands that emit rows take RowFormat.\nexport type Format = 'table' | 'json';\nexport type RowFormat = Format | 'csv';\n\n// Warned about on stderr (keeps --format json stdout machine-readable), never truncated.\nconst OVERSIZE_BYTES = 50_000;\n\n// Flatten embedded newlines so they can't break table column alignment; JSON output keeps them as-is.\nfunction cell(value: unknown): string {\n return String(value ?? '').replace(/\\s*\\n\\s*/g, ' ');\n}\n\n// RFC 4180, deliberately not cell(): csv is the redirect-to-file format, so it keeps every\n// character, newlines included; what it cannot carry (NULL vs empty, types) is what json is for.\n// An array (e.g. snippets) joins with the one delimiter our content provably cannot contain,\n// inside the quoted field newlines already trigger (DESIGN.md \"Rendering a list of snippets\").\nfunction csvField(value: unknown): string {\n const text = value === null || value === undefined ? '' : Array.isArray(value) ? value.join('\\n') : String(value);\n return /[\"\\r\\n,]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\nfunction csvLine(values: unknown[]): string {\n return values.map(csvField).join(',');\n}\n\nfunction warnOversize(bytes: number, rowCount: number): void {\n if (bytes <= OVERSIZE_BYTES) return;\n console.warn(`warning: result is ${Math.round(bytes / 1000)} KB across ${rowCount} row(s); consider a LIMIT, fewer columns, snippet() instead of whole values, or --format csv redirected to a file`);\n}\n\n// JSON.stringify throws on BigInt, and stores return int64 as BigInt (DuckDB does): a value\n// that fits a safe integer stays a number, a larger one becomes its decimal string.\nconst MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);\nconst bigintSafe = (_key: string, value: unknown): unknown => (typeof value === 'bigint' ? (value >= -MAX_SAFE && value <= MAX_SAFE ? Number(value) : value.toString()) : value);\n\nexport function stringifyJson(value: unknown, indent?: number): string {\n return JSON.stringify(value, bigintSafe, indent);\n}\n\nexport function printRows(rows: Row[], format: RowFormat, columns?: string[]): void {\n if (format === 'csv') {\n // Names from a row wherever there is one: the statement's column list keeps duplicates the\n // row collapsed. Nothing at all with no row and no columns -- a bare newline is an empty record.\n const names = rows.length > 0 ? Object.keys(rows[0]) : [...new Set(columns ?? [])];\n if (names.length === 0) return;\n const rendered = [csvLine(names), ...rows.map((row) => csvLine(names.map((name) => row[name])))].join('\\n');\n console.log(rendered);\n // Bytes, not code units -- CJK is 3 bytes per character.\n warnOversize(Buffer.byteLength(rendered), rows.length);\n return;\n }\n const rendered = renderRows(rows, format);\n console.log(rendered);\n warnOversize(Buffer.byteLength(rendered), rows.length);\n}\n\n// Streaming counterpart for the one unbounded caller, `sense sql`: the result is never held as\n// rows and again as a rendered string. Table buffers (column width depends on the last row); json/csv write row by row.\nexport async function printRowStream(rows: AsyncIterable<Row>, format: RowFormat, columns: string[]): Promise<void> {\n const iterator = rows[Symbol.asyncIterator]();\n // One step before any write. FTS5 parses a MATCH expression at step time rather than at\n // prepare time, so a bad search string throws here, with stdout still clean for the error.\n const first = await iterator.next();\n const rest: AsyncIterable<Row> = { [Symbol.asyncIterator]: () => iterator };\n\n if (format === 'table') {\n const collected: Row[] = first.done ? [] : [first.value];\n for await (const row of rest) collected.push(row);\n printRows(collected, format, columns);\n return;\n }\n\n let bytes = 0;\n let rowCount = 0;\n const write = (text: string): void => {\n // Bytes, not code units -- CJK is 3 bytes per character.\n bytes += Buffer.byteLength(text);\n process.stdout.write(text);\n };\n\n if (format === 'json') {\n // Byte-identical to JSON.stringify(rows, null, 2) + newline: each row re-indented one\n // level, comma-joined, inside the array brackets written here.\n const indent = (row: Row) =>\n stringifyJson(row, 2)\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n if (first.done) {\n write('[]\\n');\n } else {\n write('[\\n');\n write(indent(first.value));\n rowCount = 1;\n for await (const row of rest) {\n write(',\\n');\n write(indent(row));\n rowCount++;\n }\n write('\\n]\\n');\n }\n } else if (first.done) {\n const names = [...new Set(columns)];\n if (names.length > 0) write(`${csvLine(names)}\\n`);\n } else {\n const names = Object.keys(first.value);\n write(`${csvLine(names)}\\n`);\n write(`${csvLine(names.map((name) => first.value[name]))}\\n`);\n rowCount = 1;\n for await (const row of rest) {\n write(`${csvLine(names.map((name) => row[name]))}\\n`);\n rowCount++;\n }\n }\n warnOversize(bytes, rowCount);\n}\n\n// Tables are for reading, and a row wider than the terminal wraps unreadably: widest columns\n// give up space first, down to a floor. --format json is never truncated.\nconst MIN_COLUMN = 12;\nconst TRUNCATED = '…';\n\nfunction fitWidths(widths: number[], limit: number): number[] {\n const gaps = (widths.length - 1) * 2;\n const fitted = [...widths];\n for (;;) {\n const total = fitted.reduce((a, b) => a + b, 0) + gaps;\n if (total <= limit) return fitted;\n const widest = fitted.indexOf(Math.max(...fitted));\n if (fitted[widest] <= MIN_COLUMN) return fitted;\n fitted[widest] = Math.max(MIN_COLUMN, fitted[widest] - Math.max(1, total - limit));\n }\n}\n\n// An array cell (snippets) becomes one physical line per element; every other value stays the\n// single line cell() already produced. No cell in any other command holds one today, so a row\n// with no array-valued cell yields exactly one physical line, unchanged from before this existed.\nfunction cellLines(value: unknown): string[] {\n if (Array.isArray(value)) return value.length === 0 ? [''] : value.map((v) => cell(v));\n return [cell(value)];\n}\n\nfunction renderRows(rows: Row[], format: Format, width = process.stdout.columns): string {\n if (format === 'json') return stringifyJson(rows, 2);\n if (rows.length === 0) return '(0 rows)';\n\n const columns = Object.keys(rows[0]);\n const linesByCell = rows.map((row) => columns.map((col) => cellLines(row[col])));\n const heights = linesByCell.map((cellsInRow) => Math.max(1, ...cellsInRow.map((lines) => lines.length)));\n const natural = columns.map((col, i) => Math.max(col.length, ...linesByCell.flatMap((cellsInRow) => cellsInRow[i]).map((line) => line.length)));\n const widths = width && width > MIN_COLUMN ? fitWidths(natural, width) : natural;\n\n const clip = (value: string, w: number) => (value.length <= w ? value.padEnd(w) : `${value.slice(0, w - 1)}${TRUNCATED}`);\n const formatRow = (values: string[]) =>\n values\n .map((value, i) => clip(value, widths[i]))\n .join(' ')\n .trimEnd();\n\n // A row becomes as many physical lines as its tallest cell; other columns blank-pad on\n // continuation lines (DESIGN.md \"Rendering a list of snippets\").\n const body: string[] = [];\n for (let r = 0; r < rows.length; r++) {\n for (let li = 0; li < heights[r]; li++) body.push(formatRow(columns.map((_, c) => linesByCell[r][c][li] ?? '')));\n }\n\n return [formatRow(columns), widths.map((w) => '-'.repeat(w)).join(' '), ...body].join('\\n');\n}\n\n// Text renderers for the top-level commands; cli.ts prints what these return.\n\n// Names the config key that turns a feature back on. Only the three features-block toggles\n// reach here; `embed` has its own status line.\nexport function featureOffHint(name: string): string {\n return `features.${name}`;\n}\n\nexport function featuresLine(features: { on: string[]; off: string[] }): string {\n const off = features.off.length > 0 ? ` · off: ${features.off.map((name) => `${name} (${featureOffHint(name)})`).join(', ')}` : '';\n return `features: ${features.on.join(', ')}${off}`;\n}\n\n// name, or name:weight when the weight is not the default 1.\nfunction signalLabels(signals: Record<string, number>): string {\n return Object.entries(signals)\n .map(([name, weight]) => (weight === 1 ? name : `${name}:${weight}`))\n .join(', ');\n}\n\nexport function presetsLines(presets: Array<{ name: string; files: number; embedded: number; signals: Record<string, number> }>): string[] {\n // \"0 embedded\" is ambiguous between a scope that declined vectors and one that has not built\n // them yet, so a preset without the vectors signal says what it uses instead.\n return ['presets:', ...presets.map((p) => ` ${p.name}: ${p.files} file(s), ${p.embedded} embedded${p.signals.vectors !== undefined ? '' : ` (signals: ${signalLabels(p.signals)})`}`)];\n}\n\nexport function renderMap(result: {\n docs: { count: number; bytes: number };\n fields: Row[];\n fieldsTotal: number;\n features: { on: string[]; off: string[] };\n presets: Array<{ name: string; files: number; embedded: number; signals: Record<string, number> }>;\n hubs: Row[];\n recent: Row[];\n recentCaveat: string | null;\n}): string {\n const parts = [`docs: ${result.docs.count} (${Math.round(result.docs.bytes / 1024)} KB)`, featuresLine(result.features), '', ...presetsLines(result.presets), '', renderRows(result.fields, 'table')];\n if (result.fieldsTotal > result.fields.length) parts.push(`(+${result.fieldsTotal - result.fields.length} more fields)`);\n if (result.hubs.length > 0) parts.push('\\nhubs (by link rank):', renderRows(result.hubs, 'table'));\n else if (result.features.off.includes('rank')) parts.push(`\\nhubs: off (${featureOffHint('rank')})`);\n parts.push('\\nrecent:');\n if (result.recentCaveat) parts.push(result.recentCaveat);\n parts.push(renderRows(result.recent, 'table'));\n return parts.join('\\n');\n}\n\nexport function renderPeek(result: { path: string; tokens: number; frontmatter: Row; parseError?: string | null; sections: Row[]; outbound: string[]; backlinks: string[]; unresolved: string[]; sectionsTotal: number; outboundTotal: number; backlinksTotal: number; unresolvedTotal: number; off: string[] }): string {\n const lines = [`${result.path} (~${result.tokens} tokens)`];\n // Otherwise a refused parse is indistinguishable from a note that has no frontmatter, which\n // is the confusion the whole quarantine design exists to remove.\n if (result.parseError) lines.push(` frontmatter: did not parse, so none of it is indexed (${result.parseError})`);\n for (const [key, value] of Object.entries(result.frontmatter)) lines.push(` ${key}: ${value}`);\n if (result.sections.length > 0) {\n lines.push('', 'sections:');\n for (const s of result.sections) lines.push(` ${'#'.repeat(s.level as number)} ${s.heading} [L${s.start_line}-${s.end_line}, ~${s.tokens}t]`);\n if (result.sectionsTotal > result.sections.length) lines.push(` (+${result.sectionsTotal - result.sections.length} more sections -- sections table has all of them)`);\n } else if (result.off.includes('sections')) lines.push('', 'sections: off (features.sections)');\n if (result.off.includes('links')) {\n lines.push('', 'links: off (features.links)');\n } else {\n const linkLine = (label: string, shown: string[], total: number) => {\n if (total > 0) lines.push(`${label} (${total}): ${shown.join(', ')}${total > shown.length ? `, +${total - shown.length} more` : ''}`);\n };\n if (result.outboundTotal + result.unresolvedTotal + result.backlinksTotal > 0) lines.push('');\n linkLine('links out', result.outbound, result.outboundTotal);\n linkLine('unresolved', result.unresolved, result.unresolvedTotal);\n linkLine('backlinks', result.backlinks, result.backlinksTotal);\n }\n return lines.join('\\n');\n}\n"],"names":["featureOffHint","featuresLine","presetsLines","printRowStream","printRows","renderMap","renderPeek","stringifyJson","OVERSIZE_BYTES","cell","value","String","replace","csvField","text","undefined","Array","isArray","join","test","csvLine","values","map","warnOversize","bytes","rowCount","console","warn","Math","round","MAX_SAFE","BigInt","Number","MAX_SAFE_INTEGER","bigintSafe","_key","toString","indent","JSON","stringify","rows","format","columns","names","length","Object","keys","Set","rendered","row","name","log","Buffer","byteLength","renderRows","iterator","first","rest","collected","write","Symbol","asyncIterator","next","done","push","process","stdout","split","line","MIN_COLUMN","TRUNCATED","fitWidths","widths","limit","gaps","fitted","total","reduce","a","b","widest","indexOf","max","cellLines","v","body","formatRow","_","c","linesByCell","r","li","heights","width","col","cellsInRow","lines","natural","i","flatMap","clip","w","padEnd","slice","trimEnd","repeat","features","off","on","signalLabels","signals","entries","weight","presets","p","files","embedded","vectors","result","parts","docs","count","fields","fieldsTotal","hubs","includes","recentCaveat","recent","path","tokens","parseError","frontmatter","key","sections","s","level","heading","start_line","end_line","sectionsTotal","linkLine","label","shown","outboundTotal","unresolvedTotal","backlinksTotal","outbound","unresolved","backlinks"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/output/output.ts"],"sourcesContent":["import type { TreeMap } from '../commands/map.ts';\nimport type { Peek } from '../commands/peek.ts';\n\n// rows -> table (default) | json | csv\n\nexport type Row = Record<string, unknown>;\n\n// map/peek/status/path render structures rather than a row set, so csv has nothing to mean\n// there; the commands that emit rows take RowFormat.\nexport type Format = 'table' | 'json';\nexport type RowFormat = Format | 'csv';\n\n// Warned about on stderr (keeps --format json stdout machine-readable), never truncated.\nconst OVERSIZE_BYTES = 50_000;\n\n// Flatten embedded newlines so they can't break table column alignment; JSON output keeps them as-is.\nfunction cell(value: unknown): string {\n return String(value ?? '').replace(/\\s*\\n\\s*/g, ' ');\n}\n\n// RFC 4180, deliberately not cell(): csv is the redirect-to-file format, so it keeps every\n// character, newlines included; what it cannot carry (NULL vs empty, types) is what json is for.\n// An array (e.g. snippets) joins with the one delimiter our content provably cannot contain,\n// inside the quoted field newlines already trigger (DESIGN.md \"Rendering a list of snippets\").\nfunction csvField(value: unknown): string {\n const text = value === null || value === undefined ? '' : Array.isArray(value) ? value.join('\\n') : String(value);\n return /[\"\\r\\n,]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\nfunction csvLine(values: unknown[]): string {\n return values.map(csvField).join(',');\n}\n\nfunction warnOversize(bytes: number, rowCount: number): void {\n if (bytes <= OVERSIZE_BYTES) return;\n console.warn(`warning: result is ${Math.round(bytes / 1000)} KB across ${rowCount} row(s); consider a LIMIT, fewer columns, snippet() instead of whole values, or --format csv redirected to a file`);\n}\n\n// JSON.stringify throws on BigInt, and stores return int64 as BigInt (DuckDB does): a value\n// that fits a safe integer stays a number, a larger one becomes its decimal string.\nconst MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);\nconst bigintSafe = (_key: string, value: unknown): unknown => (typeof value === 'bigint' ? (value >= -MAX_SAFE && value <= MAX_SAFE ? Number(value) : value.toString()) : value);\n\nexport function stringifyJson(value: unknown, indent?: number): string {\n return JSON.stringify(value, bigintSafe, indent);\n}\n\nexport function printRows(rows: Row[], format: RowFormat, columns?: string[]): void {\n if (format === 'csv') {\n // Names from a row wherever there is one: the statement's column list keeps duplicates the\n // row collapsed. Nothing at all with no row and no columns -- a bare newline is an empty record.\n const names = rows.length > 0 ? Object.keys(rows[0]) : [...new Set(columns ?? [])];\n if (names.length === 0) return;\n const rendered = [csvLine(names), ...rows.map((row) => csvLine(names.map((name) => row[name])))].join('\\n');\n console.log(rendered);\n // Bytes, not code units -- CJK is 3 bytes per character.\n warnOversize(Buffer.byteLength(rendered), rows.length);\n return;\n }\n const rendered = renderRows(rows, format);\n console.log(rendered);\n warnOversize(Buffer.byteLength(rendered), rows.length);\n}\n\n// Streaming counterpart for the one unbounded caller, `sense sql`: the result is never held as\n// rows and again as a rendered string. Table buffers (column width depends on the last row); json/csv write row by row.\nexport async function printRowStream(rows: AsyncIterable<Row>, format: RowFormat, columns: string[]): Promise<void> {\n const iterator = rows[Symbol.asyncIterator]();\n // One step before any write. FTS5 parses a MATCH expression at step time rather than at\n // prepare time, so a bad search string throws here, with stdout still clean for the error.\n const first = await iterator.next();\n const rest: AsyncIterable<Row> = { [Symbol.asyncIterator]: () => iterator };\n\n if (format === 'table') {\n const collected: Row[] = first.done ? [] : [first.value];\n for await (const row of rest) collected.push(row);\n printRows(collected, format, columns);\n return;\n }\n\n let bytes = 0;\n let rowCount = 0;\n const write = (text: string): void => {\n // Bytes, not code units -- CJK is 3 bytes per character.\n bytes += Buffer.byteLength(text);\n process.stdout.write(text);\n };\n\n if (format === 'json') {\n // Byte-identical to JSON.stringify(rows, null, 2) + newline: each row re-indented one\n // level, comma-joined, inside the array brackets written here.\n const indent = (row: Row) =>\n stringifyJson(row, 2)\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n if (first.done) {\n write('[]\\n');\n } else {\n write('[\\n');\n write(indent(first.value));\n rowCount = 1;\n for await (const row of rest) {\n write(',\\n');\n write(indent(row));\n rowCount++;\n }\n write('\\n]\\n');\n }\n } else if (first.done) {\n const names = [...new Set(columns)];\n if (names.length > 0) write(`${csvLine(names)}\\n`);\n } else {\n const names = Object.keys(first.value);\n write(`${csvLine(names)}\\n`);\n write(`${csvLine(names.map((name) => first.value[name]))}\\n`);\n rowCount = 1;\n for await (const row of rest) {\n write(`${csvLine(names.map((name) => row[name]))}\\n`);\n rowCount++;\n }\n }\n warnOversize(bytes, rowCount);\n}\n\n// Tables are for reading, and a row wider than the terminal wraps unreadably: widest columns\n// give up space first, down to a floor. --format json is never truncated.\nconst MIN_COLUMN = 12;\nconst TRUNCATED = '…';\n\nfunction fitWidths(widths: number[], limit: number): number[] {\n const gaps = (widths.length - 1) * 2;\n const fitted = [...widths];\n for (;;) {\n const total = fitted.reduce((a, b) => a + b, 0) + gaps;\n if (total <= limit) return fitted;\n const widest = fitted.indexOf(Math.max(...fitted));\n if (fitted[widest] <= MIN_COLUMN) return fitted;\n fitted[widest] = Math.max(MIN_COLUMN, fitted[widest] - Math.max(1, total - limit));\n }\n}\n\n// An array cell (snippets) becomes one physical line per element; every other value stays the\n// single line cell() already produced. No cell in any other command holds one today, so a row\n// with no array-valued cell yields exactly one physical line, unchanged from before this existed.\nfunction cellLines(value: unknown): string[] {\n if (Array.isArray(value)) return value.length === 0 ? [''] : value.map((v) => cell(v));\n return [cell(value)];\n}\n\nfunction renderRows(rows: object[], format: Format, width = process.stdout.columns): string {\n if (format === 'json') return stringifyJson(rows, 2);\n if (rows.length === 0) return '(0 rows)';\n\n const columns = Object.keys(rows[0]);\n const linesByCell = rows.map((row) => columns.map((col) => cellLines(Reflect.get(row, col))));\n const heights = linesByCell.map((cellsInRow) => Math.max(1, ...cellsInRow.map((lines) => lines.length)));\n const natural = columns.map((col, i) => Math.max(col.length, ...linesByCell.flatMap((cellsInRow) => cellsInRow[i]).map((line) => line.length)));\n const widths = width && width > MIN_COLUMN ? fitWidths(natural, width) : natural;\n\n const clip = (value: string, w: number) => (value.length <= w ? value.padEnd(w) : `${value.slice(0, w - 1)}${TRUNCATED}`);\n const formatRow = (values: string[]) =>\n values\n .map((value, i) => clip(value, widths[i]))\n .join(' ')\n .trimEnd();\n\n // A row becomes as many physical lines as its tallest cell; other columns blank-pad on\n // continuation lines (DESIGN.md \"Rendering a list of snippets\").\n const body: string[] = [];\n for (let r = 0; r < rows.length; r++) {\n for (let li = 0; li < heights[r]; li++) body.push(formatRow(columns.map((_, c) => linesByCell[r][c][li] ?? '')));\n }\n\n return [formatRow(columns), widths.map((w) => '-'.repeat(w)).join(' '), ...body].join('\\n');\n}\n\n// Text renderers for the top-level commands; cli.ts prints what these return.\n\n// Names the config key that turns a feature back on. Only the three features-block toggles\n// reach here; `embed` has its own status line.\nexport function featureOffHint(name: string): string {\n return `features.${name}`;\n}\n\nexport function featuresLine(features: { on: string[]; off: string[] }): string {\n const off = features.off.length > 0 ? ` · off: ${features.off.map((name) => `${name} (${featureOffHint(name)})`).join(', ')}` : '';\n return `features: ${features.on.join(', ')}${off}`;\n}\n\n// name, or name:weight when the weight is not the default 1.\nfunction signalLabels(signals: Record<string, number>): string {\n return Object.entries(signals)\n .map(([name, weight]) => (weight === 1 ? name : `${name}:${weight}`))\n .join(', ');\n}\n\nexport function presetsLines(presets: Array<{ name: string; files: number; embedded: number; signals: Record<string, number> }>): string[] {\n // \"0 embedded\" is ambiguous between a scope that declined vectors and one that has not built\n // them yet, so a preset without the vectors signal says what it uses instead.\n return ['presets:', ...presets.map((p) => ` ${p.name}: ${p.files} file(s), ${p.embedded} embedded${p.signals.vectors !== undefined ? '' : ` (signals: ${signalLabels(p.signals)})`}`)];\n}\n\nexport function renderMap(result: TreeMap): string {\n const parts = [`docs: ${result.docs.count} (${Math.round(result.docs.bytes / 1024)} KB)`, featuresLine(result.features), '', ...presetsLines(result.presets), '', renderRows(result.fields, 'table')];\n if (result.fieldsTotal > result.fields.length) parts.push(`(+${result.fieldsTotal - result.fields.length} more fields)`);\n if (result.hubs.length > 0) parts.push('\\nhubs (by link rank):', renderRows(result.hubs, 'table'));\n else if (result.features.off.includes('rank')) parts.push(`\\nhubs: off (${featureOffHint('rank')})`);\n parts.push('\\nrecent:');\n if (result.recentCaveat) parts.push(result.recentCaveat);\n parts.push(renderRows(result.recent, 'table'));\n return parts.join('\\n');\n}\n\nexport function renderPeek(result: Peek): string {\n const lines = [`${result.path} (~${result.tokens} tokens)`];\n // Otherwise a refused parse is indistinguishable from a note that has no frontmatter, which\n // is the confusion the whole quarantine design exists to remove.\n if (result.parseError) lines.push(` frontmatter: did not parse, so none of it is indexed (${result.parseError})`);\n for (const [key, value] of Object.entries(result.frontmatter)) lines.push(` ${key}: ${value}`);\n if (result.sections.length > 0) {\n lines.push('', 'sections:');\n for (const s of result.sections) lines.push(` ${'#'.repeat(s.level)} ${s.heading} [L${s.start_line}-${s.end_line}, ~${s.tokens}t]`);\n if (result.sectionsTotal > result.sections.length) lines.push(` (+${result.sectionsTotal - result.sections.length} more sections -- sections table has all of them)`);\n } else if (result.off.includes('sections')) lines.push('', 'sections: off (features.sections)');\n if (result.off.includes('links')) {\n lines.push('', 'links: off (features.links)');\n } else {\n const linkLine = (label: string, shown: string[], total: number) => {\n if (total > 0) lines.push(`${label} (${total}): ${shown.join(', ')}${total > shown.length ? `, +${total - shown.length} more` : ''}`);\n };\n if (result.outboundTotal + result.unresolvedTotal + result.backlinksTotal > 0) lines.push('');\n linkLine('links out', result.outbound, result.outboundTotal);\n linkLine('unresolved', result.unresolved, result.unresolvedTotal);\n linkLine('backlinks', result.backlinks, result.backlinksTotal);\n }\n return lines.join('\\n');\n}\n"],"names":["featureOffHint","featuresLine","presetsLines","printRowStream","printRows","renderMap","renderPeek","stringifyJson","OVERSIZE_BYTES","cell","value","String","replace","csvField","text","undefined","Array","isArray","join","test","csvLine","values","map","warnOversize","bytes","rowCount","console","warn","Math","round","MAX_SAFE","BigInt","Number","MAX_SAFE_INTEGER","bigintSafe","_key","toString","indent","JSON","stringify","rows","format","columns","names","length","Object","keys","Set","rendered","row","name","log","Buffer","byteLength","renderRows","iterator","first","rest","collected","write","Symbol","asyncIterator","next","done","push","process","stdout","split","line","MIN_COLUMN","TRUNCATED","fitWidths","widths","limit","gaps","fitted","total","reduce","a","b","widest","indexOf","max","cellLines","v","body","formatRow","_","c","linesByCell","r","li","heights","width","col","Reflect","get","cellsInRow","lines","natural","i","flatMap","clip","w","padEnd","slice","trimEnd","repeat","features","off","on","signalLabels","signals","entries","weight","presets","p","files","embedded","vectors","result","parts","docs","count","fields","fieldsTotal","hubs","includes","recentCaveat","recent","path","tokens","parseError","frontmatter","key","sections","s","level","heading","start_line","end_line","sectionsTotal","linkLine","label","shown","outboundTotal","unresolvedTotal","backlinksTotal","outbound","unresolved","backlinks"],"mappings":"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"}
@@ -10,11 +10,12 @@ export type FileResult = {
10
10
  export declare class ParsePool {
11
11
  private pool;
12
12
  private workerData;
13
+ private workerCount;
13
14
  private operation;
14
15
  poolsCreated: number;
15
16
  private enqueue;
16
17
  private ensure;
17
- run(files: FileStat[], features: Feature[], cfg: Config, onParsed: ((done: number) => void) | undefined, maxWorkers: number): Promise<FileResult[]>;
18
+ run(files: FileStat[], features: Feature[], cfg: Config, onParsed: ((done: number) => void) | undefined, requestedWorkers: number): Promise<FileResult[]>;
18
19
  private dispatch;
19
20
  private destroy;
20
21
  close(): Promise<void>;
@@ -10,11 +10,12 @@ export type FileResult = {
10
10
  export declare class ParsePool {
11
11
  private pool;
12
12
  private workerData;
13
+ private workerCount;
13
14
  private operation;
14
15
  poolsCreated: number;
15
16
  private enqueue;
16
17
  private ensure;
17
- run(files: FileStat[], features: Feature[], cfg: Config, onParsed: ((done: number) => void) | undefined, maxWorkers: number): Promise<FileResult[]>;
18
+ run(files: FileStat[], features: Feature[], cfg: Config, onParsed: ((done: number) => void) | undefined, requestedWorkers: number): Promise<FileResult[]>;
18
19
  private dispatch;
19
20
  private destroy;
20
21
  close(): Promise<void>;
@@ -169,13 +169,16 @@ function _unsupported_iterable_to_array(o, minLen) {
169
169
  }
170
170
  // Tinypool is ESM-only; our floor (>=22.20) has native require(esm), so the tier-2 house deferral reaches it.
171
171
  var _require = typeof require === 'undefined' ? (0, _nodemodule.createRequire)(require("url").pathToFileURL(__filename).toString()) : require;
172
+ // Candidate queue depth gives uneven files more than one scheduling turn per worker.
173
+ // The bounded parser comparison decides whether this value ships.
174
+ var BATCHES_PER_WORKER = 4;
172
175
  var ParsePool = /*#__PURE__*/ function() {
173
176
  "use strict";
174
177
  function ParsePool() {
175
178
  _class_call_check(this, ParsePool);
176
179
  this.operation = Promise.resolve();
177
180
  // Tinypools this instance has constructed. Repeated equivalent dispatches leave this unchanged;
178
- // a context change or close followed by run constructs another pool.
181
+ // a context/count change or close followed by run constructs another pool.
179
182
  this.poolsCreated = 0;
180
183
  }
181
184
  var _proto = ParsePool.prototype;
@@ -188,13 +191,13 @@ var ParsePool = /*#__PURE__*/ function() {
188
191
  });
189
192
  return result;
190
193
  };
191
- _proto.ensure = function ensure(workerData, maxWorkers) {
194
+ _proto.ensure = function ensure(workerData, workerCount) {
192
195
  return _async_to_generator(function() {
193
196
  var Tinypool;
194
197
  return _ts_generator(this, function(_state) {
195
198
  switch(_state.label){
196
199
  case 0:
197
- if (!(this.pool && !(0, _nodeutil.isDeepStrictEqual)(this.workerData, workerData))) return [
200
+ if (!(this.pool && (!(0, _nodeutil.isDeepStrictEqual)(this.workerData, workerData) || this.workerCount !== workerCount))) return [
198
201
  3,
199
202
  2
200
203
  ];
@@ -210,11 +213,12 @@ var ParsePool = /*#__PURE__*/ function() {
210
213
  Tinypool = _require('tinypool').Tinypool;
211
214
  this.pool = new Tinypool({
212
215
  filename: (0, _workerfilets.resolveWorkerFile)('parse'),
213
- minThreads: maxWorkers,
214
- maxThreads: maxWorkers,
216
+ minThreads: workerCount,
217
+ maxThreads: workerCount,
215
218
  workerData: workerData
216
219
  });
217
220
  this.workerData = workerData;
221
+ this.workerCount = workerCount;
218
222
  this.poolsCreated++;
219
223
  }
220
224
  return [
@@ -225,10 +229,11 @@ var ParsePool = /*#__PURE__*/ function() {
225
229
  });
226
230
  }).call(this);
227
231
  };
228
- // Never the tree: a worker task carries one FileStat and returns only what parseFile returns --
229
- // extracted text and feature values, never the token tree.
230
- _proto.run = function run(files, features, cfg, onParsed, maxWorkers) {
232
+ // Never the tree: a worker task carries a bounded FileStat batch and returns only what
233
+ // parseFile returns for each file, never the token tree.
234
+ _proto.run = function run(files, features, cfg, onParsed, requestedWorkers) {
231
235
  var _this = this;
236
+ if (files.length === 0) return Promise.resolve([]);
232
237
  // Snapshot at invocation so caller mutation cannot change queued work or its reuse baseline.
233
238
  var workerData = {
234
239
  cfg: structuredClone(cfg),
@@ -236,45 +241,101 @@ var ParsePool = /*#__PURE__*/ function() {
236
241
  return feature.name;
237
242
  }))).sort()
238
243
  };
244
+ var workerCount = Math.max(1, Math.min(requestedWorkers, files.length));
239
245
  return this.enqueue(function() {
240
- return _this.dispatch(files, workerData, onParsed, maxWorkers);
246
+ return _this.dispatch(files, workerData, onParsed, workerCount);
241
247
  });
242
248
  };
243
- _proto.dispatch = function dispatch(files, workerData, onParsed, maxWorkers) {
249
+ _proto.dispatch = function dispatch(files, workerData, onParsed, workerCount) {
244
250
  return _async_to_generator(function() {
245
- var pool, done, settled, results, failures, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, result;
251
+ var pool, batches, done, settled, results, failures, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, batch, _results, _failures;
246
252
  return _ts_generator(this, function(_state) {
247
253
  switch(_state.label){
248
254
  case 0:
249
255
  return [
250
256
  4,
251
- this.ensure(workerData, maxWorkers)
257
+ this.ensure(workerData, workerCount)
252
258
  ];
253
259
  case 1:
254
260
  pool = _state.sent();
261
+ batches = batchFiles(files, Math.min(files.length, workerCount * BATCHES_PER_WORKER));
255
262
  done = 0;
256
263
  return [
257
264
  4,
258
- Promise.allSettled(files.map(function(file) {
265
+ Promise.all(batches.map(function(batch) {
259
266
  return _async_to_generator(function() {
260
- var result;
267
+ var taskResults, err, results, failures, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, result;
261
268
  return _ts_generator(this, function(_state) {
262
269
  switch(_state.label){
263
270
  case 0:
271
+ _state.trys.push([
272
+ 0,
273
+ 2,
274
+ ,
275
+ 3
276
+ ]);
264
277
  return [
265
278
  4,
266
- pool.run(file)
279
+ pool.run(batch)
267
280
  ];
268
281
  case 1:
269
- result = _state.sent();
270
- if (!result.ok) throw (0, _workererrorts.reviveError)(result.error);
271
- onParsed === null || onParsed === void 0 ? void 0 : onParsed(++done);
282
+ taskResults = _state.sent();
283
+ return [
284
+ 3,
285
+ 3
286
+ ];
287
+ case 2:
288
+ err = _state.sent();
289
+ return [
290
+ 2,
291
+ {
292
+ results: [],
293
+ failures: [
294
+ err
295
+ ]
296
+ }
297
+ ];
298
+ case 3:
299
+ results = [];
300
+ failures = [];
301
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
302
+ try {
303
+ for(_iterator = taskResults[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
304
+ result = _step.value;
305
+ if (!result.ok) {
306
+ failures.push((0, _workererrorts.reviveError)(result.error));
307
+ continue;
308
+ }
309
+ results.push({
310
+ doc: result.doc,
311
+ warnings: result.warnings,
312
+ parseMs: result.parseMs
313
+ });
314
+ try {
315
+ onParsed === null || onParsed === void 0 ? void 0 : onParsed(++done);
316
+ } catch (err) {
317
+ failures.push(err);
318
+ }
319
+ }
320
+ } catch (err) {
321
+ _didIteratorError = true;
322
+ _iteratorError = err;
323
+ } finally{
324
+ try {
325
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
326
+ _iterator.return();
327
+ }
328
+ } finally{
329
+ if (_didIteratorError) {
330
+ throw _iteratorError;
331
+ }
332
+ }
333
+ }
272
334
  return [
273
335
  2,
274
336
  {
275
- doc: result.doc,
276
- warnings: result.warnings,
277
- parseMs: result.parseMs
337
+ results: results,
338
+ failures: failures
278
339
  }
279
340
  ];
280
341
  }
@@ -289,9 +350,10 @@ var ParsePool = /*#__PURE__*/ function() {
289
350
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
290
351
  try {
291
352
  for(_iterator = settled[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
292
- result = _step.value;
293
- if (result.status === 'fulfilled') results.push(result.value);
294
- else failures.push(result.reason);
353
+ batch = _step.value;
354
+ ;
355
+ (_results = results).push.apply(_results, _to_consumable_array(batch.results));
356
+ (_failures = failures).push.apply(_failures, _to_consumable_array(batch.failures));
295
357
  }
296
358
  } catch (err) {
297
359
  _didIteratorError = true;
@@ -309,7 +371,7 @@ var ParsePool = /*#__PURE__*/ function() {
309
371
  }
310
372
  if (failures.length === 1) throw failures[0];
311
373
  if (failures.length > 1) throw new AggregateError(failures, "".concat(failures.length, " parse tasks failed"));
312
- // allSettled preserves input order, which downstream first-seen column order depends on.
374
+ // Promise.all and contiguous batches preserve the input order that first-seen columns use.
313
375
  return [
314
376
  2,
315
377
  results
@@ -328,14 +390,15 @@ var ParsePool = /*#__PURE__*/ function() {
328
390
  2
329
391
  ];
330
392
  pool = this.pool;
331
- this.pool = undefined;
332
- this.workerData = undefined;
333
393
  return [
334
394
  4,
335
395
  pool.destroy()
336
396
  ];
337
397
  case 1:
338
398
  _state.sent();
399
+ this.pool = undefined;
400
+ this.workerData = undefined;
401
+ this.workerCount = undefined;
339
402
  return [
340
403
  2
341
404
  ];
@@ -352,4 +415,30 @@ var ParsePool = /*#__PURE__*/ function() {
352
415
  };
353
416
  return ParsePool;
354
417
  }();
418
+ function batchFiles(files, batchCount) {
419
+ var batches = [];
420
+ var start = 0;
421
+ var remainingBytes = files.reduce(function(sum, file) {
422
+ return sum + file.size;
423
+ }, 0);
424
+ for(var batchIndex = 0; batchIndex < batchCount; batchIndex++){
425
+ var remainingBatches = batchCount - batchIndex;
426
+ if (remainingBatches === 1) {
427
+ batches.push(files.slice(start));
428
+ break;
429
+ }
430
+ var targetBytes = remainingBytes / remainingBatches;
431
+ var lastEnd = files.length - (remainingBatches - 1);
432
+ var end = start;
433
+ var bytes = 0;
434
+ while(end < lastEnd && (end === start || bytes < targetBytes)){
435
+ bytes += files[end].size;
436
+ end++;
437
+ }
438
+ batches.push(files.slice(start, end));
439
+ start = end;
440
+ remainingBytes -= bytes;
441
+ }
442
+ return batches;
443
+ }
355
444
  /* 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; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/scan/pool.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { isDeepStrictEqual } from 'node:util';\n// Type-only: erased at build, but keeps depcheck's usage check satisfied for the tier-2\n// `_require` below (see coding-standards' deferral tiers).\nimport type * as TinypoolNS from 'tinypool';\nimport type { Config } from '../config/index.ts';\nimport type { Feature } from '../features/types.ts';\nimport { resolveWorkerFile } from '../lib/worker-file.ts';\nimport type { ParsedDoc } from '../scan/index.ts';\nimport type { ParseTask, ParseTaskResult, ParseWorkerData } from '../workers/parse.ts';\nimport type { FileStat } from './list.ts';\nimport { reviveError } from './worker-error.ts';\n\n// Tinypool is ESM-only; our floor (>=22.20) has native require(esm), so the tier-2 house deferral reaches it.\nconst _require = typeof require === 'undefined' ? createRequire(import.meta.url) : require;\n\n// parseMs is worker-side only (see workers/parse.ts); absent on the serial path.\nexport type FileResult = { doc: ParsedDoc; warnings: string[]; parseMs?: number };\n\n// Created lazily and reused while dispatch context stays equivalent. A builder owns one instance\n// for its lifetime instead of paying pool startup for unchanged reconciles.\nexport class ParsePool {\n private pool: TinypoolNS.Tinypool | undefined;\n private workerData: ParseWorkerData | undefined;\n private operation: Promise<void> = Promise.resolve();\n // Tinypools this instance has constructed. Repeated equivalent dispatches leave this unchanged;\n // a context change or close followed by run constructs another pool.\n poolsCreated = 0;\n\n private enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.operation.then(operation);\n this.operation = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n\n private async ensure(workerData: ParseWorkerData, maxWorkers: number): Promise<TinypoolNS.Tinypool> {\n if (this.pool && !isDeepStrictEqual(this.workerData, workerData)) await this.destroy();\n if (!this.pool) {\n const { Tinypool } = _require('tinypool') as typeof TinypoolNS;\n this.pool = new Tinypool({ filename: resolveWorkerFile('parse'), minThreads: maxWorkers, maxThreads: maxWorkers, workerData });\n this.workerData = workerData;\n this.poolsCreated++;\n }\n return this.pool;\n }\n\n // Never the tree: a worker task carries one FileStat and returns only what parseFile returns --\n // extracted text and feature values, never the token tree.\n run(files: FileStat[], features: Feature[], cfg: Config, onParsed: ((done: number) => void) | undefined, maxWorkers: number): Promise<FileResult[]> {\n // Snapshot at invocation so caller mutation cannot change queued work or its reuse baseline.\n const workerData: ParseWorkerData = { cfg: structuredClone(cfg), featureNames: [...new Set(features.map((feature) => feature.name))].sort() };\n return this.enqueue(() => this.dispatch(files, workerData, onParsed, maxWorkers));\n }\n\n private async dispatch(files: FileStat[], workerData: ParseWorkerData, onParsed: ((done: number) => void) | undefined, maxWorkers: number): Promise<FileResult[]> {\n const pool = await this.ensure(workerData, maxWorkers);\n let done = 0;\n const settled = await Promise.allSettled(\n files.map(async (file): Promise<FileResult> => {\n const result = (await pool.run(file as ParseTask)) as ParseTaskResult;\n if (!result.ok) throw reviveError(result.error);\n onParsed?.(++done);\n return { doc: result.doc, warnings: result.warnings, parseMs: result.parseMs };\n })\n );\n const results: FileResult[] = [];\n const failures: unknown[] = [];\n for (const result of settled) {\n if (result.status === 'fulfilled') results.push(result.value);\n else failures.push(result.reason);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) throw new AggregateError(failures, `${failures.length} parse tasks failed`);\n // allSettled preserves input order, which downstream first-seen column order depends on.\n return results;\n }\n\n private async destroy(): Promise<void> {\n if (!this.pool) return;\n const pool = this.pool;\n this.pool = undefined;\n this.workerData = undefined;\n await pool.destroy();\n }\n\n // A pool never created costs nothing to destroy. Queuing lets active dispatches drain first.\n close(): Promise<void> {\n return this.enqueue(() => this.destroy());\n }\n}\n"],"names":["ParsePool","_require","require","createRequire","operation","Promise","resolve","poolsCreated","enqueue","result","then","undefined","ensure","workerData","maxWorkers","Tinypool","pool","isDeepStrictEqual","destroy","filename","resolveWorkerFile","minThreads","maxThreads","run","files","features","cfg","onParsed","structuredClone","featureNames","Set","map","feature","name","sort","dispatch","done","settled","results","failures","allSettled","file","ok","reviveError","error","doc","warnings","parseMs","status","push","value","reason","length","AggregateError","close"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/scan/pool.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { isDeepStrictEqual } from 'node:util';\n// Type-only: erased at build, but keeps depcheck's usage check satisfied for the tier-2\n// `_require` below (see coding-standards' deferral tiers).\nimport type * as TinypoolNS from 'tinypool';\nimport type { Config } from '../config/index.ts';\nimport type { Feature } from '../features/types.ts';\nimport { resolveWorkerFile } from '../lib/worker-file.ts';\nimport type { ParsedDoc } from '../scan/index.ts';\nimport type { ParseTaskResult, ParseWorkerData } from '../workers/parse.ts';\nimport type { FileStat } from './list.ts';\nimport { reviveError } from './worker-error.ts';\n\n// Tinypool is ESM-only; our floor (>=22.20) has native require(esm), so the tier-2 house deferral reaches it.\nconst _require = typeof require === 'undefined' ? createRequire(import.meta.url) : require;\n// Candidate queue depth gives uneven files more than one scheduling turn per worker.\n// The bounded parser comparison decides whether this value ships.\nconst BATCHES_PER_WORKER = 4;\n\n// parseMs is worker-side only (see workers/parse.ts); absent on the serial path.\nexport type FileResult = { doc: ParsedDoc; warnings: string[]; parseMs?: number };\n\n// Created lazily and reused while dispatch context stays equivalent. A builder owns one instance\n// for its lifetime instead of paying pool startup for unchanged reconciles.\nexport class ParsePool {\n private pool: TinypoolNS.Tinypool | undefined;\n private workerData: ParseWorkerData | undefined;\n private workerCount: number | undefined;\n private operation: Promise<void> = Promise.resolve();\n // Tinypools this instance has constructed. Repeated equivalent dispatches leave this unchanged;\n // a context/count change or close followed by run constructs another pool.\n poolsCreated = 0;\n\n private enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.operation.then(operation);\n this.operation = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n\n private async ensure(workerData: ParseWorkerData, workerCount: number): Promise<TinypoolNS.Tinypool> {\n if (this.pool && (!isDeepStrictEqual(this.workerData, workerData) || this.workerCount !== workerCount)) await this.destroy();\n if (!this.pool) {\n const { Tinypool } = _require('tinypool') as typeof TinypoolNS;\n this.pool = new Tinypool({ filename: resolveWorkerFile('parse'), minThreads: workerCount, maxThreads: workerCount, workerData });\n this.workerData = workerData;\n this.workerCount = workerCount;\n this.poolsCreated++;\n }\n return this.pool;\n }\n\n // Never the tree: a worker task carries a bounded FileStat batch and returns only what\n // parseFile returns for each file, never the token tree.\n run(files: FileStat[], features: Feature[], cfg: Config, onParsed: ((done: number) => void) | undefined, requestedWorkers: number): Promise<FileResult[]> {\n if (files.length === 0) return Promise.resolve([]);\n // Snapshot at invocation so caller mutation cannot change queued work or its reuse baseline.\n const workerData: ParseWorkerData = { cfg: structuredClone(cfg), featureNames: [...new Set(features.map((feature) => feature.name))].sort() };\n const workerCount = Math.max(1, Math.min(requestedWorkers, files.length));\n return this.enqueue(() => this.dispatch(files, workerData, onParsed, workerCount));\n }\n\n private async dispatch(files: FileStat[], workerData: ParseWorkerData, onParsed: ((done: number) => void) | undefined, workerCount: number): Promise<FileResult[]> {\n const pool = await this.ensure(workerData, workerCount);\n const batches = batchFiles(files, Math.min(files.length, workerCount * BATCHES_PER_WORKER));\n let done = 0;\n const settled = await Promise.all(\n batches.map(async (batch): Promise<{ results: FileResult[]; failures: unknown[] }> => {\n let taskResults: ParseTaskResult;\n try {\n taskResults = (await pool.run(batch)) as ParseTaskResult;\n } catch (err) {\n return { results: [], failures: [err] };\n }\n\n const results: FileResult[] = [];\n const failures: unknown[] = [];\n for (const result of taskResults) {\n if (!result.ok) {\n failures.push(reviveError(result.error));\n continue;\n }\n results.push({ doc: result.doc, warnings: result.warnings, parseMs: result.parseMs });\n try {\n onParsed?.(++done);\n } catch (err) {\n failures.push(err);\n }\n }\n return { results, failures };\n })\n );\n const results: FileResult[] = [];\n const failures: unknown[] = [];\n for (const batch of settled) {\n results.push(...batch.results);\n failures.push(...batch.failures);\n }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) throw new AggregateError(failures, `${failures.length} parse tasks failed`);\n // Promise.all and contiguous batches preserve the input order that first-seen columns use.\n return results;\n }\n\n private async destroy(): Promise<void> {\n if (!this.pool) return;\n const pool = this.pool;\n await pool.destroy();\n this.pool = undefined;\n this.workerData = undefined;\n this.workerCount = undefined;\n }\n\n // A pool never created costs nothing to destroy. Queuing lets active dispatches drain first.\n close(): Promise<void> {\n return this.enqueue(() => this.destroy());\n }\n}\n\nfunction batchFiles(files: FileStat[], batchCount: number): FileStat[][] {\n const batches: FileStat[][] = [];\n let start = 0;\n let remainingBytes = files.reduce((sum, file) => sum + file.size, 0);\n\n for (let batchIndex = 0; batchIndex < batchCount; batchIndex++) {\n const remainingBatches = batchCount - batchIndex;\n if (remainingBatches === 1) {\n batches.push(files.slice(start));\n break;\n }\n\n const targetBytes = remainingBytes / remainingBatches;\n const lastEnd = files.length - (remainingBatches - 1);\n let end = start;\n let bytes = 0;\n while (end < lastEnd && (end === start || bytes < targetBytes)) {\n bytes += files[end].size;\n end++;\n }\n batches.push(files.slice(start, end));\n start = end;\n remainingBytes -= bytes;\n }\n return batches;\n}\n"],"names":["ParsePool","_require","require","createRequire","BATCHES_PER_WORKER","operation","Promise","resolve","poolsCreated","enqueue","result","then","undefined","ensure","workerData","workerCount","Tinypool","pool","isDeepStrictEqual","destroy","filename","resolveWorkerFile","minThreads","maxThreads","run","files","features","cfg","onParsed","requestedWorkers","length","structuredClone","featureNames","Set","map","feature","name","sort","Math","max","min","dispatch","batches","done","settled","results","failures","batch","batchFiles","all","taskResults","err","ok","push","reviveError","error","doc","warnings","parseMs","AggregateError","close","batchCount","start","remainingBytes","reduce","sum","file","size","batchIndex","remainingBatches","slice","targetBytes","lastEnd","end","bytes"],"mappings":"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"}
@@ -14,5 +14,6 @@ export interface ReparseOptions {
14
14
  maxWorkers?: number;
15
15
  pool?: ParsePool;
16
16
  }
17
+ export declare const PARSE_BYTES_PER_WORKER: number;
17
18
  export declare function featuresForFile(features: Feature[], cfg: Config, file: FileStat): Feature[];
18
19
  export declare function reparseFiles(files: FileStat[], features: Feature[], cfg: Config, knownColumns: ReadonlySet<string>, onParsed?: (done: number) => void, options?: ReparseOptions): Promise<ReparseResult>;
@@ -14,5 +14,6 @@ export interface ReparseOptions {
14
14
  maxWorkers?: number;
15
15
  pool?: ParsePool;
16
16
  }
17
+ export declare const PARSE_BYTES_PER_WORKER: number;
17
18
  export declare function featuresForFile(features: Feature[], cfg: Config, file: FileStat): Feature[];
18
19
  export declare function reparseFiles(files: FileStat[], features: Feature[], cfg: Config, knownColumns: ReadonlySet<string>, onParsed?: (done: number) => void, options?: ReparseOptions): Promise<ReparseResult>;