openvibe 0.57.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 (636) hide show
  1. package/CHANGELOG.md +3041 -0
  2. package/README.md +569 -0
  3. package/dist/cli/args.d.ts +44 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +272 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/config-selector.d.ts +10 -0
  8. package/dist/cli/config-selector.d.ts.map +1 -0
  9. package/dist/cli/config-selector.js +26 -0
  10. package/dist/cli/config-selector.js.map +1 -0
  11. package/dist/cli/file-processor.d.ts +10 -0
  12. package/dist/cli/file-processor.d.ts.map +1 -0
  13. package/dist/cli/file-processor.js +68 -0
  14. package/dist/cli/file-processor.js.map +1 -0
  15. package/dist/cli/list-models.d.ts +3 -0
  16. package/dist/cli/list-models.d.ts.map +1 -0
  17. package/dist/cli/list-models.js +30 -0
  18. package/dist/cli/list-models.js.map +1 -0
  19. package/dist/cli/session-picker.d.ts +5 -0
  20. package/dist/cli/session-picker.d.ts.map +1 -0
  21. package/dist/cli/session-picker.js +30 -0
  22. package/dist/cli/session-picker.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +31 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +29 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +145 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/core/accelerated-client.d.ts +42 -0
  32. package/dist/core/accelerated-client.d.ts.map +1 -0
  33. package/dist/core/accelerated-client.js +97 -0
  34. package/dist/core/accelerated-client.js.map +1 -0
  35. package/dist/core/accelerated-stream.d.ts +41 -0
  36. package/dist/core/accelerated-stream.d.ts.map +1 -0
  37. package/dist/core/accelerated-stream.js +133 -0
  38. package/dist/core/accelerated-stream.js.map +1 -0
  39. package/dist/core/agent-session.d.ts +566 -0
  40. package/dist/core/agent-session.d.ts.map +1 -0
  41. package/dist/core/agent-session.js +2361 -0
  42. package/dist/core/agent-session.js.map +1 -0
  43. package/dist/core/api-concurrency.d.ts +37 -0
  44. package/dist/core/api-concurrency.d.ts.map +1 -0
  45. package/dist/core/api-concurrency.js +179 -0
  46. package/dist/core/api-concurrency.js.map +1 -0
  47. package/dist/core/auth-storage.d.ts +66 -0
  48. package/dist/core/auth-storage.d.ts.map +1 -0
  49. package/dist/core/auth-storage.js +336 -0
  50. package/dist/core/auth-storage.js.map +1 -0
  51. package/dist/core/bash-executor.d.ts +15 -0
  52. package/dist/core/bash-executor.d.ts.map +1 -0
  53. package/dist/core/bash-executor.js +166 -0
  54. package/dist/core/bash-executor.js.map +1 -0
  55. package/dist/core/branded-ai.d.ts +17 -0
  56. package/dist/core/branded-ai.d.ts.map +1 -0
  57. package/dist/core/branded-ai.js +123 -0
  58. package/dist/core/branded-ai.js.map +1 -0
  59. package/dist/core/compaction/branch-summarization.d.ts +37 -0
  60. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  61. package/dist/core/compaction/branch-summarization.js +158 -0
  62. package/dist/core/compaction/branch-summarization.js.map +1 -0
  63. package/dist/core/compaction/compaction.d.ts +56 -0
  64. package/dist/core/compaction/compaction.d.ts.map +1 -0
  65. package/dist/core/compaction/compaction.js +501 -0
  66. package/dist/core/compaction/compaction.js.map +1 -0
  67. package/dist/core/compaction/index.d.ts +4 -0
  68. package/dist/core/compaction/index.d.ts.map +1 -0
  69. package/dist/core/compaction/index.js +4 -0
  70. package/dist/core/compaction/index.js.map +1 -0
  71. package/dist/core/compaction/utils.d.ts +17 -0
  72. package/dist/core/compaction/utils.d.ts.map +1 -0
  73. package/dist/core/compaction/utils.js +120 -0
  74. package/dist/core/compaction/utils.js.map +1 -0
  75. package/dist/core/defaults.d.ts +3 -0
  76. package/dist/core/defaults.d.ts.map +1 -0
  77. package/dist/core/defaults.js +2 -0
  78. package/dist/core/defaults.js.map +1 -0
  79. package/dist/core/diagnostics.d.ts +15 -0
  80. package/dist/core/diagnostics.d.ts.map +1 -0
  81. package/dist/core/diagnostics.js +2 -0
  82. package/dist/core/diagnostics.js.map +1 -0
  83. package/dist/core/event-bus.d.ts +9 -0
  84. package/dist/core/event-bus.d.ts.map +1 -0
  85. package/dist/core/event-bus.js +25 -0
  86. package/dist/core/event-bus.js.map +1 -0
  87. package/dist/core/exec.d.ts +13 -0
  88. package/dist/core/exec.d.ts.map +1 -0
  89. package/dist/core/exec.js +61 -0
  90. package/dist/core/exec.js.map +1 -0
  91. package/dist/core/export-html/ansi-to-html.d.ts +3 -0
  92. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  93. package/dist/core/export-html/ansi-to-html.js +193 -0
  94. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  95. package/dist/core/export-html/index.d.ts +22 -0
  96. package/dist/core/export-html/index.d.ts.map +1 -0
  97. package/dist/core/export-html/index.js +193 -0
  98. package/dist/core/export-html/index.js.map +1 -0
  99. package/dist/core/export-html/template.css +971 -0
  100. package/dist/core/export-html/template.html +54 -0
  101. package/dist/core/export-html/template.js +1583 -0
  102. package/dist/core/export-html/tool-renderer.d.ts +21 -0
  103. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  104. package/dist/core/export-html/tool-renderer.js +51 -0
  105. package/dist/core/export-html/tool-renderer.js.map +1 -0
  106. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  107. package/dist/core/export-html/vendor/marked.min.js +6 -0
  108. package/dist/core/extensions/index.d.ts +8 -0
  109. package/dist/core/extensions/index.d.ts.map +1 -0
  110. package/dist/core/extensions/index.js +5 -0
  111. package/dist/core/extensions/index.js.map +1 -0
  112. package/dist/core/extensions/loader.d.ts +7 -0
  113. package/dist/core/extensions/loader.d.ts.map +1 -0
  114. package/dist/core/extensions/loader.js +349 -0
  115. package/dist/core/extensions/loader.js.map +1 -0
  116. package/dist/core/extensions/runner.d.ts +124 -0
  117. package/dist/core/extensions/runner.d.ts.map +1 -0
  118. package/dist/core/extensions/runner.js +657 -0
  119. package/dist/core/extensions/runner.js.map +1 -0
  120. package/dist/core/extensions/types.d.ts +1032 -0
  121. package/dist/core/extensions/types.d.ts.map +1 -0
  122. package/dist/core/extensions/types.js +35 -0
  123. package/dist/core/extensions/types.js.map +1 -0
  124. package/dist/core/extensions/wrapper.d.ts +8 -0
  125. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  126. package/dist/core/extensions/wrapper.js +79 -0
  127. package/dist/core/extensions/wrapper.js.map +1 -0
  128. package/dist/core/footer-data-provider.d.ts +19 -0
  129. package/dist/core/footer-data-provider.d.ts.map +1 -0
  130. package/dist/core/footer-data-provider.js +113 -0
  131. package/dist/core/footer-data-provider.js.map +1 -0
  132. package/dist/core/index.d.ts +13 -0
  133. package/dist/core/index.d.ts.map +1 -0
  134. package/dist/core/index.js +11 -0
  135. package/dist/core/index.js.map +1 -0
  136. package/dist/core/keybindings.d.ts +22 -0
  137. package/dist/core/keybindings.d.ts.map +1 -0
  138. package/dist/core/keybindings.js +124 -0
  139. package/dist/core/keybindings.js.map +1 -0
  140. package/dist/core/messages.d.ts +51 -0
  141. package/dist/core/messages.d.ts.map +1 -0
  142. package/dist/core/messages.js +102 -0
  143. package/dist/core/messages.js.map +1 -0
  144. package/dist/core/model-registry.d.ts +26 -0
  145. package/dist/core/model-registry.d.ts.map +1 -0
  146. package/dist/core/model-registry.js +61 -0
  147. package/dist/core/model-registry.js.map +1 -0
  148. package/dist/core/model-resolver.d.ts +20 -0
  149. package/dist/core/model-resolver.d.ts.map +1 -0
  150. package/dist/core/model-resolver.js +47 -0
  151. package/dist/core/model-resolver.js.map +1 -0
  152. package/dist/core/multi-gpu-executor.d.ts +50 -0
  153. package/dist/core/multi-gpu-executor.d.ts.map +1 -0
  154. package/dist/core/multi-gpu-executor.js +201 -0
  155. package/dist/core/multi-gpu-executor.js.map +1 -0
  156. package/dist/core/onboarding.d.ts +3 -0
  157. package/dist/core/onboarding.d.ts.map +1 -0
  158. package/dist/core/onboarding.js +109 -0
  159. package/dist/core/onboarding.js.map +1 -0
  160. package/dist/core/package-manager.d.ts +136 -0
  161. package/dist/core/package-manager.d.ts.map +1 -0
  162. package/dist/core/package-manager.js +1375 -0
  163. package/dist/core/package-manager.js.map +1 -0
  164. package/dist/core/prompt-templates.d.ts +18 -0
  165. package/dist/core/prompt-templates.d.ts.map +1 -0
  166. package/dist/core/prompt-templates.js +204 -0
  167. package/dist/core/prompt-templates.js.map +1 -0
  168. package/dist/core/resolve-config-value.d.ts +4 -0
  169. package/dist/core/resolve-config-value.d.ts.map +1 -0
  170. package/dist/core/resolve-config-value.js +45 -0
  171. package/dist/core/resolve-config-value.js.map +1 -0
  172. package/dist/core/resource-loader.d.ts +184 -0
  173. package/dist/core/resource-loader.d.ts.map +1 -0
  174. package/dist/core/resource-loader.js +661 -0
  175. package/dist/core/resource-loader.js.map +1 -0
  176. package/dist/core/response-accelerator.d.ts +51 -0
  177. package/dist/core/response-accelerator.d.ts.map +1 -0
  178. package/dist/core/response-accelerator.js +149 -0
  179. package/dist/core/response-accelerator.js.map +1 -0
  180. package/dist/core/sdk.d.ts +39 -0
  181. package/dist/core/sdk.d.ts.map +1 -0
  182. package/dist/core/sdk.js +151 -0
  183. package/dist/core/sdk.js.map +1 -0
  184. package/dist/core/session-manager.d.ts +160 -0
  185. package/dist/core/session-manager.d.ts.map +1 -0
  186. package/dist/core/session-manager.js +899 -0
  187. package/dist/core/session-manager.js.map +1 -0
  188. package/dist/core/settings-manager.d.ts +220 -0
  189. package/dist/core/settings-manager.d.ts.map +1 -0
  190. package/dist/core/settings-manager.js +673 -0
  191. package/dist/core/settings-manager.js.map +1 -0
  192. package/dist/core/skills.d.ts +33 -0
  193. package/dist/core/skills.d.ts.map +1 -0
  194. package/dist/core/skills.js +326 -0
  195. package/dist/core/skills.js.map +1 -0
  196. package/dist/core/slash-commands.d.ts +15 -0
  197. package/dist/core/slash-commands.d.ts.map +1 -0
  198. package/dist/core/slash-commands.js +19 -0
  199. package/dist/core/slash-commands.js.map +1 -0
  200. package/dist/core/system-prompt.d.ts +23 -0
  201. package/dist/core/system-prompt.d.ts.map +1 -0
  202. package/dist/core/system-prompt.js +154 -0
  203. package/dist/core/system-prompt.js.map +1 -0
  204. package/dist/core/timings.d.ts +3 -0
  205. package/dist/core/timings.d.ts.map +1 -0
  206. package/dist/core/timings.js +21 -0
  207. package/dist/core/timings.js.map +1 -0
  208. package/dist/core/tools/bash.d.ts +40 -0
  209. package/dist/core/tools/bash.d.ts.map +1 -0
  210. package/dist/core/tools/bash.js +212 -0
  211. package/dist/core/tools/bash.js.map +1 -0
  212. package/dist/core/tools/edit-diff.d.ts +29 -0
  213. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  214. package/dist/core/tools/edit-diff.js +182 -0
  215. package/dist/core/tools/edit-diff.js.map +1 -0
  216. package/dist/core/tools/edit.d.ts +28 -0
  217. package/dist/core/tools/edit.d.ts.map +1 -0
  218. package/dist/core/tools/edit.js +129 -0
  219. package/dist/core/tools/edit.js.map +1 -0
  220. package/dist/core/tools/fast-executor.d.ts +33 -0
  221. package/dist/core/tools/fast-executor.d.ts.map +1 -0
  222. package/dist/core/tools/fast-executor.js +83 -0
  223. package/dist/core/tools/fast-executor.js.map +1 -0
  224. package/dist/core/tools/find.d.ts +28 -0
  225. package/dist/core/tools/find.d.ts.map +1 -0
  226. package/dist/core/tools/find.js +50 -0
  227. package/dist/core/tools/find.js.map +1 -0
  228. package/dist/core/tools/grep.d.ts +37 -0
  229. package/dist/core/tools/grep.d.ts.map +1 -0
  230. package/dist/core/tools/grep.js +233 -0
  231. package/dist/core/tools/grep.js.map +1 -0
  232. package/dist/core/tools/index.d.ts +63 -0
  233. package/dist/core/tools/index.d.ts.map +1 -0
  234. package/dist/core/tools/index.js +52 -0
  235. package/dist/core/tools/index.js.map +1 -0
  236. package/dist/core/tools/local-accelerator.d.ts +65 -0
  237. package/dist/core/tools/local-accelerator.d.ts.map +1 -0
  238. package/dist/core/tools/local-accelerator.js +198 -0
  239. package/dist/core/tools/local-accelerator.js.map +1 -0
  240. package/dist/core/tools/ls.d.ts +31 -0
  241. package/dist/core/tools/ls.d.ts.map +1 -0
  242. package/dist/core/tools/ls.js +109 -0
  243. package/dist/core/tools/ls.js.map +1 -0
  244. package/dist/core/tools/parallel-executor.d.ts +60 -0
  245. package/dist/core/tools/parallel-executor.d.ts.map +1 -0
  246. package/dist/core/tools/parallel-executor.js +257 -0
  247. package/dist/core/tools/parallel-executor.js.map +1 -0
  248. package/dist/core/tools/path-utils.d.ts +4 -0
  249. package/dist/core/tools/path-utils.d.ts.map +1 -0
  250. package/dist/core/tools/path-utils.js +70 -0
  251. package/dist/core/tools/path-utils.js.map +1 -0
  252. package/dist/core/tools/read.d.ts +29 -0
  253. package/dist/core/tools/read.d.ts.map +1 -0
  254. package/dist/core/tools/read.js +146 -0
  255. package/dist/core/tools/read.js.map +1 -0
  256. package/dist/core/tools/truncate.d.ts +28 -0
  257. package/dist/core/tools/truncate.d.ts.map +1 -0
  258. package/dist/core/tools/truncate.js +161 -0
  259. package/dist/core/tools/truncate.js.map +1 -0
  260. package/dist/core/tools/write.d.ts +21 -0
  261. package/dist/core/tools/write.d.ts.map +1 -0
  262. package/dist/core/tools/write.js +69 -0
  263. package/dist/core/tools/write.js.map +1 -0
  264. package/dist/core/user-config.d.ts +26 -0
  265. package/dist/core/user-config.d.ts.map +1 -0
  266. package/dist/core/user-config.js +75 -0
  267. package/dist/core/user-config.js.map +1 -0
  268. package/dist/index.d.ts +27 -0
  269. package/dist/index.d.ts.map +1 -0
  270. package/dist/index.js +42 -0
  271. package/dist/index.js.map +1 -0
  272. package/dist/main.d.ts +2 -0
  273. package/dist/main.d.ts.map +1 -0
  274. package/dist/main.js +609 -0
  275. package/dist/main.js.map +1 -0
  276. package/dist/migrations.d.ts +8 -0
  277. package/dist/migrations.d.ts.map +1 -0
  278. package/dist/migrations.js +197 -0
  279. package/dist/migrations.js.map +1 -0
  280. package/dist/modes/index.d.ts +6 -0
  281. package/dist/modes/index.d.ts.map +1 -0
  282. package/dist/modes/index.js +5 -0
  283. package/dist/modes/index.js.map +1 -0
  284. package/dist/modes/interactive/components/armin.d.ts +31 -0
  285. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  286. package/dist/modes/interactive/components/armin.js +306 -0
  287. package/dist/modes/interactive/components/armin.js.map +1 -0
  288. package/dist/modes/interactive/components/assistant-message.d.ts +13 -0
  289. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  290. package/dist/modes/interactive/components/assistant-message.js +82 -0
  291. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  292. package/dist/modes/interactive/components/bash-execution.d.ts +23 -0
  293. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/bash-execution.js +126 -0
  295. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  296. package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
  297. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  298. package/dist/modes/interactive/components/bordered-loader.js +50 -0
  299. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  300. package/dist/modes/interactive/components/branch-summary-message.d.ts +12 -0
  301. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  302. package/dist/modes/interactive/components/branch-summary-message.js +40 -0
  303. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  304. package/dist/modes/interactive/components/compaction-summary-message.d.ts +12 -0
  305. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  306. package/dist/modes/interactive/components/compaction-summary-message.js +41 -0
  307. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  308. package/dist/modes/interactive/components/config-selector.d.ts +68 -0
  309. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  310. package/dist/modes/interactive/components/config-selector.js +451 -0
  311. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  312. package/dist/modes/interactive/components/countdown-timer.d.ts +11 -0
  313. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  314. package/dist/modes/interactive/components/countdown-timer.js +30 -0
  315. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  316. package/dist/modes/interactive/components/custom-editor.d.ts +14 -0
  317. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  318. package/dist/modes/interactive/components/custom-editor.js +52 -0
  319. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  320. package/dist/modes/interactive/components/custom-message.d.ts +16 -0
  321. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  322. package/dist/modes/interactive/components/custom-message.js +66 -0
  323. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  324. package/dist/modes/interactive/components/daxnuts.d.ts +18 -0
  325. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  326. package/dist/modes/interactive/components/daxnuts.js +130 -0
  327. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  328. package/dist/modes/interactive/components/diff.d.ts +5 -0
  329. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  330. package/dist/modes/interactive/components/diff.js +106 -0
  331. package/dist/modes/interactive/components/diff.js.map +1 -0
  332. package/dist/modes/interactive/components/dynamic-border.d.ts +8 -0
  333. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  334. package/dist/modes/interactive/components/dynamic-border.js +12 -0
  335. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  336. package/dist/modes/interactive/components/extension-editor.d.ts +16 -0
  337. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  338. package/dist/modes/interactive/components/extension-editor.js +95 -0
  339. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  340. package/dist/modes/interactive/components/extension-input.d.ts +20 -0
  341. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  342. package/dist/modes/interactive/components/extension-input.js +57 -0
  343. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  344. package/dist/modes/interactive/components/extension-selector.d.ts +20 -0
  345. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  346. package/dist/modes/interactive/components/extension-selector.js +74 -0
  347. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  348. package/dist/modes/interactive/components/footer.d.ts +14 -0
  349. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  350. package/dist/modes/interactive/components/footer.js +78 -0
  351. package/dist/modes/interactive/components/footer.js.map +1 -0
  352. package/dist/modes/interactive/components/index.d.ts +28 -0
  353. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  354. package/dist/modes/interactive/components/index.js +28 -0
  355. package/dist/modes/interactive/components/index.js.map +1 -0
  356. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  357. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  358. package/dist/modes/interactive/components/keybinding-hints.js +25 -0
  359. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  360. package/dist/modes/interactive/components/onboarding-wizard.d.ts +23 -0
  361. package/dist/modes/interactive/components/onboarding-wizard.d.ts.map +1 -0
  362. package/dist/modes/interactive/components/onboarding-wizard.js +250 -0
  363. package/dist/modes/interactive/components/onboarding-wizard.js.map +1 -0
  364. package/dist/modes/interactive/components/session-selector-search.d.ts +21 -0
  365. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  366. package/dist/modes/interactive/components/session-selector-search.js +149 -0
  367. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  368. package/dist/modes/interactive/components/session-selector.d.ts +89 -0
  369. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  370. package/dist/modes/interactive/components/session-selector.js +786 -0
  371. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  372. package/dist/modes/interactive/components/settings-selector.d.ts +55 -0
  373. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  374. package/dist/modes/interactive/components/settings-selector.js +273 -0
  375. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  376. package/dist/modes/interactive/components/show-images-selector.d.ts +7 -0
  377. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  378. package/dist/modes/interactive/components/show-images-selector.js +28 -0
  379. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  380. package/dist/modes/interactive/components/skill-invocation-message.d.ts +12 -0
  381. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  382. package/dist/modes/interactive/components/skill-invocation-message.js +40 -0
  383. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  384. package/dist/modes/interactive/components/theme-selector.d.ts +8 -0
  385. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  386. package/dist/modes/interactive/components/theme-selector.js +38 -0
  387. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  388. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -0
  389. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  390. package/dist/modes/interactive/components/thinking-selector.js +40 -0
  391. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  392. package/dist/modes/interactive/components/tool-execution.d.ts +54 -0
  393. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  394. package/dist/modes/interactive/components/tool-execution.js +704 -0
  395. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  396. package/dist/modes/interactive/components/tree-selector.d.ts +59 -0
  397. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  398. package/dist/modes/interactive/components/tree-selector.js +929 -0
  399. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  400. package/dist/modes/interactive/components/user-message-selector.d.ts +24 -0
  401. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  402. package/dist/modes/interactive/components/user-message-selector.js +89 -0
  403. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  404. package/dist/modes/interactive/components/user-message.d.ts +6 -0
  405. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  406. package/dist/modes/interactive/components/user-message.js +24 -0
  407. package/dist/modes/interactive/components/user-message.js.map +1 -0
  408. package/dist/modes/interactive/components/visual-truncate.d.ts +6 -0
  409. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  410. package/dist/modes/interactive/components/visual-truncate.js +15 -0
  411. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  412. package/dist/modes/interactive/interactive-mode.d.ts +177 -0
  413. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  414. package/dist/modes/interactive/interactive-mode.js +3037 -0
  415. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  416. package/dist/modes/interactive/theme/dark.json +85 -0
  417. package/dist/modes/interactive/theme/light.json +84 -0
  418. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  419. package/dist/modes/interactive/theme/theme.d.ts +60 -0
  420. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  421. package/dist/modes/interactive/theme/theme.js +852 -0
  422. package/dist/modes/interactive/theme/theme.js.map +1 -0
  423. package/dist/modes/print-mode.d.ts +10 -0
  424. package/dist/modes/print-mode.d.ts.map +1 -0
  425. package/dist/modes/print-mode.js +80 -0
  426. package/dist/modes/print-mode.js.map +1 -0
  427. package/dist/modes/rpc/jsonl.d.ts +4 -0
  428. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  429. package/dist/modes/rpc/jsonl.js +36 -0
  430. package/dist/modes/rpc/jsonl.js.map +1 -0
  431. package/dist/modes/rpc/rpc-client.d.ts +94 -0
  432. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  433. package/dist/modes/rpc/rpc-client.js +262 -0
  434. package/dist/modes/rpc/rpc-client.js.map +1 -0
  435. package/dist/modes/rpc/rpc-mode.d.ts +3 -0
  436. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  437. package/dist/modes/rpc/rpc-mode.js +227 -0
  438. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  439. package/dist/modes/rpc/rpc-types.d.ts +395 -0
  440. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  441. package/dist/modes/rpc/rpc-types.js +2 -0
  442. package/dist/modes/rpc/rpc-types.js.map +1 -0
  443. package/dist/utils/changelog.d.ts +11 -0
  444. package/dist/utils/changelog.d.ts.map +1 -0
  445. package/dist/utils/changelog.js +69 -0
  446. package/dist/utils/changelog.js.map +1 -0
  447. package/dist/utils/clipboard-image.d.ts +11 -0
  448. package/dist/utils/clipboard-image.d.ts.map +1 -0
  449. package/dist/utils/clipboard-image.js +157 -0
  450. package/dist/utils/clipboard-image.js.map +1 -0
  451. package/dist/utils/clipboard-native.d.ts +7 -0
  452. package/dist/utils/clipboard-native.d.ts.map +1 -0
  453. package/dist/utils/clipboard-native.js +14 -0
  454. package/dist/utils/clipboard-native.js.map +1 -0
  455. package/dist/utils/clipboard.d.ts +2 -0
  456. package/dist/utils/clipboard.d.ts.map +1 -0
  457. package/dist/utils/clipboard.js +55 -0
  458. package/dist/utils/clipboard.js.map +1 -0
  459. package/dist/utils/frontmatter.d.ts +8 -0
  460. package/dist/utils/frontmatter.d.ts.map +1 -0
  461. package/dist/utils/frontmatter.js +26 -0
  462. package/dist/utils/frontmatter.js.map +1 -0
  463. package/dist/utils/git.d.ts +10 -0
  464. package/dist/utils/git.d.ts.map +1 -0
  465. package/dist/utils/git.js +156 -0
  466. package/dist/utils/git.js.map +1 -0
  467. package/dist/utils/image-convert.d.ts +5 -0
  468. package/dist/utils/image-convert.d.ts.map +1 -0
  469. package/dist/utils/image-convert.js +28 -0
  470. package/dist/utils/image-convert.js.map +1 -0
  471. package/dist/utils/image-resize.d.ts +19 -0
  472. package/dist/utils/image-resize.d.ts.map +1 -0
  473. package/dist/utils/image-resize.js +152 -0
  474. package/dist/utils/image-resize.js.map +1 -0
  475. package/dist/utils/mime.d.ts +2 -0
  476. package/dist/utils/mime.d.ts.map +1 -0
  477. package/dist/utils/mime.js +26 -0
  478. package/dist/utils/mime.js.map +1 -0
  479. package/dist/utils/photon.d.ts +3 -0
  480. package/dist/utils/photon.d.ts.map +1 -0
  481. package/dist/utils/photon.js +102 -0
  482. package/dist/utils/photon.js.map +1 -0
  483. package/dist/utils/shell.d.ts +8 -0
  484. package/dist/utils/shell.d.ts.map +1 -0
  485. package/dist/utils/shell.js +135 -0
  486. package/dist/utils/shell.js.map +1 -0
  487. package/dist/utils/sleep.d.ts +2 -0
  488. package/dist/utils/sleep.d.ts.map +1 -0
  489. package/dist/utils/sleep.js +14 -0
  490. package/dist/utils/sleep.js.map +1 -0
  491. package/dist/utils/tools-manager.d.ts +3 -0
  492. package/dist/utils/tools-manager.d.ts.map +1 -0
  493. package/dist/utils/tools-manager.js +227 -0
  494. package/dist/utils/tools-manager.js.map +1 -0
  495. package/docs/compaction.md +392 -0
  496. package/docs/custom-provider.md +592 -0
  497. package/docs/development.md +69 -0
  498. package/docs/extensions.md +2023 -0
  499. package/docs/images/doom-extension.png +0 -0
  500. package/docs/images/exy.png +0 -0
  501. package/docs/images/interactive-mode.png +0 -0
  502. package/docs/images/tree-view.png +0 -0
  503. package/docs/json.md +79 -0
  504. package/docs/keybindings.md +182 -0
  505. package/docs/models.md +297 -0
  506. package/docs/packages.md +209 -0
  507. package/docs/prompt-templates.md +67 -0
  508. package/docs/providers.md +188 -0
  509. package/docs/rpc.md +1354 -0
  510. package/docs/sdk.md +968 -0
  511. package/docs/session.md +412 -0
  512. package/docs/settings.md +225 -0
  513. package/docs/shell-aliases.md +13 -0
  514. package/docs/skills.md +231 -0
  515. package/docs/terminal-setup.md +87 -0
  516. package/docs/termux.md +127 -0
  517. package/docs/themes.md +295 -0
  518. package/docs/tmux.md +61 -0
  519. package/docs/tree.md +228 -0
  520. package/docs/tui.md +887 -0
  521. package/docs/windows.md +17 -0
  522. package/examples/README.md +25 -0
  523. package/examples/extensions/README.md +205 -0
  524. package/examples/extensions/antigravity-image-gen.ts +415 -0
  525. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  526. package/examples/extensions/bash-spawn-hook.ts +30 -0
  527. package/examples/extensions/bookmark.ts +50 -0
  528. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  529. package/examples/extensions/claude-rules.ts +86 -0
  530. package/examples/extensions/commands.ts +72 -0
  531. package/examples/extensions/confirm-destructive.ts +59 -0
  532. package/examples/extensions/custom-compaction.ts +114 -0
  533. package/examples/extensions/custom-footer.ts +64 -0
  534. package/examples/extensions/custom-header.ts +73 -0
  535. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  536. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  537. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  538. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  539. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  540. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  541. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  542. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  543. package/examples/extensions/dirty-repo-guard.ts +56 -0
  544. package/examples/extensions/doom-overlay/README.md +46 -0
  545. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  546. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  547. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  548. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  549. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  550. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  551. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  552. package/examples/extensions/doom-overlay/index.ts +74 -0
  553. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  554. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  555. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  556. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  557. package/examples/extensions/dynamic-resources/index.ts +15 -0
  558. package/examples/extensions/dynamic-tools.ts +74 -0
  559. package/examples/extensions/event-bus.ts +43 -0
  560. package/examples/extensions/file-trigger.ts +41 -0
  561. package/examples/extensions/git-checkpoint.ts +53 -0
  562. package/examples/extensions/handoff.ts +150 -0
  563. package/examples/extensions/hello.ts +25 -0
  564. package/examples/extensions/inline-bash.ts +94 -0
  565. package/examples/extensions/input-transform.ts +43 -0
  566. package/examples/extensions/interactive-shell.ts +196 -0
  567. package/examples/extensions/mac-system-theme.ts +47 -0
  568. package/examples/extensions/message-renderer.ts +59 -0
  569. package/examples/extensions/minimal-mode.ts +426 -0
  570. package/examples/extensions/modal-editor.ts +85 -0
  571. package/examples/extensions/model-status.ts +31 -0
  572. package/examples/extensions/notify.ts +55 -0
  573. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  574. package/examples/extensions/overlay-test.ts +150 -0
  575. package/examples/extensions/permission-gate.ts +34 -0
  576. package/examples/extensions/pirate.ts +47 -0
  577. package/examples/extensions/plan-mode/README.md +65 -0
  578. package/examples/extensions/plan-mode/index.ts +340 -0
  579. package/examples/extensions/plan-mode/utils.ts +168 -0
  580. package/examples/extensions/preset.ts +398 -0
  581. package/examples/extensions/protected-paths.ts +30 -0
  582. package/examples/extensions/provider-payload.ts +14 -0
  583. package/examples/extensions/qna.ts +119 -0
  584. package/examples/extensions/question.ts +264 -0
  585. package/examples/extensions/questionnaire.ts +427 -0
  586. package/examples/extensions/rainbow-editor.ts +88 -0
  587. package/examples/extensions/reload-runtime.ts +37 -0
  588. package/examples/extensions/rpc-demo.ts +124 -0
  589. package/examples/extensions/sandbox/index.ts +318 -0
  590. package/examples/extensions/sandbox/package-lock.json +92 -0
  591. package/examples/extensions/sandbox/package.json +19 -0
  592. package/examples/extensions/send-user-message.ts +97 -0
  593. package/examples/extensions/session-name.ts +27 -0
  594. package/examples/extensions/shutdown-command.ts +63 -0
  595. package/examples/extensions/snake.ts +343 -0
  596. package/examples/extensions/space-invaders.ts +560 -0
  597. package/examples/extensions/ssh.ts +220 -0
  598. package/examples/extensions/status-line.ts +40 -0
  599. package/examples/extensions/subagent/README.md +172 -0
  600. package/examples/extensions/subagent/agents/planner.md +37 -0
  601. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  602. package/examples/extensions/subagent/agents/scout.md +50 -0
  603. package/examples/extensions/subagent/agents/worker.md +24 -0
  604. package/examples/extensions/subagent/agents.ts +126 -0
  605. package/examples/extensions/subagent/index.ts +964 -0
  606. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  607. package/examples/extensions/subagent/prompts/implement.md +10 -0
  608. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  609. package/examples/extensions/summarize.ts +195 -0
  610. package/examples/extensions/system-prompt-header.ts +17 -0
  611. package/examples/extensions/timed-confirm.ts +70 -0
  612. package/examples/extensions/titlebar-spinner.ts +58 -0
  613. package/examples/extensions/todo.ts +299 -0
  614. package/examples/extensions/tool-override.ts +143 -0
  615. package/examples/extensions/tools.ts +146 -0
  616. package/examples/extensions/trigger-compact.ts +40 -0
  617. package/examples/extensions/truncated-tool.ts +192 -0
  618. package/examples/extensions/widget-placement.ts +17 -0
  619. package/examples/extensions/with-deps/index.ts +32 -0
  620. package/examples/extensions/with-deps/package-lock.json +31 -0
  621. package/examples/extensions/with-deps/package.json +22 -0
  622. package/examples/rpc-extension-ui.ts +632 -0
  623. package/examples/sdk/01-minimal.ts +22 -0
  624. package/examples/sdk/02-custom-model.ts +49 -0
  625. package/examples/sdk/03-custom-prompt.ts +55 -0
  626. package/examples/sdk/04-skills.ts +46 -0
  627. package/examples/sdk/05-tools.ts +56 -0
  628. package/examples/sdk/06-extensions.ts +88 -0
  629. package/examples/sdk/07-context-files.ts +40 -0
  630. package/examples/sdk/08-prompt-templates.ts +47 -0
  631. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  632. package/examples/sdk/10-settings.ts +51 -0
  633. package/examples/sdk/11-sessions.ts +48 -0
  634. package/examples/sdk/12-full-control.ts +82 -0
  635. package/examples/sdk/README.md +144 -0
  636. package/package.json +100 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AA6aA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBA+MxC","sourcesContent":["import { type ImageContent, modelsAreEqual, supportsXhigh } from \"@mariozechner/pi-ai\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport { createInterface } from \"readline\";\nimport { type Args, parseArgs, printHelp } from \"./cli/args.js\";\nimport { selectConfig } from \"./cli/config-selector.js\";\nimport { processFileArguments } from \"./cli/file-processor.js\";\nimport { listModels } from \"./cli/list-models.js\";\nimport { selectSession } from \"./cli/session-picker.js\";\nimport { APP_NAME, getAgentDir, getModelsPath, VERSION } from \"./config.js\";\nimport { globalAcceleratedClient } from \"./core/accelerated-client.js\";\nimport { AuthStorage } from \"./core/auth-storage.js\";\nimport { exportFromFile } from \"./core/export-html/index.js\";\nimport type { LoadExtensionsResult } from \"./core/extensions/index.js\";\nimport { KeybindingsManager } from \"./core/keybindings.js\";\nimport { ModelRegistry } from \"./core/model-registry.js\";\nimport { globalMultiGPUExecutor } from \"./core/multi-gpu-executor.js\";\nimport { DefaultPackageManager } from \"./core/package-manager.js\";\nimport { DefaultResourceLoader } from \"./core/resource-loader.js\";\nimport { type CreateAgentSessionOptions, createAgentSession } from \"./core/sdk.js\";\nimport { SessionManager } from \"./core/session-manager.js\";\nimport { SettingsManager } from \"./core/settings-manager.js\";\nimport { printTimings, time } from \"./core/timings.js\";\nimport { allTools } from \"./core/tools/index.js\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.js\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"./modes/index.js\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.js\";\n\nfunction debugLog(stage: string, message: string, data?: any) {\n\tconst logLine = `[${new Date().toISOString()}] [${stage}] ${message}${data ? \": \" + JSON.stringify(data) : \"\"}\\n`;\n\tfs.appendFileSync(\"debug.log\", logLine);\n}\nasync function readPipedStdin(): Promise<string | undefined> {\n\tif (process.stdin.isTTY) {\n\t\treturn undefined;\n\t}\n\treturn new Promise((resolve) => {\n\t\tlet data = \"\";\n\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\tdata += chunk;\n\t\t});\n\t\tprocess.stdin.on(\"end\", () => {\n\t\t\tresolve(data.trim() || undefined);\n\t\t});\n\t\tprocess.stdin.resume();\n\t});\n}\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\n\tconst errors = settingsManager.drainErrors();\n\tfor (const { scope, error } of errors) {\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\n\t\tif (error.stack) {\n\t\t\tconsole.error(chalk.dim(error.stack));\n\t\t}\n\t}\n}\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\tif (!value) return false;\n\treturn value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\ntype PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\ninterface PackageCommandOptions {\n\tcommand: PackageCommand;\n\tsource?: string;\n\tlocal: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n}\nfunction getPackageCommandUsage(command: PackageCommand): string {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\n\t\tcase \"remove\":\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\n\t\tcase \"update\":\n\t\t\treturn `${APP_NAME} update [source]`;\n\t\tcase \"list\":\n\t\t\treturn `${APP_NAME} list`;\n\t}\n}\nfunction printPackageCommandHelp(command: PackageCommand): void {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"install\")}\nInstall a package and add it to settings.\nOptions:\n -l, --local Install project-locally (.pi/settings.json)\nExamples:\n ${APP_NAME} install npm:@foo/bar\n ${APP_NAME} install git:github.com/user/repo\n ${APP_NAME} install git:git@github.com:user/repo\n ${APP_NAME} install https:\n ${APP_NAME} install ssh:\n ${APP_NAME} install ./local/path\n`);\n\t\t\treturn;\n\t\tcase \"remove\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"remove\")}\nRemove a package and its source from settings.\nOptions:\n -l, --local Remove from project settings (.pi/settings.json)\nExample:\n ${APP_NAME} remove npm:@foo/bar\n`);\n\t\t\treturn;\n\t\tcase \"update\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"update\")}\nUpdate installed packages.\nIf <source> is provided, only that package is updated.\n`);\n\t\t\treturn;\n\t\tcase \"list\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"list\")}\nList installed packages from user and project settings.\n`);\n\t\t\treturn;\n\t}\n}\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\n\tconst [command, ...rest] = args;\n\tif (command !== \"install\" && command !== \"remove\" && command !== \"update\" && command !== \"list\") {\n\t\treturn undefined;\n\t}\n\tlet local = false;\n\tlet help = false;\n\tlet invalidOption: string | undefined;\n\tlet source: string | undefined;\n\tfor (const arg of rest) {\n\t\tif (arg === \"-h\" || arg === \"--help\") {\n\t\t\thelp = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"-l\" || arg === \"--local\") {\n\t\t\tif (command === \"install\" || command === \"remove\") {\n\t\t\t\tlocal = true;\n\t\t\t} else {\n\t\t\t\tinvalidOption = invalidOption ?? arg;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"-\")) {\n\t\t\tinvalidOption = invalidOption ?? arg;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!source) {\n\t\t\tsource = arg;\n\t\t}\n\t}\n\treturn { command, source, local, help, invalidOption };\n}\nasync function handlePackageCommand(args: string[]): Promise<boolean> {\n\tconst options = parsePackageCommand(args);\n\tif (!options) {\n\t\treturn false;\n\t}\n\tif (options.help) {\n\t\tprintPackageCommandHelp(options.command);\n\t\treturn true;\n\t}\n\tif (options.invalidOption) {\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n\tconst source = options.source;\n\tif ((options.command === \"install\" || options.command === \"remove\") && !source) {\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"package command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tpackageManager.setProgressCallback((event) => {\n\t\tif (event.type === \"start\") {\n\t\t\tprocess.stdout.write(chalk.dim(`${event.message}\\n`));\n\t\t}\n\t});\n\ttry {\n\t\tswitch (options.command) {\n\t\t\tcase \"install\":\n\t\t\t\tawait packageManager.install(source!, { local: options.local });\n\t\t\t\tpackageManager.addSourceToSettings(source!, { local: options.local });\n\t\t\t\tconsole.log(chalk.green(`Installed ${source}`));\n\t\t\t\treturn true;\n\t\t\tcase \"remove\": {\n\t\t\t\tawait packageManager.remove(source!, { local: options.local });\n\t\t\t\tconst removed = packageManager.removeSourceFromSettings(source!, { local: options.local });\n\t\t\t\tif (!removed) {\n\t\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\n\t\t\t\t\tprocess.exitCode = 1;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconsole.log(chalk.green(`Removed ${source}`));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcase \"list\": {\n\t\t\t\tconst globalSettings = settingsManager.getGlobalSettings();\n\t\t\t\tconst projectSettings = settingsManager.getProjectSettings();\n\t\t\t\tconst globalPackages = globalSettings.packages ?? [];\n\t\t\t\tconst projectPackages = projectSettings.packages ?? [];\n\t\t\t\tif (globalPackages.length === 0 && projectPackages.length === 0) {\n\t\t\t\t\tconsole.log(chalk.dim(\"No packages installed.\"));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst formatPackage = (pkg: (typeof globalPackages)[number], scope: \"user\" | \"project\") => {\n\t\t\t\t\tconst source = typeof pkg === \"string\" ? pkg : pkg.source;\n\t\t\t\t\tconst filtered = typeof pkg === \"object\";\n\t\t\t\t\tconst display = filtered ? `${source} (filtered)` : source;\n\t\t\t\t\tconsole.log(` ${display}`);\n\t\t\t\t\tconst path = packageManager.getInstalledPath(source, scope);\n\t\t\t\t\tif (path) {\n\t\t\t\t\t\tconsole.log(chalk.dim(` ${path}`));\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (globalPackages.length > 0) {\n\t\t\t\t\tconsole.log(chalk.bold(\"User packages:\"));\n\t\t\t\t\tfor (const pkg of globalPackages) {\n\t\t\t\t\t\tformatPackage(pkg, \"user\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (projectPackages.length > 0) {\n\t\t\t\t\tif (globalPackages.length > 0) console.log();\n\t\t\t\t\tconsole.log(chalk.bold(\"Project packages:\"));\n\t\t\t\t\tfor (const pkg of projectPackages) {\n\t\t\t\t\t\tformatPackage(pkg, \"project\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcase \"update\":\n\t\t\t\tawait packageManager.update(source);\n\t\t\t\tif (source) {\n\t\t\t\t\tconsole.log(chalk.green(`Updated ${source}`));\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(chalk.green(\"Updated packages\"));\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t}\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n}\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n): Promise<{\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n}> {\n\tif (parsed.fileArgs.length === 0) {\n\t\treturn {};\n\t}\n\tconst { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });\n\tlet initialMessage: string;\n\tif (parsed.messages.length > 0) {\n\t\tinitialMessage = text + parsed.messages[0];\n\t\tparsed.messages.shift();\n\t} else {\n\t\tinitialMessage = text;\n\t}\n\treturn {\n\t\tinitialMessage,\n\t\tinitialImages: images.length > 0 ? images : undefined,\n\t};\n}\ntype ResolvedSession =\n\t| { type: \"path\"; path: string }\n\t| { type: \"local\"; path: string }\n\t| { type: \"global\"; path: string; cwd: string }\n\t| { type: \"not_found\"; arg: string };\nasync function resolveSessionPath(sessionArg: string, cwd: string, sessionDir?: string): Promise<ResolvedSession> {\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: sessionArg };\n\t}\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatches = localSessions.filter((s) => s.id.startsWith(sessionArg));\n\tif (localMatches.length >= 1) {\n\t\treturn { type: \"local\", path: localMatches[0].path };\n\t}\n\tconst allSessions = await SessionManager.listAll();\n\tconst globalMatches = allSessions.filter((s) => s.id.startsWith(sessionArg));\n\tif (globalMatches.length >= 1) {\n\t\tconst match = globalMatches[0];\n\t\treturn { type: \"global\", path: match.path, cwd: match.cwd };\n\t}\n\treturn { type: \"not_found\", arg: sessionArg };\n}\nasync function promptConfirm(message: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\t\trl.question(`${message} [y/N] `, (answer) => {\n\t\t\trl.close();\n\t\t\tresolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n\t\t});\n\t});\n}\nasync function callSessionDirectoryHook(extensions: LoadExtensionsResult, cwd: string): Promise<string | undefined> {\n\tlet customSessionDir: string | undefined;\n\tfor (const ext of extensions.extensions) {\n\t\tconst handlers = ext.handlers.get(\"session_directory\");\n\t\tif (!handlers || handlers.length === 0) continue;\n\t\tfor (const handler of handlers) {\n\t\t\ttry {\n\t\t\t\tconst event = { type: \"session_directory\" as const, cwd };\n\t\t\t\tconst result = (await handler(event)) as { sessionDir?: string } | undefined;\n\t\t\t\tif (result?.sessionDir) {\n\t\t\t\t\tcustomSessionDir = result.sessionDir;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tconsole.error(chalk.red(`Extension \"${ext.path}\" session_directory handler failed: ${message}`));\n\t\t\t}\n\t\t}\n\t}\n\treturn customSessionDir;\n}\nasync function createSessionManager(\n\tparsed: Args,\n\tcwd: string,\n\textensions: LoadExtensionsResult,\n): Promise<SessionManager | undefined> {\n\tif (parsed.noSession) {\n\t\treturn SessionManager.inMemory();\n\t}\n\tlet effectiveSessionDir = parsed.sessionDir;\n\tif (!effectiveSessionDir) {\n\t\teffectiveSessionDir = await callSessionDirectoryHook(extensions, cwd);\n\t}\n\tif (parsed.session) {\n\t\tconst resolved = await resolveSessionPath(parsed.session, cwd, effectiveSessionDir);\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\t\treturn SessionManager.open(resolved.path, effectiveSessionDir);\n\t\t\tcase \"global\": {\n\t\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\t\tif (!shouldFork) {\n\t\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\treturn SessionManager.forkFrom(resolved.path, cwd, effectiveSessionDir);\n\t\t\t}\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\tif (parsed.continue) {\n\t\treturn SessionManager.continueRecent(cwd, effectiveSessionDir);\n\t}\n\tif (effectiveSessionDir) {\n\t\treturn SessionManager.create(cwd, effectiveSessionDir);\n\t}\n\treturn undefined;\n}\nfunction buildSessionOptions(\n\tparsed: Args,\n\tsessionManager: SessionManager | undefined,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): { options: CreateAgentSessionOptions; cliThinkingFromModel: boolean } {\n\tconst options: CreateAgentSessionOptions = {};\n\tconst cliThinkingFromModel = false;\n\tif (sessionManager) {\n\t\toptions.sessionManager = sessionManager;\n\t}\n\tif (parsed.thinking) {\n\t\toptions.thinkingLevel = parsed.thinking;\n\t}\n\tif (parsed.noTools) {\n\t\tif (parsed.tools && parsed.tools.length > 0) {\n\t\t\toptions.tools = parsed.tools.map((name) => allTools[name]);\n\t\t} else {\n\t\t\toptions.tools = [];\n\t\t}\n\t} else if (parsed.tools) {\n\t\toptions.tools = parsed.tools.map((name) => allTools[name]);\n\t}\n\treturn { options, cliThinkingFromModel };\n}\nasync function handleConfigCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"config\") {\n\t\treturn false;\n\t}\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"config command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tconst resolvedPaths = await packageManager.resolve();\n\tawait selectConfig({\n\t\tresolvedPaths,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tagentDir,\n\t});\n\tprocess.exit(0);\n}\nasync function processFilesInParallel(\n\tfileArgs: string[],\n\tautoResizeImages: boolean,\n): Promise<{ text: string; images: ImageContent[] }> {\n\tconst chunkSize = globalMultiGPUExecutor ? Math.ceil(fileArgs.length / 4) : fileArgs.length;\n\tconst chunks: string[][] = [];\n\tfor (let i = 0; i < fileArgs.length; i += chunkSize) {\n\t\tchunks.push(fileArgs.slice(i, i + chunkSize));\n\t}\n\tconst results = await Promise.all(chunks.map((chunk) => processFileArguments(chunk, { autoResizeImages })));\n\tconst text = results.map((r) => r.text).join(\"\");\n\tconst images = results.flatMap((r) => r.images);\n\treturn { text, images };\n}\nexport async function main(args: string[]) {\n\tdebugLog(\"main\", \"Starting main\", { args, pid: process.pid, platform: process.platform });\n\ttry {\n\t\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.PI_OFFLINE);\n\t\tif (offlineMode) {\n\t\t\tprocess.env.PI_OFFLINE = \"1\";\n\t\t\tprocess.env.PI_SKIP_VERSION_CHECK = \"1\";\n\t\t}\n\t\tif (await handlePackageCommand(args)) {\n\t\t\treturn;\n\t\t}\n\t\tif (await handleConfigCommand(args)) {\n\t\t\treturn;\n\t\t}\n\t\tdebugLog(\"main\", \"Running migrations\");\n\t\tconst { deprecationWarnings } = runMigrations(process.cwd());\n\t\tdebugLog(\"main\", \"Parsing args\");\n\t\tconst firstPass = parseArgs(args);\n\t\tdebugLog(\"main\", \"Initializing components\");\n\t\tconst cwd = process.cwd();\n\t\tconst agentDir = getAgentDir();\n\t\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\t\treportSettingsErrors(settingsManager, \"startup\");\n\t\tconst authStorage = AuthStorage.create();\n\t\tconst modelRegistry = new ModelRegistry(authStorage, getModelsPath());\n\t\tdebugLog(\"main\", \"Creating resource loader\");\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tadditionalExtensionPaths: firstPass.extensions,\n\t\t\tadditionalSkillPaths: firstPass.skills,\n\t\t\tadditionalPromptTemplatePaths: firstPass.promptTemplates,\n\t\t\tadditionalThemePaths: firstPass.themes,\n\t\t\tnoExtensions: firstPass.noExtensions,\n\t\t\tnoSkills: firstPass.noSkills,\n\t\t\tnoPromptTemplates: firstPass.noPromptTemplates,\n\t\t\tnoThemes: firstPass.noThemes,\n\t\t\tsystemPrompt: firstPass.systemPrompt,\n\t\t\tappendSystemPrompt: firstPass.appendSystemPrompt,\n\t\t});\n\t\tdebugLog(\"main\", \"Reloading resources\");\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t\tdebugLog(\"main\", \"Loading extensions\");\n\t\tconst extensionsResult: LoadExtensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { path, error } of extensionsResult.errors) {\n\t\t\tconsole.error(chalk.red(`Failed to load extension \"${path}\": ${error}`));\n\t\t}\n\t\t// Provider registration removed - models are configured during onboarding only\n\t\tconst extensionFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\t\tfor (const ext of extensionsResult.extensions) {\n\t\t\tfor (const [name, flag] of ext.flags) {\n\t\t\t\textensionFlags.set(name, { type: flag.type });\n\t\t\t}\n\t\t}\n\t\tconst parsed = parseArgs(args, extensionFlags);\n\t\tfor (const [name, value] of parsed.unknownFlags) {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t}\n\t\tif (parsed.version) {\n\t\t\tconsole.log(VERSION);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (parsed.help) {\n\t\t\tprintHelp();\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (parsed.listModels !== undefined) {\n\t\t\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\t\t\tawait listModels(modelRegistry, searchPattern);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (parsed.mode !== \"rpc\") {\n\t\t\tconst stdinContent = await readPipedStdin();\n\t\t\tif (stdinContent !== undefined) {\n\t\t\t\tparsed.print = true;\n\t\t\t\tparsed.messages.unshift(stdinContent);\n\t\t\t}\n\t\t}\n\t\tif (parsed.export) {\n\t\t\tlet result: string;\n\t\t\ttry {\n\t\t\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\t\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\t\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Exported to: ${result}`);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (parsed.mode === \"rpc\" && parsed.fileArgs.length > 0) {\n\t\t\tconsole.error(chalk.red(\"Error: @file arguments are not supported in RPC mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tlet initialMessage: string | undefined;\n\t\tlet initialImages: ImageContent[] | undefined;\n\t\tif (parsed.fileArgs.length > 0 && parsed.fileArgs.length > 4) {\n\t\t\tconst result = await processFilesInParallel(parsed.fileArgs, settingsManager.getImageAutoResize());\n\t\t\tinitialMessage = result.text;\n\t\t\tinitialImages = result.images.length > 0 ? result.images : undefined;\n\t\t\tif (parsed.messages.length > 0) {\n\t\t\t\tinitialMessage = initialMessage + parsed.messages[0];\n\t\t\t\tparsed.messages.shift();\n\t\t\t}\n\t\t} else {\n\t\t\tconst result = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize());\n\t\t\tinitialMessage = result.initialMessage;\n\t\t\tinitialImages = result.initialImages;\n\t\t}\n\t\tconst isInteractive = !parsed.print && parsed.mode === undefined;\n\t\tconst mode = parsed.mode || \"text\";\n\t\tinitTheme(settingsManager.getTheme(), isInteractive);\n\t\tif (isInteractive && deprecationWarnings.length > 0) {\n\t\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t\t}\n\t\tlet sessionManager = await createSessionManager(parsed, cwd, extensionsResult);\n\t\tif (parsed.resume) {\n\t\t\tKeybindingsManager.create();\n\t\t\tconst effectiveSessionDir = parsed.sessionDir || (await callSessionDirectoryHook(extensionsResult, cwd));\n\t\t\tconst selectedPath = await selectSession(\n\t\t\t\t(onProgress) => SessionManager.list(cwd, effectiveSessionDir, onProgress),\n\t\t\t\tSessionManager.listAll,\n\t\t\t);\n\t\t\tif (!selectedPath) {\n\t\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tsessionManager = SessionManager.open(selectedPath, effectiveSessionDir);\n\t\t}\n\t\tconst { options: sessionOptions, cliThinkingFromModel } = buildSessionOptions(\n\t\t\tparsed,\n\t\t\tsessionManager,\n\t\t\tmodelRegistry,\n\t\t\tsettingsManager,\n\t\t);\n\t\tsessionOptions.authStorage = authStorage;\n\t\tsessionOptions.modelRegistry = modelRegistry;\n\t\tsessionOptions.resourceLoader = resourceLoader;\n\t\tif (parsed.apiKey) {\n\t\t\tconsole.error(chalk.red(\"--api-key is deprecated. Please configure your API key during onboarding.\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst { session, modelFallbackMessage } = await createAgentSession(sessionOptions);\n\t\tif (!isInteractive && !session.model) {\n\t\t\tconsole.error(chalk.red(\"No model configured.\"));\n\t\t\tconsole.error(chalk.yellow(\"\\nPlease run onboarding to configure your model:\"));\n\t\t\tconsole.error(\" openvibe --onboarding\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;\n\t\tif (session.model && cliThinkingOverride) {\n\t\t\tlet effectiveThinking = session.thinkingLevel;\n\t\t\tif (!session.model.reasoning) {\n\t\t\t\teffectiveThinking = \"off\";\n\t\t\t} else if (effectiveThinking === \"xhigh\" && !supportsXhigh(session.model)) {\n\t\t\t\teffectiveThinking = \"high\";\n\t\t\t}\n\t\t\tif (effectiveThinking !== session.thinkingLevel) {\n\t\t\t\tsession.setThinkingLevel(effectiveThinking);\n\t\t\t}\n\t\t}\n\t\tdebugLog(\"main\", \"Selecting run mode\", { mode, isInteractive });\n\t\tif (mode === \"rpc\") {\n\t\t\tdebugLog(\"main\", \"Running RPC mode\");\n\t\t\tawait runRpcMode(session);\n\t\t} else if (isInteractive) {\n\t\t\tdebugLog(\"main\", \"Running interactive mode\");\n\t\t\tprintTimings();\n\t\t\tconst mode = new InteractiveMode(session, {\n\t\t\t\tinitialMessage,\n\t\t\t\tinitialImages,\n\t\t\t\tinitialMessages: parsed.messages,\n\t\t\t\tverbose: parsed.verbose,\n\t\t\t});\n\t\t\tawait mode.run();\n\t\t} else {\n\t\t\tdebugLog(\"main\", \"Running print mode\");\n\t\t\tawait runPrintMode(session, {\n\t\t\t\tmode,\n\t\t\t\tmessages: parsed.messages,\n\t\t\t\tinitialMessage,\n\t\t\t\tinitialImages,\n\t\t\t});\n\t\t\tstopThemeWatcher();\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tdebugLog(\"main\", \"Main completed successfully\");\n\t} catch (error) {\n\t\tdebugLog(\"main\", \"Main crashed\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\t\tconsole.error(chalk.red(\"\\n[CRASH] Application crashed:\"));\n\t\tconsole.error(error);\n\t\tfs.appendFileSync(\n\t\t\t\"crash.log\",\n\t\t\t`[${new Date().toISOString()}] Main Crash:\\n${error instanceof Error ? error.stack : String(error)}\\n\\n`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n"]}
package/dist/main.js ADDED
@@ -0,0 +1,609 @@
1
+ import { supportsXhigh } from "@mariozechner/pi-ai";
2
+ import chalk from "chalk";
3
+ import fs from "fs";
4
+ import { createInterface } from "readline";
5
+ import { parseArgs, printHelp } from "./cli/args.js";
6
+ import { selectConfig } from "./cli/config-selector.js";
7
+ import { processFileArguments } from "./cli/file-processor.js";
8
+ import { listModels } from "./cli/list-models.js";
9
+ import { selectSession } from "./cli/session-picker.js";
10
+ import { APP_NAME, getAgentDir, getModelsPath, VERSION } from "./config.js";
11
+ import { AuthStorage } from "./core/auth-storage.js";
12
+ import { exportFromFile } from "./core/export-html/index.js";
13
+ import { KeybindingsManager } from "./core/keybindings.js";
14
+ import { ModelRegistry } from "./core/model-registry.js";
15
+ import { globalMultiGPUExecutor } from "./core/multi-gpu-executor.js";
16
+ import { DefaultPackageManager } from "./core/package-manager.js";
17
+ import { DefaultResourceLoader } from "./core/resource-loader.js";
18
+ import { createAgentSession } from "./core/sdk.js";
19
+ import { SessionManager } from "./core/session-manager.js";
20
+ import { SettingsManager } from "./core/settings-manager.js";
21
+ import { printTimings, time } from "./core/timings.js";
22
+ import { allTools } from "./core/tools/index.js";
23
+ import { runMigrations, showDeprecationWarnings } from "./migrations.js";
24
+ import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index.js";
25
+ import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme.js";
26
+ function debugLog(stage, message, data) {
27
+ const logLine = `[${new Date().toISOString()}] [${stage}] ${message}${data ? ": " + JSON.stringify(data) : ""}\n`;
28
+ fs.appendFileSync("debug.log", logLine);
29
+ }
30
+ async function readPipedStdin() {
31
+ if (process.stdin.isTTY) {
32
+ return undefined;
33
+ }
34
+ return new Promise((resolve) => {
35
+ let data = "";
36
+ process.stdin.setEncoding("utf8");
37
+ process.stdin.on("data", (chunk) => {
38
+ data += chunk;
39
+ });
40
+ process.stdin.on("end", () => {
41
+ resolve(data.trim() || undefined);
42
+ });
43
+ process.stdin.resume();
44
+ });
45
+ }
46
+ function reportSettingsErrors(settingsManager, context) {
47
+ const errors = settingsManager.drainErrors();
48
+ for (const { scope, error } of errors) {
49
+ console.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));
50
+ if (error.stack) {
51
+ console.error(chalk.dim(error.stack));
52
+ }
53
+ }
54
+ }
55
+ function isTruthyEnvFlag(value) {
56
+ if (!value)
57
+ return false;
58
+ return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
59
+ }
60
+ function getPackageCommandUsage(command) {
61
+ switch (command) {
62
+ case "install":
63
+ return `${APP_NAME} install <source> [-l]`;
64
+ case "remove":
65
+ return `${APP_NAME} remove <source> [-l]`;
66
+ case "update":
67
+ return `${APP_NAME} update [source]`;
68
+ case "list":
69
+ return `${APP_NAME} list`;
70
+ }
71
+ }
72
+ function printPackageCommandHelp(command) {
73
+ switch (command) {
74
+ case "install":
75
+ console.log(`${chalk.bold("Usage:")}
76
+ ${getPackageCommandUsage("install")}
77
+ Install a package and add it to settings.
78
+ Options:
79
+ -l, --local Install project-locally (.pi/settings.json)
80
+ Examples:
81
+ ${APP_NAME} install npm:@foo/bar
82
+ ${APP_NAME} install git:github.com/user/repo
83
+ ${APP_NAME} install git:git@github.com:user/repo
84
+ ${APP_NAME} install https:
85
+ ${APP_NAME} install ssh:
86
+ ${APP_NAME} install ./local/path
87
+ `);
88
+ return;
89
+ case "remove":
90
+ console.log(`${chalk.bold("Usage:")}
91
+ ${getPackageCommandUsage("remove")}
92
+ Remove a package and its source from settings.
93
+ Options:
94
+ -l, --local Remove from project settings (.pi/settings.json)
95
+ Example:
96
+ ${APP_NAME} remove npm:@foo/bar
97
+ `);
98
+ return;
99
+ case "update":
100
+ console.log(`${chalk.bold("Usage:")}
101
+ ${getPackageCommandUsage("update")}
102
+ Update installed packages.
103
+ If <source> is provided, only that package is updated.
104
+ `);
105
+ return;
106
+ case "list":
107
+ console.log(`${chalk.bold("Usage:")}
108
+ ${getPackageCommandUsage("list")}
109
+ List installed packages from user and project settings.
110
+ `);
111
+ return;
112
+ }
113
+ }
114
+ function parsePackageCommand(args) {
115
+ const [command, ...rest] = args;
116
+ if (command !== "install" && command !== "remove" && command !== "update" && command !== "list") {
117
+ return undefined;
118
+ }
119
+ let local = false;
120
+ let help = false;
121
+ let invalidOption;
122
+ let source;
123
+ for (const arg of rest) {
124
+ if (arg === "-h" || arg === "--help") {
125
+ help = true;
126
+ continue;
127
+ }
128
+ if (arg === "-l" || arg === "--local") {
129
+ if (command === "install" || command === "remove") {
130
+ local = true;
131
+ }
132
+ else {
133
+ invalidOption = invalidOption ?? arg;
134
+ }
135
+ continue;
136
+ }
137
+ if (arg.startsWith("-")) {
138
+ invalidOption = invalidOption ?? arg;
139
+ continue;
140
+ }
141
+ if (!source) {
142
+ source = arg;
143
+ }
144
+ }
145
+ return { command, source, local, help, invalidOption };
146
+ }
147
+ async function handlePackageCommand(args) {
148
+ const options = parsePackageCommand(args);
149
+ if (!options) {
150
+ return false;
151
+ }
152
+ if (options.help) {
153
+ printPackageCommandHelp(options.command);
154
+ return true;
155
+ }
156
+ if (options.invalidOption) {
157
+ console.error(chalk.red(`Unknown option ${options.invalidOption} for "${options.command}".`));
158
+ console.error(chalk.dim(`Use "${APP_NAME} --help" or "${getPackageCommandUsage(options.command)}".`));
159
+ process.exitCode = 1;
160
+ return true;
161
+ }
162
+ const source = options.source;
163
+ if ((options.command === "install" || options.command === "remove") && !source) {
164
+ console.error(chalk.red(`Missing ${options.command} source.`));
165
+ console.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));
166
+ process.exitCode = 1;
167
+ return true;
168
+ }
169
+ const cwd = process.cwd();
170
+ const agentDir = getAgentDir();
171
+ const settingsManager = SettingsManager.create(cwd, agentDir);
172
+ reportSettingsErrors(settingsManager, "package command");
173
+ const packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });
174
+ packageManager.setProgressCallback((event) => {
175
+ if (event.type === "start") {
176
+ process.stdout.write(chalk.dim(`${event.message}\n`));
177
+ }
178
+ });
179
+ try {
180
+ switch (options.command) {
181
+ case "install":
182
+ await packageManager.install(source, { local: options.local });
183
+ packageManager.addSourceToSettings(source, { local: options.local });
184
+ console.log(chalk.green(`Installed ${source}`));
185
+ return true;
186
+ case "remove": {
187
+ await packageManager.remove(source, { local: options.local });
188
+ const removed = packageManager.removeSourceFromSettings(source, { local: options.local });
189
+ if (!removed) {
190
+ console.error(chalk.red(`No matching package found for ${source}`));
191
+ process.exitCode = 1;
192
+ return true;
193
+ }
194
+ console.log(chalk.green(`Removed ${source}`));
195
+ return true;
196
+ }
197
+ case "list": {
198
+ const globalSettings = settingsManager.getGlobalSettings();
199
+ const projectSettings = settingsManager.getProjectSettings();
200
+ const globalPackages = globalSettings.packages ?? [];
201
+ const projectPackages = projectSettings.packages ?? [];
202
+ if (globalPackages.length === 0 && projectPackages.length === 0) {
203
+ console.log(chalk.dim("No packages installed."));
204
+ return true;
205
+ }
206
+ const formatPackage = (pkg, scope) => {
207
+ const source = typeof pkg === "string" ? pkg : pkg.source;
208
+ const filtered = typeof pkg === "object";
209
+ const display = filtered ? `${source} (filtered)` : source;
210
+ console.log(` ${display}`);
211
+ const path = packageManager.getInstalledPath(source, scope);
212
+ if (path) {
213
+ console.log(chalk.dim(` ${path}`));
214
+ }
215
+ };
216
+ if (globalPackages.length > 0) {
217
+ console.log(chalk.bold("User packages:"));
218
+ for (const pkg of globalPackages) {
219
+ formatPackage(pkg, "user");
220
+ }
221
+ }
222
+ if (projectPackages.length > 0) {
223
+ if (globalPackages.length > 0)
224
+ console.log();
225
+ console.log(chalk.bold("Project packages:"));
226
+ for (const pkg of projectPackages) {
227
+ formatPackage(pkg, "project");
228
+ }
229
+ }
230
+ return true;
231
+ }
232
+ case "update":
233
+ await packageManager.update(source);
234
+ if (source) {
235
+ console.log(chalk.green(`Updated ${source}`));
236
+ }
237
+ else {
238
+ console.log(chalk.green("Updated packages"));
239
+ }
240
+ return true;
241
+ }
242
+ }
243
+ catch (error) {
244
+ const message = error instanceof Error ? error.message : "Unknown package command error";
245
+ console.error(chalk.red(`Error: ${message}`));
246
+ process.exitCode = 1;
247
+ return true;
248
+ }
249
+ }
250
+ async function prepareInitialMessage(parsed, autoResizeImages) {
251
+ if (parsed.fileArgs.length === 0) {
252
+ return {};
253
+ }
254
+ const { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });
255
+ let initialMessage;
256
+ if (parsed.messages.length > 0) {
257
+ initialMessage = text + parsed.messages[0];
258
+ parsed.messages.shift();
259
+ }
260
+ else {
261
+ initialMessage = text;
262
+ }
263
+ return {
264
+ initialMessage,
265
+ initialImages: images.length > 0 ? images : undefined,
266
+ };
267
+ }
268
+ async function resolveSessionPath(sessionArg, cwd, sessionDir) {
269
+ if (sessionArg.includes("/") || sessionArg.includes("\\") || sessionArg.endsWith(".jsonl")) {
270
+ return { type: "path", path: sessionArg };
271
+ }
272
+ const localSessions = await SessionManager.list(cwd, sessionDir);
273
+ const localMatches = localSessions.filter((s) => s.id.startsWith(sessionArg));
274
+ if (localMatches.length >= 1) {
275
+ return { type: "local", path: localMatches[0].path };
276
+ }
277
+ const allSessions = await SessionManager.listAll();
278
+ const globalMatches = allSessions.filter((s) => s.id.startsWith(sessionArg));
279
+ if (globalMatches.length >= 1) {
280
+ const match = globalMatches[0];
281
+ return { type: "global", path: match.path, cwd: match.cwd };
282
+ }
283
+ return { type: "not_found", arg: sessionArg };
284
+ }
285
+ async function promptConfirm(message) {
286
+ return new Promise((resolve) => {
287
+ const rl = createInterface({
288
+ input: process.stdin,
289
+ output: process.stdout,
290
+ });
291
+ rl.question(`${message} [y/N] `, (answer) => {
292
+ rl.close();
293
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
294
+ });
295
+ });
296
+ }
297
+ async function callSessionDirectoryHook(extensions, cwd) {
298
+ let customSessionDir;
299
+ for (const ext of extensions.extensions) {
300
+ const handlers = ext.handlers.get("session_directory");
301
+ if (!handlers || handlers.length === 0)
302
+ continue;
303
+ for (const handler of handlers) {
304
+ try {
305
+ const event = { type: "session_directory", cwd };
306
+ const result = (await handler(event));
307
+ if (result?.sessionDir) {
308
+ customSessionDir = result.sessionDir;
309
+ }
310
+ }
311
+ catch (err) {
312
+ const message = err instanceof Error ? err.message : String(err);
313
+ console.error(chalk.red(`Extension "${ext.path}" session_directory handler failed: ${message}`));
314
+ }
315
+ }
316
+ }
317
+ return customSessionDir;
318
+ }
319
+ async function createSessionManager(parsed, cwd, extensions) {
320
+ if (parsed.noSession) {
321
+ return SessionManager.inMemory();
322
+ }
323
+ let effectiveSessionDir = parsed.sessionDir;
324
+ if (!effectiveSessionDir) {
325
+ effectiveSessionDir = await callSessionDirectoryHook(extensions, cwd);
326
+ }
327
+ if (parsed.session) {
328
+ const resolved = await resolveSessionPath(parsed.session, cwd, effectiveSessionDir);
329
+ switch (resolved.type) {
330
+ case "path":
331
+ case "local":
332
+ return SessionManager.open(resolved.path, effectiveSessionDir);
333
+ case "global": {
334
+ console.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));
335
+ const shouldFork = await promptConfirm("Fork this session into current directory?");
336
+ if (!shouldFork) {
337
+ console.log(chalk.dim("Aborted."));
338
+ process.exit(0);
339
+ }
340
+ return SessionManager.forkFrom(resolved.path, cwd, effectiveSessionDir);
341
+ }
342
+ case "not_found":
343
+ console.error(chalk.red(`No session found matching '${resolved.arg}'`));
344
+ process.exit(1);
345
+ }
346
+ }
347
+ if (parsed.continue) {
348
+ return SessionManager.continueRecent(cwd, effectiveSessionDir);
349
+ }
350
+ if (effectiveSessionDir) {
351
+ return SessionManager.create(cwd, effectiveSessionDir);
352
+ }
353
+ return undefined;
354
+ }
355
+ function buildSessionOptions(parsed, sessionManager, modelRegistry, settingsManager) {
356
+ const options = {};
357
+ const cliThinkingFromModel = false;
358
+ if (sessionManager) {
359
+ options.sessionManager = sessionManager;
360
+ }
361
+ if (parsed.thinking) {
362
+ options.thinkingLevel = parsed.thinking;
363
+ }
364
+ if (parsed.noTools) {
365
+ if (parsed.tools && parsed.tools.length > 0) {
366
+ options.tools = parsed.tools.map((name) => allTools[name]);
367
+ }
368
+ else {
369
+ options.tools = [];
370
+ }
371
+ }
372
+ else if (parsed.tools) {
373
+ options.tools = parsed.tools.map((name) => allTools[name]);
374
+ }
375
+ return { options, cliThinkingFromModel };
376
+ }
377
+ async function handleConfigCommand(args) {
378
+ if (args[0] !== "config") {
379
+ return false;
380
+ }
381
+ const cwd = process.cwd();
382
+ const agentDir = getAgentDir();
383
+ const settingsManager = SettingsManager.create(cwd, agentDir);
384
+ reportSettingsErrors(settingsManager, "config command");
385
+ const packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });
386
+ const resolvedPaths = await packageManager.resolve();
387
+ await selectConfig({
388
+ resolvedPaths,
389
+ settingsManager,
390
+ cwd,
391
+ agentDir,
392
+ });
393
+ process.exit(0);
394
+ }
395
+ async function processFilesInParallel(fileArgs, autoResizeImages) {
396
+ const chunkSize = globalMultiGPUExecutor ? Math.ceil(fileArgs.length / 4) : fileArgs.length;
397
+ const chunks = [];
398
+ for (let i = 0; i < fileArgs.length; i += chunkSize) {
399
+ chunks.push(fileArgs.slice(i, i + chunkSize));
400
+ }
401
+ const results = await Promise.all(chunks.map((chunk) => processFileArguments(chunk, { autoResizeImages })));
402
+ const text = results.map((r) => r.text).join("");
403
+ const images = results.flatMap((r) => r.images);
404
+ return { text, images };
405
+ }
406
+ export async function main(args) {
407
+ debugLog("main", "Starting main", { args, pid: process.pid, platform: process.platform });
408
+ try {
409
+ const offlineMode = args.includes("--offline") || isTruthyEnvFlag(process.env.PI_OFFLINE);
410
+ if (offlineMode) {
411
+ process.env.PI_OFFLINE = "1";
412
+ process.env.PI_SKIP_VERSION_CHECK = "1";
413
+ }
414
+ if (await handlePackageCommand(args)) {
415
+ return;
416
+ }
417
+ if (await handleConfigCommand(args)) {
418
+ return;
419
+ }
420
+ debugLog("main", "Running migrations");
421
+ const { deprecationWarnings } = runMigrations(process.cwd());
422
+ debugLog("main", "Parsing args");
423
+ const firstPass = parseArgs(args);
424
+ debugLog("main", "Initializing components");
425
+ const cwd = process.cwd();
426
+ const agentDir = getAgentDir();
427
+ const settingsManager = SettingsManager.create(cwd, agentDir);
428
+ reportSettingsErrors(settingsManager, "startup");
429
+ const authStorage = AuthStorage.create();
430
+ const modelRegistry = new ModelRegistry(authStorage, getModelsPath());
431
+ debugLog("main", "Creating resource loader");
432
+ const resourceLoader = new DefaultResourceLoader({
433
+ cwd,
434
+ agentDir,
435
+ settingsManager,
436
+ additionalExtensionPaths: firstPass.extensions,
437
+ additionalSkillPaths: firstPass.skills,
438
+ additionalPromptTemplatePaths: firstPass.promptTemplates,
439
+ additionalThemePaths: firstPass.themes,
440
+ noExtensions: firstPass.noExtensions,
441
+ noSkills: firstPass.noSkills,
442
+ noPromptTemplates: firstPass.noPromptTemplates,
443
+ noThemes: firstPass.noThemes,
444
+ systemPrompt: firstPass.systemPrompt,
445
+ appendSystemPrompt: firstPass.appendSystemPrompt,
446
+ });
447
+ debugLog("main", "Reloading resources");
448
+ await resourceLoader.reload();
449
+ time("resourceLoader.reload");
450
+ debugLog("main", "Loading extensions");
451
+ const extensionsResult = resourceLoader.getExtensions();
452
+ for (const { path, error } of extensionsResult.errors) {
453
+ console.error(chalk.red(`Failed to load extension "${path}": ${error}`));
454
+ }
455
+ // Provider registration removed - models are configured during onboarding only
456
+ const extensionFlags = new Map();
457
+ for (const ext of extensionsResult.extensions) {
458
+ for (const [name, flag] of ext.flags) {
459
+ extensionFlags.set(name, { type: flag.type });
460
+ }
461
+ }
462
+ const parsed = parseArgs(args, extensionFlags);
463
+ for (const [name, value] of parsed.unknownFlags) {
464
+ extensionsResult.runtime.flagValues.set(name, value);
465
+ }
466
+ if (parsed.version) {
467
+ console.log(VERSION);
468
+ process.exit(0);
469
+ }
470
+ if (parsed.help) {
471
+ printHelp();
472
+ process.exit(0);
473
+ }
474
+ if (parsed.listModels !== undefined) {
475
+ const searchPattern = typeof parsed.listModels === "string" ? parsed.listModels : undefined;
476
+ await listModels(modelRegistry, searchPattern);
477
+ process.exit(0);
478
+ }
479
+ if (parsed.mode !== "rpc") {
480
+ const stdinContent = await readPipedStdin();
481
+ if (stdinContent !== undefined) {
482
+ parsed.print = true;
483
+ parsed.messages.unshift(stdinContent);
484
+ }
485
+ }
486
+ if (parsed.export) {
487
+ let result;
488
+ try {
489
+ const outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;
490
+ result = await exportFromFile(parsed.export, outputPath);
491
+ }
492
+ catch (error) {
493
+ const message = error instanceof Error ? error.message : "Failed to export session";
494
+ console.error(chalk.red(`Error: ${message}`));
495
+ process.exit(1);
496
+ }
497
+ console.log(`Exported to: ${result}`);
498
+ process.exit(0);
499
+ }
500
+ if (parsed.mode === "rpc" && parsed.fileArgs.length > 0) {
501
+ console.error(chalk.red("Error: @file arguments are not supported in RPC mode"));
502
+ process.exit(1);
503
+ }
504
+ let initialMessage;
505
+ let initialImages;
506
+ if (parsed.fileArgs.length > 0 && parsed.fileArgs.length > 4) {
507
+ const result = await processFilesInParallel(parsed.fileArgs, settingsManager.getImageAutoResize());
508
+ initialMessage = result.text;
509
+ initialImages = result.images.length > 0 ? result.images : undefined;
510
+ if (parsed.messages.length > 0) {
511
+ initialMessage = initialMessage + parsed.messages[0];
512
+ parsed.messages.shift();
513
+ }
514
+ }
515
+ else {
516
+ const result = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize());
517
+ initialMessage = result.initialMessage;
518
+ initialImages = result.initialImages;
519
+ }
520
+ const isInteractive = !parsed.print && parsed.mode === undefined;
521
+ const mode = parsed.mode || "text";
522
+ initTheme(settingsManager.getTheme(), isInteractive);
523
+ if (isInteractive && deprecationWarnings.length > 0) {
524
+ await showDeprecationWarnings(deprecationWarnings);
525
+ }
526
+ let sessionManager = await createSessionManager(parsed, cwd, extensionsResult);
527
+ if (parsed.resume) {
528
+ KeybindingsManager.create();
529
+ const effectiveSessionDir = parsed.sessionDir || (await callSessionDirectoryHook(extensionsResult, cwd));
530
+ const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, effectiveSessionDir, onProgress), SessionManager.listAll);
531
+ if (!selectedPath) {
532
+ console.log(chalk.dim("No session selected"));
533
+ stopThemeWatcher();
534
+ process.exit(0);
535
+ }
536
+ sessionManager = SessionManager.open(selectedPath, effectiveSessionDir);
537
+ }
538
+ const { options: sessionOptions, cliThinkingFromModel } = buildSessionOptions(parsed, sessionManager, modelRegistry, settingsManager);
539
+ sessionOptions.authStorage = authStorage;
540
+ sessionOptions.modelRegistry = modelRegistry;
541
+ sessionOptions.resourceLoader = resourceLoader;
542
+ if (parsed.apiKey) {
543
+ console.error(chalk.red("--api-key is deprecated. Please configure your API key during onboarding."));
544
+ process.exit(1);
545
+ }
546
+ const { session, modelFallbackMessage } = await createAgentSession(sessionOptions);
547
+ if (!isInteractive && !session.model) {
548
+ console.error(chalk.red("No model configured."));
549
+ console.error(chalk.yellow("\nPlease run onboarding to configure your model:"));
550
+ console.error(" openvibe --onboarding");
551
+ process.exit(1);
552
+ }
553
+ const cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;
554
+ if (session.model && cliThinkingOverride) {
555
+ let effectiveThinking = session.thinkingLevel;
556
+ if (!session.model.reasoning) {
557
+ effectiveThinking = "off";
558
+ }
559
+ else if (effectiveThinking === "xhigh" && !supportsXhigh(session.model)) {
560
+ effectiveThinking = "high";
561
+ }
562
+ if (effectiveThinking !== session.thinkingLevel) {
563
+ session.setThinkingLevel(effectiveThinking);
564
+ }
565
+ }
566
+ debugLog("main", "Selecting run mode", { mode, isInteractive });
567
+ if (mode === "rpc") {
568
+ debugLog("main", "Running RPC mode");
569
+ await runRpcMode(session);
570
+ }
571
+ else if (isInteractive) {
572
+ debugLog("main", "Running interactive mode");
573
+ printTimings();
574
+ const mode = new InteractiveMode(session, {
575
+ initialMessage,
576
+ initialImages,
577
+ initialMessages: parsed.messages,
578
+ verbose: parsed.verbose,
579
+ });
580
+ await mode.run();
581
+ }
582
+ else {
583
+ debugLog("main", "Running print mode");
584
+ await runPrintMode(session, {
585
+ mode,
586
+ messages: parsed.messages,
587
+ initialMessage,
588
+ initialImages,
589
+ });
590
+ stopThemeWatcher();
591
+ if (process.stdout.writableLength > 0) {
592
+ await new Promise((resolve) => process.stdout.once("drain", resolve));
593
+ }
594
+ process.exit(0);
595
+ }
596
+ debugLog("main", "Main completed successfully");
597
+ }
598
+ catch (error) {
599
+ debugLog("main", "Main crashed", {
600
+ error: error instanceof Error ? error.message : String(error),
601
+ stack: error instanceof Error ? error.stack : undefined,
602
+ });
603
+ console.error(chalk.red("\n[CRASH] Application crashed:"));
604
+ console.error(error);
605
+ fs.appendFileSync("crash.log", `[${new Date().toISOString()}] Main Crash:\n${error instanceof Error ? error.stack : String(error)}\n\n`);
606
+ process.exit(1);
607
+ }
608
+ }
609
+ //# sourceMappingURL=main.js.map