@handy_wote/pi-coding-agent 0.81.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 (863) hide show
  1. package/CHANGELOG.md +5107 -0
  2. package/README.md +694 -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 +95 -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 +98 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +459 -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 +2684 -0
  66. package/dist/core/agent-session.js.map +1 -0
  67. package/dist/core/auth-storage.d.ts +56 -0
  68. package/dist/core/auth-storage.d.ts.map +1 -0
  69. package/dist/core/auth-storage.js +232 -0
  70. package/dist/core/auth-storage.js.map +1 -0
  71. package/dist/core/bash-executor.d.ts +32 -0
  72. package/dist/core/bash-executor.d.ts.map +1 -0
  73. package/dist/core/bash-executor.js +111 -0
  74. package/dist/core/bash-executor.js.map +1 -0
  75. package/dist/core/cache-stats.d.ts +49 -0
  76. package/dist/core/cache-stats.d.ts.map +1 -0
  77. package/dist/core/cache-stats.js +101 -0
  78. package/dist/core/cache-stats.js.map +1 -0
  79. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  80. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  81. package/dist/core/compaction/branch-summarization.js +246 -0
  82. package/dist/core/compaction/branch-summarization.js.map +1 -0
  83. package/dist/core/compaction/compaction.d.ts +137 -0
  84. package/dist/core/compaction/compaction.d.ts.map +1 -0
  85. package/dist/core/compaction/compaction.js +637 -0
  86. package/dist/core/compaction/compaction.js.map +1 -0
  87. package/dist/core/compaction/index.d.ts +7 -0
  88. package/dist/core/compaction/index.d.ts.map +1 -0
  89. package/dist/core/compaction/index.js +7 -0
  90. package/dist/core/compaction/index.js.map +1 -0
  91. package/dist/core/compaction/utils.d.ts +38 -0
  92. package/dist/core/compaction/utils.d.ts.map +1 -0
  93. package/dist/core/compaction/utils.js +142 -0
  94. package/dist/core/compaction/utils.js.map +1 -0
  95. package/dist/core/defaults.d.ts +3 -0
  96. package/dist/core/defaults.d.ts.map +1 -0
  97. package/dist/core/defaults.js +2 -0
  98. package/dist/core/defaults.js.map +1 -0
  99. package/dist/core/diagnostics.d.ts +15 -0
  100. package/dist/core/diagnostics.d.ts.map +1 -0
  101. package/dist/core/diagnostics.js +2 -0
  102. package/dist/core/diagnostics.js.map +1 -0
  103. package/dist/core/event-bus.d.ts +9 -0
  104. package/dist/core/event-bus.d.ts.map +1 -0
  105. package/dist/core/event-bus.js +25 -0
  106. package/dist/core/event-bus.js.map +1 -0
  107. package/dist/core/exec.d.ts +29 -0
  108. package/dist/core/exec.d.ts.map +1 -0
  109. package/dist/core/exec.js +75 -0
  110. package/dist/core/exec.js.map +1 -0
  111. package/dist/core/experimental.d.ts +2 -0
  112. package/dist/core/experimental.d.ts.map +1 -0
  113. package/dist/core/experimental.js +4 -0
  114. package/dist/core/experimental.js.map +1 -0
  115. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  116. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  117. package/dist/core/export-html/ansi-to-html.js +249 -0
  118. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  119. package/dist/core/export-html/index.d.ts +37 -0
  120. package/dist/core/export-html/index.d.ts.map +1 -0
  121. package/dist/core/export-html/index.js +226 -0
  122. package/dist/core/export-html/index.js.map +1 -0
  123. package/dist/core/export-html/template.css +1066 -0
  124. package/dist/core/export-html/template.html +55 -0
  125. package/dist/core/export-html/template.js +1864 -0
  126. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  127. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  128. package/dist/core/export-html/tool-renderer.js +108 -0
  129. package/dist/core/export-html/tool-renderer.js.map +1 -0
  130. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  131. package/dist/core/export-html/vendor/marked.min.js +78 -0
  132. package/dist/core/extensions/index.d.ts +12 -0
  133. package/dist/core/extensions/index.d.ts.map +1 -0
  134. package/dist/core/extensions/index.js +9 -0
  135. package/dist/core/extensions/index.js.map +1 -0
  136. package/dist/core/extensions/loader.d.ts +23 -0
  137. package/dist/core/extensions/loader.d.ts.map +1 -0
  138. package/dist/core/extensions/loader.js +586 -0
  139. package/dist/core/extensions/loader.js.map +1 -0
  140. package/dist/core/extensions/runner.d.ts +171 -0
  141. package/dist/core/extensions/runner.d.ts.map +1 -0
  142. package/dist/core/extensions/runner.js +953 -0
  143. package/dist/core/extensions/runner.js.map +1 -0
  144. package/dist/core/extensions/types.d.ts +1259 -0
  145. package/dist/core/extensions/types.d.ts.map +1 -0
  146. package/dist/core/extensions/types.js +45 -0
  147. package/dist/core/extensions/types.js.map +1 -0
  148. package/dist/core/extensions/wrapper.d.ts +20 -0
  149. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  150. package/dist/core/extensions/wrapper.js +41 -0
  151. package/dist/core/extensions/wrapper.js.map +1 -0
  152. package/dist/core/footer-data-provider.d.ts +54 -0
  153. package/dist/core/footer-data-provider.d.ts.map +1 -0
  154. package/dist/core/footer-data-provider.js +338 -0
  155. package/dist/core/footer-data-provider.js.map +1 -0
  156. package/dist/core/http-dispatcher.d.ts +22 -0
  157. package/dist/core/http-dispatcher.d.ts.map +1 -0
  158. package/dist/core/http-dispatcher.js +91 -0
  159. package/dist/core/http-dispatcher.js.map +1 -0
  160. package/dist/core/index.d.ts +13 -0
  161. package/dist/core/index.d.ts.map +1 -0
  162. package/dist/core/index.js +13 -0
  163. package/dist/core/index.js.map +1 -0
  164. package/dist/core/keybindings.d.ts +390 -0
  165. package/dist/core/keybindings.d.ts.map +1 -0
  166. package/dist/core/keybindings.js +296 -0
  167. package/dist/core/keybindings.js.map +1 -0
  168. package/dist/core/messages.d.ts +77 -0
  169. package/dist/core/messages.d.ts.map +1 -0
  170. package/dist/core/messages.js +123 -0
  171. package/dist/core/messages.js.map +1 -0
  172. package/dist/core/model-metadata.d.ts +30 -0
  173. package/dist/core/model-metadata.d.ts.map +1 -0
  174. package/dist/core/model-metadata.js +139 -0
  175. package/dist/core/model-metadata.js.map +1 -0
  176. package/dist/core/model-registry.d.ts +48 -0
  177. package/dist/core/model-registry.d.ts.map +1 -0
  178. package/dist/core/model-registry.js +105 -0
  179. package/dist/core/model-registry.js.map +1 -0
  180. package/dist/core/model-resolver.d.ts +121 -0
  181. package/dist/core/model-resolver.d.ts.map +1 -0
  182. package/dist/core/model-resolver.js +534 -0
  183. package/dist/core/model-resolver.js.map +1 -0
  184. package/dist/core/model-runtime.d.ts +84 -0
  185. package/dist/core/model-runtime.d.ts.map +1 -0
  186. package/dist/core/model-runtime.js +453 -0
  187. package/dist/core/model-runtime.js.map +1 -0
  188. package/dist/core/models-store.d.ts +17 -0
  189. package/dist/core/models-store.d.ts.map +1 -0
  190. package/dist/core/models-store.js +45 -0
  191. package/dist/core/models-store.js.map +1 -0
  192. package/dist/core/output-guard.d.ts +7 -0
  193. package/dist/core/output-guard.d.ts.map +1 -0
  194. package/dist/core/output-guard.js +89 -0
  195. package/dist/core/output-guard.js.map +1 -0
  196. package/dist/core/package-manager.d.ts +210 -0
  197. package/dist/core/package-manager.d.ts.map +1 -0
  198. package/dist/core/package-manager.js +2135 -0
  199. package/dist/core/package-manager.js.map +1 -0
  200. package/dist/core/profile-runtime.d.ts +4 -0
  201. package/dist/core/profile-runtime.d.ts.map +1 -0
  202. package/dist/core/profile-runtime.js +57 -0
  203. package/dist/core/profile-runtime.js.map +1 -0
  204. package/dist/core/profiles-store.d.ts +17 -0
  205. package/dist/core/profiles-store.d.ts.map +1 -0
  206. package/dist/core/profiles-store.js +100 -0
  207. package/dist/core/profiles-store.js.map +1 -0
  208. package/dist/core/profiles-types.d.ts +31 -0
  209. package/dist/core/profiles-types.d.ts.map +1 -0
  210. package/dist/core/profiles-types.js +4 -0
  211. package/dist/core/profiles-types.js.map +1 -0
  212. package/dist/core/project-trust.d.ts +15 -0
  213. package/dist/core/project-trust.d.ts.map +1 -0
  214. package/dist/core/project-trust.js +59 -0
  215. package/dist/core/project-trust.js.map +1 -0
  216. package/dist/core/prompt-templates.d.ts +54 -0
  217. package/dist/core/prompt-templates.d.ts.map +1 -0
  218. package/dist/core/prompt-templates.js +236 -0
  219. package/dist/core/prompt-templates.js.map +1 -0
  220. package/dist/core/provider-attribution.d.ts +4 -0
  221. package/dist/core/provider-attribution.d.ts.map +1 -0
  222. package/dist/core/provider-attribution.js +72 -0
  223. package/dist/core/provider-attribution.js.map +1 -0
  224. package/dist/core/radius.d.ts +2 -0
  225. package/dist/core/radius.d.ts.map +1 -0
  226. package/dist/core/radius.js +2 -0
  227. package/dist/core/radius.js.map +1 -0
  228. package/dist/core/resource-loader.d.ts +206 -0
  229. package/dist/core/resource-loader.d.ts.map +1 -0
  230. package/dist/core/resource-loader.js +817 -0
  231. package/dist/core/resource-loader.js.map +1 -0
  232. package/dist/core/sdk.d.ts +106 -0
  233. package/dist/core/sdk.d.ts.map +1 -0
  234. package/dist/core/sdk.js +269 -0
  235. package/dist/core/sdk.js.map +1 -0
  236. package/dist/core/session-cwd.d.ts +19 -0
  237. package/dist/core/session-cwd.d.ts.map +1 -0
  238. package/dist/core/session-cwd.js +38 -0
  239. package/dist/core/session-cwd.js.map +1 -0
  240. package/dist/core/session-manager.d.ts +356 -0
  241. package/dist/core/session-manager.d.ts.map +1 -0
  242. package/dist/core/session-manager.js +1338 -0
  243. package/dist/core/session-manager.js.map +1 -0
  244. package/dist/core/settings-manager.d.ts +297 -0
  245. package/dist/core/settings-manager.d.ts.map +1 -0
  246. package/dist/core/settings-manager.js +902 -0
  247. package/dist/core/settings-manager.js.map +1 -0
  248. package/dist/core/skills.d.ts +60 -0
  249. package/dist/core/skills.d.ts.map +1 -0
  250. package/dist/core/skills.js +387 -0
  251. package/dist/core/skills.js.map +1 -0
  252. package/dist/core/slash-commands.d.ts +15 -0
  253. package/dist/core/slash-commands.d.ts.map +1 -0
  254. package/dist/core/slash-commands.js +25 -0
  255. package/dist/core/slash-commands.js.map +1 -0
  256. package/dist/core/source-info.d.ts +18 -0
  257. package/dist/core/source-info.d.ts.map +1 -0
  258. package/dist/core/source-info.js +19 -0
  259. package/dist/core/source-info.js.map +1 -0
  260. package/dist/core/system-prompt.d.ts +28 -0
  261. package/dist/core/system-prompt.d.ts.map +1 -0
  262. package/dist/core/system-prompt.js +110 -0
  263. package/dist/core/system-prompt.js.map +1 -0
  264. package/dist/core/telemetry.d.ts +3 -0
  265. package/dist/core/telemetry.d.ts.map +1 -0
  266. package/dist/core/telemetry.js +9 -0
  267. package/dist/core/telemetry.js.map +1 -0
  268. package/dist/core/timings.d.ts +10 -0
  269. package/dist/core/timings.d.ts.map +1 -0
  270. package/dist/core/timings.js +41 -0
  271. package/dist/core/timings.js.map +1 -0
  272. package/dist/core/tools/bash.d.ts +68 -0
  273. package/dist/core/tools/bash.d.ts.map +1 -0
  274. package/dist/core/tools/bash.js +361 -0
  275. package/dist/core/tools/bash.js.map +1 -0
  276. package/dist/core/tools/edit-diff.d.ts +106 -0
  277. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  278. package/dist/core/tools/edit-diff.js +424 -0
  279. package/dist/core/tools/edit-diff.js.map +1 -0
  280. package/dist/core/tools/edit.d.ts +51 -0
  281. package/dist/core/tools/edit.d.ts.map +1 -0
  282. package/dist/core/tools/edit.js +284 -0
  283. package/dist/core/tools/edit.js.map +1 -0
  284. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  285. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  286. package/dist/core/tools/file-mutation-queue.js +52 -0
  287. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  288. package/dist/core/tools/find.d.ts +35 -0
  289. package/dist/core/tools/find.d.ts.map +1 -0
  290. package/dist/core/tools/find.js +305 -0
  291. package/dist/core/tools/find.js.map +1 -0
  292. package/dist/core/tools/grep.d.ts +37 -0
  293. package/dist/core/tools/grep.d.ts.map +1 -0
  294. package/dist/core/tools/grep.js +304 -0
  295. package/dist/core/tools/grep.js.map +1 -0
  296. package/dist/core/tools/index.d.ts +40 -0
  297. package/dist/core/tools/index.d.ts.map +1 -0
  298. package/dist/core/tools/index.js +112 -0
  299. package/dist/core/tools/index.js.map +1 -0
  300. package/dist/core/tools/ls.d.ts +37 -0
  301. package/dist/core/tools/ls.d.ts.map +1 -0
  302. package/dist/core/tools/ls.js +167 -0
  303. package/dist/core/tools/ls.js.map +1 -0
  304. package/dist/core/tools/output-accumulator.d.ts +52 -0
  305. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  306. package/dist/core/tools/output-accumulator.js +184 -0
  307. package/dist/core/tools/output-accumulator.js.map +1 -0
  308. package/dist/core/tools/path-utils.d.ts +10 -0
  309. package/dist/core/tools/path-utils.d.ts.map +1 -0
  310. package/dist/core/tools/path-utils.js +99 -0
  311. package/dist/core/tools/path-utils.js.map +1 -0
  312. package/dist/core/tools/read.d.ts +35 -0
  313. package/dist/core/tools/read.d.ts.map +1 -0
  314. package/dist/core/tools/read.js +276 -0
  315. package/dist/core/tools/read.js.map +1 -0
  316. package/dist/core/tools/render-utils.d.ts +24 -0
  317. package/dist/core/tools/render-utils.d.ts.map +1 -0
  318. package/dist/core/tools/render-utils.js +65 -0
  319. package/dist/core/tools/render-utils.js.map +1 -0
  320. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  321. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  322. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  323. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  324. package/dist/core/tools/truncate.d.ts +70 -0
  325. package/dist/core/tools/truncate.d.ts.map +1 -0
  326. package/dist/core/tools/truncate.js +215 -0
  327. package/dist/core/tools/truncate.js.map +1 -0
  328. package/dist/core/tools/write.d.ts +26 -0
  329. package/dist/core/tools/write.d.ts.map +1 -0
  330. package/dist/core/tools/write.js +197 -0
  331. package/dist/core/tools/write.js.map +1 -0
  332. package/dist/core/trust-manager.d.ts +36 -0
  333. package/dist/core/trust-manager.d.ts.map +1 -0
  334. package/dist/core/trust-manager.js +202 -0
  335. package/dist/core/trust-manager.js.map +1 -0
  336. package/dist/core/usage-totals.d.ts +19 -0
  337. package/dist/core/usage-totals.d.ts.map +1 -0
  338. package/dist/core/usage-totals.js +52 -0
  339. package/dist/core/usage-totals.js.map +1 -0
  340. package/dist/extensions/index.d.ts +3 -0
  341. package/dist/extensions/index.d.ts.map +1 -0
  342. package/dist/extensions/index.js +3 -0
  343. package/dist/extensions/index.js.map +1 -0
  344. package/dist/extensions/llama/client.d.ts +61 -0
  345. package/dist/extensions/llama/client.d.ts.map +1 -0
  346. package/dist/extensions/llama/client.js +302 -0
  347. package/dist/extensions/llama/client.js.map +1 -0
  348. package/dist/extensions/llama/huggingface.d.ts +23 -0
  349. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  350. package/dist/extensions/llama/huggingface.js +141 -0
  351. package/dist/extensions/llama/huggingface.js.map +1 -0
  352. package/dist/extensions/llama/index.d.ts +3 -0
  353. package/dist/extensions/llama/index.d.ts.map +1 -0
  354. package/dist/extensions/llama/index.js +208 -0
  355. package/dist/extensions/llama/index.js.map +1 -0
  356. package/dist/extensions/llama/provider.d.ts +10 -0
  357. package/dist/extensions/llama/provider.d.ts.map +1 -0
  358. package/dist/extensions/llama/provider.js +102 -0
  359. package/dist/extensions/llama/provider.js.map +1 -0
  360. package/dist/extensions/llama/ui.d.ts +42 -0
  361. package/dist/extensions/llama/ui.d.ts.map +1 -0
  362. package/dist/extensions/llama/ui.js +416 -0
  363. package/dist/extensions/llama/ui.js.map +1 -0
  364. package/dist/index.d.ts +35 -0
  365. package/dist/index.d.ts.map +1 -0
  366. package/dist/index.js +47 -0
  367. package/dist/index.js.map +1 -0
  368. package/dist/main.d.ts +12 -0
  369. package/dist/main.d.ts.map +1 -0
  370. package/dist/main.js +706 -0
  371. package/dist/main.js.map +1 -0
  372. package/dist/migrations.d.ts +33 -0
  373. package/dist/migrations.d.ts.map +1 -0
  374. package/dist/migrations.js +281 -0
  375. package/dist/migrations.js.map +1 -0
  376. package/dist/modes/index.d.ts +9 -0
  377. package/dist/modes/index.d.ts.map +1 -0
  378. package/dist/modes/index.js +8 -0
  379. package/dist/modes/index.js.map +1 -0
  380. package/dist/modes/interactive/assets/clankolas.png +0 -0
  381. package/dist/modes/interactive/components/armin.d.ts +34 -0
  382. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  383. package/dist/modes/interactive/components/armin.js +333 -0
  384. package/dist/modes/interactive/components/armin.js.map +1 -0
  385. package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  386. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  387. package/dist/modes/interactive/components/assistant-message.js +141 -0
  388. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  389. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  390. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  391. package/dist/modes/interactive/components/bash-execution.js +175 -0
  392. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  393. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  394. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  395. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  396. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  397. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  398. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  399. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  400. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  401. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  402. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  403. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  404. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  405. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  406. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  407. package/dist/modes/interactive/components/config-selector.js +761 -0
  408. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  409. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  410. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  411. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  412. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  413. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  414. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/custom-editor.js +70 -0
  416. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  417. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  418. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/custom-entry.js +52 -0
  420. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  421. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  422. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/custom-message.js +79 -0
  424. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  425. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  426. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/daxnuts.js +140 -0
  428. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  429. package/dist/modes/interactive/components/diff.d.ts +12 -0
  430. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/diff.js +133 -0
  432. package/dist/modes/interactive/components/diff.js.map +1 -0
  433. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  434. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  436. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  437. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  438. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  440. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  441. package/dist/modes/interactive/components/entity-list-theme.d.ts +3 -0
  442. package/dist/modes/interactive/components/entity-list-theme.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/entity-list-theme.js +17 -0
  444. package/dist/modes/interactive/components/entity-list-theme.js.map +1 -0
  445. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  446. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/extension-editor.js +128 -0
  448. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  449. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  450. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/extension-input.js +61 -0
  452. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  453. package/dist/modes/interactive/components/extension-selector.d.ts +22 -0
  454. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/extension-selector.js +61 -0
  456. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  457. package/dist/modes/interactive/components/first-time-setup.d.ts +24 -0
  458. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/first-time-setup.js +92 -0
  460. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  461. package/dist/modes/interactive/components/footer.d.ts +32 -0
  462. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/footer.js +222 -0
  464. package/dist/modes/interactive/components/footer.js.map +1 -0
  465. package/dist/modes/interactive/components/index.d.ts +32 -0
  466. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/index.js +33 -0
  468. package/dist/modes/interactive/components/index.js.map +1 -0
  469. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  470. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  472. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  473. package/dist/modes/interactive/components/model-selector.d.ts +50 -0
  474. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/model-selector.js +240 -0
  476. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  477. package/dist/modes/interactive/components/scoped-models-selector.d.ts +36 -0
  478. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/scoped-models-selector.js +222 -0
  480. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  481. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  482. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  484. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  485. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  486. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/session-selector.js +779 -0
  488. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  489. package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  490. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/settings-selector.js +593 -0
  492. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  493. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  494. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  496. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  497. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  498. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  500. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  501. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  502. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/status-indicator.js +60 -0
  504. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  505. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  506. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/theme-selector.js +46 -0
  508. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  509. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  510. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  512. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  513. package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  514. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/tool-execution.js +317 -0
  516. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  517. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  518. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  520. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  521. package/dist/modes/interactive/components/trust-selector.d.ts +21 -0
  522. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/trust-selector.js +72 -0
  524. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  525. package/dist/modes/interactive/components/user-message-selector.d.ts +16 -0
  526. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  527. package/dist/modes/interactive/components/user-message-selector.js +53 -0
  528. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  529. package/dist/modes/interactive/components/user-message.d.ts +14 -0
  530. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  531. package/dist/modes/interactive/components/user-message.js +42 -0
  532. package/dist/modes/interactive/components/user-message.js.map +1 -0
  533. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  534. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  536. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  537. package/dist/modes/interactive/interactive-mode.d.ts +391 -0
  538. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  539. package/dist/modes/interactive/interactive-mode.js +4996 -0
  540. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  541. package/dist/modes/interactive/model-search.d.ts +12 -0
  542. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  543. package/dist/modes/interactive/model-search.js +15 -0
  544. package/dist/modes/interactive/model-search.js.map +1 -0
  545. package/dist/modes/interactive/theme/dark.json +87 -0
  546. package/dist/modes/interactive/theme/light.json +86 -0
  547. package/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  548. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  549. package/dist/modes/interactive/theme/theme-controller.js +102 -0
  550. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  551. package/dist/modes/interactive/theme/theme-schema.json +340 -0
  552. package/dist/modes/interactive/theme/theme.d.ts +120 -0
  553. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  554. package/dist/modes/interactive/theme/theme.js +1063 -0
  555. package/dist/modes/interactive/theme/theme.js.map +1 -0
  556. package/dist/modes/print-mode.d.ts +28 -0
  557. package/dist/modes/print-mode.d.ts.map +1 -0
  558. package/dist/modes/print-mode.js +132 -0
  559. package/dist/modes/print-mode.js.map +1 -0
  560. package/dist/modes/rpc/jsonl.d.ts +17 -0
  561. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  562. package/dist/modes/rpc/jsonl.js +49 -0
  563. package/dist/modes/rpc/jsonl.js.map +1 -0
  564. package/dist/modes/rpc/rpc-client.d.ts +246 -0
  565. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  566. package/dist/modes/rpc/rpc-client.js +488 -0
  567. package/dist/modes/rpc/rpc-client.js.map +1 -0
  568. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  569. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  570. package/dist/modes/rpc/rpc-mode.js +639 -0
  571. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  572. package/dist/modes/rpc/rpc-types.d.ts +457 -0
  573. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  574. package/dist/modes/rpc/rpc-types.js +8 -0
  575. package/dist/modes/rpc/rpc-types.js.map +1 -0
  576. package/dist/package-manager-cli.d.ts +8 -0
  577. package/dist/package-manager-cli.d.ts.map +1 -0
  578. package/dist/package-manager-cli.js +775 -0
  579. package/dist/package-manager-cli.js.map +1 -0
  580. package/dist/rpc-entry.d.ts +3 -0
  581. package/dist/rpc-entry.d.ts.map +1 -0
  582. package/dist/rpc-entry.js +10 -0
  583. package/dist/rpc-entry.js.map +1 -0
  584. package/dist/utils/ansi.d.ts +2 -0
  585. package/dist/utils/ansi.d.ts.map +1 -0
  586. package/dist/utils/ansi.js +52 -0
  587. package/dist/utils/ansi.js.map +1 -0
  588. package/dist/utils/changelog.d.ts +22 -0
  589. package/dist/utils/changelog.d.ts.map +1 -0
  590. package/dist/utils/changelog.js +165 -0
  591. package/dist/utils/changelog.js.map +1 -0
  592. package/dist/utils/child-process.d.ts +18 -0
  593. package/dist/utils/child-process.d.ts.map +1 -0
  594. package/dist/utils/child-process.js +106 -0
  595. package/dist/utils/child-process.js.map +1 -0
  596. package/dist/utils/clipboard-image.d.ts +11 -0
  597. package/dist/utils/clipboard-image.d.ts.map +1 -0
  598. package/dist/utils/clipboard-image.js +245 -0
  599. package/dist/utils/clipboard-image.js.map +1 -0
  600. package/dist/utils/clipboard-native.d.ts +11 -0
  601. package/dist/utils/clipboard-native.d.ts.map +1 -0
  602. package/dist/utils/clipboard-native.js +20 -0
  603. package/dist/utils/clipboard-native.js.map +1 -0
  604. package/dist/utils/clipboard.d.ts +4 -0
  605. package/dist/utils/clipboard.d.ts.map +1 -0
  606. package/dist/utils/clipboard.js +130 -0
  607. package/dist/utils/clipboard.js.map +1 -0
  608. package/dist/utils/deprecation.d.ts +4 -0
  609. package/dist/utils/deprecation.d.ts.map +1 -0
  610. package/dist/utils/deprecation.js +13 -0
  611. package/dist/utils/deprecation.js.map +1 -0
  612. package/dist/utils/exif-orientation.d.ts +5 -0
  613. package/dist/utils/exif-orientation.d.ts.map +1 -0
  614. package/dist/utils/exif-orientation.js +158 -0
  615. package/dist/utils/exif-orientation.js.map +1 -0
  616. package/dist/utils/frontmatter.d.ts +8 -0
  617. package/dist/utils/frontmatter.d.ts.map +1 -0
  618. package/dist/utils/frontmatter.js +26 -0
  619. package/dist/utils/frontmatter.js.map +1 -0
  620. package/dist/utils/fs-watch.d.ts +5 -0
  621. package/dist/utils/fs-watch.d.ts.map +1 -0
  622. package/dist/utils/fs-watch.js +25 -0
  623. package/dist/utils/fs-watch.js.map +1 -0
  624. package/dist/utils/git.d.ts +26 -0
  625. package/dist/utils/git.d.ts.map +1 -0
  626. package/dist/utils/git.js +195 -0
  627. package/dist/utils/git.js.map +1 -0
  628. package/dist/utils/html.d.ts +7 -0
  629. package/dist/utils/html.d.ts.map +1 -0
  630. package/dist/utils/html.js +40 -0
  631. package/dist/utils/html.js.map +1 -0
  632. package/dist/utils/image-convert.d.ts +10 -0
  633. package/dist/utils/image-convert.d.ts.map +1 -0
  634. package/dist/utils/image-convert.js +45 -0
  635. package/dist/utils/image-convert.js.map +1 -0
  636. package/dist/utils/image-process.d.ts +18 -0
  637. package/dist/utils/image-process.d.ts.map +1 -0
  638. package/dist/utils/image-process.js +83 -0
  639. package/dist/utils/image-process.js.map +1 -0
  640. package/dist/utils/image-resize-core.d.ts +30 -0
  641. package/dist/utils/image-resize-core.d.ts.map +1 -0
  642. package/dist/utils/image-resize-core.js +124 -0
  643. package/dist/utils/image-resize-core.js.map +1 -0
  644. package/dist/utils/image-resize-worker.d.ts +2 -0
  645. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  646. package/dist/utils/image-resize-worker.js +31 -0
  647. package/dist/utils/image-resize-worker.js.map +1 -0
  648. package/dist/utils/image-resize.d.ts +16 -0
  649. package/dist/utils/image-resize.d.ts.map +1 -0
  650. package/dist/utils/image-resize.js +97 -0
  651. package/dist/utils/image-resize.js.map +1 -0
  652. package/dist/utils/json.d.ts +3 -0
  653. package/dist/utils/json.d.ts.map +1 -0
  654. package/dist/utils/json.js +7 -0
  655. package/dist/utils/json.js.map +1 -0
  656. package/dist/utils/mime.d.ts +3 -0
  657. package/dist/utils/mime.d.ts.map +1 -0
  658. package/dist/utils/mime.js +110 -0
  659. package/dist/utils/mime.js.map +1 -0
  660. package/dist/utils/open-browser.d.ts +9 -0
  661. package/dist/utils/open-browser.d.ts.map +1 -0
  662. package/dist/utils/open-browser.js +22 -0
  663. package/dist/utils/open-browser.js.map +1 -0
  664. package/dist/utils/paths.d.ts +31 -0
  665. package/dist/utils/paths.d.ts.map +1 -0
  666. package/dist/utils/paths.js +92 -0
  667. package/dist/utils/paths.js.map +1 -0
  668. package/dist/utils/photon.d.ts +21 -0
  669. package/dist/utils/photon.d.ts.map +1 -0
  670. package/dist/utils/photon.js +121 -0
  671. package/dist/utils/photon.js.map +1 -0
  672. package/dist/utils/pi-user-agent.d.ts +2 -0
  673. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  674. package/dist/utils/pi-user-agent.js +5 -0
  675. package/dist/utils/pi-user-agent.js.map +1 -0
  676. package/dist/utils/shell.d.ts +31 -0
  677. package/dist/utils/shell.d.ts.map +1 -0
  678. package/dist/utils/shell.js +202 -0
  679. package/dist/utils/shell.js.map +1 -0
  680. package/dist/utils/sleep.d.ts +5 -0
  681. package/dist/utils/sleep.d.ts.map +1 -0
  682. package/dist/utils/sleep.js +17 -0
  683. package/dist/utils/sleep.js.map +1 -0
  684. package/dist/utils/syntax-highlight.d.ts +12 -0
  685. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  686. package/dist/utils/syntax-highlight.js +118 -0
  687. package/dist/utils/syntax-highlight.js.map +1 -0
  688. package/dist/utils/tools-manager.d.ts +3 -0
  689. package/dist/utils/tools-manager.d.ts.map +1 -0
  690. package/dist/utils/tools-manager.js +328 -0
  691. package/dist/utils/tools-manager.js.map +1 -0
  692. package/dist/utils/version-check.d.ts +15 -0
  693. package/dist/utils/version-check.d.ts.map +1 -0
  694. package/dist/utils/version-check.js +59 -0
  695. package/dist/utils/version-check.js.map +1 -0
  696. package/dist/utils/windows-self-update.d.ts +3 -0
  697. package/dist/utils/windows-self-update.d.ts.map +1 -0
  698. package/dist/utils/windows-self-update.js +77 -0
  699. package/dist/utils/windows-self-update.js.map +1 -0
  700. package/docs/compaction.md +401 -0
  701. package/docs/containerization.md +111 -0
  702. package/docs/custom-provider.md +763 -0
  703. package/docs/development.md +71 -0
  704. package/docs/docs.json +156 -0
  705. package/docs/extensions.md +2953 -0
  706. package/docs/images/doom-extension.png +0 -0
  707. package/docs/images/exy.png +0 -0
  708. package/docs/images/interactive-mode.png +0 -0
  709. package/docs/images/tree-view.png +0 -0
  710. package/docs/index.md +83 -0
  711. package/docs/json.md +86 -0
  712. package/docs/keybindings.md +198 -0
  713. package/docs/llama-cpp.md +99 -0
  714. package/docs/models.md +540 -0
  715. package/docs/packages.md +228 -0
  716. package/docs/prompt-templates.md +96 -0
  717. package/docs/providers.md +301 -0
  718. package/docs/quickstart.md +165 -0
  719. package/docs/rpc.md +1559 -0
  720. package/docs/sdk.md +1186 -0
  721. package/docs/security.md +59 -0
  722. package/docs/session-format.md +436 -0
  723. package/docs/sessions.md +145 -0
  724. package/docs/settings.md +319 -0
  725. package/docs/shell-aliases.md +13 -0
  726. package/docs/skills.md +231 -0
  727. package/docs/terminal-setup.md +142 -0
  728. package/docs/termux.md +127 -0
  729. package/docs/themes.md +297 -0
  730. package/docs/tmux.md +63 -0
  731. package/docs/tui.md +942 -0
  732. package/docs/usage.md +311 -0
  733. package/docs/windows.md +17 -0
  734. package/examples/README.md +25 -0
  735. package/examples/extensions/README.md +213 -0
  736. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  737. package/examples/extensions/bash-spawn-hook.ts +30 -0
  738. package/examples/extensions/bookmark.ts +50 -0
  739. package/examples/extensions/border-status-editor.ts +150 -0
  740. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  741. package/examples/extensions/claude-rules.ts +86 -0
  742. package/examples/extensions/commands.ts +72 -0
  743. package/examples/extensions/confirm-destructive.ts +59 -0
  744. package/examples/extensions/custom-compaction.ts +129 -0
  745. package/examples/extensions/custom-footer.ts +64 -0
  746. package/examples/extensions/custom-header.ts +73 -0
  747. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  748. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  749. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  750. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
  751. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  752. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  753. package/examples/extensions/dirty-repo-guard.ts +56 -0
  754. package/examples/extensions/doom-overlay/README.md +46 -0
  755. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  756. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  757. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  758. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  759. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  760. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  761. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  762. package/examples/extensions/doom-overlay/index.ts +74 -0
  763. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  764. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  765. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  766. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  767. package/examples/extensions/dynamic-resources/index.ts +15 -0
  768. package/examples/extensions/dynamic-tools.ts +74 -0
  769. package/examples/extensions/entry-renderer.ts +41 -0
  770. package/examples/extensions/event-bus.ts +43 -0
  771. package/examples/extensions/file-trigger.ts +41 -0
  772. package/examples/extensions/git-checkpoint.ts +53 -0
  773. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  774. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  775. package/examples/extensions/gondolin/index.ts +531 -0
  776. package/examples/extensions/gondolin/package-lock.json +185 -0
  777. package/examples/extensions/gondolin/package.json +19 -0
  778. package/examples/extensions/handoff.ts +191 -0
  779. package/examples/extensions/hello.ts +26 -0
  780. package/examples/extensions/hidden-thinking-label.ts +53 -0
  781. package/examples/extensions/inline-bash.ts +94 -0
  782. package/examples/extensions/input-transform-streaming.ts +39 -0
  783. package/examples/extensions/input-transform.ts +43 -0
  784. package/examples/extensions/interactive-shell.ts +196 -0
  785. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  786. package/examples/extensions/mac-system-theme.ts +47 -0
  787. package/examples/extensions/message-renderer.ts +59 -0
  788. package/examples/extensions/minimal-mode.ts +426 -0
  789. package/examples/extensions/modal-editor.ts +85 -0
  790. package/examples/extensions/model-status.ts +31 -0
  791. package/examples/extensions/notify.ts +55 -0
  792. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  793. package/examples/extensions/overlay-test.ts +153 -0
  794. package/examples/extensions/permission-gate.ts +34 -0
  795. package/examples/extensions/pirate.ts +47 -0
  796. package/examples/extensions/plan-mode/README.md +66 -0
  797. package/examples/extensions/plan-mode/index.ts +390 -0
  798. package/examples/extensions/plan-mode/utils.ts +168 -0
  799. package/examples/extensions/preset.ts +436 -0
  800. package/examples/extensions/project-trust.ts +64 -0
  801. package/examples/extensions/prompt-customizer.ts +97 -0
  802. package/examples/extensions/protected-paths.ts +30 -0
  803. package/examples/extensions/provider-payload.ts +18 -0
  804. package/examples/extensions/qna.ts +122 -0
  805. package/examples/extensions/question.ts +278 -0
  806. package/examples/extensions/questionnaire.ts +440 -0
  807. package/examples/extensions/rainbow-editor.ts +88 -0
  808. package/examples/extensions/reload-runtime.ts +37 -0
  809. package/examples/extensions/rpc-demo.ts +118 -0
  810. package/examples/extensions/sandbox/index.ts +321 -0
  811. package/examples/extensions/sandbox/package-lock.json +92 -0
  812. package/examples/extensions/sandbox/package.json +19 -0
  813. package/examples/extensions/send-user-message.ts +97 -0
  814. package/examples/extensions/session-name.ts +27 -0
  815. package/examples/extensions/shutdown-command.ts +63 -0
  816. package/examples/extensions/snake.ts +343 -0
  817. package/examples/extensions/space-invaders.ts +560 -0
  818. package/examples/extensions/ssh.ts +220 -0
  819. package/examples/extensions/status-line.ts +32 -0
  820. package/examples/extensions/structured-output.ts +65 -0
  821. package/examples/extensions/subagent/README.md +175 -0
  822. package/examples/extensions/subagent/agents/planner.md +37 -0
  823. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  824. package/examples/extensions/subagent/agents/scout.md +50 -0
  825. package/examples/extensions/subagent/agents/worker.md +24 -0
  826. package/examples/extensions/subagent/agents.ts +126 -0
  827. package/examples/extensions/subagent/index.ts +1015 -0
  828. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  829. package/examples/extensions/subagent/prompts/implement.md +10 -0
  830. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  831. package/examples/extensions/summarize.ts +207 -0
  832. package/examples/extensions/system-prompt-header.ts +17 -0
  833. package/examples/extensions/tic-tac-toe.ts +1008 -0
  834. package/examples/extensions/timed-confirm.ts +70 -0
  835. package/examples/extensions/titlebar-spinner.ts +58 -0
  836. package/examples/extensions/todo.ts +297 -0
  837. package/examples/extensions/tool-override.ts +144 -0
  838. package/examples/extensions/tools.ts +146 -0
  839. package/examples/extensions/trigger-compact.ts +50 -0
  840. package/examples/extensions/truncated-tool.ts +195 -0
  841. package/examples/extensions/widget-placement.ts +9 -0
  842. package/examples/extensions/with-deps/index.ts +32 -0
  843. package/examples/extensions/with-deps/package-lock.json +31 -0
  844. package/examples/extensions/with-deps/package.json +22 -0
  845. package/examples/extensions/working-indicator.ts +123 -0
  846. package/examples/extensions/working-message-test.ts +25 -0
  847. package/examples/rpc-extension-ui.ts +632 -0
  848. package/examples/sdk/01-minimal.ts +26 -0
  849. package/examples/sdk/02-custom-model.ts +50 -0
  850. package/examples/sdk/03-custom-prompt.ts +70 -0
  851. package/examples/sdk/04-skills.ts +55 -0
  852. package/examples/sdk/05-tools.ts +48 -0
  853. package/examples/sdk/06-extensions.ts +94 -0
  854. package/examples/sdk/07-context-files.ts +42 -0
  855. package/examples/sdk/08-prompt-templates.ts +51 -0
  856. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  857. package/examples/sdk/10-settings.ts +53 -0
  858. package/examples/sdk/11-sessions.ts +52 -0
  859. package/examples/sdk/12-full-control.ts +72 -0
  860. package/examples/sdk/13-session-runtime.ts +67 -0
  861. package/examples/sdk/README.md +140 -0
  862. package/npm-shrinkwrap.json +1824 -0
  863. package/package.json +100 -0
@@ -0,0 +1,302 @@
1
+ function errorMessage(payload, fallback) {
2
+ if (typeof payload !== "object" || payload === null)
3
+ return fallback;
4
+ const error = payload.error;
5
+ if (typeof error !== "object" || error === null)
6
+ return fallback;
7
+ const message = error.message;
8
+ return typeof message === "string" && message ? message : fallback;
9
+ }
10
+ function isModelInfo(value) {
11
+ if (typeof value !== "object" || value === null)
12
+ return false;
13
+ const candidate = value;
14
+ return typeof candidate.id === "string" && typeof candidate.status?.value === "string";
15
+ }
16
+ function linkSignal(source, target) {
17
+ if (!source)
18
+ return () => { };
19
+ if (source.aborted) {
20
+ target.abort(source.reason);
21
+ return () => { };
22
+ }
23
+ const abort = () => target.abort(source.reason);
24
+ source.addEventListener("abort", abort, { once: true });
25
+ return () => source.removeEventListener("abort", abort);
26
+ }
27
+ function sleep(ms, signal) {
28
+ return new Promise((resolve, reject) => {
29
+ if (signal?.aborted) {
30
+ reject(signal.reason ?? new Error("Cancelled"));
31
+ return;
32
+ }
33
+ const abort = () => {
34
+ clearTimeout(timeout);
35
+ reject(signal?.reason ?? new Error("Cancelled"));
36
+ };
37
+ const timeout = setTimeout(() => {
38
+ signal?.removeEventListener("abort", abort);
39
+ resolve();
40
+ }, ms);
41
+ signal?.addEventListener("abort", abort, { once: true });
42
+ });
43
+ }
44
+ function parseLoadProgress(data) {
45
+ if (typeof data !== "object" || data === null)
46
+ return undefined;
47
+ const progress = data.progress;
48
+ if (typeof progress !== "object" || progress === null)
49
+ return undefined;
50
+ const value = progress;
51
+ const stage = typeof value.current === "string" ? value.current : typeof value.stage === "string" ? value.stage : undefined;
52
+ const stages = Array.isArray(value.stages)
53
+ ? value.stages.filter((entry) => typeof entry === "string")
54
+ : [];
55
+ const stageRatio = typeof value.value === "number" ? Math.max(0, Math.min(1, value.value)) : undefined;
56
+ let ratio = stageRatio;
57
+ if (stage && stages.length > 0) {
58
+ const index = stages.indexOf(stage);
59
+ if (index >= 0)
60
+ ratio = (index + (stageRatio ?? 0)) / stages.length;
61
+ }
62
+ return {
63
+ message: stage ? `Loading ${stage.replaceAll("_", " ")}` : "Loading model",
64
+ ratio,
65
+ };
66
+ }
67
+ function parseDownloadProgress(data) {
68
+ if (typeof data !== "object" || data === null)
69
+ return undefined;
70
+ const nested = data.progress;
71
+ const files = typeof nested === "object" && nested !== null ? nested : data;
72
+ let done = 0;
73
+ let total = 0;
74
+ for (const value of Object.values(files)) {
75
+ if (typeof value !== "object" || value === null)
76
+ continue;
77
+ const entry = value;
78
+ if (typeof entry.done !== "number" || typeof entry.total !== "number")
79
+ continue;
80
+ done += entry.done;
81
+ total += entry.total;
82
+ }
83
+ if (total <= 0)
84
+ return undefined;
85
+ return {
86
+ message: "Downloading model",
87
+ ratio: done / total,
88
+ detail: `${formatBytes(done)} / ${formatBytes(total)}`,
89
+ };
90
+ }
91
+ export function formatBytes(bytes) {
92
+ if (bytes < 1024)
93
+ return `${bytes} B`;
94
+ const units = ["KiB", "MiB", "GiB", "TiB"];
95
+ let value = bytes / 1024;
96
+ let unit = units[0];
97
+ for (let index = 1; index < units.length && value >= 1024; index++) {
98
+ value /= 1024;
99
+ unit = units[index];
100
+ }
101
+ return `${value >= 10 ? value.toFixed(1) : value.toFixed(2)} ${unit}`;
102
+ }
103
+ export function normalizeLlamaServerUrl(value) {
104
+ const url = new URL(value.trim());
105
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
106
+ throw new Error("Server URL must use http or https");
107
+ }
108
+ url.hash = "";
109
+ url.search = "";
110
+ url.pathname = url.pathname.replace(/\/+$/u, "").replace(/\/v1$/u, "") || "/";
111
+ return url.toString().replace(/\/$/u, "");
112
+ }
113
+ export function llamaInferenceUrl(serverUrl) {
114
+ return `${normalizeLlamaServerUrl(serverUrl)}/v1`;
115
+ }
116
+ export class LlamaClient {
117
+ serverUrl;
118
+ apiKey;
119
+ constructor(serverUrl, apiKey) {
120
+ this.serverUrl = normalizeLlamaServerUrl(serverUrl);
121
+ this.apiKey = apiKey;
122
+ }
123
+ async request(path, init = {}) {
124
+ const headers = new Headers(init.headers);
125
+ if (init.body !== undefined)
126
+ headers.set("Content-Type", "application/json");
127
+ if (this.apiKey)
128
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
129
+ const timeout = AbortSignal.timeout(15_000);
130
+ const signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
131
+ const response = await fetch(`${this.serverUrl}${path}`, { ...init, headers, signal });
132
+ let payload;
133
+ try {
134
+ payload = await response.json();
135
+ }
136
+ catch {
137
+ payload = undefined;
138
+ }
139
+ if (!response.ok)
140
+ throw new Error(errorMessage(payload, `llama.cpp returned HTTP ${response.status}`));
141
+ return payload;
142
+ }
143
+ async list(options = {}) {
144
+ const payload = await this.request(`/models${options.reload ? "?reload=1" : ""}`, { signal: options.signal });
145
+ if (typeof payload !== "object" || payload === null || !Array.isArray(payload.data)) {
146
+ throw new Error("llama.cpp returned an invalid model catalog");
147
+ }
148
+ const data = payload.data;
149
+ if (!data.every(isModelInfo))
150
+ throw new Error("Server is not running in llama.cpp router mode");
151
+ return data;
152
+ }
153
+ async load(model, signal) {
154
+ await this.request("/models/load", { method: "POST", body: JSON.stringify({ model }), signal });
155
+ }
156
+ async unload(model, signal) {
157
+ await this.request("/models/unload", { method: "POST", body: JSON.stringify({ model }), signal });
158
+ }
159
+ async unloadAndWait(model, signal) {
160
+ await this.unload(model, signal);
161
+ while (true) {
162
+ const entry = (await this.list({ signal })).find((candidate) => candidate.id === model);
163
+ if (!entry || entry.status.value === "unloaded")
164
+ return;
165
+ await sleep(100, signal);
166
+ }
167
+ }
168
+ async download(model, signal) {
169
+ await this.request("/models", { method: "POST", body: JSON.stringify({ model }), signal });
170
+ }
171
+ async watch(onEvent, signal) {
172
+ const headers = new Headers();
173
+ if (this.apiKey)
174
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
175
+ const response = await fetch(`${this.serverUrl}/models/sse`, { headers, signal });
176
+ if (!response.ok || !response.body)
177
+ throw new Error(`llama.cpp SSE returned HTTP ${response.status}`);
178
+ const reader = response.body.getReader();
179
+ const decoder = new TextDecoder();
180
+ let buffer = "";
181
+ while (true) {
182
+ const chunk = await reader.read();
183
+ if (chunk.done)
184
+ break;
185
+ buffer += decoder.decode(chunk.value, { stream: true }).replaceAll("\r\n", "\n");
186
+ let boundary = buffer.indexOf("\n\n");
187
+ while (boundary >= 0) {
188
+ const frame = buffer.slice(0, boundary);
189
+ buffer = buffer.slice(boundary + 2);
190
+ const data = frame
191
+ .split("\n")
192
+ .filter((line) => line.startsWith("data:"))
193
+ .map((line) => line.slice(5).trimStart())
194
+ .join("\n");
195
+ if (data) {
196
+ try {
197
+ const event = JSON.parse(data);
198
+ if (event && typeof event.model === "string" && typeof event.event === "string")
199
+ onEvent(event);
200
+ }
201
+ catch {
202
+ // Ignore malformed events; catalog polling remains authoritative.
203
+ }
204
+ }
205
+ boundary = buffer.indexOf("\n\n");
206
+ }
207
+ }
208
+ }
209
+ async loadAndWait(model, onProgress, signal) {
210
+ const watcher = new AbortController();
211
+ const unlink = linkSignal(signal, watcher);
212
+ let eventLoaded = false;
213
+ let eventError;
214
+ void this.watch((event) => {
215
+ if (event.model !== model)
216
+ return;
217
+ if (event.event !== "model_status" && event.event !== "status_change")
218
+ return;
219
+ const data = event.data;
220
+ if (data?.status === "loaded")
221
+ eventLoaded = true;
222
+ if (data?.status === "unloaded")
223
+ eventError = "Model failed to load";
224
+ const progress = parseLoadProgress(event.data);
225
+ if (progress)
226
+ onProgress(progress);
227
+ }, watcher.signal).catch(() => { });
228
+ try {
229
+ await this.load(model, signal);
230
+ onProgress({ message: "Loading model" });
231
+ while (true) {
232
+ if (signal?.aborted)
233
+ throw signal.reason ?? new Error("Cancelled");
234
+ const entry = (await this.list({ signal })).find((candidate) => candidate.id === model);
235
+ if (entry?.status.value === "loaded")
236
+ return entry;
237
+ if (eventLoaded && !entry)
238
+ return { id: model, status: { value: "loaded" } };
239
+ if (entry?.status.failed || eventError) {
240
+ throw new Error(entry?.status.exit_code === undefined
241
+ ? (eventError ?? "Model failed to load")
242
+ : `Model exited with code ${entry.status.exit_code}`);
243
+ }
244
+ await sleep(250, signal);
245
+ }
246
+ }
247
+ finally {
248
+ unlink();
249
+ watcher.abort();
250
+ }
251
+ }
252
+ async downloadAndWait(model, onProgress, signal) {
253
+ const watcher = new AbortController();
254
+ const unlink = linkSignal(signal, watcher);
255
+ let finished = false;
256
+ let failure;
257
+ let sawDownloading = false;
258
+ let polls = 0;
259
+ void this.watch((event) => {
260
+ if (event.model !== model)
261
+ return;
262
+ if (event.event === "download_finished")
263
+ finished = true;
264
+ if (event.event === "download_failed")
265
+ failure = errorMessage(event.data, "Download failed");
266
+ if (event.event === "download_progress") {
267
+ sawDownloading = true;
268
+ const progress = parseDownloadProgress(event.data);
269
+ if (progress)
270
+ onProgress(progress);
271
+ }
272
+ }, watcher.signal).catch(() => { });
273
+ try {
274
+ await this.download(model, signal);
275
+ onProgress({ message: "Downloading model" });
276
+ while (true) {
277
+ if (signal?.aborted)
278
+ throw signal.reason ?? new Error("Cancelled");
279
+ if (failure)
280
+ throw new Error(failure);
281
+ const models = await this.list({ signal });
282
+ polls++;
283
+ const entry = models.find((candidate) => candidate.id === model);
284
+ if (entry?.status.value === "downloading") {
285
+ sawDownloading = true;
286
+ const progress = parseDownloadProgress(entry.status.progress);
287
+ if (progress)
288
+ onProgress(progress);
289
+ }
290
+ else if (finished || (entry && (sawDownloading || polls >= 2))) {
291
+ return this.list({ reload: true, signal });
292
+ }
293
+ await sleep(500, signal);
294
+ }
295
+ }
296
+ finally {
297
+ unlink();
298
+ watcher.abort();
299
+ }
300
+ }
301
+ }
302
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/extensions/llama/client.ts"],"names":[],"mappings":"AA0CA,SAAS,YAAY,CAAC,OAAgB,EAAE,QAAgB,EAAU;IACjE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACrE,MAAM,KAAK,GAAI,OAA+B,CAAC,KAAK,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACjE,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;IACzD,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAAA,CACnE;AAED,SAAS,WAAW,CAAC,KAAc,EAA2B;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAuD,CAAC;IAC1E,OAAO,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC;AAAA,CACvF;AAED,SAAS,UAAU,CAAC,MAA+B,EAAE,MAAuB,EAAc;IACzF,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAAA,CACxD;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB,EAAiB;IAC/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YAChD,OAAO;QACR,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAAA,CACjD,CAAC;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;QAAA,CACV,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAAA,CACzD,CAAC,CAAC;AAAA,CACH;AAED,SAAS,iBAAiB,CAAC,IAAa,EAA6B;IACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,QAAQ,GAAI,IAA+B,CAAC,QAAQ,CAAC;IAC3D,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACxE,MAAM,KAAK,GAAG,QAAqF,CAAC;IACpG,MAAM,KAAK,GACV,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACzC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC5E,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,KAAK,IAAI,CAAC;YAAE,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACrE,CAAC;IACD,OAAO;QACN,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe;QAC1E,KAAK;KACL,CAAC;AAAA,CACF;AAED,SAAS,qBAAqB,CAAC,IAAa,EAA6B;IACxE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,MAAM,GAAI,IAA+B,CAAC,QAAQ,CAAC;IACzD,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC,EAAE,CAAC;QACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC1D,MAAM,KAAK,GAAG,KAA4C,CAAC;QAC3D,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,SAAS;QAChF,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;QACnB,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO;QACN,OAAO,EAAE,mBAAmB;QAC5B,KAAK,EAAE,IAAI,GAAG,KAAK;QACnB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE;KACtD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAU;IAClD,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IACzB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACpE,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,CACtE;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAU;IAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtD,CAAC;IACD,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAC9E,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAAA,CAC1C;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAU;IAC5D,OAAO,GAAG,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC;AAAA,CAClD;AAED,MAAM,OAAO,WAAW;IACd,SAAS,CAAS;IACV,MAAM,CAAqB;IAE5C,YAAY,SAAiB,EAAE,MAAe,EAAE;QAC/C,IAAI,CAAC,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAAA,CACrB;IAEO,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAI,GAAgB,EAAE,EAAoB;QAC7E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC/E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACJ,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,GAAG,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvG,OAAO,OAAO,CAAC;IAAA,CACf;IAED,KAAK,CAAC,IAAI,CAAC,OAAO,GAA+C,EAAE,EAA6B;QAC/F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9G,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,OAA8B,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7G,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,GAAI,OAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,MAAoB,EAAiB;QAC9D,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAAA,CAChG;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAoB,EAAiB;QAChE,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAAA,CAClG;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,MAAoB,EAAiB;QACvE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YACxF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU;gBAAE,OAAO;YACxD,MAAM,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC;IAAA,CACD;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,MAAoB,EAAiB;QAClE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAAA,CAC3F;IAED,KAAK,CAAC,KAAK,CAAC,OAAyC,EAAE,MAAoB,EAAiB;QAC3F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACtG,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI;gBAAE,MAAM;YACtB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjF,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,QAAQ,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,KAAK;qBAChB,KAAK,CAAC,IAAI,CAAC;qBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;qBAC1C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;qBACxC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACb,IAAI,IAAI,EAAE,CAAC;oBACV,IAAI,CAAC;wBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;wBAClD,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;4BAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBACjG,CAAC;oBAAC,MAAM,CAAC;wBACR,kEAAkE;oBACnE,CAAC;gBACF,CAAC;gBACD,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACF,CAAC;IAAA,CACD;IAED,KAAK,CAAC,WAAW,CAChB,KAAa,EACb,UAA6C,EAC7C,MAAoB,EACM;QAC1B,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,UAA8B,CAAC;QACnC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;gBAAE,OAAO;YAClC,IAAI,KAAK,CAAC,KAAK,KAAK,cAAc,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe;gBAAE,OAAO;YAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAwC,CAAC;YAC5D,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ;gBAAE,WAAW,GAAG,IAAI,CAAC;YAClD,IAAI,IAAI,EAAE,MAAM,KAAK,UAAU;gBAAE,UAAU,GAAG,sBAAsB,CAAC;YACrE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,QAAQ;gBAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAA,CACnC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC/B,UAAU,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YACzC,OAAO,IAAI,EAAE,CAAC;gBACb,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnE,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;gBACxF,IAAI,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBACnD,IAAI,WAAW,IAAI,CAAC,KAAK;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAC7E,IAAI,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CACd,KAAK,EAAE,MAAM,CAAC,SAAS,KAAK,SAAS;wBACpC,CAAC,CAAC,CAAC,UAAU,IAAI,sBAAsB,CAAC;wBACxC,CAAC,CAAC,0BAA0B,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CACrD,CAAC;gBACH,CAAC;gBACD,MAAM,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IAAA,CACD;IAED,KAAK,CAAC,eAAe,CACpB,KAAa,EACb,UAA6C,EAC7C,MAAoB,EACQ;QAC5B,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAA2B,CAAC;QAChC,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;gBAAE,OAAO;YAClC,IAAI,KAAK,CAAC,KAAK,KAAK,mBAAmB;gBAAE,QAAQ,GAAG,IAAI,CAAC;YACzD,IAAI,KAAK,CAAC,KAAK,KAAK,iBAAiB;gBAAE,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC7F,IAAI,KAAK,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;gBACzC,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,QAAQ;oBAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;QAAA,CACD,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,UAAU,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC7C,OAAO,IAAI,EAAE,CAAC;gBACb,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnE,IAAI,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3C,KAAK,EAAE,CAAC;gBACR,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;gBACjE,IAAI,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;oBAC3C,cAAc,GAAG,IAAI,CAAC;oBACtB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC9D,IAAI,QAAQ;wBAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;qBAAM,IAAI,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IAAA,CACD;CACD","sourcesContent":["export type LlamaModelStatus = \"unloaded\" | \"loading\" | \"loaded\" | \"downloading\" | \"sleeping\";\n\nexport interface LlamaModelInfo {\n\tid: string;\n\taliases?: string[];\n\tstatus: {\n\t\tvalue: LlamaModelStatus;\n\t\targs?: string[];\n\t\tfailed?: boolean;\n\t\texit_code?: number;\n\t\tprogress?: Record<string, { done: number; total: number }>;\n\t};\n\tarchitecture?: {\n\t\tinput_modalities?: string[];\n\t\toutput_modalities?: string[];\n\t};\n\tsource?: string;\n\tmeta?: {\n\t\tn_ctx?: number;\n\t\tn_ctx_train?: number;\n\t\tsize?: number;\n\t\tftype?: string;\n\t};\n}\n\nexport interface LlamaModelsResponse {\n\tdata: LlamaModelInfo[];\n\tobject?: string;\n}\n\nexport interface LlamaModelEvent {\n\tmodel: string;\n\tevent: string;\n\tdata?: unknown;\n}\n\nexport interface LlamaProgress {\n\tmessage: string;\n\tratio?: number;\n\tdetail?: string;\n}\n\nfunction errorMessage(payload: unknown, fallback: string): string {\n\tif (typeof payload !== \"object\" || payload === null) return fallback;\n\tconst error = (payload as { error?: unknown }).error;\n\tif (typeof error !== \"object\" || error === null) return fallback;\n\tconst message = (error as { message?: unknown }).message;\n\treturn typeof message === \"string\" && message ? message : fallback;\n}\n\nfunction isModelInfo(value: unknown): value is LlamaModelInfo {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst candidate = value as { id?: unknown; status?: { value?: unknown } };\n\treturn typeof candidate.id === \"string\" && typeof candidate.status?.value === \"string\";\n}\n\nfunction linkSignal(source: AbortSignal | undefined, target: AbortController): () => void {\n\tif (!source) return () => {};\n\tif (source.aborted) {\n\t\ttarget.abort(source.reason);\n\t\treturn () => {};\n\t}\n\tconst abort = () => target.abort(source.reason);\n\tsource.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason ?? new Error(\"Cancelled\"));\n\t\t\treturn;\n\t\t}\n\t\tconst abort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(signal?.reason ?? new Error(\"Cancelled\"));\n\t\t};\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nfunction parseLoadProgress(data: unknown): LlamaProgress | undefined {\n\tif (typeof data !== \"object\" || data === null) return undefined;\n\tconst progress = (data as { progress?: unknown }).progress;\n\tif (typeof progress !== \"object\" || progress === null) return undefined;\n\tconst value = progress as { stages?: unknown; current?: unknown; stage?: unknown; value?: unknown };\n\tconst stage =\n\t\ttypeof value.current === \"string\" ? value.current : typeof value.stage === \"string\" ? value.stage : undefined;\n\tconst stages = Array.isArray(value.stages)\n\t\t? value.stages.filter((entry): entry is string => typeof entry === \"string\")\n\t\t: [];\n\tconst stageRatio = typeof value.value === \"number\" ? Math.max(0, Math.min(1, value.value)) : undefined;\n\tlet ratio = stageRatio;\n\tif (stage && stages.length > 0) {\n\t\tconst index = stages.indexOf(stage);\n\t\tif (index >= 0) ratio = (index + (stageRatio ?? 0)) / stages.length;\n\t}\n\treturn {\n\t\tmessage: stage ? `Loading ${stage.replaceAll(\"_\", \" \")}` : \"Loading model\",\n\t\tratio,\n\t};\n}\n\nfunction parseDownloadProgress(data: unknown): LlamaProgress | undefined {\n\tif (typeof data !== \"object\" || data === null) return undefined;\n\tconst nested = (data as { progress?: unknown }).progress;\n\tconst files = typeof nested === \"object\" && nested !== null ? nested : data;\n\tlet done = 0;\n\tlet total = 0;\n\tfor (const value of Object.values(files as Record<string, unknown>)) {\n\t\tif (typeof value !== \"object\" || value === null) continue;\n\t\tconst entry = value as { done?: unknown; total?: unknown };\n\t\tif (typeof entry.done !== \"number\" || typeof entry.total !== \"number\") continue;\n\t\tdone += entry.done;\n\t\ttotal += entry.total;\n\t}\n\tif (total <= 0) return undefined;\n\treturn {\n\t\tmessage: \"Downloading model\",\n\t\tratio: done / total,\n\t\tdetail: `${formatBytes(done)} / ${formatBytes(total)}`,\n\t};\n}\n\nexport function formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes} B`;\n\tconst units = [\"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n\tlet value = bytes / 1024;\n\tlet unit = units[0]!;\n\tfor (let index = 1; index < units.length && value >= 1024; index++) {\n\t\tvalue /= 1024;\n\t\tunit = units[index]!;\n\t}\n\treturn `${value >= 10 ? value.toFixed(1) : value.toFixed(2)} ${unit}`;\n}\n\nexport function normalizeLlamaServerUrl(value: string): string {\n\tconst url = new URL(value.trim());\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(\"Server URL must use http or https\");\n\t}\n\turl.hash = \"\";\n\turl.search = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/u, \"\").replace(/\\/v1$/u, \"\") || \"/\";\n\treturn url.toString().replace(/\\/$/u, \"\");\n}\n\nexport function llamaInferenceUrl(serverUrl: string): string {\n\treturn `${normalizeLlamaServerUrl(serverUrl)}/v1`;\n}\n\nexport class LlamaClient {\n\treadonly serverUrl: string;\n\tprivate readonly apiKey: string | undefined;\n\n\tconstructor(serverUrl: string, apiKey?: string) {\n\t\tthis.serverUrl = normalizeLlamaServerUrl(serverUrl);\n\t\tthis.apiKey = apiKey;\n\t}\n\n\tprivate async request(path: string, init: RequestInit = {}): Promise<unknown> {\n\t\tconst headers = new Headers(init.headers);\n\t\tif (init.body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n\t\tif (this.apiKey) headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\t\tconst timeout = AbortSignal.timeout(15_000);\n\t\tconst signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;\n\t\tconst response = await fetch(`${this.serverUrl}${path}`, { ...init, headers, signal });\n\t\tlet payload: unknown;\n\t\ttry {\n\t\t\tpayload = await response.json();\n\t\t} catch {\n\t\t\tpayload = undefined;\n\t\t}\n\t\tif (!response.ok) throw new Error(errorMessage(payload, `llama.cpp returned HTTP ${response.status}`));\n\t\treturn payload;\n\t}\n\n\tasync list(options: { reload?: boolean; signal?: AbortSignal } = {}): Promise<LlamaModelInfo[]> {\n\t\tconst payload = await this.request(`/models${options.reload ? \"?reload=1\" : \"\"}`, { signal: options.signal });\n\t\tif (typeof payload !== \"object\" || payload === null || !Array.isArray((payload as { data?: unknown }).data)) {\n\t\t\tthrow new Error(\"llama.cpp returned an invalid model catalog\");\n\t\t}\n\t\tconst data = (payload as { data: unknown[] }).data;\n\t\tif (!data.every(isModelInfo)) throw new Error(\"Server is not running in llama.cpp router mode\");\n\t\treturn data;\n\t}\n\n\tasync load(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.request(\"/models/load\", { method: \"POST\", body: JSON.stringify({ model }), signal });\n\t}\n\n\tasync unload(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.request(\"/models/unload\", { method: \"POST\", body: JSON.stringify({ model }), signal });\n\t}\n\n\tasync unloadAndWait(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.unload(model, signal);\n\t\twhile (true) {\n\t\t\tconst entry = (await this.list({ signal })).find((candidate) => candidate.id === model);\n\t\t\tif (!entry || entry.status.value === \"unloaded\") return;\n\t\t\tawait sleep(100, signal);\n\t\t}\n\t}\n\n\tasync download(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.request(\"/models\", { method: \"POST\", body: JSON.stringify({ model }), signal });\n\t}\n\n\tasync watch(onEvent: (event: LlamaModelEvent) => void, signal?: AbortSignal): Promise<void> {\n\t\tconst headers = new Headers();\n\t\tif (this.apiKey) headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\t\tconst response = await fetch(`${this.serverUrl}/models/sse`, { headers, signal });\n\t\tif (!response.ok || !response.body) throw new Error(`llama.cpp SSE returned HTTP ${response.status}`);\n\t\tconst reader = response.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tlet buffer = \"\";\n\t\twhile (true) {\n\t\t\tconst chunk = await reader.read();\n\t\t\tif (chunk.done) break;\n\t\t\tbuffer += decoder.decode(chunk.value, { stream: true }).replaceAll(\"\\r\\n\", \"\\n\");\n\t\t\tlet boundary = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (boundary >= 0) {\n\t\t\t\tconst frame = buffer.slice(0, boundary);\n\t\t\t\tbuffer = buffer.slice(boundary + 2);\n\t\t\t\tconst data = frame\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t\t\t.map((line) => line.slice(5).trimStart())\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tif (data) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst event = JSON.parse(data) as LlamaModelEvent;\n\t\t\t\t\t\tif (event && typeof event.model === \"string\" && typeof event.event === \"string\") onEvent(event);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore malformed events; catalog polling remains authoritative.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tboundary = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync loadAndWait(\n\t\tmodel: string,\n\t\tonProgress: (progress: LlamaProgress) => void,\n\t\tsignal?: AbortSignal,\n\t): Promise<LlamaModelInfo> {\n\t\tconst watcher = new AbortController();\n\t\tconst unlink = linkSignal(signal, watcher);\n\t\tlet eventLoaded = false;\n\t\tlet eventError: string | undefined;\n\t\tvoid this.watch((event) => {\n\t\t\tif (event.model !== model) return;\n\t\t\tif (event.event !== \"model_status\" && event.event !== \"status_change\") return;\n\t\t\tconst data = event.data as { status?: unknown } | undefined;\n\t\t\tif (data?.status === \"loaded\") eventLoaded = true;\n\t\t\tif (data?.status === \"unloaded\") eventError = \"Model failed to load\";\n\t\t\tconst progress = parseLoadProgress(event.data);\n\t\t\tif (progress) onProgress(progress);\n\t\t}, watcher.signal).catch(() => {});\n\t\ttry {\n\t\t\tawait this.load(model, signal);\n\t\t\tonProgress({ message: \"Loading model\" });\n\t\t\twhile (true) {\n\t\t\t\tif (signal?.aborted) throw signal.reason ?? new Error(\"Cancelled\");\n\t\t\t\tconst entry = (await this.list({ signal })).find((candidate) => candidate.id === model);\n\t\t\t\tif (entry?.status.value === \"loaded\") return entry;\n\t\t\t\tif (eventLoaded && !entry) return { id: model, status: { value: \"loaded\" } };\n\t\t\t\tif (entry?.status.failed || eventError) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tentry?.status.exit_code === undefined\n\t\t\t\t\t\t\t? (eventError ?? \"Model failed to load\")\n\t\t\t\t\t\t\t: `Model exited with code ${entry.status.exit_code}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tawait sleep(250, signal);\n\t\t\t}\n\t\t} finally {\n\t\t\tunlink();\n\t\t\twatcher.abort();\n\t\t}\n\t}\n\n\tasync downloadAndWait(\n\t\tmodel: string,\n\t\tonProgress: (progress: LlamaProgress) => void,\n\t\tsignal?: AbortSignal,\n\t): Promise<LlamaModelInfo[]> {\n\t\tconst watcher = new AbortController();\n\t\tconst unlink = linkSignal(signal, watcher);\n\t\tlet finished = false;\n\t\tlet failure: string | undefined;\n\t\tlet sawDownloading = false;\n\t\tlet polls = 0;\n\t\tvoid this.watch((event) => {\n\t\t\tif (event.model !== model) return;\n\t\t\tif (event.event === \"download_finished\") finished = true;\n\t\t\tif (event.event === \"download_failed\") failure = errorMessage(event.data, \"Download failed\");\n\t\t\tif (event.event === \"download_progress\") {\n\t\t\t\tsawDownloading = true;\n\t\t\t\tconst progress = parseDownloadProgress(event.data);\n\t\t\t\tif (progress) onProgress(progress);\n\t\t\t}\n\t\t}, watcher.signal).catch(() => {});\n\t\ttry {\n\t\t\tawait this.download(model, signal);\n\t\t\tonProgress({ message: \"Downloading model\" });\n\t\t\twhile (true) {\n\t\t\t\tif (signal?.aborted) throw signal.reason ?? new Error(\"Cancelled\");\n\t\t\t\tif (failure) throw new Error(failure);\n\t\t\t\tconst models = await this.list({ signal });\n\t\t\t\tpolls++;\n\t\t\t\tconst entry = models.find((candidate) => candidate.id === model);\n\t\t\t\tif (entry?.status.value === \"downloading\") {\n\t\t\t\t\tsawDownloading = true;\n\t\t\t\t\tconst progress = parseDownloadProgress(entry.status.progress);\n\t\t\t\t\tif (progress) onProgress(progress);\n\t\t\t\t} else if (finished || (entry && (sawDownloading || polls >= 2))) {\n\t\t\t\t\treturn this.list({ reload: true, signal });\n\t\t\t\t}\n\t\t\t\tawait sleep(500, signal);\n\t\t\t}\n\t\t} finally {\n\t\t\tunlink();\n\t\t\twatcher.abort();\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,23 @@
1
+ export interface HuggingFaceModel {
2
+ id: string;
3
+ downloads: number;
4
+ }
5
+ export interface HuggingFaceQuantization {
6
+ name: string;
7
+ size?: number;
8
+ }
9
+ export interface HuggingFaceModelDetails {
10
+ id: string;
11
+ gated: false | "auto" | "manual";
12
+ quantizations: HuggingFaceQuantization[];
13
+ }
14
+ export declare function findHuggingFaceToken(env?: NodeJS.ProcessEnv): Promise<string | undefined>;
15
+ export declare class HuggingFaceClient {
16
+ private readonly token;
17
+ private readonly baseUrl;
18
+ constructor(token?: string, baseUrl?: string);
19
+ private request;
20
+ search(query: string, signal?: AbortSignal): Promise<HuggingFaceModel[]>;
21
+ details(id: string, signal?: AbortSignal): Promise<HuggingFaceModelDetails>;
22
+ }
23
+ //# sourceMappingURL=huggingface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingface.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/huggingface.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IACjC,aAAa,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAsBD,wBAAsB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe5G;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,YAAY,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,SAA2B,EAG7D;YAEa,OAAO;IA4Bf,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgB7E;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuChF;CACD","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst DEFAULT_HUGGING_FACE_URL = \"https://huggingface.co\";\nconst QUANTIZATION_PATTERN =\n\t/(?:^|[-_.])((?:UD-)?(?:IQ\\d(?:_[A-Z0-9]+)+|Q\\d(?:_[A-Z0-9]+)+|BF16|F16|F32|MXFP\\d(?:_[A-Z0-9]+)*))$/iu;\nconst SHARD_SUFFIX_PATTERN = /-\\d{5}-of-\\d{5}$/u;\n\nexport interface HuggingFaceModel {\n\tid: string;\n\tdownloads: number;\n}\n\nexport interface HuggingFaceQuantization {\n\tname: string;\n\tsize?: number;\n}\n\nexport interface HuggingFaceModelDetails {\n\tid: string;\n\tgated: false | \"auto\" | \"manual\";\n\tquantizations: HuggingFaceQuantization[];\n}\n\nfunction payloadError(payload: unknown, fallback: string): string {\n\tif (typeof payload !== \"object\" || payload === null) return fallback;\n\tconst error = (payload as { error?: unknown }).error;\n\treturn typeof error === \"string\" && error ? error : fallback;\n}\n\nfunction parseRateLimitDelay(value: string | null): number | undefined {\n\tconst match = value?.match(/(?:^|;)t=(\\d+)/u);\n\treturn match ? Number(match[1]) : undefined;\n}\n\nasync function readToken(path: string): Promise<string | undefined> {\n\ttry {\n\t\tconst token = (await readFile(path, \"utf8\")).trim();\n\t\treturn token || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport async function findHuggingFaceToken(env: NodeJS.ProcessEnv = process.env): Promise<string | undefined> {\n\tconst fromEnvironment = env.HF_TOKEN?.trim();\n\tif (fromEnvironment) return fromEnvironment;\n\n\tconst paths = [\n\t\tenv.HF_TOKEN_PATH,\n\t\tenv.HF_HOME ? join(env.HF_HOME, \"token\") : undefined,\n\t\tenv.XDG_CACHE_HOME ? join(env.XDG_CACHE_HOME, \"huggingface\", \"token\") : undefined,\n\t\tjoin(homedir(), \".cache\", \"huggingface\", \"token\"),\n\t].filter((path): path is string => Boolean(path));\n\tfor (const path of new Set(paths)) {\n\t\tconst token = await readToken(path);\n\t\tif (token) return token;\n\t}\n\treturn undefined;\n}\n\nexport class HuggingFaceClient {\n\tprivate readonly token: string | undefined;\n\tprivate readonly baseUrl: string;\n\n\tconstructor(token?: string, baseUrl = DEFAULT_HUGGING_FACE_URL) {\n\t\tthis.token = token;\n\t\tthis.baseUrl = baseUrl.replace(/\\/+$/u, \"\");\n\t}\n\n\tprivate async request(path: string, signal?: AbortSignal): Promise<unknown> {\n\t\tconst headers = new Headers();\n\t\tif (this.token) headers.set(\"Authorization\", `Bearer ${this.token}`);\n\t\tconst timeout = AbortSignal.timeout(15_000);\n\t\tconst response = await fetch(`${this.baseUrl}${path}`, {\n\t\t\theaders,\n\t\t\tsignal: signal ? AbortSignal.any([signal, timeout]) : timeout,\n\t\t});\n\t\tlet payload: unknown;\n\t\ttry {\n\t\t\tpayload = await response.json();\n\t\t} catch {\n\t\t\tpayload = undefined;\n\t\t}\n\t\tif (!response.ok) {\n\t\t\tconst fallback = `Hugging Face returned HTTP ${response.status}`;\n\t\t\tif (response.status === 429) {\n\t\t\t\tconst delay =\n\t\t\t\t\tNumber(response.headers.get(\"retry-after\")) || parseRateLimitDelay(response.headers.get(\"ratelimit\"));\n\t\t\t\tthrow new Error(\n\t\t\t\t\tdelay ? `Hugging Face rate limit reached; retry in ${delay}s` : \"Hugging Face rate limit reached\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(payloadError(payload, fallback));\n\t\t}\n\t\treturn payload;\n\t}\n\n\tasync search(query: string, signal?: AbortSignal): Promise<HuggingFaceModel[]> {\n\t\tconst params = new URLSearchParams({\n\t\t\tsearch: query,\n\t\t\tfilter: \"gguf\",\n\t\t\tsort: \"downloads\",\n\t\t\tdirection: \"-1\",\n\t\t\tlimit: \"20\",\n\t\t});\n\t\tconst payload = await this.request(`/api/models?${params}`, signal);\n\t\tif (!Array.isArray(payload)) throw new Error(\"Hugging Face returned invalid search results\");\n\t\treturn payload.flatMap((value) => {\n\t\t\tif (typeof value !== \"object\" || value === null || typeof (value as { id?: unknown }).id !== \"string\")\n\t\t\t\treturn [];\n\t\t\tconst model = value as { id: string; downloads?: unknown };\n\t\t\treturn [{ id: model.id, downloads: typeof model.downloads === \"number\" ? model.downloads : 0 }];\n\t\t});\n\t}\n\n\tasync details(id: string, signal?: AbortSignal): Promise<HuggingFaceModelDetails> {\n\t\tconst encodedId = id.split(\"/\").map(encodeURIComponent).join(\"/\");\n\t\tconst payload = await this.request(`/api/models/${encodedId}?blobs=true`, signal);\n\t\tif (typeof payload !== \"object\" || payload === null) {\n\t\t\tthrow new Error(\"Hugging Face returned invalid model details\");\n\t\t}\n\t\tconst model = payload as { id?: unknown; gated?: unknown; siblings?: unknown };\n\t\tconst sizes = new Map<string, { total: number; complete: boolean }>();\n\t\tif (Array.isArray(model.siblings)) {\n\t\t\tfor (const value of model.siblings) {\n\t\t\t\tif (typeof value !== \"object\" || value === null) continue;\n\t\t\t\tconst file = value as { rfilename?: unknown; size?: unknown };\n\t\t\t\tif (typeof file.rfilename !== \"string\" || !file.rfilename.toLowerCase().endsWith(\".gguf\")) continue;\n\t\t\t\tconst filename = file.rfilename.split(\"/\").at(-1)!;\n\t\t\t\tif (filename.toLowerCase().startsWith(\"mmproj\")) continue;\n\t\t\t\tconst stem = filename.slice(0, -5).replace(SHARD_SUFFIX_PATTERN, \"\");\n\t\t\t\tconst quantization = stem.match(QUANTIZATION_PATTERN)?.[1]?.toUpperCase();\n\t\t\t\tif (!quantization) continue;\n\t\t\t\tconst current = sizes.get(quantization) ?? { total: 0, complete: true };\n\t\t\t\tif (typeof file.size === \"number\") current.total += file.size;\n\t\t\t\telse current.complete = false;\n\t\t\t\tsizes.set(quantization, current);\n\t\t\t}\n\t\t}\n\t\tconst quantizations = [...sizes]\n\t\t\t.map(([name, size]) => ({ name, size: size.complete ? size.total : undefined }))\n\t\t\t.sort((left, right) => {\n\t\t\t\tif (left.name === \"Q4_K_M\") return -1;\n\t\t\t\tif (right.name === \"Q4_K_M\") return 1;\n\t\t\t\treturn (\n\t\t\t\t\t(left.size ?? Number.MAX_SAFE_INTEGER) - (right.size ?? Number.MAX_SAFE_INTEGER) ||\n\t\t\t\t\tleft.name.localeCompare(right.name)\n\t\t\t\t);\n\t\t\t});\n\t\treturn {\n\t\t\tid: typeof model.id === \"string\" ? model.id : id,\n\t\t\tgated: model.gated === \"auto\" || model.gated === \"manual\" ? model.gated : false,\n\t\t\tquantizations,\n\t\t};\n\t}\n}\n"]}
@@ -0,0 +1,141 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const DEFAULT_HUGGING_FACE_URL = "https://huggingface.co";
5
+ const QUANTIZATION_PATTERN = /(?:^|[-_.])((?:UD-)?(?:IQ\d(?:_[A-Z0-9]+)+|Q\d(?:_[A-Z0-9]+)+|BF16|F16|F32|MXFP\d(?:_[A-Z0-9]+)*))$/iu;
6
+ const SHARD_SUFFIX_PATTERN = /-\d{5}-of-\d{5}$/u;
7
+ function payloadError(payload, fallback) {
8
+ if (typeof payload !== "object" || payload === null)
9
+ return fallback;
10
+ const error = payload.error;
11
+ return typeof error === "string" && error ? error : fallback;
12
+ }
13
+ function parseRateLimitDelay(value) {
14
+ const match = value?.match(/(?:^|;)t=(\d+)/u);
15
+ return match ? Number(match[1]) : undefined;
16
+ }
17
+ async function readToken(path) {
18
+ try {
19
+ const token = (await readFile(path, "utf8")).trim();
20
+ return token || undefined;
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ export async function findHuggingFaceToken(env = process.env) {
27
+ const fromEnvironment = env.HF_TOKEN?.trim();
28
+ if (fromEnvironment)
29
+ return fromEnvironment;
30
+ const paths = [
31
+ env.HF_TOKEN_PATH,
32
+ env.HF_HOME ? join(env.HF_HOME, "token") : undefined,
33
+ env.XDG_CACHE_HOME ? join(env.XDG_CACHE_HOME, "huggingface", "token") : undefined,
34
+ join(homedir(), ".cache", "huggingface", "token"),
35
+ ].filter((path) => Boolean(path));
36
+ for (const path of new Set(paths)) {
37
+ const token = await readToken(path);
38
+ if (token)
39
+ return token;
40
+ }
41
+ return undefined;
42
+ }
43
+ export class HuggingFaceClient {
44
+ token;
45
+ baseUrl;
46
+ constructor(token, baseUrl = DEFAULT_HUGGING_FACE_URL) {
47
+ this.token = token;
48
+ this.baseUrl = baseUrl.replace(/\/+$/u, "");
49
+ }
50
+ async request(path, signal) {
51
+ const headers = new Headers();
52
+ if (this.token)
53
+ headers.set("Authorization", `Bearer ${this.token}`);
54
+ const timeout = AbortSignal.timeout(15_000);
55
+ const response = await fetch(`${this.baseUrl}${path}`, {
56
+ headers,
57
+ signal: signal ? AbortSignal.any([signal, timeout]) : timeout,
58
+ });
59
+ let payload;
60
+ try {
61
+ payload = await response.json();
62
+ }
63
+ catch {
64
+ payload = undefined;
65
+ }
66
+ if (!response.ok) {
67
+ const fallback = `Hugging Face returned HTTP ${response.status}`;
68
+ if (response.status === 429) {
69
+ const delay = Number(response.headers.get("retry-after")) || parseRateLimitDelay(response.headers.get("ratelimit"));
70
+ throw new Error(delay ? `Hugging Face rate limit reached; retry in ${delay}s` : "Hugging Face rate limit reached");
71
+ }
72
+ throw new Error(payloadError(payload, fallback));
73
+ }
74
+ return payload;
75
+ }
76
+ async search(query, signal) {
77
+ const params = new URLSearchParams({
78
+ search: query,
79
+ filter: "gguf",
80
+ sort: "downloads",
81
+ direction: "-1",
82
+ limit: "20",
83
+ });
84
+ const payload = await this.request(`/api/models?${params}`, signal);
85
+ if (!Array.isArray(payload))
86
+ throw new Error("Hugging Face returned invalid search results");
87
+ return payload.flatMap((value) => {
88
+ if (typeof value !== "object" || value === null || typeof value.id !== "string")
89
+ return [];
90
+ const model = value;
91
+ return [{ id: model.id, downloads: typeof model.downloads === "number" ? model.downloads : 0 }];
92
+ });
93
+ }
94
+ async details(id, signal) {
95
+ const encodedId = id.split("/").map(encodeURIComponent).join("/");
96
+ const payload = await this.request(`/api/models/${encodedId}?blobs=true`, signal);
97
+ if (typeof payload !== "object" || payload === null) {
98
+ throw new Error("Hugging Face returned invalid model details");
99
+ }
100
+ const model = payload;
101
+ const sizes = new Map();
102
+ if (Array.isArray(model.siblings)) {
103
+ for (const value of model.siblings) {
104
+ if (typeof value !== "object" || value === null)
105
+ continue;
106
+ const file = value;
107
+ if (typeof file.rfilename !== "string" || !file.rfilename.toLowerCase().endsWith(".gguf"))
108
+ continue;
109
+ const filename = file.rfilename.split("/").at(-1);
110
+ if (filename.toLowerCase().startsWith("mmproj"))
111
+ continue;
112
+ const stem = filename.slice(0, -5).replace(SHARD_SUFFIX_PATTERN, "");
113
+ const quantization = stem.match(QUANTIZATION_PATTERN)?.[1]?.toUpperCase();
114
+ if (!quantization)
115
+ continue;
116
+ const current = sizes.get(quantization) ?? { total: 0, complete: true };
117
+ if (typeof file.size === "number")
118
+ current.total += file.size;
119
+ else
120
+ current.complete = false;
121
+ sizes.set(quantization, current);
122
+ }
123
+ }
124
+ const quantizations = [...sizes]
125
+ .map(([name, size]) => ({ name, size: size.complete ? size.total : undefined }))
126
+ .sort((left, right) => {
127
+ if (left.name === "Q4_K_M")
128
+ return -1;
129
+ if (right.name === "Q4_K_M")
130
+ return 1;
131
+ return ((left.size ?? Number.MAX_SAFE_INTEGER) - (right.size ?? Number.MAX_SAFE_INTEGER) ||
132
+ left.name.localeCompare(right.name));
133
+ });
134
+ return {
135
+ id: typeof model.id === "string" ? model.id : id,
136
+ gated: model.gated === "auto" || model.gated === "manual" ? model.gated : false,
137
+ quantizations,
138
+ };
139
+ }
140
+ }
141
+ //# sourceMappingURL=huggingface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingface.js","sourceRoot":"","sources":["../../../src/extensions/llama/huggingface.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst DEFAULT_HUGGING_FACE_URL = \"https://huggingface.co\";\nconst QUANTIZATION_PATTERN =\n\t/(?:^|[-_.])((?:UD-)?(?:IQ\\d(?:_[A-Z0-9]+)+|Q\\d(?:_[A-Z0-9]+)+|BF16|F16|F32|MXFP\\d(?:_[A-Z0-9]+)*))$/iu;\nconst SHARD_SUFFIX_PATTERN = /-\\d{5}-of-\\d{5}$/u;\n\nexport interface HuggingFaceModel {\n\tid: string;\n\tdownloads: number;\n}\n\nexport interface HuggingFaceQuantization {\n\tname: string;\n\tsize?: number;\n}\n\nexport interface HuggingFaceModelDetails {\n\tid: string;\n\tgated: false | \"auto\" | \"manual\";\n\tquantizations: HuggingFaceQuantization[];\n}\n\nfunction payloadError(payload: unknown, fallback: string): string {\n\tif (typeof payload !== \"object\" || payload === null) return fallback;\n\tconst error = (payload as { error?: unknown }).error;\n\treturn typeof error === \"string\" && error ? error : fallback;\n}\n\nfunction parseRateLimitDelay(value: string | null): number | undefined {\n\tconst match = value?.match(/(?:^|;)t=(\\d+)/u);\n\treturn match ? Number(match[1]) : undefined;\n}\n\nasync function readToken(path: string): Promise<string | undefined> {\n\ttry {\n\t\tconst token = (await readFile(path, \"utf8\")).trim();\n\t\treturn token || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport async function findHuggingFaceToken(env: NodeJS.ProcessEnv = process.env): Promise<string | undefined> {\n\tconst fromEnvironment = env.HF_TOKEN?.trim();\n\tif (fromEnvironment) return fromEnvironment;\n\n\tconst paths = [\n\t\tenv.HF_TOKEN_PATH,\n\t\tenv.HF_HOME ? join(env.HF_HOME, \"token\") : undefined,\n\t\tenv.XDG_CACHE_HOME ? join(env.XDG_CACHE_HOME, \"huggingface\", \"token\") : undefined,\n\t\tjoin(homedir(), \".cache\", \"huggingface\", \"token\"),\n\t].filter((path): path is string => Boolean(path));\n\tfor (const path of new Set(paths)) {\n\t\tconst token = await readToken(path);\n\t\tif (token) return token;\n\t}\n\treturn undefined;\n}\n\nexport class HuggingFaceClient {\n\tprivate readonly token: string | undefined;\n\tprivate readonly baseUrl: string;\n\n\tconstructor(token?: string, baseUrl = DEFAULT_HUGGING_FACE_URL) {\n\t\tthis.token = token;\n\t\tthis.baseUrl = baseUrl.replace(/\\/+$/u, \"\");\n\t}\n\n\tprivate async request(path: string, signal?: AbortSignal): Promise<unknown> {\n\t\tconst headers = new Headers();\n\t\tif (this.token) headers.set(\"Authorization\", `Bearer ${this.token}`);\n\t\tconst timeout = AbortSignal.timeout(15_000);\n\t\tconst response = await fetch(`${this.baseUrl}${path}`, {\n\t\t\theaders,\n\t\t\tsignal: signal ? AbortSignal.any([signal, timeout]) : timeout,\n\t\t});\n\t\tlet payload: unknown;\n\t\ttry {\n\t\t\tpayload = await response.json();\n\t\t} catch {\n\t\t\tpayload = undefined;\n\t\t}\n\t\tif (!response.ok) {\n\t\t\tconst fallback = `Hugging Face returned HTTP ${response.status}`;\n\t\t\tif (response.status === 429) {\n\t\t\t\tconst delay =\n\t\t\t\t\tNumber(response.headers.get(\"retry-after\")) || parseRateLimitDelay(response.headers.get(\"ratelimit\"));\n\t\t\t\tthrow new Error(\n\t\t\t\t\tdelay ? `Hugging Face rate limit reached; retry in ${delay}s` : \"Hugging Face rate limit reached\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(payloadError(payload, fallback));\n\t\t}\n\t\treturn payload;\n\t}\n\n\tasync search(query: string, signal?: AbortSignal): Promise<HuggingFaceModel[]> {\n\t\tconst params = new URLSearchParams({\n\t\t\tsearch: query,\n\t\t\tfilter: \"gguf\",\n\t\t\tsort: \"downloads\",\n\t\t\tdirection: \"-1\",\n\t\t\tlimit: \"20\",\n\t\t});\n\t\tconst payload = await this.request(`/api/models?${params}`, signal);\n\t\tif (!Array.isArray(payload)) throw new Error(\"Hugging Face returned invalid search results\");\n\t\treturn payload.flatMap((value) => {\n\t\t\tif (typeof value !== \"object\" || value === null || typeof (value as { id?: unknown }).id !== \"string\")\n\t\t\t\treturn [];\n\t\t\tconst model = value as { id: string; downloads?: unknown };\n\t\t\treturn [{ id: model.id, downloads: typeof model.downloads === \"number\" ? model.downloads : 0 }];\n\t\t});\n\t}\n\n\tasync details(id: string, signal?: AbortSignal): Promise<HuggingFaceModelDetails> {\n\t\tconst encodedId = id.split(\"/\").map(encodeURIComponent).join(\"/\");\n\t\tconst payload = await this.request(`/api/models/${encodedId}?blobs=true`, signal);\n\t\tif (typeof payload !== \"object\" || payload === null) {\n\t\t\tthrow new Error(\"Hugging Face returned invalid model details\");\n\t\t}\n\t\tconst model = payload as { id?: unknown; gated?: unknown; siblings?: unknown };\n\t\tconst sizes = new Map<string, { total: number; complete: boolean }>();\n\t\tif (Array.isArray(model.siblings)) {\n\t\t\tfor (const value of model.siblings) {\n\t\t\t\tif (typeof value !== \"object\" || value === null) continue;\n\t\t\t\tconst file = value as { rfilename?: unknown; size?: unknown };\n\t\t\t\tif (typeof file.rfilename !== \"string\" || !file.rfilename.toLowerCase().endsWith(\".gguf\")) continue;\n\t\t\t\tconst filename = file.rfilename.split(\"/\").at(-1)!;\n\t\t\t\tif (filename.toLowerCase().startsWith(\"mmproj\")) continue;\n\t\t\t\tconst stem = filename.slice(0, -5).replace(SHARD_SUFFIX_PATTERN, \"\");\n\t\t\t\tconst quantization = stem.match(QUANTIZATION_PATTERN)?.[1]?.toUpperCase();\n\t\t\t\tif (!quantization) continue;\n\t\t\t\tconst current = sizes.get(quantization) ?? { total: 0, complete: true };\n\t\t\t\tif (typeof file.size === \"number\") current.total += file.size;\n\t\t\t\telse current.complete = false;\n\t\t\t\tsizes.set(quantization, current);\n\t\t\t}\n\t\t}\n\t\tconst quantizations = [...sizes]\n\t\t\t.map(([name, size]) => ({ name, size: size.complete ? size.total : undefined }))\n\t\t\t.sort((left, right) => {\n\t\t\t\tif (left.name === \"Q4_K_M\") return -1;\n\t\t\t\tif (right.name === \"Q4_K_M\") return 1;\n\t\t\t\treturn (\n\t\t\t\t\t(left.size ?? Number.MAX_SAFE_INTEGER) - (right.size ?? Number.MAX_SAFE_INTEGER) ||\n\t\t\t\t\tleft.name.localeCompare(right.name)\n\t\t\t\t);\n\t\t\t});\n\t\treturn {\n\t\t\tid: typeof model.id === \"string\" ? model.id : id,\n\t\t\tgated: model.gated === \"auto\" || model.gated === \"manual\" ? model.gated : false,\n\t\t\tquantizations,\n\t\t};\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "../../core/extensions/types.ts";
2
+ export default function llamaExtension(pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gCAAgC,CAAC;AAyC5F,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmL7D","sourcesContent":["import type { ExtensionAPI, ExtensionCommandContext } from \"../../core/extensions/types.ts\";\nimport { formatBytes, LlamaClient, type LlamaModelInfo, normalizeLlamaServerUrl } from \"./client.ts\";\nimport { findHuggingFaceToken, HuggingFaceClient } from \"./huggingface.ts\";\nimport { createLlamaProvider, LLAMA_PROVIDER_ID } from \"./provider.ts\";\nimport { type LlamaUi, runWithProgress, showLlamaUi } from \"./ui.ts\";\n\nfunction modelIsLoaded(model: LlamaModelInfo): boolean {\n\treturn model.status.value === \"loaded\" || model.status.value === \"sleeping\";\n}\n\nfunction isConnectionError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst message = `${error.name} ${error.message}`.toLowerCase();\n\treturn message.includes(\"fetch failed\") || message.includes(\"timeout\") || message.includes(\"network\");\n}\n\nfunction connectionErrorMessage(error: unknown): string {\n\tif (isConnectionError(error)) return \"Could not connect to the server.\";\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction parseHuggingFaceModel(value: string): { repository: string; quantization?: string } {\n\tconst colon = value.indexOf(\":\", value.indexOf(\"/\") + 1);\n\treturn colon < 0\n\t\t? { repository: value }\n\t\t: { repository: value.slice(0, colon), quantization: value.slice(colon + 1) };\n}\n\nasync function configuredClient(ctx: ExtensionCommandContext): Promise<LlamaClient | undefined> {\n\tconst result = await ctx.modelRegistry.getProviderAuth(LLAMA_PROVIDER_ID);\n\tif (!result) {\n\t\tctx.ui.notify(\"Configure llama.cpp with /profile\", \"warning\");\n\t\treturn undefined;\n\t}\n\tconst configuredUrl = result.env?.LLAMA_BASE_URL;\n\tconst serverUrl = normalizeLlamaServerUrl(\n\t\ttypeof configuredUrl === \"string\" && configuredUrl ? configuredUrl : (result.auth.baseUrl ?? \"\"),\n\t);\n\treturn new LlamaClient(serverUrl, result.auth.apiKey);\n}\n\nexport default function llamaExtension(pi: ExtensionAPI): void {\n\tconst provider = createLlamaProvider();\n\tpi.registerProvider(provider.provider);\n\n\tconst syncCatalog = async (\n\t\tctx: ExtensionCommandContext,\n\t\tclient: LlamaClient,\n\t\tcatalog?: LlamaModelInfo[],\n\t): Promise<LlamaModelInfo[]> => {\n\t\tconst current = catalog ?? (await client.list());\n\t\tprovider.setCatalog(current, client.serverUrl);\n\t\tawait ctx.modelRegistry.refresh();\n\t\treturn current;\n\t};\n\n\tconst loadModel = async (\n\t\tctx: ExtensionCommandContext,\n\t\tui: LlamaUi,\n\t\tclient: LlamaClient,\n\t\tcatalog: LlamaModelInfo[],\n\t\ttarget: LlamaModelInfo,\n\t): Promise<void> => {\n\t\tconst loaded = catalog.filter((model) => model.id !== target.id && modelIsLoaded(model));\n\t\tlet replace = false;\n\t\tif (loaded.length > 0) {\n\t\t\tconst choice = await ui.select(`${loaded.length} model${loaded.length === 1 ? \" is\" : \"s are\"} loaded`, [\n\t\t\t\t\"Unload all and load\",\n\t\t\t\t\"Keep loaded and load\",\n\t\t\t\t\"Cancel\",\n\t\t\t]);\n\t\t\tif (!choice || choice === \"Cancel\") return;\n\t\t\treplace = choice === \"Unload all and load\";\n\t\t}\n\n\t\tconst restoreLoaded = async (): Promise<void> => {\n\t\t\tctx.ui.notify(\"Restoring previously loaded models\");\n\t\t\tfor (const model of loaded) await client.loadAndWait(model.id, () => {});\n\t\t\tawait syncCatalog(ctx, client);\n\t\t};\n\t\tif (replace) {\n\t\t\tfor (const model of loaded) await client.unloadAndWait(model.id);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await runWithProgress(ui, {\n\t\t\t\ttitle: \"Loading model\",\n\t\t\t\tmodel: target.id,\n\t\t\t\tinitialMessage: \"Starting…\",\n\t\t\t\tcancelTitle: \"Stop loading?\",\n\t\t\t\tcancelMessage: target.id,\n\t\t\t\trun: (signal, update) => client.loadAndWait(target.id, update, signal),\n\t\t\t\tcancel: () => client.unload(target.id),\n\t\t\t});\n\t\t\tif (result.cancelled) {\n\t\t\t\tif (replace) await restoreLoaded();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst refreshed = await syncCatalog(ctx, client);\n\t\t\tconst loadedModel = refreshed.find((model) => model.id === target.id);\n\t\t\tctx.ui.notify(\n\t\t\t\tloadedModel?.status.value === \"loaded\" ? `Loaded ${target.id}` : `Load started for ${target.id}`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (replace) {\n\t\t\t\ttry {\n\t\t\t\t\tawait restoreLoaded();\n\t\t\t\t} catch {\n\t\t\t\t\t// Preserve the original load error.\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst unloadModel = async (\n\t\tctx: ExtensionCommandContext,\n\t\tui: LlamaUi,\n\t\tclient: LlamaClient,\n\t\tmodel: LlamaModelInfo,\n\t): Promise<void> => {\n\t\tif (!(await ui.confirm(\"Unload model?\", model.id))) return;\n\t\tawait client.unloadAndWait(model.id);\n\t\tawait syncCatalog(ctx, client);\n\t\tctx.ui.notify(`Unloaded ${model.id}`);\n\t};\n\n\tconst downloadModel = async (ctx: ExtensionCommandContext, ui: LlamaUi, client: LlamaClient): Promise<void> => {\n\t\tconst huggingFace = new HuggingFaceClient(await findHuggingFaceToken());\n\t\tconst selected = await ui.searchModels((query, signal) => huggingFace.search(query, signal));\n\t\tif (!selected) return;\n\t\tconst parsed = parseHuggingFaceModel(selected);\n\t\tui.showStatus(\"Loading model details\", parsed.repository);\n\t\tconst details = await huggingFace.details(parsed.repository);\n\t\tif (details.gated) {\n\t\t\tconst approval = details.gated === \"manual\" ? \"Manual approval is required\" : \"Accept the access terms\";\n\t\t\tconst choice = await ui.select(\n\t\t\t\t`Hugging Face access required\\n${details.id}\\n\\n${approval} at:\\nhttps://huggingface.co/${details.id}\\n\\nThe llama.cpp server needs HF_TOKEN with access.`,\n\t\t\t\t[\"Continue\", \"Back\"],\n\t\t\t);\n\t\t\tif (choice !== \"Continue\") return;\n\t\t}\n\t\tlet quantization = parsed.quantization;\n\t\tif (!quantization && details.quantizations.length > 0) {\n\t\t\tconst options = details.quantizations.map((entry) => {\n\t\t\t\tconst detail = [\n\t\t\t\t\tentry.size === undefined ? undefined : formatBytes(entry.size),\n\t\t\t\t\tentry.name === \"Q4_K_M\" ? \"recommended\" : undefined,\n\t\t\t\t]\n\t\t\t\t\t.filter((value): value is string => Boolean(value))\n\t\t\t\t\t.join(\" · \");\n\t\t\t\treturn detail ? `${entry.name} · ${detail}` : entry.name;\n\t\t\t});\n\t\t\tconst choice = await ui.select(`Select quantization\\n${details.id}`, options);\n\t\t\tif (!choice) return;\n\t\t\tquantization = details.quantizations[options.indexOf(choice)]?.name;\n\t\t\tif (!quantization) return;\n\t\t}\n\t\tconst model = quantization ? `${details.id}:${quantization}` : details.id;\n\t\tconst result = await runWithProgress(ui, {\n\t\t\ttitle: \"Downloading model\",\n\t\t\tmodel,\n\t\t\tinitialMessage: \"Starting…\",\n\t\t\tcancelTitle: \"Stop download?\",\n\t\t\tcancelMessage: model,\n\t\t\trun: (signal, update) => client.downloadAndWait(model, update, signal),\n\t\t\tcancel: () => client.unload(model),\n\t\t});\n\t\tif (result.cancelled) return;\n\t\tawait syncCatalog(ctx, client, result.value);\n\t\tctx.ui.notify(`Downloaded ${model}`);\n\t};\n\n\tpi.registerCommand(\"llama\", {\n\t\tdescription: \"Manage llama.cpp router models\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (ctx.mode !== \"tui\") {\n\t\t\t\tctx.ui.notify(\"/llama is available in interactive mode\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst client = await configuredClient(ctx);\n\t\t\tif (!client) return;\n\t\t\tawait showLlamaUi(ctx, async (ui) => {\n\t\t\t\tconst readCatalog = async (): Promise<LlamaModelInfo[] | undefined> => {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn await syncCatalog(ctx, client);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif ((await ui.connectionError(client.serverUrl, connectionErrorMessage(error))) === \"close\") {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet catalog = await readCatalog();\n\t\t\t\tif (!catalog) return;\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst action = await ui.showModels(client.serverUrl, catalog);\n\t\t\t\t\tif (action.type === \"close\") return;\n\t\t\t\t\tlet actionError: unknown;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (action.type === \"download\") await downloadModel(ctx, ui, client);\n\t\t\t\t\t\telse if (modelIsLoaded(action.model)) await unloadModel(ctx, ui, client, action.model);\n\t\t\t\t\t\telse if (action.model.status.value === \"unloaded\")\n\t\t\t\t\t\t\tawait loadModel(ctx, ui, client, catalog, action.model);\n\t\t\t\t\t\telse ctx.ui.notify(`${action.model.id} is ${action.model.status.value}`, \"warning\");\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tactionError = error;\n\t\t\t\t\t}\n\t\t\t\t\tconst refreshed = await readCatalog();\n\t\t\t\t\tif (!refreshed) return;\n\t\t\t\t\tcatalog = refreshed;\n\t\t\t\t\tif (actionError && !isConnectionError(actionError)) {\n\t\t\t\t\t\tctx.ui.notify(actionError instanceof Error ? actionError.message : String(actionError), \"error\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t});\n}\n"]}