@cavelang/cli 0.35.0 → 0.36.1

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 (327) hide show
  1. package/README.md +224 -12
  2. package/dist/internal/act/action.js +2 -1
  3. package/dist/internal/act/action.js.map +1 -1
  4. package/dist/internal/act/declare.d.ts.map +1 -1
  5. package/dist/internal/act/declare.js +82 -53
  6. package/dist/internal/act/declare.js.map +1 -1
  7. package/dist/internal/act/engine.d.ts +4 -3
  8. package/dist/internal/act/engine.d.ts.map +1 -1
  9. package/dist/internal/act/engine.js +121 -32
  10. package/dist/internal/act/engine.js.map +1 -1
  11. package/dist/internal/automate/cancellation.d.ts +3 -0
  12. package/dist/internal/automate/cancellation.d.ts.map +1 -0
  13. package/dist/internal/automate/cancellation.js +38 -0
  14. package/dist/internal/automate/cancellation.js.map +1 -0
  15. package/dist/internal/automate/declare.d.ts.map +1 -1
  16. package/dist/internal/automate/declare.js +49 -24
  17. package/dist/internal/automate/declare.js.map +1 -1
  18. package/dist/internal/automate/engine.d.ts +7 -3
  19. package/dist/internal/automate/engine.d.ts.map +1 -1
  20. package/dist/internal/automate/engine.js +196 -93
  21. package/dist/internal/automate/engine.js.map +1 -1
  22. package/dist/internal/automate/error-message.d.ts +3 -0
  23. package/dist/internal/automate/error-message.d.ts.map +1 -0
  24. package/dist/internal/automate/error-message.js +10 -0
  25. package/dist/internal/automate/error-message.js.map +1 -0
  26. package/dist/internal/automate/main.d.ts.map +1 -1
  27. package/dist/internal/automate/main.js +238 -35
  28. package/dist/internal/automate/main.js.map +1 -1
  29. package/dist/internal/automate/options.d.ts +4 -0
  30. package/dist/internal/automate/options.d.ts.map +1 -0
  31. package/dist/internal/automate/options.js +19 -0
  32. package/dist/internal/automate/options.js.map +1 -0
  33. package/dist/internal/connect/declared.d.ts +6 -27
  34. package/dist/internal/connect/declared.d.ts.map +1 -1
  35. package/dist/internal/connect/declared.js +165 -76
  36. package/dist/internal/connect/declared.js.map +1 -1
  37. package/dist/internal/connect/error-message.d.ts +3 -0
  38. package/dist/internal/connect/error-message.d.ts.map +1 -0
  39. package/dist/internal/connect/error-message.js +10 -0
  40. package/dist/internal/connect/error-message.js.map +1 -0
  41. package/dist/internal/connect/federation.d.ts +9 -0
  42. package/dist/internal/connect/federation.d.ts.map +1 -0
  43. package/dist/internal/connect/federation.js +19 -0
  44. package/dist/internal/connect/federation.js.map +1 -0
  45. package/dist/internal/connect/fetch-failure.d.ts +3 -0
  46. package/dist/internal/connect/fetch-failure.d.ts.map +1 -0
  47. package/dist/internal/connect/fetch-failure.js +36 -0
  48. package/dist/internal/connect/fetch-failure.js.map +1 -0
  49. package/dist/internal/connect/main.d.ts +1 -0
  50. package/dist/internal/connect/main.d.ts.map +1 -1
  51. package/dist/internal/connect/main.js +288 -114
  52. package/dist/internal/connect/main.js.map +1 -1
  53. package/dist/internal/connect/options.d.ts +3 -0
  54. package/dist/internal/connect/options.d.ts.map +1 -0
  55. package/dist/internal/connect/options.js +9 -0
  56. package/dist/internal/connect/options.js.map +1 -0
  57. package/dist/internal/connect/records.d.ts +3 -0
  58. package/dist/internal/connect/records.d.ts.map +1 -0
  59. package/dist/internal/connect/records.js +21 -0
  60. package/dist/internal/connect/records.js.map +1 -0
  61. package/dist/internal/connect/run.d.ts +1 -18
  62. package/dist/internal/connect/run.d.ts.map +1 -1
  63. package/dist/internal/connect/run.js +115 -55
  64. package/dist/internal/connect/run.js.map +1 -1
  65. package/dist/internal/connect/source.d.ts +3 -1
  66. package/dist/internal/connect/source.d.ts.map +1 -1
  67. package/dist/internal/connect/source.js +226 -47
  68. package/dist/internal/connect/source.js.map +1 -1
  69. package/dist/internal/connect/template.d.ts +2 -2
  70. package/dist/internal/connect/template.d.ts.map +1 -1
  71. package/dist/internal/connect/template.js +25 -9
  72. package/dist/internal/connect/template.js.map +1 -1
  73. package/dist/internal/connect/utf8.d.ts +3 -0
  74. package/dist/internal/connect/utf8.d.ts.map +1 -0
  75. package/dist/internal/connect/utf8.js +12 -0
  76. package/dist/internal/connect/utf8.js.map +1 -0
  77. package/dist/internal/eval/cleanup.d.ts +5 -0
  78. package/dist/internal/eval/cleanup.d.ts.map +1 -0
  79. package/dist/internal/eval/cleanup.js +50 -0
  80. package/dist/internal/eval/cleanup.js.map +1 -0
  81. package/dist/internal/eval/error-message.d.ts +3 -0
  82. package/dist/internal/eval/error-message.d.ts.map +1 -0
  83. package/dist/internal/eval/error-message.js +10 -0
  84. package/dist/internal/eval/error-message.js.map +1 -0
  85. package/dist/internal/eval/judge.d.ts.map +1 -1
  86. package/dist/internal/eval/judge.js +3 -31
  87. package/dist/internal/eval/judge.js.map +1 -1
  88. package/dist/internal/eval/loop.d.ts.map +1 -1
  89. package/dist/internal/eval/loop.js +18 -4
  90. package/dist/internal/eval/loop.js.map +1 -1
  91. package/dist/internal/eval/main.d.ts.map +1 -1
  92. package/dist/internal/eval/main.js +22 -10
  93. package/dist/internal/eval/main.js.map +1 -1
  94. package/dist/internal/eval/options.d.ts +6 -0
  95. package/dist/internal/eval/options.d.ts.map +1 -0
  96. package/dist/internal/eval/options.js +31 -0
  97. package/dist/internal/eval/options.js.map +1 -0
  98. package/dist/internal/eval/queries.d.ts.map +1 -1
  99. package/dist/internal/eval/queries.js +9 -6
  100. package/dist/internal/eval/queries.js.map +1 -1
  101. package/dist/internal/eval/run.d.ts.map +1 -1
  102. package/dist/internal/eval/run.js +112 -24
  103. package/dist/internal/eval/run.js.map +1 -1
  104. package/dist/internal/eval/score.d.ts.map +1 -1
  105. package/dist/internal/eval/score.js +9 -2
  106. package/dist/internal/eval/score.js.map +1 -1
  107. package/dist/internal/eval/suite.d.ts.map +1 -1
  108. package/dist/internal/eval/suite.js +14 -2
  109. package/dist/internal/eval/suite.js.map +1 -1
  110. package/dist/internal/ingest/cleanup.d.ts +5 -0
  111. package/dist/internal/ingest/cleanup.d.ts.map +1 -0
  112. package/dist/internal/ingest/cleanup.js +50 -0
  113. package/dist/internal/ingest/cleanup.js.map +1 -0
  114. package/dist/internal/ingest/content.d.ts +6 -0
  115. package/dist/internal/ingest/content.d.ts.map +1 -0
  116. package/dist/internal/ingest/content.js +25 -0
  117. package/dist/internal/ingest/content.js.map +1 -0
  118. package/dist/internal/ingest/context.d.ts.map +1 -1
  119. package/dist/internal/ingest/context.js +25 -7
  120. package/dist/internal/ingest/context.js.map +1 -1
  121. package/dist/internal/ingest/error-message.d.ts +3 -0
  122. package/dist/internal/ingest/error-message.d.ts.map +1 -0
  123. package/dist/internal/ingest/error-message.js +10 -0
  124. package/dist/internal/ingest/error-message.js.map +1 -0
  125. package/dist/internal/ingest/files.d.ts +4 -12
  126. package/dist/internal/ingest/files.d.ts.map +1 -1
  127. package/dist/internal/ingest/files.js +22 -10
  128. package/dist/internal/ingest/files.js.map +1 -1
  129. package/dist/internal/ingest/main.d.ts.map +1 -1
  130. package/dist/internal/ingest/main.js +46 -16
  131. package/dist/internal/ingest/main.js.map +1 -1
  132. package/dist/internal/ingest/options.d.ts +6 -0
  133. package/dist/internal/ingest/options.d.ts.map +1 -0
  134. package/dist/internal/ingest/options.js +27 -0
  135. package/dist/internal/ingest/options.js.map +1 -0
  136. package/dist/internal/ingest/prompt.d.ts.map +1 -1
  137. package/dist/internal/ingest/prompt.js +14 -10
  138. package/dist/internal/ingest/prompt.js.map +1 -1
  139. package/dist/internal/ingest/run.d.ts +9 -2
  140. package/dist/internal/ingest/run.d.ts.map +1 -1
  141. package/dist/internal/ingest/run.js +206 -62
  142. package/dist/internal/ingest/run.js.map +1 -1
  143. package/dist/internal/ingest/timeout.d.ts +3 -0
  144. package/dist/internal/ingest/timeout.d.ts.map +1 -0
  145. package/dist/internal/ingest/timeout.js +14 -0
  146. package/dist/internal/ingest/timeout.js.map +1 -0
  147. package/dist/internal/ingest/web.d.ts +2 -11
  148. package/dist/internal/ingest/web.d.ts.map +1 -1
  149. package/dist/internal/ingest/web.js +131 -25
  150. package/dist/internal/ingest/web.js.map +1 -1
  151. package/dist/internal/loop/budgets.d.ts +3 -0
  152. package/dist/internal/loop/budgets.d.ts.map +1 -0
  153. package/dist/internal/loop/budgets.js +10 -0
  154. package/dist/internal/loop/budgets.js.map +1 -0
  155. package/dist/internal/loop/index.d.ts +2 -0
  156. package/dist/internal/loop/index.d.ts.map +1 -1
  157. package/dist/internal/loop/index.js +2 -0
  158. package/dist/internal/loop/index.js.map +1 -1
  159. package/dist/internal/loop/json-answer.d.ts +7 -0
  160. package/dist/internal/loop/json-answer.d.ts.map +1 -0
  161. package/dist/internal/loop/json-answer.js +79 -0
  162. package/dist/internal/loop/json-answer.js.map +1 -0
  163. package/dist/internal/loop/json-spans.d.ts +3 -0
  164. package/dist/internal/loop/json-spans.d.ts.map +1 -0
  165. package/dist/internal/loop/json-spans.js +88 -0
  166. package/dist/internal/loop/json-spans.js.map +1 -0
  167. package/dist/internal/loop/llm.d.ts +3 -2
  168. package/dist/internal/loop/llm.d.ts.map +1 -1
  169. package/dist/internal/loop/llm.js +115 -32
  170. package/dist/internal/loop/llm.js.map +1 -1
  171. package/dist/internal/loop/process.d.ts +3 -1
  172. package/dist/internal/loop/process.d.ts.map +1 -1
  173. package/dist/internal/loop/process.js +159 -59
  174. package/dist/internal/loop/process.js.map +1 -1
  175. package/dist/internal/loop/read-snapshot.d.ts +4 -0
  176. package/dist/internal/loop/read-snapshot.d.ts.map +1 -0
  177. package/dist/internal/loop/read-snapshot.js +29 -0
  178. package/dist/internal/loop/read-snapshot.js.map +1 -0
  179. package/dist/internal/loop/reconstruct.d.ts +6 -5
  180. package/dist/internal/loop/reconstruct.d.ts.map +1 -1
  181. package/dist/internal/loop/reconstruct.js +19 -8
  182. package/dist/internal/loop/reconstruct.js.map +1 -1
  183. package/dist/internal/loop/score-settings.d.ts +5 -0
  184. package/dist/internal/loop/score-settings.d.ts.map +1 -0
  185. package/dist/internal/loop/score-settings.js +14 -0
  186. package/dist/internal/loop/score-settings.js.map +1 -0
  187. package/dist/internal/loop/sqlite.d.ts.map +1 -1
  188. package/dist/internal/loop/sqlite.js +15 -7
  189. package/dist/internal/loop/sqlite.js.map +1 -1
  190. package/dist/internal/loop/store.d.ts.map +1 -1
  191. package/dist/internal/loop/store.js +11 -7
  192. package/dist/internal/loop/store.js.map +1 -1
  193. package/dist/internal/loop/timeout.d.ts +3 -0
  194. package/dist/internal/loop/timeout.d.ts.map +1 -0
  195. package/dist/internal/loop/timeout.js +13 -0
  196. package/dist/internal/loop/timeout.js.map +1 -0
  197. package/dist/internal/mcp/error-message.d.ts +3 -0
  198. package/dist/internal/mcp/error-message.d.ts.map +1 -0
  199. package/dist/internal/mcp/error-message.js +10 -0
  200. package/dist/internal/mcp/error-message.js.map +1 -0
  201. package/dist/internal/mcp/main.d.ts.map +1 -1
  202. package/dist/internal/mcp/main.js +42 -27
  203. package/dist/internal/mcp/main.js.map +1 -1
  204. package/dist/internal/mcp/read-snapshot.d.ts +4 -0
  205. package/dist/internal/mcp/read-snapshot.d.ts.map +1 -0
  206. package/dist/internal/mcp/read-snapshot.js +22 -0
  207. package/dist/internal/mcp/read-snapshot.js.map +1 -0
  208. package/dist/internal/mcp/server.d.ts.map +1 -1
  209. package/dist/internal/mcp/server.js +181 -21
  210. package/dist/internal/mcp/server.js.map +1 -1
  211. package/dist/internal/mcp/source.d.ts +3 -0
  212. package/dist/internal/mcp/source.d.ts.map +1 -0
  213. package/dist/internal/mcp/source.js +13 -0
  214. package/dist/internal/mcp/source.js.map +1 -0
  215. package/dist/internal/mcp/tools.d.ts.map +1 -1
  216. package/dist/internal/mcp/tools.js +135 -72
  217. package/dist/internal/mcp/tools.js.map +1 -1
  218. package/dist/internal/rules/declarations.d.ts +6 -0
  219. package/dist/internal/rules/declarations.d.ts.map +1 -0
  220. package/dist/internal/rules/declarations.js +14 -0
  221. package/dist/internal/rules/declarations.js.map +1 -0
  222. package/dist/internal/rules/declare.d.ts.map +1 -1
  223. package/dist/internal/rules/declare.js +30 -16
  224. package/dist/internal/rules/declare.js.map +1 -1
  225. package/dist/internal/rules/engine.d.ts +8 -7
  226. package/dist/internal/rules/engine.d.ts.map +1 -1
  227. package/dist/internal/rules/engine.js +150 -44
  228. package/dist/internal/rules/engine.js.map +1 -1
  229. package/dist/internal/shape/alias-root.d.ts +3 -0
  230. package/dist/internal/shape/alias-root.d.ts.map +1 -0
  231. package/dist/internal/shape/alias-root.js +13 -0
  232. package/dist/internal/shape/alias-root.js.map +1 -0
  233. package/dist/internal/shape/check.d.ts +15 -3
  234. package/dist/internal/shape/check.d.ts.map +1 -1
  235. package/dist/internal/shape/check.js +230 -100
  236. package/dist/internal/shape/check.js.map +1 -1
  237. package/dist/internal/shape/client.d.ts.map +1 -1
  238. package/dist/internal/shape/client.js +42 -20
  239. package/dist/internal/shape/client.js.map +1 -1
  240. package/dist/internal/shape/constraints.d.ts +8 -0
  241. package/dist/internal/shape/constraints.d.ts.map +1 -0
  242. package/dist/internal/shape/constraints.js +17 -0
  243. package/dist/internal/shape/constraints.js.map +1 -0
  244. package/dist/internal/shape/edit-distance.d.ts +3 -0
  245. package/dist/internal/shape/edit-distance.d.ts.map +1 -0
  246. package/dist/internal/shape/edit-distance.js +33 -0
  247. package/dist/internal/shape/edit-distance.js.map +1 -0
  248. package/dist/internal/shape/gate.d.ts.map +1 -1
  249. package/dist/internal/shape/gate.js +0 -0
  250. package/dist/internal/shape/gate.js.map +1 -1
  251. package/dist/internal/shape/snapshot.d.ts +4 -0
  252. package/dist/internal/shape/snapshot.d.ts.map +1 -0
  253. package/dist/internal/shape/snapshot.js +20 -0
  254. package/dist/internal/shape/snapshot.js.map +1 -0
  255. package/dist/internal/shape/suggest.d.ts +8 -6
  256. package/dist/internal/shape/suggest.d.ts.map +1 -1
  257. package/dist/internal/shape/suggest.js +208 -92
  258. package/dist/internal/shape/suggest.js.map +1 -1
  259. package/dist/internal/sync/error-message.d.ts +3 -0
  260. package/dist/internal/sync/error-message.d.ts.map +1 -0
  261. package/dist/internal/sync/error-message.js +10 -0
  262. package/dist/internal/sync/error-message.js.map +1 -0
  263. package/dist/internal/sync/index.d.ts +3 -2
  264. package/dist/internal/sync/index.d.ts.map +1 -1
  265. package/dist/internal/sync/index.js +3 -2
  266. package/dist/internal/sync/index.js.map +1 -1
  267. package/dist/internal/sync/sync.d.ts +8 -5
  268. package/dist/internal/sync/sync.d.ts.map +1 -1
  269. package/dist/internal/sync/sync.js +322 -65
  270. package/dist/internal/sync/sync.js.map +1 -1
  271. package/dist/internal/view/api.d.ts +3 -1
  272. package/dist/internal/view/api.d.ts.map +1 -1
  273. package/dist/internal/view/api.js +154 -90
  274. package/dist/internal/view/api.js.map +1 -1
  275. package/dist/internal/view/error-message.d.ts +3 -0
  276. package/dist/internal/view/error-message.d.ts.map +1 -0
  277. package/dist/internal/view/error-message.js +10 -0
  278. package/dist/internal/view/error-message.js.map +1 -0
  279. package/dist/internal/view/main.d.ts.map +1 -1
  280. package/dist/internal/view/main.js +61 -8
  281. package/dist/internal/view/main.js.map +1 -1
  282. package/dist/internal/view/page.d.ts.map +1 -1
  283. package/dist/internal/view/page.js +119 -20
  284. package/dist/internal/view/page.js.map +1 -1
  285. package/dist/internal/view/report.d.ts.map +1 -1
  286. package/dist/internal/view/report.js +180 -145
  287. package/dist/internal/view/report.js.map +1 -1
  288. package/dist/internal/view/scope.d.ts +6 -2
  289. package/dist/internal/view/scope.d.ts.map +1 -1
  290. package/dist/internal/view/scope.js +107 -24
  291. package/dist/internal/view/scope.js.map +1 -1
  292. package/dist/internal/view/sensitivity.d.ts +4 -0
  293. package/dist/internal/view/sensitivity.d.ts.map +1 -0
  294. package/dist/internal/view/sensitivity.js +11 -0
  295. package/dist/internal/view/sensitivity.js.map +1 -0
  296. package/dist/internal/view/server.d.ts.map +1 -1
  297. package/dist/internal/view/server.js +57 -20
  298. package/dist/internal/view/server.js.map +1 -1
  299. package/dist/src/atomic-output.d.ts +3 -0
  300. package/dist/src/atomic-output.d.ts.map +1 -0
  301. package/dist/src/atomic-output.js +67 -0
  302. package/dist/src/atomic-output.js.map +1 -0
  303. package/dist/src/cli.d.ts +3 -2
  304. package/dist/src/cli.d.ts.map +1 -1
  305. package/dist/src/cli.js +188 -173
  306. package/dist/src/cli.js.map +1 -1
  307. package/dist/src/dispatch.d.ts.map +1 -1
  308. package/dist/src/dispatch.js +3 -2
  309. package/dist/src/dispatch.js.map +1 -1
  310. package/dist/src/doctor.d.ts.map +1 -1
  311. package/dist/src/doctor.js +178 -102
  312. package/dist/src/doctor.js.map +1 -1
  313. package/dist/src/error-message.d.ts +3 -0
  314. package/dist/src/error-message.d.ts.map +1 -0
  315. package/dist/src/error-message.js +20 -0
  316. package/dist/src/error-message.js.map +1 -0
  317. package/dist/src/hooks-config.d.ts +3 -0
  318. package/dist/src/hooks-config.d.ts.map +1 -0
  319. package/dist/src/hooks-config.js +23 -0
  320. package/dist/src/hooks-config.js.map +1 -0
  321. package/package.json +23 -20
  322. package/src/atomic-output.ts +47 -0
  323. package/src/cli.ts +170 -147
  324. package/src/dispatch.ts +3 -2
  325. package/src/doctor.ts +192 -111
  326. package/src/error-message.ts +13 -0
  327. package/src/hooks-config.ts +22 -0
@@ -1,3 +1,4 @@
1
+ import { booleanOption, sourceList } from "./options.js";
1
2
  /**
2
3
  * URL sources for ingestion — `cave ingest https://…` fetches the page
3
4
  * with the built-in fetch and reduces HTML to its readable article text
@@ -8,13 +9,18 @@
8
9
  * is taken over the *extracted* text, so a page is re-ingested only when
9
10
  * its readable content changes — not on every markup or chrome tweak.
10
11
  */
12
+ import { errorMessage } from "./error-message.js";
13
+ import { sourceLabel } from "./content.js";
11
14
  import { Readability } from '@mozilla/readability';
12
15
  import { parseHTML } from 'linkedom';
13
16
  import { digestOf, isIngested } from "./files.js";
17
+ import { agentTimeoutMs } from "./timeout.js";
14
18
  /** @returns whether an ingest pattern is a fetchable URL. */
15
19
  export const isUrl = (pattern) => /^https?:\/\//i.test(pattern);
16
20
  /** Block-level elements worth a line of their own in the extracted text. */
17
- const blockSelector = 'p, h1, h2, h3, h4, h5, h6, li, pre, blockquote, td, figcaption';
21
+ const blockSelector = 'p, h1, h2, h3, h4, h5, h6, li, pre, blockquote, th, td, caption, dt, dd, figcaption, address';
22
+ // Structural containers separate text but do not absorb nested headings or code.
23
+ const containerSelector = 'div, section, article, main, header, footer, aside, nav, figure, details, summary, form, fieldset, ul, ol, dl, table, thead, tbody, tfoot, tr';
18
24
  const headingPrefix = {
19
25
  H1: '# ', H2: '## ', H3: '### ', H4: '#### ', H5: '##### ', H6: '###### ', LI: '- '
20
26
  };
@@ -23,17 +29,68 @@ const headingPrefix = {
23
29
  const Parser = Readability;
24
30
  /** Flattens a DOM subtree into markdown-ish text, one block per line. */
25
31
  const textOf = (root) => {
26
- const blocks = [...root.querySelectorAll(blockSelector)]
32
+ for (const lineBreak of root.querySelectorAll('br'))
33
+ lineBreak.replaceWith('\n');
34
+ const elements = [...root.querySelectorAll(blockSelector)];
35
+ // textContent does not separate adjacent blocks. Keep nested content in its
36
+ // outer block, but retain word boundaries before flattening its whitespace.
37
+ for (const element of [...elements, ...root.querySelectorAll(containerSelector)]) {
38
+ if (element.parentElement?.closest(blockSelector) != null) {
39
+ element.before('\n');
40
+ element.after('\n');
41
+ }
42
+ }
43
+ const blocks = new Map(elements
27
44
  // Keep outermost blocks only — a <p> inside a kept <li> is its text.
28
45
  .filter(element => element.parentElement === null || element.parentElement.closest(blockSelector) === null)
29
46
  .map(element => {
30
47
  const text = element.textContent ?? '';
31
- return element.tagName === 'PRE' ?
32
- text.trim() :
33
- `${headingPrefix[element.tagName] ?? ''}${text.replace(/\s+/g, ' ').trim()}`;
34
- })
35
- .filter(line => line !== '');
36
- return blocks.length > 0 ? blocks.join('\n\n') : (root.textContent ?? '').trim();
48
+ if (element.tagName === 'PRE')
49
+ return [element, text];
50
+ const content = text.replace(/\s+/g, ' ').trim();
51
+ return [element, content === '' ? '' : `${headingPrefix[element.tagName] ?? ''}${content}`];
52
+ }));
53
+ const containers = new Set(root.querySelectorAll(containerSelector));
54
+ if (blocks.size === 0 && containers.size === 0)
55
+ return (root.textContent ?? '').trim();
56
+ const output = [];
57
+ let pending = [];
58
+ const flush = () => {
59
+ const text = pending.join('').replace(/\s+/g, ' ').trim();
60
+ if (text !== '')
61
+ output.push(text);
62
+ pending = [];
63
+ };
64
+ // Traverse iteratively and skip the descendants of emitted blocks. Text
65
+ // between those blocks belongs to the retained article too.
66
+ const stack = root.firstChild === null ? [] : [root.firstChild];
67
+ while (stack.length > 0) {
68
+ const node = stack.pop();
69
+ if (node === null) {
70
+ flush();
71
+ continue;
72
+ }
73
+ if (node.nextSibling !== null)
74
+ stack.push(node.nextSibling);
75
+ const block = blocks.get(node);
76
+ if (block !== undefined) {
77
+ flush();
78
+ if (block !== '')
79
+ output.push(block);
80
+ }
81
+ else if (node.nodeType === 3) {
82
+ pending.push(node.textContent ?? '');
83
+ }
84
+ else if (node.nodeType === 1 && node.firstChild !== null) {
85
+ if (containers.has(node)) {
86
+ flush();
87
+ stack.push(null);
88
+ }
89
+ stack.push(node.firstChild);
90
+ }
91
+ }
92
+ flush();
93
+ return output.join('\n\n');
37
94
  };
38
95
  /**
39
96
  * @returns the readable text of an HTML page — Readability's article when
@@ -52,9 +109,12 @@ export const readableTextOf = (html) => {
52
109
  };
53
110
  const text = article === null || article.content === null || article.content === undefined ?
54
111
  body() :
55
- textOf(parseHTML(`<html><body>${article.content}</body></html>`).document);
112
+ textOf(parseHTML(`<html><body>${article.content}</body></html>`).document.body);
56
113
  const title = (article?.title ?? parse().title ?? '').trim();
57
- return title === '' || text.startsWith(`# ${title}`) ? text : `# ${title}\n\n${text}`;
114
+ const heading = `# ${title}`;
115
+ if (title === '' || text === heading || text.startsWith(`${heading}\n`))
116
+ return text;
117
+ return text === '' ? heading : `${heading}\n\n${text}`;
58
118
  };
59
119
  class FetchFailure extends Error {
60
120
  failure;
@@ -67,14 +127,19 @@ const retryableStatus = (status) => status === 408 || status === 425 || status =
67
127
  const failureOf = (url, error) => {
68
128
  if (error instanceof FetchFailure)
69
129
  return error.failure;
70
- const detail = error instanceof Error ? error.message : String(error);
71
- return { path: url, kind: 'network', retryable: true, message: `fetch ${url} failed: ${detail}` };
130
+ const detail = errorMessage(error);
131
+ return { path: url, kind: 'network', retryable: true, message: `fetch ${sourceLabel(url)} failed: ${sourceLabel(detail)}` };
72
132
  };
73
133
  /**
74
134
  * Fetches one URL and returns it as a selectable source — readable text
75
135
  * for HTML responses, the verbatim body for anything else.
76
136
  */
77
- export const fetchDocument = async (url, fetchImpl = fetch, timeoutSeconds = 60) => {
137
+ export const fetchDocument = async (url, fetchImpl = fetch, timeoutSeconds = 60, signal) => {
138
+ signal?.throwIfAborted();
139
+ if (/[\uD800-\uDFFF]/u.test(url)) {
140
+ throw new TypeError('URL must contain well-formed Unicode');
141
+ }
142
+ const timeoutMs = agentTimeoutMs(timeoutSeconds, true);
78
143
  let response;
79
144
  try {
80
145
  response = await fetchImpl(url, {
@@ -83,24 +148,50 @@ export const fetchDocument = async (url, fetchImpl = fetch, timeoutSeconds = 60)
83
148
  accept: 'text/html, text/markdown, text/plain, application/json;q=0.9, */*;q=0.8'
84
149
  },
85
150
  redirect: 'follow',
86
- signal: AbortSignal.timeout(timeoutSeconds * 1000)
151
+ signal: AbortSignal.any([
152
+ AbortSignal.timeout(timeoutMs),
153
+ ...signal === undefined ? [] : [signal]
154
+ ])
87
155
  });
88
156
  }
89
157
  catch (error) {
158
+ signal?.throwIfAborted();
90
159
  throw new FetchFailure(failureOf(url, error));
91
160
  }
161
+ if (signal?.aborted) {
162
+ await response.body?.cancel().catch(() => undefined);
163
+ signal.throwIfAborted();
164
+ }
92
165
  if (!response.ok) {
166
+ await response.body?.cancel().catch(() => undefined);
167
+ signal?.throwIfAborted();
93
168
  throw new FetchFailure({
94
169
  path: url,
95
170
  kind: 'http',
96
171
  retryable: retryableStatus(response.status),
97
172
  status: response.status,
98
- message: `fetch ${url} failed: ${response.status} ${response.statusText}`
173
+ message: `fetch ${sourceLabel(url)} failed: ${response.status} ${sourceLabel(response.statusText)}`
99
174
  });
100
175
  }
101
- const type = response.headers.get('content-type') ?? '';
102
- const body = await response.text();
103
- const html = /html|xhtml/i.test(type) || (type === '' && /^\s*</.test(body));
176
+ const type = (response.headers.get('content-type') ?? '').split(';', 1)[0].trim().toLowerCase();
177
+ let bytes;
178
+ try {
179
+ bytes = await response.arrayBuffer();
180
+ }
181
+ catch (error) {
182
+ signal?.throwIfAborted();
183
+ throw error;
184
+ }
185
+ signal?.throwIfAborted();
186
+ let body;
187
+ try {
188
+ body = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes);
189
+ }
190
+ catch (cause) {
191
+ throw new FetchFailure(failureOf(url, new TypeError('invalid UTF-8 response body', { cause })));
192
+ }
193
+ const html = type === 'text/html' || type === 'application/xhtml+xml' ||
194
+ (type === '' && /^\s*</.test(body));
104
195
  const content = html ? readableTextOf(body) : body;
105
196
  return { path: url, digest: digestOf(content), content };
106
197
  };
@@ -111,24 +202,39 @@ export const fetchDocument = async (url, fetchImpl = fetch, timeoutSeconds = 60)
111
202
  * but unchanged pages cost no agent run.
112
203
  */
113
204
  export const select = async (store, urls, options = {}) => {
205
+ const signal = options.signal;
206
+ signal?.throwIfAborted();
207
+ const force = booleanOption(options.force, 'force');
208
+ const fetchImpl = options.fetchImpl;
114
209
  const files = [];
115
210
  const skipped = [];
116
211
  const failures = [];
117
- const outcomes = await Promise.all([...new Set(urls)].map(async (url) => {
118
- try {
119
- return { document: await fetchDocument(url, options.fetchImpl) };
120
- }
121
- catch (error) {
122
- return { failure: failureOf(url, error) };
212
+ const selected = [...new Set(sourceList(urls, 'URLs'))];
213
+ const outcomes = new Array(selected.length);
214
+ let next = 0;
215
+ // Bound in-flight requests while retaining input order for reports and batches.
216
+ await Promise.all(Array.from({ length: Math.min(8, selected.length) }, async () => {
217
+ while (next < selected.length) {
218
+ signal?.throwIfAborted();
219
+ const index = next++;
220
+ const url = selected[index];
221
+ try {
222
+ outcomes[index] = { document: await fetchDocument(url, fetchImpl, 60, signal) };
223
+ }
224
+ catch (error) {
225
+ signal?.throwIfAborted();
226
+ outcomes[index] = { failure: failureOf(url, error) };
227
+ }
123
228
  }
124
229
  }));
230
+ signal?.throwIfAborted();
125
231
  for (const outcome of outcomes) {
126
232
  if ('failure' in outcome) {
127
233
  failures.push(outcome.failure);
128
234
  continue;
129
235
  }
130
236
  const document = outcome.document;
131
- if (options.force !== true && isIngested(store, document.path, document.digest)) {
237
+ if (force !== true && isIngested(store, document.path, document.digest)) {
132
238
  skipped.push(document.path);
133
239
  }
134
240
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGjD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAW,EAAE,CAChD,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAE/B,4EAA4E;AAC5E,MAAM,aAAa,GAAG,gEAAgE,CAAA;AAEtF,MAAM,aAAa,GAAqC;IACtD,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI;CACpF,CAAA;AAeD;6EAC6E;AAC7E,MAAM,MAAM,GAAG,WAC+E,CAAA;AAE9F,yEAAyE;AACzE,MAAM,MAAM,GAAG,CAAC,IAAc,EAAU,EAAE;IACxC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACtD,qEAAqE;SACpE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;SAC1G,GAAG,CAAC,OAAO,CAAC,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;QACtC,OAAO,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACb,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;IAChF,CAAC,CAAC;SACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IAC9B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AAClF,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IACrD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAA;IAC5C,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;IAC3C,MAAM,IAAI,GAAG,GAAW,EAAE;QACxB,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAA;QACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,gBAAgB,CAAC,mCAAmC,CAA0B,EAAE,CAAC;YAC9G,OAAO,CAAC,MAAM,EAAE,CAAA;QAClB,CAAC;QACD,OAAO,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAa,CAAC,CAAA;IACxD,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;QAC1F,IAAI,EAAE,CAAC,CAAC;QACR,MAAM,CAAC,SAAS,CAAC,eAAe,OAAO,CAAC,OAAO,gBAAgB,CAAC,CAAC,QAA+B,CAAC,CAAA;IACnG,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5D,OAAO,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,EAAE,CAAA;AACvF,CAAC,CAAA;AAeD,MAAM,YAAa,SAAQ,KAAK;IACrB,OAAO,CAAS;IAEzB,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAW,EAAE,CAClD,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAA;AAErE,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,KAAc,EAAW,EAAE;IACzD,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,KAAK,CAAC,OAAO,CAAA;IACvD,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACrE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,YAAY,MAAM,EAAE,EAAE,CAAA;AACnG,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,GAAW,EACX,YAAuB,KAAK,EAC5B,cAAc,GAAG,EAAE,EACA,EAAE;IACrB,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE;gBACP,YAAY,EAAE,aAAa;gBAC3B,MAAM,EAAE,yEAAyE;aAClF;YACD,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;SACnD,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAC/C,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,SAAS,GAAG,YAAY,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;SAC1E,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;IACvD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;AAC1D,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,KAAY,EACZ,IAAuB,EACvB,UAAsD,EAAE,EACD,EAAE;IACzD,MAAM,KAAK,GAAe,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,QAAQ,GAAc,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAsD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;QACvH,IAAI,CAAC;YACH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAA;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAA;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC,CAAA;IACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9B,SAAQ;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QACjC,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrC,CAAC,CAAA"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Validate built-in policy budgets before traversal or model work. */
2
+ export declare const validateBudgets: (maxSteps: number, maxClaims: number) => void;
3
+ //# sourceMappingURL=budgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/budgets.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,KAAG,IAOrE,CAAA"}
@@ -0,0 +1,10 @@
1
+ /** Validate built-in policy budgets before traversal or model work. */
2
+ export const validateBudgets = (maxSteps, maxClaims) => {
3
+ if (!Number.isSafeInteger(maxSteps) || maxSteps < 0) {
4
+ throw new TypeError('maxSteps must be a nonnegative safe integer');
5
+ }
6
+ if (maxClaims !== Infinity && (!Number.isSafeInteger(maxClaims) || maxClaims < 0)) {
7
+ throw new TypeError('maxClaims must be a nonnegative safe integer or Infinity');
8
+ }
9
+ };
10
+ //# sourceMappingURL=budgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.js","sourceRoot":"","sources":["../../src/budgets.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAQ,EAAE;IAC3E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAA;IACjF,CAAC;AACH,CAAC,CAAA"}
@@ -19,4 +19,6 @@ export { llmPolicy, parseSelection, selectPrompt, shellComplete, stopToken } fro
19
19
  export { ProcessFailure, defaultMaxStderrBytes, defaultMaxStdoutBytes, directCommand, quoteShellArgument, runProcess, runProcessSync, shellCommand, shellSyntaxFor, substituteShell } from './process.ts';
20
20
  export type { ProcessCommand, ProcessFailureKind, ProcessFailureRecord, ProcessOptions, ProcessResult, ShellSyntax, SyncProcessOptions } from './process.ts';
21
21
  export type { Complete, LlmOptions, ShellCompleteOptions } from './llm.ts';
22
+ export { jsonValueEnds } from './json-spans.ts';
23
+ export { lastJsonArray } from './json-answer.ts';
22
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACjF,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC/G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,WAAW,EACX,kBAAkB,EACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACjF,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC/G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,WAAW,EACX,kBAAkB,EACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -15,4 +15,6 @@ export { sqliteStore } from "./sqlite.js";
15
15
  export { heuristicPolicy, reconstruct, reconstructAsync } from "./reconstruct.js";
16
16
  export { llmPolicy, parseSelection, selectPrompt, shellComplete, stopToken } from "./llm.js";
17
17
  export { ProcessFailure, defaultMaxStderrBytes, defaultMaxStdoutBytes, directCommand, quoteShellArgument, runProcess, runProcessSync, shellCommand, shellSyntaxFor, substituteShell } from "./process.js";
18
+ export { jsonValueEnds } from "./json-spans.js";
19
+ export { lastJsonArray } from "./json-answer.js";
18
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,cAAc,CAAA;AAYrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Last eligible JSON array amid prose. Complete strings and objects consume
3
+ * nested candidates; an optional own property names a supported object wrapper.
4
+ * Malformed prose retains balanced-candidate recovery. No input is evaluated.
5
+ */
6
+ export declare const lastJsonArray: (output: string, property?: string) => unknown[] | undefined;
7
+ //# sourceMappingURL=json-answer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-answer.d.ts","sourceRoot":"","sources":["../../src/json-answer.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,EAAE,GAAG,SA8D7E,CAAA"}
@@ -0,0 +1,79 @@
1
+ import { jsonValueEnds } from "./json-spans.js";
2
+ /**
3
+ * Last eligible JSON array amid prose. Complete strings and objects consume
4
+ * nested candidates; an optional own property names a supported object wrapper.
5
+ * Malformed prose retains balanced-candidate recovery. No input is evaluated.
6
+ */
7
+ export const lastJsonArray = (output, property) => {
8
+ // Complete JSON containers consume nested candidates before array answers
9
+ // are selected. Raw delimiter boundaries retain recovery from unfinished prose.
10
+ const spans = [];
11
+ const stack = [];
12
+ const rawStack = [];
13
+ let quote;
14
+ let escaped = false;
15
+ for (let at = 0; at < output.length; at += 1) {
16
+ const char = output[at];
17
+ let opening;
18
+ if (char === '[' || char === '{') {
19
+ opening = { index: spans.length, close: char === '[' ? ']' : '}' };
20
+ spans.push({ start: at, end: -1, rawEnd: -1 });
21
+ rawStack.push(opening);
22
+ }
23
+ else if (rawStack.length > 0 && char === rawStack[rawStack.length - 1].close) {
24
+ spans[rawStack.pop().index].rawEnd = at;
25
+ }
26
+ if (quote !== undefined) {
27
+ if (escaped)
28
+ escaped = false;
29
+ else if (char === '\\')
30
+ escaped = true;
31
+ else if (char === '"') {
32
+ spans[quote].end = at;
33
+ quote = undefined;
34
+ }
35
+ continue;
36
+ }
37
+ if (char === '"') {
38
+ quote = spans.length;
39
+ spans.push({ start: at, end: -1, rawEnd: -1 });
40
+ }
41
+ else if (opening !== undefined) {
42
+ stack.push(opening);
43
+ }
44
+ else if (stack.length > 0 && char === stack[stack.length - 1].close) {
45
+ spans[stack.pop().index].end = at;
46
+ }
47
+ }
48
+ const valueEnds = jsonValueEnds(output);
49
+ let parsed;
50
+ let consumed = -1;
51
+ for (const { start, end, rawEnd } of spans) {
52
+ if (start <= consumed)
53
+ continue;
54
+ // Recover answers after unfinished prose brackets or quotes, but only
55
+ // after valid outer JSON has consumed every candidate inside its span.
56
+ for (const candidate of new Set([end, rawEnd])) {
57
+ if (candidate === -1 || valueEnds[start] !== candidate + 1)
58
+ continue;
59
+ try {
60
+ const value = JSON.parse(output.slice(start, candidate + 1));
61
+ if (Array.isArray(value))
62
+ parsed = value;
63
+ else if (property !== undefined && value !== null && typeof value === 'object' &&
64
+ Object.hasOwn(value, property)) {
65
+ const nested = value[property];
66
+ if (Array.isArray(nested))
67
+ parsed = nested;
68
+ }
69
+ consumed = candidate;
70
+ break;
71
+ }
72
+ catch {
73
+ // Try the recovery boundary, then the next balanced candidate.
74
+ }
75
+ }
76
+ }
77
+ return Array.isArray(parsed) ? parsed : undefined;
78
+ };
79
+ //# sourceMappingURL=json-answer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-answer.js","sourceRoot":"","sources":["../../src/json-answer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Index valid JSON value prefixes in linear time, without recursion or decoding. */
2
+ export declare const jsonValueEnds: (text: string) => Int32Array;
3
+ //# sourceMappingURL=json-spans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-spans.d.ts","sourceRoot":"","sources":["../../src/json-spans.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,UAmE5C,CAAA"}
@@ -0,0 +1,88 @@
1
+ /** Index valid JSON value prefixes in linear time, without recursion or decoding. */
2
+ export const jsonValueEnds = (text) => {
3
+ const size = text.length;
4
+ const next = new Int32Array(size + 1);
5
+ const digits = new Int32Array(size + 1);
6
+ const strings = new Int32Array(size + 1);
7
+ const values = new Int32Array(size + 1);
8
+ const elements = new Int32Array(size + 1);
9
+ const members = new Int32Array(size + 1);
10
+ next[size] = size;
11
+ digits[size] = size;
12
+ const digit = (at) => at < size && text[at] >= '0' && text[at] <= '9';
13
+ for (let at = size - 1; at >= 0; at--) {
14
+ const char = text[at];
15
+ next[at] = char === ' ' || char === '\n' || char === '\r' || char === '\t' ? next[at + 1] : at;
16
+ digits[at] = digit(at) ? digits[at + 1] : at;
17
+ if (char === '"')
18
+ strings[at] = at + 1;
19
+ else if (char === '\\') {
20
+ const escaped = text[at + 1];
21
+ if (escaped !== undefined && '"\\/bfnrt'.includes(escaped))
22
+ strings[at] = strings[at + 2] ?? 0;
23
+ else if (escaped === 'u' && /^[0-9a-fA-F]{4}$/.test(text.slice(at + 2, at + 6)))
24
+ strings[at] = strings[at + 6] ?? 0;
25
+ }
26
+ else if (char.charCodeAt(0) >= 0x20)
27
+ strings[at] = strings[at + 1];
28
+ }
29
+ // Suffix indexes share comma-separated tails across all candidate openings.
30
+ // Every dependency lies to the right, including nested objects and arrays.
31
+ for (let at = size - 1; at >= 0; at--) {
32
+ const char = text[at];
33
+ if (char === '"')
34
+ values[at] = strings[at + 1];
35
+ else if (char === '[' || char === '{') {
36
+ const start = next[at + 1];
37
+ const close = char === '[' ? ']' : '}';
38
+ values[at] = text[start] === close ? start + 1 : (char === '[' ? elements[start] : members[start]);
39
+ }
40
+ else if (text.startsWith('true', at))
41
+ values[at] = at + 4;
42
+ else if (text.startsWith('false', at))
43
+ values[at] = at + 5;
44
+ else if (text.startsWith('null', at))
45
+ values[at] = at + 4;
46
+ else if (char === '-' || digit(at)) {
47
+ let end = char === '-' ? at + 1 : at;
48
+ if (digit(end)) {
49
+ end = text[end] === '0' ? end + 1 : digits[end];
50
+ let valid = true;
51
+ if (text[end] === '.') {
52
+ end++;
53
+ valid = digit(end);
54
+ end = digits[end] ?? end;
55
+ }
56
+ if (text[end] === 'e' || text[end] === 'E') {
57
+ end++;
58
+ if (text[end] === '+' || text[end] === '-')
59
+ end++;
60
+ valid = valid && digit(end);
61
+ end = digits[end] ?? end;
62
+ }
63
+ if (valid)
64
+ values[at] = end;
65
+ }
66
+ }
67
+ const end = values[at];
68
+ if (end === 0)
69
+ continue;
70
+ const separator = next[end];
71
+ if (text[separator] === ']')
72
+ elements[at] = separator + 1;
73
+ else if (text[separator] === ',')
74
+ elements[at] = elements[next[separator + 1]];
75
+ if (char === '"' && text[separator] === ':') {
76
+ const value = values[next[separator + 1]];
77
+ if (value === 0)
78
+ continue;
79
+ const after = next[value];
80
+ if (text[after] === '}')
81
+ members[at] = after + 1;
82
+ else if (text[after] === ',')
83
+ members[at] = members[next[after + 1]];
84
+ }
85
+ }
86
+ return values;
87
+ };
88
+ //# sourceMappingURL=json-spans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-spans.js","sourceRoot":"","sources":["../../src/json-spans.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  * model twice per step (select, then "are we done?"). Both decisions fit
12
12
  * one prompt: the model replies with the next cue to expand *or* `STOP`,
13
13
  * and the loop already treats an `undefined` selection as the stop
14
- * signal. `done` then only enforces the hard budgets, for free.
14
+ * signal. `done` then only checks the stopping budgets, for free.
15
15
  * - **Scoring stays local.** Models are better spent on select/stop than
16
16
  * on per-edge arithmetic; `score` is the same parent × confidence ×
17
17
  * decay the heuristic uses, so the scores shown in the prompt mean the
@@ -39,7 +39,7 @@ export type LlmOptions = {
39
39
  readonly instructions?: string;
40
40
  /** Hard step budget — and completion budget, one per step (default 16). */
41
41
  readonly maxSteps?: number;
42
- /** Stop once this many claims are collected (default ∞). */
42
+ /** Claim-count stopping threshold, checked between complete expansions (default ∞). */
43
43
  readonly maxClaims?: number;
44
44
  /** Per-hop decay of the local edge score (default 0.8). */
45
45
  readonly decay?: number;
@@ -60,6 +60,7 @@ export declare const selectPrompt: (state: State, options?: LlmOptions) => strin
60
60
  *
61
61
  * 1. the trimmed reply, its last non-empty line, or either with list
62
62
  * markers/quotes stripped, is exactly a frontier entity → that cue;
63
+ * trailing sentence punctuation prefers the longest matching literal name;
63
64
  * 2. the reply's first word is the stop token (any case) → stop;
64
65
  * 3. the earliest frontier entity mentioned anywhere in the reply → that
65
66
  * cue (ties at one position go to the longer name; occurrences inside
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAG/D,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,MAAM,UAAU,GAAG;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,8CAA8C;AAC9C,eAAO,MAAM,SAAS,SAAS,CAAA;AAQ/B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,UAAS,UAAe,KAAG,MAiBrE,CAAA;AA4BD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,KAAG,SAAS,GAAG,GAiCpF,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,QAAQ,EAAE,UAAS,UAAe,KAAG,WAkBxE,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,gEAAgE;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,sEAAsE;IACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,yDAAyD;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,UAAS,oBAAyB,KAAG,QA4BpF,CAAA"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAM/D,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,MAAM,UAAU,GAAG;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,8CAA8C;AAC9C,eAAO,MAAM,SAAS,SAAS,CAAA;AAqB/B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,UAAS,UAAe,KAAG,MAoBrE,CAAA;AA6CD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,KAAG,SAAS,GAAG,GA0CpF,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,QAAQ,EAAE,UAAS,UAAe,KAAG,WA0BxE,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,gEAAgE;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,sEAAsE;IACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,yDAAyD;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,UAAS,oBAAyB,KAAG,QAoDpF,CAAA"}