@astralyn/pi 0.81.1-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 (1065) hide show
  1. package/CHANGELOG.md +5113 -0
  2. package/README.md +677 -0
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +11 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +36 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +57 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +381 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +16 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +70 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/project-trust.d.ts +10 -0
  36. package/dist/cli/project-trust.d.ts.map +1 -0
  37. package/dist/cli/project-trust.js +48 -0
  38. package/dist/cli/project-trust.js.map +1 -0
  39. package/dist/cli/session-picker.d.ts +10 -0
  40. package/dist/cli/session-picker.d.ts.map +1 -0
  41. package/dist/cli/session-picker.js +36 -0
  42. package/dist/cli/session-picker.js.map +1 -0
  43. package/dist/cli/startup-ui.d.ts +20 -0
  44. package/dist/cli/startup-ui.d.ts.map +1 -0
  45. package/dist/cli/startup-ui.js +184 -0
  46. package/dist/cli/startup-ui.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +18 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/config.d.ts +96 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +455 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/core/agent-session-runtime.d.ts +119 -0
  56. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  57. package/dist/core/agent-session-runtime.js +306 -0
  58. package/dist/core/agent-session-runtime.js.map +1 -0
  59. package/dist/core/agent-session-services.d.ts +85 -0
  60. package/dist/core/agent-session-services.d.ts.map +1 -0
  61. package/dist/core/agent-session-services.js +133 -0
  62. package/dist/core/agent-session-services.js.map +1 -0
  63. package/dist/core/agent-session.d.ts +642 -0
  64. package/dist/core/agent-session.d.ts.map +1 -0
  65. package/dist/core/agent-session.js +2679 -0
  66. package/dist/core/agent-session.js.map +1 -0
  67. package/dist/core/auth-guidance.d.ts +5 -0
  68. package/dist/core/auth-guidance.d.ts.map +1 -0
  69. package/dist/core/auth-guidance.js +21 -0
  70. package/dist/core/auth-guidance.js.map +1 -0
  71. package/dist/core/auth-storage.d.ts +56 -0
  72. package/dist/core/auth-storage.d.ts.map +1 -0
  73. package/dist/core/auth-storage.js +229 -0
  74. package/dist/core/auth-storage.js.map +1 -0
  75. package/dist/core/bash-executor.d.ts +32 -0
  76. package/dist/core/bash-executor.d.ts.map +1 -0
  77. package/dist/core/bash-executor.js +111 -0
  78. package/dist/core/bash-executor.js.map +1 -0
  79. package/dist/core/cache-stats.d.ts +49 -0
  80. package/dist/core/cache-stats.d.ts.map +1 -0
  81. package/dist/core/cache-stats.js +101 -0
  82. package/dist/core/cache-stats.js.map +1 -0
  83. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  84. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  85. package/dist/core/compaction/branch-summarization.js +246 -0
  86. package/dist/core/compaction/branch-summarization.js.map +1 -0
  87. package/dist/core/compaction/compaction.d.ts +137 -0
  88. package/dist/core/compaction/compaction.d.ts.map +1 -0
  89. package/dist/core/compaction/compaction.js +637 -0
  90. package/dist/core/compaction/compaction.js.map +1 -0
  91. package/dist/core/compaction/index.d.ts +7 -0
  92. package/dist/core/compaction/index.d.ts.map +1 -0
  93. package/dist/core/compaction/index.js +7 -0
  94. package/dist/core/compaction/index.js.map +1 -0
  95. package/dist/core/compaction/utils.d.ts +38 -0
  96. package/dist/core/compaction/utils.d.ts.map +1 -0
  97. package/dist/core/compaction/utils.js +142 -0
  98. package/dist/core/compaction/utils.js.map +1 -0
  99. package/dist/core/defaults.d.ts +3 -0
  100. package/dist/core/defaults.d.ts.map +1 -0
  101. package/dist/core/defaults.js +2 -0
  102. package/dist/core/defaults.js.map +1 -0
  103. package/dist/core/diagnostics.d.ts +15 -0
  104. package/dist/core/diagnostics.d.ts.map +1 -0
  105. package/dist/core/diagnostics.js +2 -0
  106. package/dist/core/diagnostics.js.map +1 -0
  107. package/dist/core/event-bus.d.ts +9 -0
  108. package/dist/core/event-bus.d.ts.map +1 -0
  109. package/dist/core/event-bus.js +25 -0
  110. package/dist/core/event-bus.js.map +1 -0
  111. package/dist/core/exec.d.ts +29 -0
  112. package/dist/core/exec.d.ts.map +1 -0
  113. package/dist/core/exec.js +75 -0
  114. package/dist/core/exec.js.map +1 -0
  115. package/dist/core/experimental.d.ts +2 -0
  116. package/dist/core/experimental.d.ts.map +1 -0
  117. package/dist/core/experimental.js +4 -0
  118. package/dist/core/experimental.js.map +1 -0
  119. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  120. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  121. package/dist/core/export-html/ansi-to-html.js +249 -0
  122. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  123. package/dist/core/export-html/index.d.ts +37 -0
  124. package/dist/core/export-html/index.d.ts.map +1 -0
  125. package/dist/core/export-html/index.js +226 -0
  126. package/dist/core/export-html/index.js.map +1 -0
  127. package/dist/core/export-html/template.css +1066 -0
  128. package/dist/core/export-html/template.html +55 -0
  129. package/dist/core/export-html/template.js +1864 -0
  130. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  131. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  132. package/dist/core/export-html/tool-renderer.js +108 -0
  133. package/dist/core/export-html/tool-renderer.js.map +1 -0
  134. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  135. package/dist/core/export-html/vendor/marked.min.js +78 -0
  136. package/dist/core/extensions/index.d.ts +12 -0
  137. package/dist/core/extensions/index.d.ts.map +1 -0
  138. package/dist/core/extensions/index.js +9 -0
  139. package/dist/core/extensions/index.js.map +1 -0
  140. package/dist/core/extensions/loader.d.ts +23 -0
  141. package/dist/core/extensions/loader.d.ts.map +1 -0
  142. package/dist/core/extensions/loader.js +558 -0
  143. package/dist/core/extensions/loader.js.map +1 -0
  144. package/dist/core/extensions/runner.d.ts +171 -0
  145. package/dist/core/extensions/runner.d.ts.map +1 -0
  146. package/dist/core/extensions/runner.js +953 -0
  147. package/dist/core/extensions/runner.js.map +1 -0
  148. package/dist/core/extensions/types.d.ts +1259 -0
  149. package/dist/core/extensions/types.d.ts.map +1 -0
  150. package/dist/core/extensions/types.js +45 -0
  151. package/dist/core/extensions/types.js.map +1 -0
  152. package/dist/core/extensions/wrapper.d.ts +20 -0
  153. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  154. package/dist/core/extensions/wrapper.js +41 -0
  155. package/dist/core/extensions/wrapper.js.map +1 -0
  156. package/dist/core/footer-data-provider.d.ts +54 -0
  157. package/dist/core/footer-data-provider.d.ts.map +1 -0
  158. package/dist/core/footer-data-provider.js +338 -0
  159. package/dist/core/footer-data-provider.js.map +1 -0
  160. package/dist/core/http-dispatcher.d.ts +22 -0
  161. package/dist/core/http-dispatcher.d.ts.map +1 -0
  162. package/dist/core/http-dispatcher.js +91 -0
  163. package/dist/core/http-dispatcher.js.map +1 -0
  164. package/dist/core/index.d.ts +13 -0
  165. package/dist/core/index.d.ts.map +1 -0
  166. package/dist/core/index.js +13 -0
  167. package/dist/core/index.js.map +1 -0
  168. package/dist/core/keybindings.d.ts +363 -0
  169. package/dist/core/keybindings.d.ts.map +1 -0
  170. package/dist/core/keybindings.js +300 -0
  171. package/dist/core/keybindings.js.map +1 -0
  172. package/dist/core/messages.d.ts +77 -0
  173. package/dist/core/messages.d.ts.map +1 -0
  174. package/dist/core/messages.js +123 -0
  175. package/dist/core/messages.js.map +1 -0
  176. package/dist/core/model-config.d.ts +512 -0
  177. package/dist/core/model-config.d.ts.map +1 -0
  178. package/dist/core/model-config.js +243 -0
  179. package/dist/core/model-config.js.map +1 -0
  180. package/dist/core/model-registry.d.ts +43 -0
  181. package/dist/core/model-registry.d.ts.map +1 -0
  182. package/dist/core/model-registry.js +104 -0
  183. package/dist/core/model-registry.js.map +1 -0
  184. package/dist/core/model-resolver.d.ts +121 -0
  185. package/dist/core/model-resolver.d.ts.map +1 -0
  186. package/dist/core/model-resolver.js +534 -0
  187. package/dist/core/model-resolver.js.map +1 -0
  188. package/dist/core/model-runtime.d.ts +82 -0
  189. package/dist/core/model-runtime.d.ts.map +1 -0
  190. package/dist/core/model-runtime.js +441 -0
  191. package/dist/core/model-runtime.js.map +1 -0
  192. package/dist/core/models-store.d.ts +17 -0
  193. package/dist/core/models-store.d.ts.map +1 -0
  194. package/dist/core/models-store.js +45 -0
  195. package/dist/core/models-store.js.map +1 -0
  196. package/dist/core/output-guard.d.ts +7 -0
  197. package/dist/core/output-guard.d.ts.map +1 -0
  198. package/dist/core/output-guard.js +89 -0
  199. package/dist/core/output-guard.js.map +1 -0
  200. package/dist/core/package-manager.d.ts +210 -0
  201. package/dist/core/package-manager.d.ts.map +1 -0
  202. package/dist/core/package-manager.js +2135 -0
  203. package/dist/core/package-manager.js.map +1 -0
  204. package/dist/core/project-trust.d.ts +15 -0
  205. package/dist/core/project-trust.d.ts.map +1 -0
  206. package/dist/core/project-trust.js +59 -0
  207. package/dist/core/project-trust.js.map +1 -0
  208. package/dist/core/prompt-templates.d.ts +54 -0
  209. package/dist/core/prompt-templates.d.ts.map +1 -0
  210. package/dist/core/prompt-templates.js +236 -0
  211. package/dist/core/prompt-templates.js.map +1 -0
  212. package/dist/core/provider-attribution.d.ts +4 -0
  213. package/dist/core/provider-attribution.d.ts.map +1 -0
  214. package/dist/core/provider-attribution.js +72 -0
  215. package/dist/core/provider-attribution.js.map +1 -0
  216. package/dist/core/provider-composer.d.ts +55 -0
  217. package/dist/core/provider-composer.d.ts.map +1 -0
  218. package/dist/core/provider-composer.js +375 -0
  219. package/dist/core/provider-composer.js.map +1 -0
  220. package/dist/core/radius.d.ts +2 -0
  221. package/dist/core/radius.d.ts.map +1 -0
  222. package/dist/core/radius.js +2 -0
  223. package/dist/core/radius.js.map +1 -0
  224. package/dist/core/remote-catalog-provider.d.ts +5 -0
  225. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  226. package/dist/core/remote-catalog-provider.js +102 -0
  227. package/dist/core/remote-catalog-provider.js.map +1 -0
  228. package/dist/core/resolve-config-value.d.ts +30 -0
  229. package/dist/core/resolve-config-value.d.ts.map +1 -0
  230. package/dist/core/resolve-config-value.js +247 -0
  231. package/dist/core/resolve-config-value.js.map +1 -0
  232. package/dist/core/resource-loader.d.ts +206 -0
  233. package/dist/core/resource-loader.d.ts.map +1 -0
  234. package/dist/core/resource-loader.js +817 -0
  235. package/dist/core/resource-loader.js.map +1 -0
  236. package/dist/core/runtime-credentials.d.ts +15 -0
  237. package/dist/core/runtime-credentials.d.ts.map +1 -0
  238. package/dist/core/runtime-credentials.js +36 -0
  239. package/dist/core/runtime-credentials.js.map +1 -0
  240. package/dist/core/sdk.d.ts +106 -0
  241. package/dist/core/sdk.d.ts.map +1 -0
  242. package/dist/core/sdk.js +267 -0
  243. package/dist/core/sdk.js.map +1 -0
  244. package/dist/core/session-cwd.d.ts +19 -0
  245. package/dist/core/session-cwd.d.ts.map +1 -0
  246. package/dist/core/session-cwd.js +38 -0
  247. package/dist/core/session-cwd.js.map +1 -0
  248. package/dist/core/session-manager.d.ts +356 -0
  249. package/dist/core/session-manager.d.ts.map +1 -0
  250. package/dist/core/session-manager.js +1338 -0
  251. package/dist/core/session-manager.js.map +1 -0
  252. package/dist/core/settings-manager.d.ts +297 -0
  253. package/dist/core/settings-manager.d.ts.map +1 -0
  254. package/dist/core/settings-manager.js +902 -0
  255. package/dist/core/settings-manager.js.map +1 -0
  256. package/dist/core/skills.d.ts +60 -0
  257. package/dist/core/skills.d.ts.map +1 -0
  258. package/dist/core/skills.js +387 -0
  259. package/dist/core/skills.js.map +1 -0
  260. package/dist/core/slash-commands.d.ts +15 -0
  261. package/dist/core/slash-commands.d.ts.map +1 -0
  262. package/dist/core/slash-commands.js +26 -0
  263. package/dist/core/slash-commands.js.map +1 -0
  264. package/dist/core/source-info.d.ts +18 -0
  265. package/dist/core/source-info.d.ts.map +1 -0
  266. package/dist/core/source-info.js +19 -0
  267. package/dist/core/source-info.js.map +1 -0
  268. package/dist/core/system-prompt.d.ts +28 -0
  269. package/dist/core/system-prompt.d.ts.map +1 -0
  270. package/dist/core/system-prompt.js +110 -0
  271. package/dist/core/system-prompt.js.map +1 -0
  272. package/dist/core/telemetry.d.ts +3 -0
  273. package/dist/core/telemetry.d.ts.map +1 -0
  274. package/dist/core/telemetry.js +9 -0
  275. package/dist/core/telemetry.js.map +1 -0
  276. package/dist/core/timings.d.ts +10 -0
  277. package/dist/core/timings.d.ts.map +1 -0
  278. package/dist/core/timings.js +41 -0
  279. package/dist/core/timings.js.map +1 -0
  280. package/dist/core/tools/bash.d.ts +68 -0
  281. package/dist/core/tools/bash.d.ts.map +1 -0
  282. package/dist/core/tools/bash.js +361 -0
  283. package/dist/core/tools/bash.js.map +1 -0
  284. package/dist/core/tools/edit-diff.d.ts +106 -0
  285. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  286. package/dist/core/tools/edit-diff.js +424 -0
  287. package/dist/core/tools/edit-diff.js.map +1 -0
  288. package/dist/core/tools/edit.d.ts +50 -0
  289. package/dist/core/tools/edit.d.ts.map +1 -0
  290. package/dist/core/tools/edit.js +261 -0
  291. package/dist/core/tools/edit.js.map +1 -0
  292. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  293. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  294. package/dist/core/tools/file-mutation-queue.js +52 -0
  295. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  296. package/dist/core/tools/find.d.ts +35 -0
  297. package/dist/core/tools/find.d.ts.map +1 -0
  298. package/dist/core/tools/find.js +305 -0
  299. package/dist/core/tools/find.js.map +1 -0
  300. package/dist/core/tools/grep.d.ts +37 -0
  301. package/dist/core/tools/grep.d.ts.map +1 -0
  302. package/dist/core/tools/grep.js +304 -0
  303. package/dist/core/tools/grep.js.map +1 -0
  304. package/dist/core/tools/index.d.ts +40 -0
  305. package/dist/core/tools/index.d.ts.map +1 -0
  306. package/dist/core/tools/index.js +112 -0
  307. package/dist/core/tools/index.js.map +1 -0
  308. package/dist/core/tools/ls.d.ts +37 -0
  309. package/dist/core/tools/ls.d.ts.map +1 -0
  310. package/dist/core/tools/ls.js +167 -0
  311. package/dist/core/tools/ls.js.map +1 -0
  312. package/dist/core/tools/output-accumulator.d.ts +52 -0
  313. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  314. package/dist/core/tools/output-accumulator.js +184 -0
  315. package/dist/core/tools/output-accumulator.js.map +1 -0
  316. package/dist/core/tools/path-utils.d.ts +10 -0
  317. package/dist/core/tools/path-utils.d.ts.map +1 -0
  318. package/dist/core/tools/path-utils.js +99 -0
  319. package/dist/core/tools/path-utils.js.map +1 -0
  320. package/dist/core/tools/read.d.ts +35 -0
  321. package/dist/core/tools/read.d.ts.map +1 -0
  322. package/dist/core/tools/read.js +276 -0
  323. package/dist/core/tools/read.js.map +1 -0
  324. package/dist/core/tools/render-utils.d.ts +24 -0
  325. package/dist/core/tools/render-utils.d.ts.map +1 -0
  326. package/dist/core/tools/render-utils.js +65 -0
  327. package/dist/core/tools/render-utils.js.map +1 -0
  328. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  329. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  330. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  331. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  332. package/dist/core/tools/truncate.d.ts +70 -0
  333. package/dist/core/tools/truncate.d.ts.map +1 -0
  334. package/dist/core/tools/truncate.js +215 -0
  335. package/dist/core/tools/truncate.js.map +1 -0
  336. package/dist/core/tools/write.d.ts +26 -0
  337. package/dist/core/tools/write.d.ts.map +1 -0
  338. package/dist/core/tools/write.js +197 -0
  339. package/dist/core/tools/write.js.map +1 -0
  340. package/dist/core/trust-manager.d.ts +36 -0
  341. package/dist/core/trust-manager.d.ts.map +1 -0
  342. package/dist/core/trust-manager.js +202 -0
  343. package/dist/core/trust-manager.js.map +1 -0
  344. package/dist/core/usage-totals.d.ts +19 -0
  345. package/dist/core/usage-totals.d.ts.map +1 -0
  346. package/dist/core/usage-totals.js +52 -0
  347. package/dist/core/usage-totals.js.map +1 -0
  348. package/dist/extensions/deepwiki/client.d.ts +14 -0
  349. package/dist/extensions/deepwiki/client.d.ts.map +1 -0
  350. package/dist/extensions/deepwiki/client.js +196 -0
  351. package/dist/extensions/deepwiki/client.js.map +1 -0
  352. package/dist/extensions/deepwiki/constants.d.ts +13 -0
  353. package/dist/extensions/deepwiki/constants.d.ts.map +1 -0
  354. package/dist/extensions/deepwiki/constants.js +18 -0
  355. package/dist/extensions/deepwiki/constants.js.map +1 -0
  356. package/dist/extensions/deepwiki/contents.d.ts +63 -0
  357. package/dist/extensions/deepwiki/contents.d.ts.map +1 -0
  358. package/dist/extensions/deepwiki/contents.js +174 -0
  359. package/dist/extensions/deepwiki/contents.js.map +1 -0
  360. package/dist/extensions/deepwiki/execute.d.ts +25 -0
  361. package/dist/extensions/deepwiki/execute.d.ts.map +1 -0
  362. package/dist/extensions/deepwiki/execute.js +78 -0
  363. package/dist/extensions/deepwiki/execute.js.map +1 -0
  364. package/dist/extensions/deepwiki/http.d.ts +12 -0
  365. package/dist/extensions/deepwiki/http.d.ts.map +1 -0
  366. package/dist/extensions/deepwiki/http.js +74 -0
  367. package/dist/extensions/deepwiki/http.js.map +1 -0
  368. package/dist/extensions/deepwiki/index.d.ts +9 -0
  369. package/dist/extensions/deepwiki/index.d.ts.map +1 -0
  370. package/dist/extensions/deepwiki/index.js +25 -0
  371. package/dist/extensions/deepwiki/index.js.map +1 -0
  372. package/dist/extensions/deepwiki/render.d.ts +14 -0
  373. package/dist/extensions/deepwiki/render.d.ts.map +1 -0
  374. package/dist/extensions/deepwiki/render.js +166 -0
  375. package/dist/extensions/deepwiki/render.js.map +1 -0
  376. package/dist/extensions/deepwiki/schema.d.ts +13 -0
  377. package/dist/extensions/deepwiki/schema.d.ts.map +1 -0
  378. package/dist/extensions/deepwiki/schema.js +208 -0
  379. package/dist/extensions/deepwiki/schema.js.map +1 -0
  380. package/dist/extensions/index.d.ts +3 -0
  381. package/dist/extensions/index.d.ts.map +1 -0
  382. package/dist/extensions/index.js +17 -0
  383. package/dist/extensions/index.js.map +1 -0
  384. package/dist/extensions/llama/client.d.ts +61 -0
  385. package/dist/extensions/llama/client.d.ts.map +1 -0
  386. package/dist/extensions/llama/client.js +302 -0
  387. package/dist/extensions/llama/client.js.map +1 -0
  388. package/dist/extensions/llama/huggingface.d.ts +23 -0
  389. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  390. package/dist/extensions/llama/huggingface.js +141 -0
  391. package/dist/extensions/llama/huggingface.js.map +1 -0
  392. package/dist/extensions/llama/index.d.ts +3 -0
  393. package/dist/extensions/llama/index.d.ts.map +1 -0
  394. package/dist/extensions/llama/index.js +208 -0
  395. package/dist/extensions/llama/index.js.map +1 -0
  396. package/dist/extensions/llama/provider.d.ts +10 -0
  397. package/dist/extensions/llama/provider.d.ts.map +1 -0
  398. package/dist/extensions/llama/provider.js +102 -0
  399. package/dist/extensions/llama/provider.js.map +1 -0
  400. package/dist/extensions/llama/ui.d.ts +42 -0
  401. package/dist/extensions/llama/ui.d.ts.map +1 -0
  402. package/dist/extensions/llama/ui.js +416 -0
  403. package/dist/extensions/llama/ui.js.map +1 -0
  404. package/dist/extensions/question/constants.d.ts +13 -0
  405. package/dist/extensions/question/constants.d.ts.map +1 -0
  406. package/dist/extensions/question/constants.js +17 -0
  407. package/dist/extensions/question/constants.js.map +1 -0
  408. package/dist/extensions/question/dialog-primitives.d.ts +6 -0
  409. package/dist/extensions/question/dialog-primitives.d.ts.map +1 -0
  410. package/dist/extensions/question/dialog-primitives.js +20 -0
  411. package/dist/extensions/question/dialog-primitives.js.map +1 -0
  412. package/dist/extensions/question/dialog.d.ts +10 -0
  413. package/dist/extensions/question/dialog.d.ts.map +1 -0
  414. package/dist/extensions/question/dialog.js +519 -0
  415. package/dist/extensions/question/dialog.js.map +1 -0
  416. package/dist/extensions/question/index.d.ts +9 -0
  417. package/dist/extensions/question/index.d.ts.map +1 -0
  418. package/dist/extensions/question/index.js +32 -0
  419. package/dist/extensions/question/index.js.map +1 -0
  420. package/dist/extensions/question/limits.d.ts +11 -0
  421. package/dist/extensions/question/limits.d.ts.map +1 -0
  422. package/dist/extensions/question/limits.js +11 -0
  423. package/dist/extensions/question/limits.js.map +1 -0
  424. package/dist/extensions/question/render-cache.d.ts +9 -0
  425. package/dist/extensions/question/render-cache.d.ts.map +1 -0
  426. package/dist/extensions/question/render-cache.js +18 -0
  427. package/dist/extensions/question/render-cache.js.map +1 -0
  428. package/dist/extensions/question/render.d.ts +17 -0
  429. package/dist/extensions/question/render.d.ts.map +1 -0
  430. package/dist/extensions/question/render.js +47 -0
  431. package/dist/extensions/question/render.js.map +1 -0
  432. package/dist/extensions/question/results.d.ts +8 -0
  433. package/dist/extensions/question/results.d.ts.map +1 -0
  434. package/dist/extensions/question/results.js +68 -0
  435. package/dist/extensions/question/results.js.map +1 -0
  436. package/dist/extensions/question/schema.d.ts +22 -0
  437. package/dist/extensions/question/schema.d.ts.map +1 -0
  438. package/dist/extensions/question/schema.js +98 -0
  439. package/dist/extensions/question/schema.js.map +1 -0
  440. package/dist/extensions/question/state.d.ts +9 -0
  441. package/dist/extensions/question/state.d.ts.map +1 -0
  442. package/dist/extensions/question/state.js +76 -0
  443. package/dist/extensions/question/state.js.map +1 -0
  444. package/dist/extensions/question/types.d.ts +60 -0
  445. package/dist/extensions/question/types.d.ts.map +1 -0
  446. package/dist/extensions/question/types.js +2 -0
  447. package/dist/extensions/question/types.js.map +1 -0
  448. package/dist/extensions/rewind/config.d.ts +16 -0
  449. package/dist/extensions/rewind/config.d.ts.map +1 -0
  450. package/dist/extensions/rewind/config.js +69 -0
  451. package/dist/extensions/rewind/config.js.map +1 -0
  452. package/dist/extensions/rewind/engine.d.ts +97 -0
  453. package/dist/extensions/rewind/engine.d.ts.map +1 -0
  454. package/dist/extensions/rewind/engine.js +747 -0
  455. package/dist/extensions/rewind/engine.js.map +1 -0
  456. package/dist/extensions/rewind/gc.d.ts +35 -0
  457. package/dist/extensions/rewind/gc.d.ts.map +1 -0
  458. package/dist/extensions/rewind/gc.js +169 -0
  459. package/dist/extensions/rewind/gc.js.map +1 -0
  460. package/dist/extensions/rewind/index.d.ts +3 -0
  461. package/dist/extensions/rewind/index.d.ts.map +1 -0
  462. package/dist/extensions/rewind/index.js +253 -0
  463. package/dist/extensions/rewind/index.js.map +1 -0
  464. package/dist/extensions/rewind/menu.d.ts +13 -0
  465. package/dist/extensions/rewind/menu.d.ts.map +1 -0
  466. package/dist/extensions/rewind/menu.js +118 -0
  467. package/dist/extensions/rewind/menu.js.map +1 -0
  468. package/dist/extensions/rewind/paths.d.ts +4 -0
  469. package/dist/extensions/rewind/paths.d.ts.map +1 -0
  470. package/dist/extensions/rewind/paths.js +15 -0
  471. package/dist/extensions/rewind/paths.js.map +1 -0
  472. package/dist/extensions/rewind/restore.d.ts +37 -0
  473. package/dist/extensions/rewind/restore.d.ts.map +1 -0
  474. package/dist/extensions/rewind/restore.js +52 -0
  475. package/dist/extensions/rewind/restore.js.map +1 -0
  476. package/dist/extensions/rewind/snapshot.d.ts +45 -0
  477. package/dist/extensions/rewind/snapshot.d.ts.map +1 -0
  478. package/dist/extensions/rewind/snapshot.js +21 -0
  479. package/dist/extensions/rewind/snapshot.js.map +1 -0
  480. package/dist/extensions/rewind/storage.d.ts +12 -0
  481. package/dist/extensions/rewind/storage.d.ts.map +1 -0
  482. package/dist/extensions/rewind/storage.js +33 -0
  483. package/dist/extensions/rewind/storage.js.map +1 -0
  484. package/dist/extensions/rewind/text.d.ts +7 -0
  485. package/dist/extensions/rewind/text.d.ts.map +1 -0
  486. package/dist/extensions/rewind/text.js +19 -0
  487. package/dist/extensions/rewind/text.js.map +1 -0
  488. package/dist/extensions/rewind/tool-path.d.ts +3 -0
  489. package/dist/extensions/rewind/tool-path.d.ts.map +1 -0
  490. package/dist/extensions/rewind/tool-path.js +9 -0
  491. package/dist/extensions/rewind/tool-path.js.map +1 -0
  492. package/dist/extensions/router/constants.d.ts +20 -0
  493. package/dist/extensions/router/constants.d.ts.map +1 -0
  494. package/dist/extensions/router/constants.js +27 -0
  495. package/dist/extensions/router/constants.js.map +1 -0
  496. package/dist/extensions/router/dialog.d.ts +38 -0
  497. package/dist/extensions/router/dialog.d.ts.map +1 -0
  498. package/dist/extensions/router/dialog.js +407 -0
  499. package/dist/extensions/router/dialog.js.map +1 -0
  500. package/dist/extensions/router/index.d.ts +15 -0
  501. package/dist/extensions/router/index.d.ts.map +1 -0
  502. package/dist/extensions/router/index.js +61 -0
  503. package/dist/extensions/router/index.js.map +1 -0
  504. package/dist/extensions/router/presets.d.ts +48 -0
  505. package/dist/extensions/router/presets.d.ts.map +1 -0
  506. package/dist/extensions/router/presets.js +109 -0
  507. package/dist/extensions/router/presets.js.map +1 -0
  508. package/dist/extensions/router/probe.d.ts +20 -0
  509. package/dist/extensions/router/probe.d.ts.map +1 -0
  510. package/dist/extensions/router/probe.js +125 -0
  511. package/dist/extensions/router/probe.js.map +1 -0
  512. package/dist/extensions/router/register.d.ts +34 -0
  513. package/dist/extensions/router/register.d.ts.map +1 -0
  514. package/dist/extensions/router/register.js +81 -0
  515. package/dist/extensions/router/register.js.map +1 -0
  516. package/dist/extensions/router/store.d.ts +12 -0
  517. package/dist/extensions/router/store.d.ts.map +1 -0
  518. package/dist/extensions/router/store.js +164 -0
  519. package/dist/extensions/router/store.js.map +1 -0
  520. package/dist/extensions/router/stream.d.ts +16 -0
  521. package/dist/extensions/router/stream.d.ts.map +1 -0
  522. package/dist/extensions/router/stream.js +198 -0
  523. package/dist/extensions/router/stream.js.map +1 -0
  524. package/dist/extensions/router/types.d.ts +23 -0
  525. package/dist/extensions/router/types.d.ts.map +1 -0
  526. package/dist/extensions/router/types.js +2 -0
  527. package/dist/extensions/router/types.js.map +1 -0
  528. package/dist/extensions/router/ui.d.ts +9 -0
  529. package/dist/extensions/router/ui.d.ts.map +1 -0
  530. package/dist/extensions/router/ui.js +538 -0
  531. package/dist/extensions/router/ui.js.map +1 -0
  532. package/dist/extensions/statusline/index.d.ts +3 -0
  533. package/dist/extensions/statusline/index.d.ts.map +1 -0
  534. package/dist/extensions/statusline/index.js +367 -0
  535. package/dist/extensions/statusline/index.js.map +1 -0
  536. package/dist/extensions/todo/constants.d.ts +16 -0
  537. package/dist/extensions/todo/constants.d.ts.map +1 -0
  538. package/dist/extensions/todo/constants.js +20 -0
  539. package/dist/extensions/todo/constants.js.map +1 -0
  540. package/dist/extensions/todo/index.d.ts +17 -0
  541. package/dist/extensions/todo/index.d.ts.map +1 -0
  542. package/dist/extensions/todo/index.js +83 -0
  543. package/dist/extensions/todo/index.js.map +1 -0
  544. package/dist/extensions/todo/overlay.d.ts +24 -0
  545. package/dist/extensions/todo/overlay.d.ts.map +1 -0
  546. package/dist/extensions/todo/overlay.js +139 -0
  547. package/dist/extensions/todo/overlay.js.map +1 -0
  548. package/dist/extensions/todo/schema.d.ts +41 -0
  549. package/dist/extensions/todo/schema.d.ts.map +1 -0
  550. package/dist/extensions/todo/schema.js +36 -0
  551. package/dist/extensions/todo/schema.js.map +1 -0
  552. package/dist/extensions/todo/state.d.ts +57 -0
  553. package/dist/extensions/todo/state.d.ts.map +1 -0
  554. package/dist/extensions/todo/state.js +452 -0
  555. package/dist/extensions/todo/state.js.map +1 -0
  556. package/dist/extensions/todo/view.d.ts +8 -0
  557. package/dist/extensions/todo/view.d.ts.map +1 -0
  558. package/dist/extensions/todo/view.js +119 -0
  559. package/dist/extensions/todo/view.js.map +1 -0
  560. package/dist/index.d.ts +35 -0
  561. package/dist/index.d.ts.map +1 -0
  562. package/dist/index.js +47 -0
  563. package/dist/index.js.map +1 -0
  564. package/dist/main.d.ts +12 -0
  565. package/dist/main.d.ts.map +1 -0
  566. package/dist/main.js +704 -0
  567. package/dist/main.js.map +1 -0
  568. package/dist/migrations.d.ts +33 -0
  569. package/dist/migrations.d.ts.map +1 -0
  570. package/dist/migrations.js +281 -0
  571. package/dist/migrations.js.map +1 -0
  572. package/dist/modes/index.d.ts +9 -0
  573. package/dist/modes/index.d.ts.map +1 -0
  574. package/dist/modes/index.js +8 -0
  575. package/dist/modes/index.js.map +1 -0
  576. package/dist/modes/interactive/assets/clankolas.png +0 -0
  577. package/dist/modes/interactive/components/armin.d.ts +34 -0
  578. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  579. package/dist/modes/interactive/components/armin.js +333 -0
  580. package/dist/modes/interactive/components/armin.js.map +1 -0
  581. package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  582. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  583. package/dist/modes/interactive/components/assistant-message.js +141 -0
  584. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  585. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  586. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  587. package/dist/modes/interactive/components/bash-execution.js +175 -0
  588. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  589. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  590. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  591. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  592. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  593. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  594. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  595. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  596. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  597. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  598. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  599. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  600. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  601. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  602. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  603. package/dist/modes/interactive/components/config-selector.js +761 -0
  604. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  605. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  606. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  607. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  608. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  609. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  610. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/custom-editor.js +70 -0
  612. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  613. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  614. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  615. package/dist/modes/interactive/components/custom-entry.js +52 -0
  616. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  617. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  618. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  619. package/dist/modes/interactive/components/custom-message.js +79 -0
  620. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  621. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  622. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  623. package/dist/modes/interactive/components/daxnuts.js +140 -0
  624. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  625. package/dist/modes/interactive/components/diff.d.ts +12 -0
  626. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  627. package/dist/modes/interactive/components/diff.js +133 -0
  628. package/dist/modes/interactive/components/diff.js.map +1 -0
  629. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  630. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  631. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  632. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  633. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  634. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  635. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  636. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  637. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  638. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  639. package/dist/modes/interactive/components/extension-editor.js +128 -0
  640. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  641. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  642. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  643. package/dist/modes/interactive/components/extension-input.js +61 -0
  644. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  645. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  646. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  647. package/dist/modes/interactive/components/extension-selector.js +83 -0
  648. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  649. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  650. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  651. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  652. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  653. package/dist/modes/interactive/components/footer.d.ts +32 -0
  654. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  655. package/dist/modes/interactive/components/footer.js +222 -0
  656. package/dist/modes/interactive/components/footer.js.map +1 -0
  657. package/dist/modes/interactive/components/index.d.ts +34 -0
  658. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  659. package/dist/modes/interactive/components/index.js +35 -0
  660. package/dist/modes/interactive/components/index.js.map +1 -0
  661. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  662. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  663. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  664. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  665. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  666. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  667. package/dist/modes/interactive/components/login-dialog.js +188 -0
  668. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  669. package/dist/modes/interactive/components/model-selector.d.ts +54 -0
  670. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  671. package/dist/modes/interactive/components/model-selector.js +310 -0
  672. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  673. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  674. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  675. package/dist/modes/interactive/components/oauth-selector.js +163 -0
  676. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  677. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  678. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  679. package/dist/modes/interactive/components/scoped-models-selector.js +293 -0
  680. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  681. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  682. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  683. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  684. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  685. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  686. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  687. package/dist/modes/interactive/components/session-selector.js +867 -0
  688. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  689. package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  690. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  691. package/dist/modes/interactive/components/settings-selector.js +593 -0
  692. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  693. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  694. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  695. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  696. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  697. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  698. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  699. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  700. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  701. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  702. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  703. package/dist/modes/interactive/components/status-indicator.js +60 -0
  704. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  705. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  706. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  707. package/dist/modes/interactive/components/theme-selector.js +50 -0
  708. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  709. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  710. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  711. package/dist/modes/interactive/components/thinking-selector.js +52 -0
  712. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  713. package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
  714. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  715. package/dist/modes/interactive/components/tool-execution.js +361 -0
  716. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  717. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  718. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  719. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  720. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  721. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  722. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  723. package/dist/modes/interactive/components/trust-selector.js +91 -0
  724. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  725. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  726. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  727. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  728. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  729. package/dist/modes/interactive/components/user-message.d.ts +14 -0
  730. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  731. package/dist/modes/interactive/components/user-message.js +42 -0
  732. package/dist/modes/interactive/components/user-message.js.map +1 -0
  733. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  734. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  735. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  736. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  737. package/dist/modes/interactive/interactive-mode.d.ts +394 -0
  738. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  739. package/dist/modes/interactive/interactive-mode.js +5039 -0
  740. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  741. package/dist/modes/interactive/model-search.d.ts +12 -0
  742. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  743. package/dist/modes/interactive/model-search.js +15 -0
  744. package/dist/modes/interactive/model-search.js.map +1 -0
  745. package/dist/modes/interactive/theme/dark.json +87 -0
  746. package/dist/modes/interactive/theme/ice-cream-dark.json +101 -0
  747. package/dist/modes/interactive/theme/ice-cream-light.json +101 -0
  748. package/dist/modes/interactive/theme/light.json +86 -0
  749. package/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  750. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  751. package/dist/modes/interactive/theme/theme-controller.js +102 -0
  752. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  753. package/dist/modes/interactive/theme/theme-schema.json +340 -0
  754. package/dist/modes/interactive/theme/theme.d.ts +120 -0
  755. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  756. package/dist/modes/interactive/theme/theme.js +1063 -0
  757. package/dist/modes/interactive/theme/theme.js.map +1 -0
  758. package/dist/modes/print-mode.d.ts +28 -0
  759. package/dist/modes/print-mode.d.ts.map +1 -0
  760. package/dist/modes/print-mode.js +132 -0
  761. package/dist/modes/print-mode.js.map +1 -0
  762. package/dist/modes/rpc/jsonl.d.ts +17 -0
  763. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  764. package/dist/modes/rpc/jsonl.js +49 -0
  765. package/dist/modes/rpc/jsonl.js.map +1 -0
  766. package/dist/modes/rpc/rpc-client.d.ts +246 -0
  767. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  768. package/dist/modes/rpc/rpc-client.js +488 -0
  769. package/dist/modes/rpc/rpc-client.js.map +1 -0
  770. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  771. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  772. package/dist/modes/rpc/rpc-mode.js +639 -0
  773. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  774. package/dist/modes/rpc/rpc-types.d.ts +457 -0
  775. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  776. package/dist/modes/rpc/rpc-types.js +8 -0
  777. package/dist/modes/rpc/rpc-types.js.map +1 -0
  778. package/dist/package-manager-cli.d.ts +8 -0
  779. package/dist/package-manager-cli.d.ts.map +1 -0
  780. package/dist/package-manager-cli.js +775 -0
  781. package/dist/package-manager-cli.js.map +1 -0
  782. package/dist/rpc-entry.d.ts +3 -0
  783. package/dist/rpc-entry.d.ts.map +1 -0
  784. package/dist/rpc-entry.js +10 -0
  785. package/dist/rpc-entry.js.map +1 -0
  786. package/dist/utils/ansi.d.ts +2 -0
  787. package/dist/utils/ansi.d.ts.map +1 -0
  788. package/dist/utils/ansi.js +52 -0
  789. package/dist/utils/ansi.js.map +1 -0
  790. package/dist/utils/changelog.d.ts +22 -0
  791. package/dist/utils/changelog.d.ts.map +1 -0
  792. package/dist/utils/changelog.js +165 -0
  793. package/dist/utils/changelog.js.map +1 -0
  794. package/dist/utils/child-process.d.ts +18 -0
  795. package/dist/utils/child-process.d.ts.map +1 -0
  796. package/dist/utils/child-process.js +106 -0
  797. package/dist/utils/child-process.js.map +1 -0
  798. package/dist/utils/clipboard-image.d.ts +11 -0
  799. package/dist/utils/clipboard-image.d.ts.map +1 -0
  800. package/dist/utils/clipboard-image.js +245 -0
  801. package/dist/utils/clipboard-image.js.map +1 -0
  802. package/dist/utils/clipboard-native.d.ts +11 -0
  803. package/dist/utils/clipboard-native.d.ts.map +1 -0
  804. package/dist/utils/clipboard-native.js +20 -0
  805. package/dist/utils/clipboard-native.js.map +1 -0
  806. package/dist/utils/clipboard.d.ts +4 -0
  807. package/dist/utils/clipboard.d.ts.map +1 -0
  808. package/dist/utils/clipboard.js +130 -0
  809. package/dist/utils/clipboard.js.map +1 -0
  810. package/dist/utils/deprecation.d.ts +4 -0
  811. package/dist/utils/deprecation.d.ts.map +1 -0
  812. package/dist/utils/deprecation.js +13 -0
  813. package/dist/utils/deprecation.js.map +1 -0
  814. package/dist/utils/exif-orientation.d.ts +5 -0
  815. package/dist/utils/exif-orientation.d.ts.map +1 -0
  816. package/dist/utils/exif-orientation.js +158 -0
  817. package/dist/utils/exif-orientation.js.map +1 -0
  818. package/dist/utils/frontmatter.d.ts +8 -0
  819. package/dist/utils/frontmatter.d.ts.map +1 -0
  820. package/dist/utils/frontmatter.js +26 -0
  821. package/dist/utils/frontmatter.js.map +1 -0
  822. package/dist/utils/fs-watch.d.ts +5 -0
  823. package/dist/utils/fs-watch.d.ts.map +1 -0
  824. package/dist/utils/fs-watch.js +25 -0
  825. package/dist/utils/fs-watch.js.map +1 -0
  826. package/dist/utils/git.d.ts +26 -0
  827. package/dist/utils/git.d.ts.map +1 -0
  828. package/dist/utils/git.js +195 -0
  829. package/dist/utils/git.js.map +1 -0
  830. package/dist/utils/html.d.ts +7 -0
  831. package/dist/utils/html.d.ts.map +1 -0
  832. package/dist/utils/html.js +40 -0
  833. package/dist/utils/html.js.map +1 -0
  834. package/dist/utils/image-convert.d.ts +10 -0
  835. package/dist/utils/image-convert.d.ts.map +1 -0
  836. package/dist/utils/image-convert.js +45 -0
  837. package/dist/utils/image-convert.js.map +1 -0
  838. package/dist/utils/image-process.d.ts +18 -0
  839. package/dist/utils/image-process.d.ts.map +1 -0
  840. package/dist/utils/image-process.js +83 -0
  841. package/dist/utils/image-process.js.map +1 -0
  842. package/dist/utils/image-resize-core.d.ts +30 -0
  843. package/dist/utils/image-resize-core.d.ts.map +1 -0
  844. package/dist/utils/image-resize-core.js +124 -0
  845. package/dist/utils/image-resize-core.js.map +1 -0
  846. package/dist/utils/image-resize-worker.d.ts +2 -0
  847. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  848. package/dist/utils/image-resize-worker.js +31 -0
  849. package/dist/utils/image-resize-worker.js.map +1 -0
  850. package/dist/utils/image-resize.d.ts +16 -0
  851. package/dist/utils/image-resize.d.ts.map +1 -0
  852. package/dist/utils/image-resize.js +97 -0
  853. package/dist/utils/image-resize.js.map +1 -0
  854. package/dist/utils/json.d.ts +3 -0
  855. package/dist/utils/json.d.ts.map +1 -0
  856. package/dist/utils/json.js +7 -0
  857. package/dist/utils/json.js.map +1 -0
  858. package/dist/utils/mime.d.ts +3 -0
  859. package/dist/utils/mime.d.ts.map +1 -0
  860. package/dist/utils/mime.js +110 -0
  861. package/dist/utils/mime.js.map +1 -0
  862. package/dist/utils/open-browser.d.ts +9 -0
  863. package/dist/utils/open-browser.d.ts.map +1 -0
  864. package/dist/utils/open-browser.js +22 -0
  865. package/dist/utils/open-browser.js.map +1 -0
  866. package/dist/utils/paths.d.ts +31 -0
  867. package/dist/utils/paths.d.ts.map +1 -0
  868. package/dist/utils/paths.js +92 -0
  869. package/dist/utils/paths.js.map +1 -0
  870. package/dist/utils/photon.d.ts +21 -0
  871. package/dist/utils/photon.d.ts.map +1 -0
  872. package/dist/utils/photon.js +121 -0
  873. package/dist/utils/photon.js.map +1 -0
  874. package/dist/utils/pi-user-agent.d.ts +2 -0
  875. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  876. package/dist/utils/pi-user-agent.js +5 -0
  877. package/dist/utils/pi-user-agent.js.map +1 -0
  878. package/dist/utils/shell.d.ts +31 -0
  879. package/dist/utils/shell.d.ts.map +1 -0
  880. package/dist/utils/shell.js +202 -0
  881. package/dist/utils/shell.js.map +1 -0
  882. package/dist/utils/sleep.d.ts +5 -0
  883. package/dist/utils/sleep.d.ts.map +1 -0
  884. package/dist/utils/sleep.js +17 -0
  885. package/dist/utils/sleep.js.map +1 -0
  886. package/dist/utils/syntax-highlight.d.ts +12 -0
  887. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  888. package/dist/utils/syntax-highlight.js +118 -0
  889. package/dist/utils/syntax-highlight.js.map +1 -0
  890. package/dist/utils/tools-manager.d.ts +3 -0
  891. package/dist/utils/tools-manager.d.ts.map +1 -0
  892. package/dist/utils/tools-manager.js +328 -0
  893. package/dist/utils/tools-manager.js.map +1 -0
  894. package/dist/utils/version-check.d.ts +15 -0
  895. package/dist/utils/version-check.d.ts.map +1 -0
  896. package/dist/utils/version-check.js +54 -0
  897. package/dist/utils/version-check.js.map +1 -0
  898. package/dist/utils/windows-self-update.d.ts +3 -0
  899. package/dist/utils/windows-self-update.d.ts.map +1 -0
  900. package/dist/utils/windows-self-update.js +77 -0
  901. package/dist/utils/windows-self-update.js.map +1 -0
  902. package/docs/compaction.md +401 -0
  903. package/docs/containerization.md +111 -0
  904. package/docs/custom-provider.md +763 -0
  905. package/docs/development.md +71 -0
  906. package/docs/docs.json +156 -0
  907. package/docs/extensions.md +2953 -0
  908. package/docs/images/doom-extension.png +0 -0
  909. package/docs/images/exy.png +0 -0
  910. package/docs/images/interactive-mode.png +0 -0
  911. package/docs/images/tree-view.png +0 -0
  912. package/docs/index.md +77 -0
  913. package/docs/json.md +86 -0
  914. package/docs/keybindings.md +198 -0
  915. package/docs/llama-cpp.md +99 -0
  916. package/docs/models.md +540 -0
  917. package/docs/packages.md +228 -0
  918. package/docs/prompt-templates.md +96 -0
  919. package/docs/providers.md +301 -0
  920. package/docs/quickstart.md +165 -0
  921. package/docs/rpc.md +1559 -0
  922. package/docs/sdk.md +1186 -0
  923. package/docs/security.md +59 -0
  924. package/docs/session-format.md +436 -0
  925. package/docs/sessions.md +145 -0
  926. package/docs/settings.md +319 -0
  927. package/docs/shell-aliases.md +13 -0
  928. package/docs/skills.md +231 -0
  929. package/docs/terminal-setup.md +142 -0
  930. package/docs/termux.md +127 -0
  931. package/docs/themes.md +301 -0
  932. package/docs/tmux.md +63 -0
  933. package/docs/tui.md +942 -0
  934. package/docs/usage.md +311 -0
  935. package/docs/windows.md +17 -0
  936. package/examples/README.md +25 -0
  937. package/examples/extensions/README.md +213 -0
  938. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  939. package/examples/extensions/bash-spawn-hook.ts +30 -0
  940. package/examples/extensions/bookmark.ts +50 -0
  941. package/examples/extensions/border-status-editor.ts +145 -0
  942. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  943. package/examples/extensions/claude-rules.ts +86 -0
  944. package/examples/extensions/commands.ts +72 -0
  945. package/examples/extensions/confirm-destructive.ts +59 -0
  946. package/examples/extensions/custom-compaction.ts +129 -0
  947. package/examples/extensions/custom-footer.ts +64 -0
  948. package/examples/extensions/custom-header.ts +73 -0
  949. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  950. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  951. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  952. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
  953. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  954. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  955. package/examples/extensions/dirty-repo-guard.ts +56 -0
  956. package/examples/extensions/doom-overlay/README.md +46 -0
  957. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  958. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  959. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  960. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  961. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  962. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  963. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  964. package/examples/extensions/doom-overlay/index.ts +74 -0
  965. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  966. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  967. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  968. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  969. package/examples/extensions/dynamic-resources/index.ts +15 -0
  970. package/examples/extensions/dynamic-tools.ts +74 -0
  971. package/examples/extensions/entry-renderer.ts +41 -0
  972. package/examples/extensions/event-bus.ts +43 -0
  973. package/examples/extensions/file-trigger.ts +41 -0
  974. package/examples/extensions/git-checkpoint.ts +53 -0
  975. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  976. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  977. package/examples/extensions/gondolin/index.ts +531 -0
  978. package/examples/extensions/gondolin/package-lock.json +185 -0
  979. package/examples/extensions/gondolin/package.json +19 -0
  980. package/examples/extensions/handoff.ts +191 -0
  981. package/examples/extensions/hello.ts +26 -0
  982. package/examples/extensions/hidden-thinking-label.ts +53 -0
  983. package/examples/extensions/inline-bash.ts +94 -0
  984. package/examples/extensions/input-transform-streaming.ts +39 -0
  985. package/examples/extensions/input-transform.ts +43 -0
  986. package/examples/extensions/interactive-shell.ts +196 -0
  987. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  988. package/examples/extensions/mac-system-theme.ts +47 -0
  989. package/examples/extensions/message-renderer.ts +59 -0
  990. package/examples/extensions/minimal-mode.ts +426 -0
  991. package/examples/extensions/modal-editor.ts +85 -0
  992. package/examples/extensions/model-status.ts +31 -0
  993. package/examples/extensions/notify.ts +55 -0
  994. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  995. package/examples/extensions/overlay-test.ts +153 -0
  996. package/examples/extensions/permission-gate.ts +34 -0
  997. package/examples/extensions/pirate.ts +47 -0
  998. package/examples/extensions/plan-mode/README.md +66 -0
  999. package/examples/extensions/plan-mode/index.ts +390 -0
  1000. package/examples/extensions/plan-mode/utils.ts +168 -0
  1001. package/examples/extensions/preset.ts +436 -0
  1002. package/examples/extensions/project-trust.ts +64 -0
  1003. package/examples/extensions/prompt-customizer.ts +97 -0
  1004. package/examples/extensions/protected-paths.ts +30 -0
  1005. package/examples/extensions/provider-payload.ts +18 -0
  1006. package/examples/extensions/qna.ts +122 -0
  1007. package/examples/extensions/question.ts +286 -0
  1008. package/examples/extensions/questionnaire.ts +448 -0
  1009. package/examples/extensions/rainbow-editor.ts +88 -0
  1010. package/examples/extensions/reload-runtime.ts +37 -0
  1011. package/examples/extensions/rpc-demo.ts +118 -0
  1012. package/examples/extensions/sandbox/index.ts +321 -0
  1013. package/examples/extensions/sandbox/package-lock.json +92 -0
  1014. package/examples/extensions/sandbox/package.json +19 -0
  1015. package/examples/extensions/send-user-message.ts +97 -0
  1016. package/examples/extensions/session-name.ts +27 -0
  1017. package/examples/extensions/shutdown-command.ts +63 -0
  1018. package/examples/extensions/snake.ts +343 -0
  1019. package/examples/extensions/space-invaders.ts +560 -0
  1020. package/examples/extensions/ssh.ts +220 -0
  1021. package/examples/extensions/status-line.ts +32 -0
  1022. package/examples/extensions/structured-output.ts +65 -0
  1023. package/examples/extensions/subagent/README.md +175 -0
  1024. package/examples/extensions/subagent/agents/planner.md +37 -0
  1025. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1026. package/examples/extensions/subagent/agents/scout.md +50 -0
  1027. package/examples/extensions/subagent/agents/worker.md +24 -0
  1028. package/examples/extensions/subagent/agents.ts +126 -0
  1029. package/examples/extensions/subagent/index.ts +1009 -0
  1030. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1031. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1032. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1033. package/examples/extensions/summarize.ts +207 -0
  1034. package/examples/extensions/system-prompt-header.ts +17 -0
  1035. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1036. package/examples/extensions/timed-confirm.ts +70 -0
  1037. package/examples/extensions/titlebar-spinner.ts +58 -0
  1038. package/examples/extensions/todo.ts +297 -0
  1039. package/examples/extensions/tool-override.ts +144 -0
  1040. package/examples/extensions/tools.ts +146 -0
  1041. package/examples/extensions/trigger-compact.ts +50 -0
  1042. package/examples/extensions/truncated-tool.ts +195 -0
  1043. package/examples/extensions/widget-placement.ts +9 -0
  1044. package/examples/extensions/with-deps/index.ts +32 -0
  1045. package/examples/extensions/with-deps/package-lock.json +31 -0
  1046. package/examples/extensions/with-deps/package.json +22 -0
  1047. package/examples/extensions/working-indicator.ts +123 -0
  1048. package/examples/extensions/working-message-test.ts +25 -0
  1049. package/examples/rpc-extension-ui.ts +632 -0
  1050. package/examples/sdk/01-minimal.ts +26 -0
  1051. package/examples/sdk/02-custom-model.ts +50 -0
  1052. package/examples/sdk/03-custom-prompt.ts +70 -0
  1053. package/examples/sdk/04-skills.ts +55 -0
  1054. package/examples/sdk/05-tools.ts +48 -0
  1055. package/examples/sdk/06-extensions.ts +94 -0
  1056. package/examples/sdk/07-context-files.ts +42 -0
  1057. package/examples/sdk/08-prompt-templates.ts +51 -0
  1058. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  1059. package/examples/sdk/10-settings.ts +53 -0
  1060. package/examples/sdk/11-sessions.ts +52 -0
  1061. package/examples/sdk/12-full-control.ts +72 -0
  1062. package/examples/sdk/13-session-runtime.ts +67 -0
  1063. package/examples/sdk/README.md +140 -0
  1064. package/npm-shrinkwrap.json +1824 -0
  1065. package/package.json +99 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { PAGE_HEADER_RE } from \"./contents.ts\";\nimport { fetchWithRetry } from \"./http.ts\";\nimport { type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nconst DEEPWIKI_MCP_URL = \"https://mcp.deepwiki.com/mcp\";\nconst MCP_PROTOCOL_VERSION = \"2024-11-05\";\nconst REQUEST_TIMEOUT_MS = 45_000;\nconst CACHE_TTL_MS = 10 * 60_000;\n/** Long-lived process guard: entries are only otherwise dropped on re-read after expiry. */\nconst MAX_CACHE_ENTRIES = 50;\n/** Transient-failure retries (network blips, 5xx, 429). Aborts/timeouts are not retried. */\nconst MAX_RETRIES = 2;\n\ntype DeepWikiToolName = \"read_wiki_structure\" | \"read_wiki_contents\" | \"ask_question\";\n\ninterface JsonRpcErrorPayload {\n\tcode?: number;\n\tmessage?: string;\n\tdata?: unknown;\n}\n\ninterface JsonRpcEnvelope {\n\tjsonrpc?: string;\n\tid?: string | number | null;\n\tresult?: unknown;\n\terror?: JsonRpcErrorPayload;\n}\n\ninterface McpTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface McpToolCallResult {\n\tcontent?: unknown;\n\tstructuredContent?: unknown;\n\tisError?: boolean;\n}\n\nexport interface DeepWikiResponse {\n\ttoolName: DeepWikiToolName;\n\ttext: string;\n\toutputLength: number;\n\tpageTitles?: string[];\n\tcacheHit?: boolean;\n}\n\ninterface CacheEntry {\n\texpiresAt: number;\n\tresponse: DeepWikiResponse;\n}\n\nconst responseCache = new Map<string, CacheEntry>();\n\nfunction toolNameForAction(action: DeepWikiParams[\"action\"]): DeepWikiToolName {\n\tif (action === \"structure\") return \"read_wiki_structure\";\n\tif (action === \"contents\") return \"read_wiki_contents\";\n\treturn \"ask_question\";\n}\n\n// Callers pass params already normalized by callDeepWiki's entry gate; no re-normalization.\nfunction argumentsForParams(params: DeepWikiParams): Record<string, unknown> {\n\tif (params.action === \"question\") {\n\t\tconst question = params.question?.trim();\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn { repoName: params.repoName, question };\n\t}\n\treturn { repoName: params.repoName };\n}\n\nfunction cacheKey(params: DeepWikiParams): string {\n\tconst repos = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn JSON.stringify([params.action, repos, params.question ?? \"\"]);\n}\n\nfunction cloneResponse(response: DeepWikiResponse, cacheHit: boolean): DeepWikiResponse {\n\treturn {\n\t\t...response,\n\t\t...(response.pageTitles ? { pageTitles: [...response.pageTitles] } : {}),\n\t\tcacheHit,\n\t};\n}\n\nfunction truncate(text: string, maxLength = 500): string {\n\tif (text.length <= maxLength) return text;\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction parseJson(text: string): JsonRpcEnvelope {\n\ttry {\n\t\treturn JSON.parse(text) as JsonRpcEnvelope;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki returned invalid JSON: ${message}`);\n\t}\n}\n\nfunction parseSse(text: string): JsonRpcEnvelope {\n\tconst blocks = text.split(/\\r?\\n\\r?\\n/);\n\tlet fallback: JsonRpcEnvelope | undefined;\n\tfor (const block of blocks) {\n\t\tconst dataLines = block\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t.map((line) => line.slice(5).replace(/^ /, \"\"));\n\t\tif (dataLines.length === 0) continue;\n\n\t\tconst data = dataLines.join(\"\\n\").trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\tconst envelope = parseJson(data);\n\t\tif (envelope.error || envelope.result !== undefined) return envelope;\n\t\tfallback = envelope;\n\t}\n\tif (fallback) return fallback;\n\tthrow new Error(\"DeepWiki returned an empty event stream\");\n}\n\nfunction parseEnvelope(text: string, contentType: string | null): JsonRpcEnvelope {\n\tif (contentType?.includes(\"text/event-stream\")) return parseSse(text);\n\treturn parseJson(text);\n}\n\nfunction extractStructuredResult(result: McpToolCallResult): string | undefined {\n\tif (!result.structuredContent || typeof result.structuredContent !== \"object\") return undefined;\n\tconst value = (result.structuredContent as Record<string, unknown>).result;\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction extractContentResult(result: McpToolCallResult): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\treturn result.content\n\t\t.filter((part): part is McpTextContent => {\n\t\t\tif (!part || typeof part !== \"object\") return false;\n\t\t\tconst record = part as Record<string, unknown>;\n\t\t\treturn record.type === \"text\" && typeof record.text === \"string\";\n\t\t})\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isDeepWikiErrorText(text: string): boolean {\n\tconst trimmed = text.trim();\n\treturn (\n\t\t/^Error fetching wiki for .+?: Repository not found\\./i.test(trimmed) ||\n\t\t/^Error processing question: Repository not found\\./i.test(trimmed)\n\t);\n}\n\nfunction extractToolText(result: unknown): string {\n\tif (!result || typeof result !== \"object\") throw new Error(\"DeepWiki returned no result object\");\n\n\tconst toolResult = result as McpToolCallResult;\n\tconst text = extractStructuredResult(toolResult) ?? extractContentResult(toolResult);\n\tif (!text) throw new Error(\"DeepWiki returned no text content\");\n\tif (toolResult.isError || isDeepWikiErrorText(text)) throw new Error(text);\n\treturn text;\n}\n\nexport function extractStructureSections(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(/^\\s*-\\s+\\d+\\s+(.+)$/)?.[1]?.trim()));\n}\n\nexport function extractContentPages(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(PAGE_HEADER_RE)?.[1]?.trim()));\n}\n\nfunction uniqueTitles(titles: Array<string | undefined>): string[] {\n\tconst seen = new Set<string>();\n\tconst result: string[] = [];\n\tfor (const title of titles) {\n\t\tif (!title || seen.has(title)) continue;\n\t\tseen.add(title);\n\t\tresult.push(title);\n\t}\n\treturn result;\n}\n\nfunction extractPageTitles(toolName: DeepWikiToolName, text: string): string[] {\n\tif (toolName === \"read_wiki_structure\") return extractStructureSections(text);\n\tif (toolName === \"read_wiki_contents\") return extractContentPages(text);\n\treturn [];\n}\n\nexport async function callDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined): Promise<DeepWikiResponse> {\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst key = cacheKey(normalizedParams);\n\tconst cached = responseCache.get(key);\n\tif (cached && cached.expiresAt > Date.now()) {\n\t\treturn cloneResponse(cached.response, true);\n\t}\n\tif (cached) responseCache.delete(key);\n\n\tconst toolName = toolNameForAction(normalizedParams.action);\n\tconst bodyJson = JSON.stringify({\n\t\tjsonrpc: \"2.0\",\n\t\tid: 1,\n\t\tmethod: \"tools/call\",\n\t\tparams: {\n\t\t\tname: toolName,\n\t\t\targuments: argumentsForParams(normalizedParams),\n\t\t},\n\t});\n\n\t// Timeout + bounded transient retry live in this extension's http.ts; non-retryable\n\t// statuses come back here for the domain-specific HTTP error below.\n\tconst { response, text } = await fetchWithRetry(\n\t\tDEEPWIKI_MCP_URL,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json, text/event-stream\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"MCP-Protocol-Version\": MCP_PROTOCOL_VERSION,\n\t\t\t},\n\t\t\tbody: bodyJson,\n\t\t},\n\t\t{ timeoutMs: REQUEST_TIMEOUT_MS, retries: MAX_RETRIES, signal, label: \"DeepWiki\" },\n\t);\n\n\tif (!response.ok) {\n\t\tthrow new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);\n\t}\n\n\tconst envelope = parseEnvelope(text, response.headers.get(\"content-type\"));\n\tif (envelope.error) {\n\t\tthrow new Error(envelope.error.message ?? `DeepWiki JSON-RPC error ${envelope.error.code ?? \"unknown\"}`);\n\t}\n\n\tconst resultText = extractToolText(envelope.result);\n\tconst pageTitles = extractPageTitles(toolName, resultText);\n\tconst result: DeepWikiResponse = {\n\t\ttoolName,\n\t\ttext: resultText,\n\t\toutputLength: resultText.length,\n\t\t...(pageTitles.length ? { pageTitles } : {}),\n\t};\n\tresponseCache.set(key, { expiresAt: Date.now() + CACHE_TTL_MS, response: cloneResponse(result, false) });\n\twhile (responseCache.size > MAX_CACHE_ENTRIES) {\n\t\tconst oldest = responseCache.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tresponseCache.delete(oldest);\n\t}\n\treturn result;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * constants.ts — deepwiki tool identity + prompt copy.
3
+ *
4
+ * Name/label/description/promptSnippet/promptGuidelines live here so
5
+ * `index.ts` only assembles the tool. Prompt copy is the model-facing
6
+ * contract; keep it stable.
7
+ */
8
+ export declare const DEEPWIKI_TOOL_NAME = "deepwiki";
9
+ export declare const DEEPWIKI_LABEL = "DeepWiki";
10
+ export declare const DEEPWIKI_DESCRIPTION = "Query DeepWiki's AI-generated documentation for indexed public GitHub repositories. Recommended flow: structure lists the wiki's pages; contents with page (title or 1-based index) reads one page \u2014 read pages selectively rather than pulling the whole wiki (omitting page returns everything, truncated past ~120k chars); question answers a focused query (up to 10 repos for comparisons) \u2014 reach for it when the wiki pages don't cover what you need, or on its own for a quick answer without reading. Use it for architecture, module layout, APIs, extension points, and implementation patterns when designing or building. Results describe indexed public snapshots and may cite sources; they are not local workspace state, private code, or guaranteed-fresh facts.";
11
+ export declare const DEEPWIKI_PROMPT_SNIPPET = "Query AI-generated docs for public GitHub repos: architecture, APIs, implementation patterns, cross-repo comparisons";
12
+ export declare const DEEPWIKI_PROMPT_GUIDELINES: string[];
13
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,eAAO,MAAM,oBAAoB,owBACutB,CAAC;AAEzvB,eAAO,MAAM,uBAAuB,yHACmF,CAAC;AAExH,eAAO,MAAM,0BAA0B,UAKtC,CAAC","sourcesContent":["/**\n * constants.ts — deepwiki tool identity + prompt copy.\n *\n * Name/label/description/promptSnippet/promptGuidelines live here so\n * `index.ts` only assembles the tool. Prompt copy is the model-facing\n * contract; keep it stable.\n */\n\nexport const DEEPWIKI_TOOL_NAME = \"deepwiki\";\nexport const DEEPWIKI_LABEL = \"DeepWiki\";\n\nexport const DEEPWIKI_DESCRIPTION =\n\t\"Query DeepWiki's AI-generated documentation for indexed public GitHub repositories. Recommended flow: structure lists the wiki's pages; contents with page (title or 1-based index) reads one page — read pages selectively rather than pulling the whole wiki (omitting page returns everything, truncated past ~120k chars); question answers a focused query (up to 10 repos for comparisons) — reach for it when the wiki pages don't cover what you need, or on its own for a quick answer without reading. Use it for architecture, module layout, APIs, extension points, and implementation patterns when designing or building. Results describe indexed public snapshots and may cite sources; they are not local workspace state, private code, or guaranteed-fresh facts.\";\n\nexport const DEEPWIKI_PROMPT_SNIPPET =\n\t\"Query AI-generated docs for public GitHub repos: architecture, APIs, implementation patterns, cross-repo comparisons\";\n\nexport const DEEPWIKI_PROMPT_GUIDELINES = [\n\t\"Use `deepwiki` on public GitHub repos only: run `structure` first for that owner/repo. If structure fails with repository not found, the wiki is not indexed on DeepWiki — do not call contents or question for that repo; pick another repo (e.g. upstream `badlogic/pi-mono` for pi-mono docs).\",\n\t\"After structure, use `contents` with `page` set to a 1-based index or an exact page title from the structure list (titles are plain names like `Extension System`, not numbered outline lines like `4.4 Extension System`). Avoid `contents` without `page` unless the wiki is small.\",\n\t\"Use `deepwiki` action `question` for a focused answer without reading pages, or when structure/contents do not cover the topic. Single repo: `repoName` as a string. Compare 2-10 repos: `repoName` as an array of owner/repo strings (or comma-separated string).\",\n\t\"Do not use `deepwiki` for local workspace files, private repos, exact current HEAD, or freshness-sensitive facts (releases, pricing, advisories); use local tools or current primary sources instead.\",\n];\n"]}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * constants.ts — deepwiki tool identity + prompt copy.
3
+ *
4
+ * Name/label/description/promptSnippet/promptGuidelines live here so
5
+ * `index.ts` only assembles the tool. Prompt copy is the model-facing
6
+ * contract; keep it stable.
7
+ */
8
+ export const DEEPWIKI_TOOL_NAME = "deepwiki";
9
+ export const DEEPWIKI_LABEL = "DeepWiki";
10
+ export const DEEPWIKI_DESCRIPTION = "Query DeepWiki's AI-generated documentation for indexed public GitHub repositories. Recommended flow: structure lists the wiki's pages; contents with page (title or 1-based index) reads one page — read pages selectively rather than pulling the whole wiki (omitting page returns everything, truncated past ~120k chars); question answers a focused query (up to 10 repos for comparisons) — reach for it when the wiki pages don't cover what you need, or on its own for a quick answer without reading. Use it for architecture, module layout, APIs, extension points, and implementation patterns when designing or building. Results describe indexed public snapshots and may cite sources; they are not local workspace state, private code, or guaranteed-fresh facts.";
11
+ export const DEEPWIKI_PROMPT_SNIPPET = "Query AI-generated docs for public GitHub repos: architecture, APIs, implementation patterns, cross-repo comparisons";
12
+ export const DEEPWIKI_PROMPT_GUIDELINES = [
13
+ "Use `deepwiki` on public GitHub repos only: run `structure` first for that owner/repo. If structure fails with repository not found, the wiki is not indexed on DeepWiki — do not call contents or question for that repo; pick another repo (e.g. upstream `badlogic/pi-mono` for pi-mono docs).",
14
+ "After structure, use `contents` with `page` set to a 1-based index or an exact page title from the structure list (titles are plain names like `Extension System`, not numbered outline lines like `4.4 Extension System`). Avoid `contents` without `page` unless the wiki is small.",
15
+ "Use `deepwiki` action `question` for a focused answer without reading pages, or when structure/contents do not cover the topic. Single repo: `repoName` as a string. Compare 2-10 repos: `repoName` as an array of owner/repo strings (or comma-separated string).",
16
+ "Do not use `deepwiki` for local workspace files, private repos, exact current HEAD, or freshness-sensitive facts (releases, pricing, advisories); use local tools or current primary sources instead.",
17
+ ];
18
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAChC,2vBAAuvB,CAAC;AAEzvB,MAAM,CAAC,MAAM,uBAAuB,GACnC,sHAAsH,CAAC;AAExH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACzC,qSAAmS;IACnS,uRAAuR;IACvR,oQAAoQ;IACpQ,uMAAuM;CACvM,CAAC","sourcesContent":["/**\n * constants.ts — deepwiki tool identity + prompt copy.\n *\n * Name/label/description/promptSnippet/promptGuidelines live here so\n * `index.ts` only assembles the tool. Prompt copy is the model-facing\n * contract; keep it stable.\n */\n\nexport const DEEPWIKI_TOOL_NAME = \"deepwiki\";\nexport const DEEPWIKI_LABEL = \"DeepWiki\";\n\nexport const DEEPWIKI_DESCRIPTION =\n\t\"Query DeepWiki's AI-generated documentation for indexed public GitHub repositories. Recommended flow: structure lists the wiki's pages; contents with page (title or 1-based index) reads one page — read pages selectively rather than pulling the whole wiki (omitting page returns everything, truncated past ~120k chars); question answers a focused query (up to 10 repos for comparisons) — reach for it when the wiki pages don't cover what you need, or on its own for a quick answer without reading. Use it for architecture, module layout, APIs, extension points, and implementation patterns when designing or building. Results describe indexed public snapshots and may cite sources; they are not local workspace state, private code, or guaranteed-fresh facts.\";\n\nexport const DEEPWIKI_PROMPT_SNIPPET =\n\t\"Query AI-generated docs for public GitHub repos: architecture, APIs, implementation patterns, cross-repo comparisons\";\n\nexport const DEEPWIKI_PROMPT_GUIDELINES = [\n\t\"Use `deepwiki` on public GitHub repos only: run `structure` first for that owner/repo. If structure fails with repository not found, the wiki is not indexed on DeepWiki — do not call contents or question for that repo; pick another repo (e.g. upstream `badlogic/pi-mono` for pi-mono docs).\",\n\t\"After structure, use `contents` with `page` set to a 1-based index or an exact page title from the structure list (titles are plain names like `Extension System`, not numbered outline lines like `4.4 Extension System`). Avoid `contents` without `page` unless the wiki is small.\",\n\t\"Use `deepwiki` action `question` for a focused answer without reading pages, or when structure/contents do not cover the topic. Single repo: `repoName` as a string. Compare 2-10 repos: `repoName` as an array of owner/repo strings (or comma-separated string).\",\n\t\"Do not use `deepwiki` for local workspace files, private repos, exact current HEAD, or freshness-sensitive facts (releases, pricing, advisories); use local tools or current primary sources instead.\",\n];\n"]}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * contents.ts — page-boundary truncation for deepwiki `contents` responses.
3
+ *
4
+ * Zero-import pure module so `node scratch/<x>.ts` can drive it directly (this
5
+ * repo has no node_modules; bare-package imports would fail to resolve there).
6
+ * client.ts imports PAGE_HEADER_RE from here, so page-title extraction and
7
+ * truncation chunking share one definition and cannot drift apart.
8
+ *
9
+ * Model-facing output must stay bounded: a full generated wiki can reach
10
+ * hundreds of KB. Past CONTENTS_CHAR_BUDGET the text is cut at "# Page:"
11
+ * boundaries — whole pages are kept in order, at least the beginning of the
12
+ * first page always survives — and a trailing notice states what was omitted
13
+ * and how to get it (read a single page via the `page` parameter, or ask a
14
+ * focused question). extractPage implements that single-page read: upstream
15
+ * has no per-page fetch, so a page is sliced locally out of the full text.
16
+ *
17
+ * Determinism matters: callDeepWiki caches the FULL response and the caller
18
+ * re-truncates on every call, so cached and fresh calls must produce
19
+ * byte-identical text. Pure function + constant budget guarantees that.
20
+ */
21
+ /** Page-header line of a DeepWiki contents response ("# Page: <title>"). */
22
+ export declare const PAGE_HEADER_RE: RegExp;
23
+ export declare const CONTENTS_CHAR_BUDGET = 120000;
24
+ export interface ContentsTruncation {
25
+ /** Truncated body plus trailing notice; equals the input when not truncated. */
26
+ text: string;
27
+ truncated: boolean;
28
+ /** Page chunks found in the full text (0 = no "# Page:" markers). */
29
+ totalPages: number;
30
+ /** Pages fully or partially shown (a mid-page cut still counts its page). */
31
+ shownPages: number;
32
+ /** Body characters dropped by the cut (the notice is not counted). */
33
+ truncatedChars: number;
34
+ }
35
+ /**
36
+ * Truncate a contents response to `budget` chars at page boundaries and append
37
+ * an omission notice. Below budget the input is returned untouched.
38
+ */
39
+ export declare function truncateContentsByPages(text: string, budget?: number): ContentsTruncation;
40
+ export interface PageSlice {
41
+ /** Resolved page title as it appears in the header line. */
42
+ title: string;
43
+ /** Page text from its header line up to the next page header (or EOF). */
44
+ text: string;
45
+ /** 1-based position among the page chunks. */
46
+ index: number;
47
+ }
48
+ export interface PageLookup {
49
+ found?: PageSlice;
50
+ /** All page titles in document order — for self-healing not-found errors. */
51
+ titles: string[];
52
+ }
53
+ /** Strip outline numbers copied from structure TOC (e.g. `4.4 Extension System` → `Extension System`). */
54
+ export declare function normalizePageRef(pageRef: string | number): string | number;
55
+ /**
56
+ * Slice one wiki page out of a full contents response. `pageRef` is matched
57
+ * leniently, in this order: case-insensitive exact title, unique partial
58
+ * title, or a 1-based index for purely numeric refs (matching the order shown
59
+ * by structure and truncation notices). No match (or a wiki without page
60
+ * markers) returns just the title list so the caller can report what exists.
61
+ */
62
+ export declare function extractPage(text: string, pageRef: string | number): PageLookup;
63
+ //# sourceMappingURL=contents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/contents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,cAAc,QAAuB,CAAC;AAEnD,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAK5C,MAAM,WAAW,kBAAkB;IAClC,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;CACvB;AAyDD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAuB,GAAG,kBAAkB,CAwDvG;AAED,MAAM,WAAW,SAAS;IACzB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA6E;IAC7E,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,4GAA0G;AAC1G,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAM1E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CA2B9E","sourcesContent":["/**\n * contents.ts — page-boundary truncation for deepwiki `contents` responses.\n *\n * Zero-import pure module so `node scratch/<x>.ts` can drive it directly (this\n * repo has no node_modules; bare-package imports would fail to resolve there).\n * client.ts imports PAGE_HEADER_RE from here, so page-title extraction and\n * truncation chunking share one definition and cannot drift apart.\n *\n * Model-facing output must stay bounded: a full generated wiki can reach\n * hundreds of KB. Past CONTENTS_CHAR_BUDGET the text is cut at \"# Page:\"\n * boundaries — whole pages are kept in order, at least the beginning of the\n * first page always survives — and a trailing notice states what was omitted\n * and how to get it (read a single page via the `page` parameter, or ask a\n * focused question). extractPage implements that single-page read: upstream\n * has no per-page fetch, so a page is sliced locally out of the full text.\n *\n * Determinism matters: callDeepWiki caches the FULL response and the caller\n * re-truncates on every call, so cached and fresh calls must produce\n * byte-identical text. Pure function + constant budget guarantees that.\n */\n\n/** Page-header line of a DeepWiki contents response (\"# Page: <title>\"). */\nexport const PAGE_HEADER_RE = /^#\\s+Page:\\s+(.+)$/;\n\nexport const CONTENTS_CHAR_BUDGET = 120_000;\n\n/** Cap for omitted page titles inside the notice — the notice itself is bounded. */\nconst OMITTED_TITLES_MAX = 20;\n\nexport interface ContentsTruncation {\n\t/** Truncated body plus trailing notice; equals the input when not truncated. */\n\ttext: string;\n\ttruncated: boolean;\n\t/** Page chunks found in the full text (0 = no \"# Page:\" markers). */\n\ttotalPages: number;\n\t/** Pages fully or partially shown (a mid-page cut still counts its page). */\n\tshownPages: number;\n\t/** Body characters dropped by the cut (the notice is not counted). */\n\ttruncatedChars: number;\n}\n\ninterface PageChunk {\n\ttitle: string;\n\tstart: number;\n}\n\n/** Locate every page-header line as a character offset into the full text. */\nfunction pageOffsets(text: string): PageChunk[] {\n\tconst re = new RegExp(PAGE_HEADER_RE.source, \"gm\");\n\tconst chunks: PageChunk[] = [];\n\tlet match = re.exec(text);\n\twhile (match !== null) {\n\t\tchunks.push({ title: match[1]!.trim(), start: match.index });\n\t\tmatch = re.exec(text);\n\t}\n\treturn chunks;\n}\n\n/**\n * Hard-cut `text` to at most `budget` chars, preferring the last newline within\n * the budget so the cut lands between lines. A newline too close to the start\n * (< 40% of the budget) is ignored — a hard cut keeps more content than a tiny\n * stub, using the same word-boundary heuristic as other bounded text output.\n */\nfunction cutAtLineBoundary(text: string, budget: number): string {\n\tif (text.length <= budget) return text;\n\tconst slice = text.slice(0, budget);\n\tconst lastNewline = slice.lastIndexOf(\"\\n\");\n\treturn lastNewline >= Math.floor(budget * 0.4) ? slice.slice(0, lastNewline) : slice;\n}\n\nfunction buildNotice(opts: {\n\tshownPages: number;\n\ttotalPages: number;\n\tkeptChars: number;\n\tfullChars: number;\n\tomittedTitles: string[];\n\tpartialLastPage: boolean;\n}): string {\n\tconst pagesPart =\n\t\topts.totalPages > 0 ? `showing ${opts.shownPages} of ${opts.totalPages} pages` : \"showing the beginning\";\n\tconst lines = [`[DeepWiki contents truncated — ${pagesPart} (${opts.keptChars} of ${opts.fullChars} chars).`];\n\tif (opts.partialLastPage) lines.push(\"The last shown page is itself truncated.\");\n\tif (opts.omittedTitles.length > 0) {\n\t\tconst shown = opts.omittedTitles.slice(0, OMITTED_TITLES_MAX).join(\"; \");\n\t\tconst more = opts.omittedTitles.length - OMITTED_TITLES_MAX;\n\t\tlines.push(`Omitted pages: ${shown}${more > 0 ? ` … +${more} more` : \"\"}.`);\n\t\tlines.push(\n\t\t\t`Read an omitted page with {action: \"contents\", page: \"<title>\"}, or use action \"question\" for a targeted answer.]`,\n\t\t);\n\t} else {\n\t\tlines.push(`For the missing remainder, use action \"question\" with a focused question.]`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Truncate a contents response to `budget` chars at page boundaries and append\n * an omission notice. Below budget the input is returned untouched.\n */\nexport function truncateContentsByPages(text: string, budget = CONTENTS_CHAR_BUDGET): ContentsTruncation {\n\tconst chunks = pageOffsets(text);\n\tconst totalPages = chunks.length;\n\n\tif (text.length <= budget) {\n\t\treturn { text, truncated: false, totalPages, shownPages: totalPages, truncatedChars: 0 };\n\t}\n\n\tlet kept: string;\n\tlet shownPages: number;\n\tlet partialLastPage = false;\n\n\tif (totalPages === 0) {\n\t\t// No page markers: treat the whole text as one block and cut at a line.\n\t\tkept = cutAtLineBoundary(text, budget);\n\t\tshownPages = 0;\n\t} else {\n\t\t// Accumulate the preamble (anything before the first marker) plus whole\n\t\t// pages, in order, while they fit.\n\t\tconst preambleEnd = chunks[0]!.start;\n\t\tshownPages = 0;\n\t\tlet end = preambleEnd;\n\t\tfor (let i = 0; i < chunks.length; i++) {\n\t\t\tconst pageEnd = i + 1 < chunks.length ? chunks[i + 1]!.start : text.length;\n\t\t\tif (pageEnd > budget) break;\n\t\t\tend = pageEnd;\n\t\t\tshownPages++;\n\t\t}\n\t\tif (shownPages === 0) {\n\t\t\t// Even the first page does not fit: cut inside it so at least the\n\t\t\t// document head and the first page's opening survive.\n\t\t\tkept = cutAtLineBoundary(text, budget);\n\t\t\tshownPages = 1;\n\t\t\tpartialLastPage = true;\n\t\t} else {\n\t\t\tkept = text.slice(0, end);\n\t\t}\n\t}\n\n\tconst omittedTitles = chunks.slice(shownPages).map((chunk) => chunk.title);\n\tconst notice = buildNotice({\n\t\tshownPages,\n\t\ttotalPages,\n\t\tkeptChars: kept.length,\n\t\tfullChars: text.length,\n\t\tomittedTitles,\n\t\tpartialLastPage,\n\t});\n\n\treturn {\n\t\ttext: `${kept}\\n\\n${notice}`,\n\t\ttruncated: true,\n\t\ttotalPages,\n\t\tshownPages,\n\t\ttruncatedChars: text.length - kept.length,\n\t};\n}\n\nexport interface PageSlice {\n\t/** Resolved page title as it appears in the header line. */\n\ttitle: string;\n\t/** Page text from its header line up to the next page header (or EOF). */\n\ttext: string;\n\t/** 1-based position among the page chunks. */\n\tindex: number;\n}\n\nexport interface PageLookup {\n\tfound?: PageSlice;\n\t/** All page titles in document order — for self-healing not-found errors. */\n\ttitles: string[];\n}\n\n/** Strip outline numbers copied from structure TOC (e.g. `4.4 Extension System` → `Extension System`). */\nexport function normalizePageRef(pageRef: string | number): string | number {\n\tif (typeof pageRef === \"number\") return pageRef;\n\tconst trimmed = pageRef.trim();\n\tif (!trimmed) return trimmed;\n\tconst stripped = trimmed.replace(/^\\d+(?:\\.\\d+)*\\s+/, \"\");\n\treturn stripped.length > 0 ? stripped : trimmed;\n}\n\n/**\n * Slice one wiki page out of a full contents response. `pageRef` is matched\n * leniently, in this order: case-insensitive exact title, unique partial\n * title, or a 1-based index for purely numeric refs (matching the order shown\n * by structure and truncation notices). No match (or a wiki without page\n * markers) returns just the title list so the caller can report what exists.\n */\nexport function extractPage(text: string, pageRef: string | number): PageLookup {\n\tconst chunks = pageOffsets(text);\n\tconst titles = chunks.map((chunk) => chunk.title);\n\tif (chunks.length === 0) return { titles };\n\n\tconst normalized = normalizePageRef(pageRef);\n\tconst ref = String(normalized).trim();\n\tlet idx = -1;\n\tif (typeof normalized === \"number\" || /^\\d+$/.test(ref)) {\n\t\tconst ordinal = typeof normalized === \"number\" ? normalized : Number.parseInt(ref, 10);\n\t\tif (ordinal >= 1 && ordinal <= chunks.length) idx = ordinal - 1;\n\t} else if (ref) {\n\t\tconst lower = ref.toLowerCase();\n\t\tidx = titles.findIndex((title) => title.toLowerCase() === lower);\n\t\tif (idx === -1) {\n\t\t\tconst partial = titles.reduce<number[]>((acc, title, i) => {\n\t\t\t\tif (title.toLowerCase().includes(lower)) acc.push(i);\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\t\t\tif (partial.length === 1) idx = partial[0]!;\n\t\t}\n\t}\n\tif (idx === -1) return { titles };\n\n\tconst start = chunks[idx]!.start;\n\tconst end = idx + 1 < chunks.length ? chunks[idx + 1]!.start : text.length;\n\treturn { found: { title: titles[idx]!, text: text.slice(start, end), index: idx + 1 }, titles };\n}\n"]}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * contents.ts — page-boundary truncation for deepwiki `contents` responses.
3
+ *
4
+ * Zero-import pure module so `node scratch/<x>.ts` can drive it directly (this
5
+ * repo has no node_modules; bare-package imports would fail to resolve there).
6
+ * client.ts imports PAGE_HEADER_RE from here, so page-title extraction and
7
+ * truncation chunking share one definition and cannot drift apart.
8
+ *
9
+ * Model-facing output must stay bounded: a full generated wiki can reach
10
+ * hundreds of KB. Past CONTENTS_CHAR_BUDGET the text is cut at "# Page:"
11
+ * boundaries — whole pages are kept in order, at least the beginning of the
12
+ * first page always survives — and a trailing notice states what was omitted
13
+ * and how to get it (read a single page via the `page` parameter, or ask a
14
+ * focused question). extractPage implements that single-page read: upstream
15
+ * has no per-page fetch, so a page is sliced locally out of the full text.
16
+ *
17
+ * Determinism matters: callDeepWiki caches the FULL response and the caller
18
+ * re-truncates on every call, so cached and fresh calls must produce
19
+ * byte-identical text. Pure function + constant budget guarantees that.
20
+ */
21
+ /** Page-header line of a DeepWiki contents response ("# Page: <title>"). */
22
+ export const PAGE_HEADER_RE = /^#\s+Page:\s+(.+)$/;
23
+ export const CONTENTS_CHAR_BUDGET = 120_000;
24
+ /** Cap for omitted page titles inside the notice — the notice itself is bounded. */
25
+ const OMITTED_TITLES_MAX = 20;
26
+ /** Locate every page-header line as a character offset into the full text. */
27
+ function pageOffsets(text) {
28
+ const re = new RegExp(PAGE_HEADER_RE.source, "gm");
29
+ const chunks = [];
30
+ let match = re.exec(text);
31
+ while (match !== null) {
32
+ chunks.push({ title: match[1].trim(), start: match.index });
33
+ match = re.exec(text);
34
+ }
35
+ return chunks;
36
+ }
37
+ /**
38
+ * Hard-cut `text` to at most `budget` chars, preferring the last newline within
39
+ * the budget so the cut lands between lines. A newline too close to the start
40
+ * (< 40% of the budget) is ignored — a hard cut keeps more content than a tiny
41
+ * stub, using the same word-boundary heuristic as other bounded text output.
42
+ */
43
+ function cutAtLineBoundary(text, budget) {
44
+ if (text.length <= budget)
45
+ return text;
46
+ const slice = text.slice(0, budget);
47
+ const lastNewline = slice.lastIndexOf("\n");
48
+ return lastNewline >= Math.floor(budget * 0.4) ? slice.slice(0, lastNewline) : slice;
49
+ }
50
+ function buildNotice(opts) {
51
+ const pagesPart = opts.totalPages > 0 ? `showing ${opts.shownPages} of ${opts.totalPages} pages` : "showing the beginning";
52
+ const lines = [`[DeepWiki contents truncated — ${pagesPart} (${opts.keptChars} of ${opts.fullChars} chars).`];
53
+ if (opts.partialLastPage)
54
+ lines.push("The last shown page is itself truncated.");
55
+ if (opts.omittedTitles.length > 0) {
56
+ const shown = opts.omittedTitles.slice(0, OMITTED_TITLES_MAX).join("; ");
57
+ const more = opts.omittedTitles.length - OMITTED_TITLES_MAX;
58
+ lines.push(`Omitted pages: ${shown}${more > 0 ? ` … +${more} more` : ""}.`);
59
+ lines.push(`Read an omitted page with {action: "contents", page: "<title>"}, or use action "question" for a targeted answer.]`);
60
+ }
61
+ else {
62
+ lines.push(`For the missing remainder, use action "question" with a focused question.]`);
63
+ }
64
+ return lines.join("\n");
65
+ }
66
+ /**
67
+ * Truncate a contents response to `budget` chars at page boundaries and append
68
+ * an omission notice. Below budget the input is returned untouched.
69
+ */
70
+ export function truncateContentsByPages(text, budget = CONTENTS_CHAR_BUDGET) {
71
+ const chunks = pageOffsets(text);
72
+ const totalPages = chunks.length;
73
+ if (text.length <= budget) {
74
+ return { text, truncated: false, totalPages, shownPages: totalPages, truncatedChars: 0 };
75
+ }
76
+ let kept;
77
+ let shownPages;
78
+ let partialLastPage = false;
79
+ if (totalPages === 0) {
80
+ // No page markers: treat the whole text as one block and cut at a line.
81
+ kept = cutAtLineBoundary(text, budget);
82
+ shownPages = 0;
83
+ }
84
+ else {
85
+ // Accumulate the preamble (anything before the first marker) plus whole
86
+ // pages, in order, while they fit.
87
+ const preambleEnd = chunks[0].start;
88
+ shownPages = 0;
89
+ let end = preambleEnd;
90
+ for (let i = 0; i < chunks.length; i++) {
91
+ const pageEnd = i + 1 < chunks.length ? chunks[i + 1].start : text.length;
92
+ if (pageEnd > budget)
93
+ break;
94
+ end = pageEnd;
95
+ shownPages++;
96
+ }
97
+ if (shownPages === 0) {
98
+ // Even the first page does not fit: cut inside it so at least the
99
+ // document head and the first page's opening survive.
100
+ kept = cutAtLineBoundary(text, budget);
101
+ shownPages = 1;
102
+ partialLastPage = true;
103
+ }
104
+ else {
105
+ kept = text.slice(0, end);
106
+ }
107
+ }
108
+ const omittedTitles = chunks.slice(shownPages).map((chunk) => chunk.title);
109
+ const notice = buildNotice({
110
+ shownPages,
111
+ totalPages,
112
+ keptChars: kept.length,
113
+ fullChars: text.length,
114
+ omittedTitles,
115
+ partialLastPage,
116
+ });
117
+ return {
118
+ text: `${kept}\n\n${notice}`,
119
+ truncated: true,
120
+ totalPages,
121
+ shownPages,
122
+ truncatedChars: text.length - kept.length,
123
+ };
124
+ }
125
+ /** Strip outline numbers copied from structure TOC (e.g. `4.4 Extension System` → `Extension System`). */
126
+ export function normalizePageRef(pageRef) {
127
+ if (typeof pageRef === "number")
128
+ return pageRef;
129
+ const trimmed = pageRef.trim();
130
+ if (!trimmed)
131
+ return trimmed;
132
+ const stripped = trimmed.replace(/^\d+(?:\.\d+)*\s+/, "");
133
+ return stripped.length > 0 ? stripped : trimmed;
134
+ }
135
+ /**
136
+ * Slice one wiki page out of a full contents response. `pageRef` is matched
137
+ * leniently, in this order: case-insensitive exact title, unique partial
138
+ * title, or a 1-based index for purely numeric refs (matching the order shown
139
+ * by structure and truncation notices). No match (or a wiki without page
140
+ * markers) returns just the title list so the caller can report what exists.
141
+ */
142
+ export function extractPage(text, pageRef) {
143
+ const chunks = pageOffsets(text);
144
+ const titles = chunks.map((chunk) => chunk.title);
145
+ if (chunks.length === 0)
146
+ return { titles };
147
+ const normalized = normalizePageRef(pageRef);
148
+ const ref = String(normalized).trim();
149
+ let idx = -1;
150
+ if (typeof normalized === "number" || /^\d+$/.test(ref)) {
151
+ const ordinal = typeof normalized === "number" ? normalized : Number.parseInt(ref, 10);
152
+ if (ordinal >= 1 && ordinal <= chunks.length)
153
+ idx = ordinal - 1;
154
+ }
155
+ else if (ref) {
156
+ const lower = ref.toLowerCase();
157
+ idx = titles.findIndex((title) => title.toLowerCase() === lower);
158
+ if (idx === -1) {
159
+ const partial = titles.reduce((acc, title, i) => {
160
+ if (title.toLowerCase().includes(lower))
161
+ acc.push(i);
162
+ return acc;
163
+ }, []);
164
+ if (partial.length === 1)
165
+ idx = partial[0];
166
+ }
167
+ }
168
+ if (idx === -1)
169
+ return { titles };
170
+ const start = chunks[idx].start;
171
+ const end = idx + 1 < chunks.length ? chunks[idx + 1].start : text.length;
172
+ return { found: { title: titles[idx], text: text.slice(start, end), index: idx + 1 }, titles };
173
+ }
174
+ //# sourceMappingURL=contents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contents.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/contents.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * contents.ts — page-boundary truncation for deepwiki `contents` responses.\n *\n * Zero-import pure module so `node scratch/<x>.ts` can drive it directly (this\n * repo has no node_modules; bare-package imports would fail to resolve there).\n * client.ts imports PAGE_HEADER_RE from here, so page-title extraction and\n * truncation chunking share one definition and cannot drift apart.\n *\n * Model-facing output must stay bounded: a full generated wiki can reach\n * hundreds of KB. Past CONTENTS_CHAR_BUDGET the text is cut at \"# Page:\"\n * boundaries — whole pages are kept in order, at least the beginning of the\n * first page always survives — and a trailing notice states what was omitted\n * and how to get it (read a single page via the `page` parameter, or ask a\n * focused question). extractPage implements that single-page read: upstream\n * has no per-page fetch, so a page is sliced locally out of the full text.\n *\n * Determinism matters: callDeepWiki caches the FULL response and the caller\n * re-truncates on every call, so cached and fresh calls must produce\n * byte-identical text. Pure function + constant budget guarantees that.\n */\n\n/** Page-header line of a DeepWiki contents response (\"# Page: <title>\"). */\nexport const PAGE_HEADER_RE = /^#\\s+Page:\\s+(.+)$/;\n\nexport const CONTENTS_CHAR_BUDGET = 120_000;\n\n/** Cap for omitted page titles inside the notice — the notice itself is bounded. */\nconst OMITTED_TITLES_MAX = 20;\n\nexport interface ContentsTruncation {\n\t/** Truncated body plus trailing notice; equals the input when not truncated. */\n\ttext: string;\n\ttruncated: boolean;\n\t/** Page chunks found in the full text (0 = no \"# Page:\" markers). */\n\ttotalPages: number;\n\t/** Pages fully or partially shown (a mid-page cut still counts its page). */\n\tshownPages: number;\n\t/** Body characters dropped by the cut (the notice is not counted). */\n\ttruncatedChars: number;\n}\n\ninterface PageChunk {\n\ttitle: string;\n\tstart: number;\n}\n\n/** Locate every page-header line as a character offset into the full text. */\nfunction pageOffsets(text: string): PageChunk[] {\n\tconst re = new RegExp(PAGE_HEADER_RE.source, \"gm\");\n\tconst chunks: PageChunk[] = [];\n\tlet match = re.exec(text);\n\twhile (match !== null) {\n\t\tchunks.push({ title: match[1]!.trim(), start: match.index });\n\t\tmatch = re.exec(text);\n\t}\n\treturn chunks;\n}\n\n/**\n * Hard-cut `text` to at most `budget` chars, preferring the last newline within\n * the budget so the cut lands between lines. A newline too close to the start\n * (< 40% of the budget) is ignored — a hard cut keeps more content than a tiny\n * stub, using the same word-boundary heuristic as other bounded text output.\n */\nfunction cutAtLineBoundary(text: string, budget: number): string {\n\tif (text.length <= budget) return text;\n\tconst slice = text.slice(0, budget);\n\tconst lastNewline = slice.lastIndexOf(\"\\n\");\n\treturn lastNewline >= Math.floor(budget * 0.4) ? slice.slice(0, lastNewline) : slice;\n}\n\nfunction buildNotice(opts: {\n\tshownPages: number;\n\ttotalPages: number;\n\tkeptChars: number;\n\tfullChars: number;\n\tomittedTitles: string[];\n\tpartialLastPage: boolean;\n}): string {\n\tconst pagesPart =\n\t\topts.totalPages > 0 ? `showing ${opts.shownPages} of ${opts.totalPages} pages` : \"showing the beginning\";\n\tconst lines = [`[DeepWiki contents truncated — ${pagesPart} (${opts.keptChars} of ${opts.fullChars} chars).`];\n\tif (opts.partialLastPage) lines.push(\"The last shown page is itself truncated.\");\n\tif (opts.omittedTitles.length > 0) {\n\t\tconst shown = opts.omittedTitles.slice(0, OMITTED_TITLES_MAX).join(\"; \");\n\t\tconst more = opts.omittedTitles.length - OMITTED_TITLES_MAX;\n\t\tlines.push(`Omitted pages: ${shown}${more > 0 ? ` … +${more} more` : \"\"}.`);\n\t\tlines.push(\n\t\t\t`Read an omitted page with {action: \"contents\", page: \"<title>\"}, or use action \"question\" for a targeted answer.]`,\n\t\t);\n\t} else {\n\t\tlines.push(`For the missing remainder, use action \"question\" with a focused question.]`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Truncate a contents response to `budget` chars at page boundaries and append\n * an omission notice. Below budget the input is returned untouched.\n */\nexport function truncateContentsByPages(text: string, budget = CONTENTS_CHAR_BUDGET): ContentsTruncation {\n\tconst chunks = pageOffsets(text);\n\tconst totalPages = chunks.length;\n\n\tif (text.length <= budget) {\n\t\treturn { text, truncated: false, totalPages, shownPages: totalPages, truncatedChars: 0 };\n\t}\n\n\tlet kept: string;\n\tlet shownPages: number;\n\tlet partialLastPage = false;\n\n\tif (totalPages === 0) {\n\t\t// No page markers: treat the whole text as one block and cut at a line.\n\t\tkept = cutAtLineBoundary(text, budget);\n\t\tshownPages = 0;\n\t} else {\n\t\t// Accumulate the preamble (anything before the first marker) plus whole\n\t\t// pages, in order, while they fit.\n\t\tconst preambleEnd = chunks[0]!.start;\n\t\tshownPages = 0;\n\t\tlet end = preambleEnd;\n\t\tfor (let i = 0; i < chunks.length; i++) {\n\t\t\tconst pageEnd = i + 1 < chunks.length ? chunks[i + 1]!.start : text.length;\n\t\t\tif (pageEnd > budget) break;\n\t\t\tend = pageEnd;\n\t\t\tshownPages++;\n\t\t}\n\t\tif (shownPages === 0) {\n\t\t\t// Even the first page does not fit: cut inside it so at least the\n\t\t\t// document head and the first page's opening survive.\n\t\t\tkept = cutAtLineBoundary(text, budget);\n\t\t\tshownPages = 1;\n\t\t\tpartialLastPage = true;\n\t\t} else {\n\t\t\tkept = text.slice(0, end);\n\t\t}\n\t}\n\n\tconst omittedTitles = chunks.slice(shownPages).map((chunk) => chunk.title);\n\tconst notice = buildNotice({\n\t\tshownPages,\n\t\ttotalPages,\n\t\tkeptChars: kept.length,\n\t\tfullChars: text.length,\n\t\tomittedTitles,\n\t\tpartialLastPage,\n\t});\n\n\treturn {\n\t\ttext: `${kept}\\n\\n${notice}`,\n\t\ttruncated: true,\n\t\ttotalPages,\n\t\tshownPages,\n\t\ttruncatedChars: text.length - kept.length,\n\t};\n}\n\nexport interface PageSlice {\n\t/** Resolved page title as it appears in the header line. */\n\ttitle: string;\n\t/** Page text from its header line up to the next page header (or EOF). */\n\ttext: string;\n\t/** 1-based position among the page chunks. */\n\tindex: number;\n}\n\nexport interface PageLookup {\n\tfound?: PageSlice;\n\t/** All page titles in document order — for self-healing not-found errors. */\n\ttitles: string[];\n}\n\n/** Strip outline numbers copied from structure TOC (e.g. `4.4 Extension System` → `Extension System`). */\nexport function normalizePageRef(pageRef: string | number): string | number {\n\tif (typeof pageRef === \"number\") return pageRef;\n\tconst trimmed = pageRef.trim();\n\tif (!trimmed) return trimmed;\n\tconst stripped = trimmed.replace(/^\\d+(?:\\.\\d+)*\\s+/, \"\");\n\treturn stripped.length > 0 ? stripped : trimmed;\n}\n\n/**\n * Slice one wiki page out of a full contents response. `pageRef` is matched\n * leniently, in this order: case-insensitive exact title, unique partial\n * title, or a 1-based index for purely numeric refs (matching the order shown\n * by structure and truncation notices). No match (or a wiki without page\n * markers) returns just the title list so the caller can report what exists.\n */\nexport function extractPage(text: string, pageRef: string | number): PageLookup {\n\tconst chunks = pageOffsets(text);\n\tconst titles = chunks.map((chunk) => chunk.title);\n\tif (chunks.length === 0) return { titles };\n\n\tconst normalized = normalizePageRef(pageRef);\n\tconst ref = String(normalized).trim();\n\tlet idx = -1;\n\tif (typeof normalized === \"number\" || /^\\d+$/.test(ref)) {\n\t\tconst ordinal = typeof normalized === \"number\" ? normalized : Number.parseInt(ref, 10);\n\t\tif (ordinal >= 1 && ordinal <= chunks.length) idx = ordinal - 1;\n\t} else if (ref) {\n\t\tconst lower = ref.toLowerCase();\n\t\tidx = titles.findIndex((title) => title.toLowerCase() === lower);\n\t\tif (idx === -1) {\n\t\t\tconst partial = titles.reduce<number[]>((acc, title, i) => {\n\t\t\t\tif (title.toLowerCase().includes(lower)) acc.push(i);\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\t\t\tif (partial.length === 1) idx = partial[0]!;\n\t\t}\n\t}\n\tif (idx === -1) return { titles };\n\n\tconst start = chunks[idx]!.start;\n\tconst end = idx + 1 < chunks.length ? chunks[idx + 1]!.start : text.length;\n\treturn { found: { title: titles[idx]!, text: text.slice(start, end), index: idx + 1 }, titles };\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import type { AgentToolResult, AgentToolUpdateCallback } from "../../core/extensions/types.ts";
2
+ import { type DeepWikiAction, type DeepWikiParams } from "./schema.ts";
3
+ export interface DeepWikiDetails {
4
+ action: DeepWikiAction;
5
+ repoName: string;
6
+ repoNames?: string[];
7
+ question?: string;
8
+ toolName?: string;
9
+ outputLength?: number;
10
+ cacheHit?: boolean;
11
+ pageCount?: number;
12
+ pageTitles?: string[];
13
+ /** Resolved title and 1-based position of a single-page contents read. */
14
+ requestedPage?: string;
15
+ pageIndex?: number;
16
+ /** Set only when a contents response was truncated to the char budget. */
17
+ shownPages?: number;
18
+ truncatedChars?: number;
19
+ /** Legacy fields kept so older session entries still render. */
20
+ sectionCount?: number;
21
+ sectionTitles?: string[];
22
+ errorMessage?: string;
23
+ }
24
+ export declare function executeDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined, onUpdate: AgentToolUpdateCallback<DeepWikiDetails> | undefined): Promise<AgentToolResult<DeepWikiDetails>>;
25
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI/F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAoBD,wBAAsB,eAAe,CACpC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,SAAS,GAC5D,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAkE3C","sourcesContent":["import type { AgentToolResult, AgentToolUpdateCallback } from \"../../core/extensions/types.ts\";\n\nimport { callDeepWiki, type DeepWikiResponse } from \"./client.ts\";\nimport { extractPage, truncateContentsByPages } from \"./contents.ts\";\nimport { type DeepWikiAction, type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nexport interface DeepWikiDetails {\n\taction: DeepWikiAction;\n\trepoName: string;\n\trepoNames?: string[];\n\tquestion?: string;\n\ttoolName?: string;\n\toutputLength?: number;\n\tcacheHit?: boolean;\n\tpageCount?: number;\n\tpageTitles?: string[];\n\t/** Resolved title and 1-based position of a single-page contents read. */\n\trequestedPage?: string;\n\tpageIndex?: number;\n\t/** Set only when a contents response was truncated to the char budget. */\n\tshownPages?: number;\n\ttruncatedChars?: number;\n\t/** Legacy fields kept so older session entries still render. */\n\tsectionCount?: number;\n\tsectionTitles?: string[];\n\terrorMessage?: string;\n}\n\nfunction buildResult(\n\tparams: DeepWikiParams,\n\ttext: string,\n\textra: Partial<DeepWikiDetails> = {},\n): AgentToolResult<DeepWikiDetails> {\n\tconst repoNames = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails: {\n\t\t\taction: params.action,\n\t\t\trepoName: repoNames.join(\", \"),\n\t\t\t...(repoNames.length > 1 ? { repoNames } : {}),\n\t\t\t...(params.question ? { question: params.question } : {}),\n\t\t\t...extra,\n\t\t},\n\t};\n}\n\nexport async function executeDeepWiki(\n\tparams: DeepWikiParams,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: AgentToolUpdateCallback<DeepWikiDetails> | undefined,\n): Promise<AgentToolResult<DeepWikiDetails>> {\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst repoLabel = Array.isArray(normalizedParams.repoName)\n\t\t? normalizedParams.repoName.join(\", \")\n\t\t: normalizedParams.repoName;\n\n\tonUpdate?.(buildResult(normalizedParams, `Querying DeepWiki for ${repoLabel}...`));\n\n\tlet response: DeepWikiResponse;\n\ttry {\n\t\tresponse = await callDeepWiki(normalizedParams, signal);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki call failed: ${message}`);\n\t}\n\n\tconst extra: Partial<DeepWikiDetails> = {\n\t\ttoolName: response.toolName,\n\t\toutputLength: response.outputLength,\n\t\t...(response.cacheHit ? { cacheHit: true } : {}),\n\t\t...(response.pageTitles\n\t\t\t? {\n\t\t\t\t\tpageCount: response.pageTitles.length,\n\t\t\t\t\tpageTitles: response.pageTitles,\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\t// Bounded model-facing output: the cache keeps the full response\n\t// (outputLength/pageTitles describe it); only the returned text is cut.\n\t// truncateContentsByPages/extractPage are deterministic, so cached and\n\t// fresh calls produce identical text.\n\tlet resultText = response.text;\n\tif (normalizedParams.action === \"contents\") {\n\t\tif (normalizedParams.page !== undefined) {\n\t\t\t// Single-page read: upstream has no per-page fetch, so slice the page\n\t\t\t// out of the (cached) full wiki locally.\n\t\t\tconst lookup = extractPage(response.text, normalizedParams.page);\n\t\t\tif (!lookup.found) {\n\t\t\t\tif (lookup.titles.length === 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`page \"${normalizedParams.page}\" not found: this wiki has no page structure. Call contents without page.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst list = lookup.titles.slice(0, 30).join(\"; \");\n\t\t\t\tconst more = lookup.titles.length > 30 ? ` … +${lookup.titles.length - 30} more` : \"\";\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`page \"${normalizedParams.page}\" not found in ${repoLabel} wiki (${lookup.titles.length} pages).\\nAvailable pages: ${list}${more}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst truncation = truncateContentsByPages(lookup.found.text);\n\t\t\tresultText = truncation.text;\n\t\t\textra.requestedPage = lookup.found.title;\n\t\t\textra.pageIndex = lookup.found.index;\n\t\t\tif (truncation.truncated) extra.truncatedChars = truncation.truncatedChars;\n\t\t} else {\n\t\t\tconst truncation = truncateContentsByPages(response.text);\n\t\t\tif (truncation.truncated) {\n\t\t\t\tresultText = truncation.text;\n\t\t\t\textra.shownPages = truncation.shownPages;\n\t\t\t\textra.truncatedChars = truncation.truncatedChars;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn buildResult(normalizedParams, resultText, extra);\n}\n"]}
@@ -0,0 +1,78 @@
1
+ import { callDeepWiki } from "./client.js";
2
+ import { extractPage, truncateContentsByPages } from "./contents.js";
3
+ import { normalizeDeepWikiParams } from "./schema.js";
4
+ function buildResult(params, text, extra = {}) {
5
+ const repoNames = Array.isArray(params.repoName) ? params.repoName : [params.repoName];
6
+ return {
7
+ content: [{ type: "text", text }],
8
+ details: {
9
+ action: params.action,
10
+ repoName: repoNames.join(", "),
11
+ ...(repoNames.length > 1 ? { repoNames } : {}),
12
+ ...(params.question ? { question: params.question } : {}),
13
+ ...extra,
14
+ },
15
+ };
16
+ }
17
+ export async function executeDeepWiki(params, signal, onUpdate) {
18
+ const normalizedParams = normalizeDeepWikiParams(params);
19
+ const repoLabel = Array.isArray(normalizedParams.repoName)
20
+ ? normalizedParams.repoName.join(", ")
21
+ : normalizedParams.repoName;
22
+ onUpdate?.(buildResult(normalizedParams, `Querying DeepWiki for ${repoLabel}...`));
23
+ let response;
24
+ try {
25
+ response = await callDeepWiki(normalizedParams, signal);
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ throw new Error(`DeepWiki call failed: ${message}`);
30
+ }
31
+ const extra = {
32
+ toolName: response.toolName,
33
+ outputLength: response.outputLength,
34
+ ...(response.cacheHit ? { cacheHit: true } : {}),
35
+ ...(response.pageTitles
36
+ ? {
37
+ pageCount: response.pageTitles.length,
38
+ pageTitles: response.pageTitles,
39
+ }
40
+ : {}),
41
+ };
42
+ // Bounded model-facing output: the cache keeps the full response
43
+ // (outputLength/pageTitles describe it); only the returned text is cut.
44
+ // truncateContentsByPages/extractPage are deterministic, so cached and
45
+ // fresh calls produce identical text.
46
+ let resultText = response.text;
47
+ if (normalizedParams.action === "contents") {
48
+ if (normalizedParams.page !== undefined) {
49
+ // Single-page read: upstream has no per-page fetch, so slice the page
50
+ // out of the (cached) full wiki locally.
51
+ const lookup = extractPage(response.text, normalizedParams.page);
52
+ if (!lookup.found) {
53
+ if (lookup.titles.length === 0) {
54
+ throw new Error(`page "${normalizedParams.page}" not found: this wiki has no page structure. Call contents without page.`);
55
+ }
56
+ const list = lookup.titles.slice(0, 30).join("; ");
57
+ const more = lookup.titles.length > 30 ? ` … +${lookup.titles.length - 30} more` : "";
58
+ throw new Error(`page "${normalizedParams.page}" not found in ${repoLabel} wiki (${lookup.titles.length} pages).\nAvailable pages: ${list}${more}`);
59
+ }
60
+ const truncation = truncateContentsByPages(lookup.found.text);
61
+ resultText = truncation.text;
62
+ extra.requestedPage = lookup.found.title;
63
+ extra.pageIndex = lookup.found.index;
64
+ if (truncation.truncated)
65
+ extra.truncatedChars = truncation.truncatedChars;
66
+ }
67
+ else {
68
+ const truncation = truncateContentsByPages(response.text);
69
+ if (truncation.truncated) {
70
+ resultText = truncation.text;
71
+ extra.shownPages = truncation.shownPages;
72
+ extra.truncatedChars = truncation.truncatedChars;
73
+ }
74
+ }
75
+ }
76
+ return buildResult(normalizedParams, resultText, extra);
77
+ }
78
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult, AgentToolUpdateCallback } from \"../../core/extensions/types.ts\";\n\nimport { callDeepWiki, type DeepWikiResponse } from \"./client.ts\";\nimport { extractPage, truncateContentsByPages } from \"./contents.ts\";\nimport { type DeepWikiAction, type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nexport interface DeepWikiDetails {\n\taction: DeepWikiAction;\n\trepoName: string;\n\trepoNames?: string[];\n\tquestion?: string;\n\ttoolName?: string;\n\toutputLength?: number;\n\tcacheHit?: boolean;\n\tpageCount?: number;\n\tpageTitles?: string[];\n\t/** Resolved title and 1-based position of a single-page contents read. */\n\trequestedPage?: string;\n\tpageIndex?: number;\n\t/** Set only when a contents response was truncated to the char budget. */\n\tshownPages?: number;\n\ttruncatedChars?: number;\n\t/** Legacy fields kept so older session entries still render. */\n\tsectionCount?: number;\n\tsectionTitles?: string[];\n\terrorMessage?: string;\n}\n\nfunction buildResult(\n\tparams: DeepWikiParams,\n\ttext: string,\n\textra: Partial<DeepWikiDetails> = {},\n): AgentToolResult<DeepWikiDetails> {\n\tconst repoNames = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails: {\n\t\t\taction: params.action,\n\t\t\trepoName: repoNames.join(\", \"),\n\t\t\t...(repoNames.length > 1 ? { repoNames } : {}),\n\t\t\t...(params.question ? { question: params.question } : {}),\n\t\t\t...extra,\n\t\t},\n\t};\n}\n\nexport async function executeDeepWiki(\n\tparams: DeepWikiParams,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: AgentToolUpdateCallback<DeepWikiDetails> | undefined,\n): Promise<AgentToolResult<DeepWikiDetails>> {\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst repoLabel = Array.isArray(normalizedParams.repoName)\n\t\t? normalizedParams.repoName.join(\", \")\n\t\t: normalizedParams.repoName;\n\n\tonUpdate?.(buildResult(normalizedParams, `Querying DeepWiki for ${repoLabel}...`));\n\n\tlet response: DeepWikiResponse;\n\ttry {\n\t\tresponse = await callDeepWiki(normalizedParams, signal);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki call failed: ${message}`);\n\t}\n\n\tconst extra: Partial<DeepWikiDetails> = {\n\t\ttoolName: response.toolName,\n\t\toutputLength: response.outputLength,\n\t\t...(response.cacheHit ? { cacheHit: true } : {}),\n\t\t...(response.pageTitles\n\t\t\t? {\n\t\t\t\t\tpageCount: response.pageTitles.length,\n\t\t\t\t\tpageTitles: response.pageTitles,\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\t// Bounded model-facing output: the cache keeps the full response\n\t// (outputLength/pageTitles describe it); only the returned text is cut.\n\t// truncateContentsByPages/extractPage are deterministic, so cached and\n\t// fresh calls produce identical text.\n\tlet resultText = response.text;\n\tif (normalizedParams.action === \"contents\") {\n\t\tif (normalizedParams.page !== undefined) {\n\t\t\t// Single-page read: upstream has no per-page fetch, so slice the page\n\t\t\t// out of the (cached) full wiki locally.\n\t\t\tconst lookup = extractPage(response.text, normalizedParams.page);\n\t\t\tif (!lookup.found) {\n\t\t\t\tif (lookup.titles.length === 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`page \"${normalizedParams.page}\" not found: this wiki has no page structure. Call contents without page.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst list = lookup.titles.slice(0, 30).join(\"; \");\n\t\t\t\tconst more = lookup.titles.length > 30 ? ` … +${lookup.titles.length - 30} more` : \"\";\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`page \"${normalizedParams.page}\" not found in ${repoLabel} wiki (${lookup.titles.length} pages).\\nAvailable pages: ${list}${more}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst truncation = truncateContentsByPages(lookup.found.text);\n\t\t\tresultText = truncation.text;\n\t\t\textra.requestedPage = lookup.found.title;\n\t\t\textra.pageIndex = lookup.found.index;\n\t\t\tif (truncation.truncated) extra.truncatedChars = truncation.truncatedChars;\n\t\t} else {\n\t\t\tconst truncation = truncateContentsByPages(response.text);\n\t\t\tif (truncation.truncated) {\n\t\t\t\tresultText = truncation.text;\n\t\t\t\textra.shownPages = truncation.shownPages;\n\t\t\t\textra.truncatedChars = truncation.truncatedChars;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn buildResult(normalizedParams, resultText, extra);\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export interface FetchRetryOptions {
2
+ timeoutMs: number;
3
+ retries?: number;
4
+ signal?: AbortSignal;
5
+ label?: string;
6
+ }
7
+ /** Fetch with a per-attempt timeout and bounded retries for transient failures. */
8
+ export declare function fetchWithRetry(url: string, request: RequestInit, options: FetchRetryOptions): Promise<{
9
+ response: Response;
10
+ text: string;
11
+ }>;
12
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAyDD,mFAAmF;AACnF,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB/C","sourcesContent":["export interface FetchRetryOptions {\n\ttimeoutMs: number;\n\tretries?: number;\n\tsignal?: AbortSignal;\n\tlabel?: string;\n}\n\nfunction delay(milliseconds: number, label: string, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst handleAbort = () => {\n\t\t\tcleanup();\n\t\t\treject(new Error(`${label} request aborted`));\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t}, milliseconds);\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", handleAbort);\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\thandleAbort();\n\t\t\treturn;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", handleAbort, { once: true });\n\t});\n}\n\nasync function attemptOnce(\n\turl: string,\n\trequest: RequestInit,\n\ttimeoutMs: number,\n\tlabel: string,\n\tsignal: AbortSignal | undefined,\n): Promise<{ ok: true; response: Response; text: string } | { ok: false; error: Error }> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromParent = () => controller.abort(signal?.reason);\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\n\tif (signal?.aborted) abortFromParent();\n\telse signal?.addEventListener(\"abort\", abortFromParent, { once: true });\n\n\ttry {\n\t\tconst response = await fetch(url, { ...request, signal: controller.signal });\n\t\tconst text = await response.text();\n\t\treturn { ok: true, response, text };\n\t} catch (error) {\n\t\tif (timedOut) throw new Error(`${label} request timed out after ${timeoutMs / 1000}s`);\n\t\tif (signal?.aborted) throw new Error(`${label} request aborted`);\n\t\treturn { ok: false, error: error instanceof Error ? error : new Error(String(error)) };\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal?.removeEventListener(\"abort\", abortFromParent);\n\t}\n}\n\n/** Fetch with a per-attempt timeout and bounded retries for transient failures. */\nexport async function fetchWithRetry(\n\turl: string,\n\trequest: RequestInit,\n\toptions: FetchRetryOptions,\n): Promise<{ response: Response; text: string }> {\n\tconst retries = options.retries ?? 2;\n\tconst label = options.label ?? \"HTTP\";\n\tlet lastError: Error | undefined;\n\n\tfor (let attemptIndex = 0; attemptIndex <= retries; attemptIndex++) {\n\t\tif (attemptIndex > 0) await delay(1000 * attemptIndex, label, options.signal);\n\t\tconst outcome = await attemptOnce(url, request, options.timeoutMs, label, options.signal);\n\t\tif (!outcome.ok) {\n\t\t\tlastError = outcome.error;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { response, text } = outcome;\n\t\tconst retryable = response.status >= 500 || response.status === 429;\n\t\tif (!response.ok && retryable && attemptIndex < retries) {\n\t\t\tlastError = new Error(`${label} HTTP ${response.status}`);\n\t\t\tcontinue;\n\t\t}\n\t\treturn { response, text };\n\t}\n\n\tthrow lastError ?? new Error(`${label} request failed`);\n}\n"]}
@@ -0,0 +1,74 @@
1
+ function delay(milliseconds, label, signal) {
2
+ return new Promise((resolve, reject) => {
3
+ const handleAbort = () => {
4
+ cleanup();
5
+ reject(new Error(`${label} request aborted`));
6
+ };
7
+ const timer = setTimeout(() => {
8
+ cleanup();
9
+ resolve();
10
+ }, milliseconds);
11
+ const cleanup = () => {
12
+ clearTimeout(timer);
13
+ signal?.removeEventListener("abort", handleAbort);
14
+ };
15
+ if (signal?.aborted) {
16
+ handleAbort();
17
+ return;
18
+ }
19
+ signal?.addEventListener("abort", handleAbort, { once: true });
20
+ });
21
+ }
22
+ async function attemptOnce(url, request, timeoutMs, label, signal) {
23
+ const controller = new AbortController();
24
+ let timedOut = false;
25
+ const abortFromParent = () => controller.abort(signal?.reason);
26
+ const timeout = setTimeout(() => {
27
+ timedOut = true;
28
+ controller.abort();
29
+ }, timeoutMs);
30
+ if (signal?.aborted)
31
+ abortFromParent();
32
+ else
33
+ signal?.addEventListener("abort", abortFromParent, { once: true });
34
+ try {
35
+ const response = await fetch(url, { ...request, signal: controller.signal });
36
+ const text = await response.text();
37
+ return { ok: true, response, text };
38
+ }
39
+ catch (error) {
40
+ if (timedOut)
41
+ throw new Error(`${label} request timed out after ${timeoutMs / 1000}s`);
42
+ if (signal?.aborted)
43
+ throw new Error(`${label} request aborted`);
44
+ return { ok: false, error: error instanceof Error ? error : new Error(String(error)) };
45
+ }
46
+ finally {
47
+ clearTimeout(timeout);
48
+ signal?.removeEventListener("abort", abortFromParent);
49
+ }
50
+ }
51
+ /** Fetch with a per-attempt timeout and bounded retries for transient failures. */
52
+ export async function fetchWithRetry(url, request, options) {
53
+ const retries = options.retries ?? 2;
54
+ const label = options.label ?? "HTTP";
55
+ let lastError;
56
+ for (let attemptIndex = 0; attemptIndex <= retries; attemptIndex++) {
57
+ if (attemptIndex > 0)
58
+ await delay(1000 * attemptIndex, label, options.signal);
59
+ const outcome = await attemptOnce(url, request, options.timeoutMs, label, options.signal);
60
+ if (!outcome.ok) {
61
+ lastError = outcome.error;
62
+ continue;
63
+ }
64
+ const { response, text } = outcome;
65
+ const retryable = response.status >= 500 || response.status === 429;
66
+ if (!response.ok && retryable && attemptIndex < retries) {
67
+ lastError = new Error(`${label} HTTP ${response.status}`);
68
+ continue;
69
+ }
70
+ return { response, text };
71
+ }
72
+ throw lastError ?? new Error(`${label} request failed`);
73
+ }
74
+ //# sourceMappingURL=http.js.map