@phi-code-admin/phi-code 0.74.2 → 0.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. package/CHANGELOG.md +1186 -4
  2. package/README.md +478 -379
  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 +9 -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 +13 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +32 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +12 -7
  16. package/dist/cli/args.d.ts.map +1 -1
  17. package/dist/cli/args.js +87 -45
  18. package/dist/cli/args.js.map +1 -1
  19. package/dist/cli/config-selector.d.ts.map +1 -1
  20. package/dist/cli/config-selector.js.map +1 -1
  21. package/dist/cli/file-processor.d.ts.map +1 -1
  22. package/dist/cli/file-processor.js +4 -0
  23. package/dist/cli/file-processor.js.map +1 -1
  24. package/dist/cli/initial-message.d.ts +18 -0
  25. package/dist/cli/initial-message.d.ts.map +1 -0
  26. package/dist/cli/initial-message.js +22 -0
  27. package/dist/cli/initial-message.js.map +1 -0
  28. package/dist/cli/list-models.d.ts.map +1 -1
  29. package/dist/cli/list-models.js +7 -1
  30. package/dist/cli/list-models.js.map +1 -1
  31. package/dist/cli/session-picker.d.ts.map +1 -1
  32. package/dist/cli/session-picker.js +2 -1
  33. package/dist/cli/session-picker.js.map +1 -1
  34. package/dist/cli.d.ts.map +1 -1
  35. package/dist/cli.js +9 -5
  36. package/dist/cli.js.map +1 -1
  37. package/dist/config.d.ts +24 -0
  38. package/dist/config.d.ts.map +1 -1
  39. package/dist/config.js +226 -30
  40. package/dist/config.js.map +1 -1
  41. package/dist/core/agent-session-runtime.d.ts +117 -0
  42. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  43. package/dist/core/agent-session-runtime.js +300 -0
  44. package/dist/core/agent-session-runtime.js.map +1 -0
  45. package/dist/core/agent-session-services.d.ts +86 -0
  46. package/dist/core/agent-session-services.d.ts.map +1 -0
  47. package/dist/core/agent-session-services.js +117 -0
  48. package/dist/core/agent-session-services.js.map +1 -0
  49. package/dist/core/agent-session.d.ts +63 -82
  50. package/dist/core/agent-session.d.ts.map +1 -1
  51. package/dist/core/agent-session.js +674 -628
  52. package/dist/core/agent-session.js.map +1 -1
  53. package/dist/core/api-key-store.d.ts +87 -0
  54. package/dist/core/api-key-store.d.ts.map +1 -0
  55. package/dist/core/api-key-store.js +168 -0
  56. package/dist/core/api-key-store.js.map +1 -0
  57. package/dist/core/auth-guidance.d.ts +5 -0
  58. package/dist/core/auth-guidance.d.ts.map +1 -0
  59. package/dist/core/auth-guidance.js +21 -0
  60. package/dist/core/auth-guidance.js.map +1 -0
  61. package/dist/core/auth-storage.d.ts +12 -5
  62. package/dist/core/auth-storage.d.ts.map +1 -1
  63. package/dist/core/auth-storage.js +34 -8
  64. package/dist/core/auth-storage.js.map +1 -1
  65. package/dist/core/bash-executor.d.ts +0 -15
  66. package/dist/core/bash-executor.d.ts.map +1 -1
  67. package/dist/core/bash-executor.js +28 -129
  68. package/dist/core/bash-executor.js.map +1 -1
  69. package/dist/core/compaction/branch-summarization.d.ts +2 -0
  70. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  71. package/dist/core/compaction/branch-summarization.js +3 -2
  72. package/dist/core/compaction/branch-summarization.js.map +1 -1
  73. package/dist/core/compaction/compaction.d.ts +4 -4
  74. package/dist/core/compaction/compaction.d.ts.map +1 -1
  75. package/dist/core/compaction/compaction.js +32 -27
  76. package/dist/core/compaction/compaction.js.map +1 -1
  77. package/dist/core/compaction/index.d.ts.map +1 -1
  78. package/dist/core/compaction/utils.d.ts.map +1 -1
  79. package/dist/core/compaction/utils.js.map +1 -1
  80. package/dist/core/config-watcher.d.ts +47 -0
  81. package/dist/core/config-watcher.d.ts.map +1 -0
  82. package/dist/core/config-watcher.js +135 -0
  83. package/dist/core/config-watcher.js.map +1 -0
  84. package/dist/core/default-models.json +80 -0
  85. package/dist/core/defaults.d.ts.map +1 -1
  86. package/dist/core/diagnostics.d.ts.map +1 -1
  87. package/dist/core/event-bus.d.ts.map +1 -1
  88. package/dist/core/event-bus.js.map +1 -1
  89. package/dist/core/exec.d.ts.map +1 -1
  90. package/dist/core/exec.js +7 -3
  91. package/dist/core/exec.js.map +1 -1
  92. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  93. package/dist/core/export-html/ansi-to-html.js +1 -1
  94. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  95. package/dist/core/export-html/index.d.ts +7 -4
  96. package/dist/core/export-html/index.d.ts.map +1 -1
  97. package/dist/core/export-html/index.js +15 -13
  98. package/dist/core/export-html/index.js.map +1 -1
  99. package/dist/core/export-html/template.css +112 -17
  100. package/dist/core/export-html/template.html +1 -0
  101. package/dist/core/export-html/template.js +312 -64
  102. package/dist/core/export-html/tool-renderer.d.ts +9 -10
  103. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  104. package/dist/core/export-html/tool-renderer.js +61 -16
  105. package/dist/core/export-html/tool-renderer.js.map +1 -1
  106. package/dist/core/extensions/index.d.ts +5 -4
  107. package/dist/core/extensions/index.d.ts.map +1 -1
  108. package/dist/core/extensions/index.js +2 -2
  109. package/dist/core/extensions/index.js.map +1 -1
  110. package/dist/core/extensions/loader.d.ts +0 -1
  111. package/dist/core/extensions/loader.d.ts.map +1 -1
  112. package/dist/core/extensions/loader.js +98 -18
  113. package/dist/core/extensions/loader.js.map +1 -1
  114. package/dist/core/extensions/runner.d.ts +27 -14
  115. package/dist/core/extensions/runner.d.ts.map +1 -1
  116. package/dist/core/extensions/runner.js +299 -115
  117. package/dist/core/extensions/runner.js.map +1 -1
  118. package/dist/core/extensions/types.d.ts +200 -44
  119. package/dist/core/extensions/types.d.ts.map +1 -1
  120. package/dist/core/extensions/types.js +10 -0
  121. package/dist/core/extensions/types.js.map +1 -1
  122. package/dist/core/extensions/wrapper.d.ts +4 -11
  123. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  124. package/dist/core/extensions/wrapper.js +7 -87
  125. package/dist/core/extensions/wrapper.js.map +1 -1
  126. package/dist/core/footer-data-provider.d.ts +22 -2
  127. package/dist/core/footer-data-provider.d.ts.map +1 -1
  128. package/dist/core/footer-data-provider.js +225 -49
  129. package/dist/core/footer-data-provider.js.map +1 -1
  130. package/dist/core/index.d.ts +5 -2
  131. package/dist/core/index.d.ts.map +1 -1
  132. package/dist/core/index.js +5 -2
  133. package/dist/core/index.js.map +1 -1
  134. package/dist/core/keybindings.d.ts +348 -50
  135. package/dist/core/keybindings.d.ts.map +1 -1
  136. package/dist/core/keybindings.js +276 -132
  137. package/dist/core/keybindings.js.map +1 -1
  138. package/dist/core/messages.d.ts.map +1 -1
  139. package/dist/core/messages.js.map +1 -1
  140. package/dist/core/model-registry.d.ts +41 -5
  141. package/dist/core/model-registry.d.ts.map +1 -1
  142. package/dist/core/model-registry.js +316 -136
  143. package/dist/core/model-registry.js.map +1 -1
  144. package/dist/core/model-resolver.d.ts +6 -0
  145. package/dist/core/model-resolver.d.ts.map +1 -1
  146. package/dist/core/model-resolver.js +70 -37
  147. package/dist/core/model-resolver.js.map +1 -1
  148. package/dist/core/output-guard.d.ts +6 -0
  149. package/dist/core/output-guard.d.ts.map +1 -0
  150. package/dist/core/output-guard.js +59 -0
  151. package/dist/core/output-guard.js.map +1 -0
  152. package/dist/core/package-manager.d.ts +49 -7
  153. package/dist/core/package-manager.d.ts.map +1 -1
  154. package/dist/core/package-manager.js +655 -122
  155. package/dist/core/package-manager.js.map +1 -1
  156. package/dist/core/prompt-templates.d.ts +12 -10
  157. package/dist/core/prompt-templates.d.ts.map +1 -1
  158. package/dist/core/prompt-templates.js +37 -38
  159. package/dist/core/prompt-templates.js.map +1 -1
  160. package/dist/core/provider-display-names.d.ts +2 -0
  161. package/dist/core/provider-display-names.d.ts.map +1 -0
  162. package/dist/core/provider-display-names.js +33 -0
  163. package/dist/core/provider-display-names.js.map +1 -0
  164. package/dist/core/resolve-config-value.d.ts +6 -0
  165. package/dist/core/resolve-config-value.d.ts.map +1 -1
  166. package/dist/core/resolve-config-value.js +75 -8
  167. package/dist/core/resolve-config-value.js.map +1 -1
  168. package/dist/core/resource-loader.d.ts +18 -8
  169. package/dist/core/resource-loader.d.ts.map +1 -1
  170. package/dist/core/resource-loader.js +217 -123
  171. package/dist/core/resource-loader.js.map +1 -1
  172. package/dist/core/sdk.d.ts +25 -8
  173. package/dist/core/sdk.d.ts.map +1 -1
  174. package/dist/core/sdk.js +84 -37
  175. package/dist/core/sdk.js.map +1 -1
  176. package/dist/core/session-cwd.d.ts +19 -0
  177. package/dist/core/session-cwd.d.ts.map +1 -0
  178. package/dist/core/session-cwd.js +38 -0
  179. package/dist/core/session-cwd.js.map +1 -0
  180. package/dist/core/session-manager.d.ts +11 -1
  181. package/dist/core/session-manager.d.ts.map +1 -1
  182. package/dist/core/session-manager.js +42 -27
  183. package/dist/core/session-manager.js.map +1 -1
  184. package/dist/core/settings-manager.d.ts +34 -5
  185. package/dist/core/settings-manager.d.ts.map +1 -1
  186. package/dist/core/settings-manager.js +113 -13
  187. package/dist/core/settings-manager.js.map +1 -1
  188. package/dist/core/skills.d.ts +13 -11
  189. package/dist/core/skills.d.ts.map +1 -1
  190. package/dist/core/skills.js +59 -19
  191. package/dist/core/skills.js.map +1 -1
  192. package/dist/core/slash-commands.d.ts +2 -3
  193. package/dist/core/slash-commands.d.ts.map +1 -1
  194. package/dist/core/slash-commands.js +9 -6
  195. package/dist/core/slash-commands.js.map +1 -1
  196. package/dist/core/source-info.d.ts +18 -0
  197. package/dist/core/source-info.d.ts.map +1 -0
  198. package/dist/core/source-info.js +19 -0
  199. package/dist/core/source-info.js.map +1 -0
  200. package/dist/core/system-prompt.d.ts +3 -3
  201. package/dist/core/system-prompt.d.ts.map +1 -1
  202. package/dist/core/system-prompt.js +16 -55
  203. package/dist/core/system-prompt.js.map +1 -1
  204. package/dist/core/telemetry.d.ts +3 -0
  205. package/dist/core/telemetry.d.ts.map +1 -0
  206. package/dist/core/telemetry.js +9 -0
  207. package/dist/core/telemetry.js.map +1 -0
  208. package/dist/core/timings.d.ts +1 -0
  209. package/dist/core/timings.d.ts.map +1 -1
  210. package/dist/core/timings.js +6 -0
  211. package/dist/core/timings.js.map +1 -1
  212. package/dist/core/tools/bash.d.ts +27 -14
  213. package/dist/core/tools/bash.d.ts.map +1 -1
  214. package/dist/core/tools/bash.js +301 -208
  215. package/dist/core/tools/bash.js.map +1 -1
  216. package/dist/core/tools/edit-diff.d.ts +23 -1
  217. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  218. package/dist/core/tools/edit-diff.js +154 -59
  219. package/dist/core/tools/edit-diff.js.map +1 -1
  220. package/dist/core/tools/edit.d.ts +22 -12
  221. package/dist/core/tools/edit.d.ts.map +1 -1
  222. package/dist/core/tools/edit.js +243 -65
  223. package/dist/core/tools/edit.js.map +1 -1
  224. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  225. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  226. package/dist/core/tools/file-mutation-queue.js +37 -0
  227. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  228. package/dist/core/tools/find.d.ts +10 -14
  229. package/dist/core/tools/find.d.ts.map +1 -1
  230. package/dist/core/tools/find.js +202 -110
  231. package/dist/core/tools/find.js.map +1 -1
  232. package/dist/core/tools/grep.d.ts +14 -22
  233. package/dist/core/tools/grep.d.ts.map +1 -1
  234. package/dist/core/tools/grep.js +100 -35
  235. package/dist/core/tools/grep.js.map +1 -1
  236. package/dist/core/tools/index.d.ts +27 -60
  237. package/dist/core/tools/index.d.ts.map +1 -1
  238. package/dist/core/tools/index.js +96 -45
  239. package/dist/core/tools/index.js.map +1 -1
  240. package/dist/core/tools/ls.d.ts +8 -11
  241. package/dist/core/tools/ls.d.ts.map +1 -1
  242. package/dist/core/tools/ls.js +66 -15
  243. package/dist/core/tools/ls.js.map +1 -1
  244. package/dist/core/tools/output-accumulator.d.ts +50 -0
  245. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  246. package/dist/core/tools/output-accumulator.js +178 -0
  247. package/dist/core/tools/output-accumulator.js.map +1 -0
  248. package/dist/core/tools/path-utils.d.ts.map +1 -1
  249. package/dist/core/tools/path-utils.js +1 -1
  250. package/dist/core/tools/path-utils.js.map +1 -1
  251. package/dist/core/tools/read.d.ts +9 -13
  252. package/dist/core/tools/read.d.ts.map +1 -1
  253. package/dist/core/tools/read.js +175 -52
  254. package/dist/core/tools/read.js.map +1 -1
  255. package/dist/core/tools/render-utils.d.ts +21 -0
  256. package/dist/core/tools/render-utils.d.ts.map +1 -0
  257. package/dist/core/tools/render-utils.js +49 -0
  258. package/dist/core/tools/render-utils.js.map +1 -0
  259. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  260. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  261. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  262. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  263. package/dist/core/tools/truncate.d.ts.map +1 -1
  264. package/dist/core/tools/truncate.js.map +1 -1
  265. package/dist/core/tools/write.d.ts +8 -11
  266. package/dist/core/tools/write.d.ts.map +1 -1
  267. package/dist/core/tools/write.js +167 -32
  268. package/dist/core/tools/write.js.map +1 -1
  269. package/dist/index.d.ts +12 -9
  270. package/dist/index.d.ts.map +1 -1
  271. package/dist/index.js +12 -10
  272. package/dist/index.js.map +1 -1
  273. package/dist/main.d.ts +5 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/main.js +326 -404
  276. package/dist/main.js.map +1 -1
  277. package/dist/migrations.d.ts +2 -2
  278. package/dist/migrations.d.ts.map +1 -1
  279. package/dist/migrations.js +24 -4
  280. package/dist/migrations.js.map +1 -1
  281. package/dist/modes/index.d.ts.map +1 -1
  282. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/armin.js +10 -6
  284. package/dist/modes/interactive/components/armin.js.map +1 -1
  285. package/dist/modes/interactive/components/assistant-message.d.ts +5 -1
  286. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/assistant-message.js +32 -3
  288. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  289. package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
  290. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  291. package/dist/modes/interactive/components/bash-execution.js +31 -12
  292. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  293. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  294. package/dist/modes/interactive/components/bordered-loader.js +7 -1
  295. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  296. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  297. package/dist/modes/interactive/components/branch-summary-message.js +5 -3
  298. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  299. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  300. package/dist/modes/interactive/components/compaction-summary-message.js +5 -3
  301. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  302. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  303. package/dist/modes/interactive/components/config-selector.js +49 -16
  304. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  305. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  306. package/dist/modes/interactive/components/countdown-timer.js +5 -0
  307. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  308. package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
  309. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  310. package/dist/modes/interactive/components/custom-editor.js +14 -7
  311. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  312. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  313. package/dist/modes/interactive/components/custom-message.js +6 -1
  314. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  315. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  316. package/dist/modes/interactive/components/daxnuts.js +8 -6
  317. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  318. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/diff.js.map +1 -1
  320. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  321. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  322. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  323. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  324. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  325. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  326. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  327. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  328. package/dist/modes/interactive/components/extension-editor.js +16 -10
  329. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  330. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  331. package/dist/modes/interactive/components/extension-input.js +13 -7
  332. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  333. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  334. package/dist/modes/interactive/components/extension-selector.js +18 -11
  335. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  336. package/dist/modes/interactive/components/footer.d.ts +1 -0
  337. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  338. package/dist/modes/interactive/components/footer.js +7 -2
  339. package/dist/modes/interactive/components/footer.js.map +1 -1
  340. package/dist/modes/interactive/components/index.d.ts +1 -1
  341. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  342. package/dist/modes/interactive/components/index.js +1 -1
  343. package/dist/modes/interactive/components/index.js.map +1 -1
  344. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -36
  345. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  346. package/dist/modes/interactive/components/keybinding-hints.js +23 -48
  347. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  348. package/dist/modes/interactive/components/login-dialog.d.ts +5 -1
  349. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  350. package/dist/modes/interactive/components/login-dialog.js +35 -14
  351. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  352. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  353. package/dist/modes/interactive/components/model-selector.js +41 -22
  354. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  355. package/dist/modes/interactive/components/oauth-selector.d.ts +18 -6
  356. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  357. package/dist/modes/interactive/components/oauth-selector.js +104 -31
  358. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  359. package/dist/modes/interactive/components/scoped-models-selector.d.ts +5 -12
  360. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/scoped-models-selector.js +61 -42
  362. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  363. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  365. package/dist/modes/interactive/components/session-selector.d.ts +2 -1
  366. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  367. package/dist/modes/interactive/components/session-selector.js +109 -73
  368. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  369. package/dist/modes/interactive/components/settings-selector.d.ts +9 -0
  370. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  371. package/dist/modes/interactive/components/settings-selector.js +84 -4
  372. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  373. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/show-images-selector.js +6 -1
  375. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  376. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  377. package/dist/modes/interactive/components/skill-invocation-message.js +5 -3
  378. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  379. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/theme-selector.js +7 -1
  381. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  382. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  383. package/dist/modes/interactive/components/thinking-selector.js +6 -1
  384. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  385. package/dist/modes/interactive/components/tool-execution.d.ts +20 -34
  386. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  387. package/dist/modes/interactive/components/tool-execution.js +158 -636
  388. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  389. package/dist/modes/interactive/components/tree-selector.d.ts +21 -2
  390. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  391. package/dist/modes/interactive/components/tree-selector.js +224 -52
  392. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  393. package/dist/modes/interactive/components/user-message-selector.d.ts +2 -2
  394. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  395. package/dist/modes/interactive/components/user-message-selector.js +20 -16
  396. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  397. package/dist/modes/interactive/components/user-message.d.ts +1 -0
  398. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  399. package/dist/modes/interactive/components/user-message.js +8 -6
  400. package/dist/modes/interactive/components/user-message.js.map +1 -1
  401. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  402. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  403. package/dist/modes/interactive/interactive-mode.d.ts +67 -39
  404. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  405. package/dist/modes/interactive/interactive-mode.js +1556 -680
  406. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  407. package/dist/modes/interactive/theme/dark.json +1 -1
  408. package/dist/modes/interactive/theme/light.json +1 -1
  409. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  410. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  411. package/dist/modes/interactive/theme/theme.js +101 -72
  412. package/dist/modes/interactive/theme/theme.js.map +1 -1
  413. package/dist/modes/print-mode.d.ts +2 -2
  414. package/dist/modes/print-mode.d.ts.map +1 -1
  415. package/dist/modes/print-mode.js +107 -77
  416. package/dist/modes/print-mode.js.map +1 -1
  417. package/dist/modes/rpc/jsonl.d.ts +17 -0
  418. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  419. package/dist/modes/rpc/jsonl.js +49 -0
  420. package/dist/modes/rpc/jsonl.js.map +1 -0
  421. package/dist/modes/rpc/rpc-client.d.ts +8 -1
  422. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  423. package/dist/modes/rpc/rpc-client.js +22 -16
  424. package/dist/modes/rpc/rpc-client.js.map +1 -1
  425. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  426. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  427. package/dist/modes/rpc/rpc-mode.js +184 -94
  428. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  429. package/dist/modes/rpc/rpc-types.d.ts +14 -4
  430. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  431. package/dist/modes/rpc/rpc-types.js.map +1 -1
  432. package/dist/package-manager-cli.d.ts +4 -0
  433. package/dist/package-manager-cli.d.ts.map +1 -0
  434. package/dist/package-manager-cli.js +460 -0
  435. package/dist/package-manager-cli.js.map +1 -0
  436. package/dist/utils/changelog.d.ts.map +1 -1
  437. package/dist/utils/changelog.js.map +1 -1
  438. package/dist/utils/child-process.d.ts +12 -0
  439. package/dist/utils/child-process.d.ts.map +1 -0
  440. package/dist/utils/child-process.js +86 -0
  441. package/dist/utils/child-process.js.map +1 -0
  442. package/dist/utils/clipboard-image.d.ts.map +1 -1
  443. package/dist/utils/clipboard-image.js +94 -11
  444. package/dist/utils/clipboard-image.js.map +1 -1
  445. package/dist/utils/clipboard-native.d.ts +1 -0
  446. package/dist/utils/clipboard-native.d.ts.map +1 -1
  447. package/dist/utils/clipboard-native.js.map +1 -1
  448. package/dist/utils/clipboard.d.ts +1 -1
  449. package/dist/utils/clipboard.d.ts.map +1 -1
  450. package/dist/utils/clipboard.js +96 -46
  451. package/dist/utils/clipboard.js.map +1 -1
  452. package/dist/utils/exif-orientation.d.ts +5 -0
  453. package/dist/utils/exif-orientation.d.ts.map +1 -0
  454. package/dist/utils/exif-orientation.js +158 -0
  455. package/dist/utils/exif-orientation.js.map +1 -0
  456. package/dist/utils/frontmatter.d.ts.map +1 -1
  457. package/dist/utils/frontmatter.js.map +1 -1
  458. package/dist/utils/fs-watch.d.ts +5 -0
  459. package/dist/utils/fs-watch.d.ts.map +1 -0
  460. package/dist/utils/fs-watch.js +25 -0
  461. package/dist/utils/fs-watch.js.map +1 -0
  462. package/dist/utils/git.d.ts.map +1 -1
  463. package/dist/utils/git.js.map +1 -1
  464. package/dist/utils/image-convert.d.ts.map +1 -1
  465. package/dist/utils/image-convert.js +5 -1
  466. package/dist/utils/image-convert.js.map +1 -1
  467. package/dist/utils/image-resize.d.ts +5 -5
  468. package/dist/utils/image-resize.d.ts.map +1 -1
  469. package/dist/utils/image-resize.js +51 -95
  470. package/dist/utils/image-resize.js.map +1 -1
  471. package/dist/utils/mime.d.ts.map +1 -1
  472. package/dist/utils/mime.js.map +1 -1
  473. package/dist/utils/paths.d.ts +16 -0
  474. package/dist/utils/paths.d.ts.map +1 -0
  475. package/dist/utils/paths.js +50 -0
  476. package/dist/utils/paths.js.map +1 -0
  477. package/dist/utils/photon.d.ts.map +1 -1
  478. package/dist/utils/photon.js.map +1 -1
  479. package/dist/utils/pi-user-agent.d.ts +2 -0
  480. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  481. package/dist/utils/pi-user-agent.js +5 -0
  482. package/dist/utils/pi-user-agent.js.map +1 -0
  483. package/dist/utils/shell.d.ts +10 -6
  484. package/dist/utils/shell.d.ts.map +1 -1
  485. package/dist/utils/shell.js +29 -25
  486. package/dist/utils/shell.js.map +1 -1
  487. package/dist/utils/sleep.d.ts.map +1 -1
  488. package/dist/utils/sleep.js.map +1 -1
  489. package/dist/utils/tools-manager.d.ts.map +1 -1
  490. package/dist/utils/tools-manager.js +11 -6
  491. package/dist/utils/tools-manager.js.map +1 -1
  492. package/dist/utils/version-check.d.ts +14 -0
  493. package/dist/utils/version-check.d.ts.map +1 -0
  494. package/dist/utils/version-check.js +77 -0
  495. package/dist/utils/version-check.js.map +1 -0
  496. package/docs/compaction.md +394 -0
  497. package/docs/custom-provider.md +646 -0
  498. package/docs/development.md +71 -0
  499. package/docs/docs.json +148 -0
  500. package/docs/extensions.md +2596 -0
  501. package/docs/images/doom-extension.png +0 -0
  502. package/docs/images/exy.png +0 -0
  503. package/docs/images/interactive-mode.png +0 -0
  504. package/docs/images/tree-view.png +0 -0
  505. package/docs/index.md +70 -0
  506. package/docs/json.md +82 -0
  507. package/docs/keybindings.md +197 -0
  508. package/docs/models.md +474 -0
  509. package/docs/packages.md +223 -0
  510. package/docs/prompt-templates.md +88 -0
  511. package/docs/providers.md +243 -0
  512. package/docs/quickstart.md +142 -0
  513. package/docs/rpc.md +1407 -0
  514. package/docs/sdk.md +1149 -0
  515. package/docs/session-format.md +412 -0
  516. package/docs/sessions.md +137 -0
  517. package/docs/settings.md +279 -0
  518. package/docs/shell-aliases.md +13 -0
  519. package/docs/skills.md +232 -0
  520. package/docs/terminal-setup.md +106 -0
  521. package/docs/termux.md +127 -0
  522. package/docs/themes.md +295 -0
  523. package/docs/tmux.md +61 -0
  524. package/docs/tui.md +918 -0
  525. package/docs/usage.md +277 -0
  526. package/docs/windows.md +17 -0
  527. package/examples/README.md +25 -0
  528. package/examples/extensions/README.md +208 -0
  529. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  530. package/examples/extensions/bash-spawn-hook.ts +30 -0
  531. package/examples/extensions/bookmark.ts +50 -0
  532. package/examples/extensions/border-status-editor.ts +150 -0
  533. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  534. package/examples/extensions/claude-rules.ts +86 -0
  535. package/examples/extensions/commands.ts +72 -0
  536. package/examples/extensions/confirm-destructive.ts +59 -0
  537. package/examples/extensions/custom-compaction.ts +127 -0
  538. package/examples/extensions/custom-footer.ts +64 -0
  539. package/examples/extensions/custom-header.ts +73 -0
  540. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  541. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  542. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  543. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  544. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  545. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  546. package/examples/extensions/dirty-repo-guard.ts +56 -0
  547. package/examples/extensions/doom-overlay/README.md +46 -0
  548. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  549. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  550. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  551. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  552. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  553. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  554. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  555. package/examples/extensions/doom-overlay/index.ts +74 -0
  556. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  557. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  558. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  559. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  560. package/examples/extensions/dynamic-resources/index.ts +15 -0
  561. package/examples/extensions/dynamic-tools.ts +74 -0
  562. package/examples/extensions/event-bus.ts +43 -0
  563. package/examples/extensions/file-trigger.ts +41 -0
  564. package/examples/extensions/git-checkpoint.ts +53 -0
  565. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  566. package/examples/extensions/handoff.ts +191 -0
  567. package/examples/extensions/hello.ts +26 -0
  568. package/examples/extensions/hidden-thinking-label.ts +53 -0
  569. package/examples/extensions/inline-bash.ts +94 -0
  570. package/examples/extensions/input-transform.ts +43 -0
  571. package/examples/extensions/interactive-shell.ts +196 -0
  572. package/examples/extensions/mac-system-theme.ts +47 -0
  573. package/examples/extensions/message-renderer.ts +59 -0
  574. package/examples/extensions/minimal-mode.ts +426 -0
  575. package/examples/extensions/modal-editor.ts +85 -0
  576. package/examples/extensions/model-status.ts +31 -0
  577. package/examples/extensions/notify.ts +55 -0
  578. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  579. package/examples/extensions/overlay-test.ts +150 -0
  580. package/examples/extensions/permission-gate.ts +34 -0
  581. package/examples/extensions/pirate.ts +47 -0
  582. package/examples/extensions/plan-mode/README.md +65 -0
  583. package/examples/extensions/plan-mode/index.ts +340 -0
  584. package/examples/extensions/plan-mode/utils.ts +168 -0
  585. package/examples/extensions/preset.ts +430 -0
  586. package/examples/extensions/prompt-customizer.ts +97 -0
  587. package/examples/extensions/protected-paths.ts +30 -0
  588. package/examples/extensions/provider-payload.ts +18 -0
  589. package/examples/extensions/qna.ts +122 -0
  590. package/examples/extensions/question.ts +264 -0
  591. package/examples/extensions/questionnaire.ts +427 -0
  592. package/examples/extensions/rainbow-editor.ts +88 -0
  593. package/examples/extensions/reload-runtime.ts +37 -0
  594. package/examples/extensions/rpc-demo.ts +118 -0
  595. package/examples/extensions/sandbox/index.ts +321 -0
  596. package/examples/extensions/sandbox/package-lock.json +92 -0
  597. package/examples/extensions/sandbox/package.json +19 -0
  598. package/examples/extensions/send-user-message.ts +97 -0
  599. package/examples/extensions/session-name.ts +27 -0
  600. package/examples/extensions/shutdown-command.ts +63 -0
  601. package/examples/extensions/snake.ts +343 -0
  602. package/examples/extensions/space-invaders.ts +560 -0
  603. package/examples/extensions/ssh.ts +220 -0
  604. package/examples/extensions/status-line.ts +32 -0
  605. package/examples/extensions/structured-output.ts +65 -0
  606. package/examples/extensions/subagent/README.md +172 -0
  607. package/examples/extensions/subagent/agents/planner.md +37 -0
  608. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  609. package/examples/extensions/subagent/agents/scout.md +50 -0
  610. package/examples/extensions/subagent/agents/worker.md +24 -0
  611. package/examples/extensions/subagent/agents.ts +126 -0
  612. package/examples/extensions/subagent/index.ts +987 -0
  613. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  614. package/examples/extensions/subagent/prompts/implement.md +10 -0
  615. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  616. package/examples/extensions/summarize.ts +206 -0
  617. package/examples/extensions/system-prompt-header.ts +17 -0
  618. package/examples/extensions/tic-tac-toe.ts +1008 -0
  619. package/examples/extensions/timed-confirm.ts +70 -0
  620. package/examples/extensions/titlebar-spinner.ts +58 -0
  621. package/examples/extensions/todo.ts +297 -0
  622. package/examples/extensions/tool-override.ts +144 -0
  623. package/examples/extensions/tools.ts +141 -0
  624. package/examples/extensions/trigger-compact.ts +50 -0
  625. package/examples/extensions/truncated-tool.ts +195 -0
  626. package/examples/extensions/widget-placement.ts +9 -0
  627. package/examples/extensions/with-deps/index.ts +32 -0
  628. package/examples/extensions/with-deps/package-lock.json +31 -0
  629. package/examples/extensions/with-deps/package.json +22 -0
  630. package/examples/extensions/working-indicator.ts +123 -0
  631. package/examples/extensions/working-message-test.ts +25 -0
  632. package/examples/rpc-extension-ui.ts +632 -0
  633. package/examples/sdk/01-minimal.ts +22 -0
  634. package/examples/sdk/02-custom-model.ts +49 -0
  635. package/examples/sdk/03-custom-prompt.ts +62 -0
  636. package/examples/sdk/04-skills.ts +55 -0
  637. package/examples/sdk/05-tools.ts +44 -0
  638. package/examples/sdk/06-extensions.ts +90 -0
  639. package/examples/sdk/07-context-files.ts +42 -0
  640. package/examples/sdk/08-prompt-templates.ts +51 -0
  641. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  642. package/examples/sdk/10-settings.ts +53 -0
  643. package/examples/sdk/11-sessions.ts +48 -0
  644. package/examples/sdk/12-full-control.ts +73 -0
  645. package/examples/sdk/13-session-runtime.ts +67 -0
  646. package/examples/sdk/README.md +147 -0
  647. package/extensions/phi/init.ts +15 -1
  648. package/extensions/phi/keys.ts +186 -0
  649. package/extensions/phi/providers/alibaba.ts +126 -0
  650. package/extensions/phi/providers/opencode-go.ts +204 -0
  651. package/extensions/phi/setup.ts +692 -0
  652. package/extensions/phi/smart-router.ts +8 -0
  653. package/extensions/phi/web-search.ts +432 -186
  654. package/package.json +111 -106
  655. package/scripts/copy-assets.sh +0 -0
  656. package/scripts/migrate-sessions.sh +0 -0
package/dist/main.js CHANGED
@@ -4,30 +4,35 @@
4
4
  * This file handles CLI argument parsing and translates them into
5
5
  * createAgentSession() options. The SDK does the heavy lifting.
6
6
  */
7
- import { modelsAreEqual, supportsXhigh } from "phi-code-ai";
7
+ import { resolve } from "node:path";
8
+ import { createInterface } from "node:readline";
8
9
  import chalk from "chalk";
9
- import { createInterface } from "readline";
10
+ import { modelsAreEqual } from "phi-code-ai";
11
+ import { ProcessTerminal, setKeybindings, TUI } from "phi-code-tui";
10
12
  import { parseArgs, printHelp } from "./cli/args.js";
11
- import { selectConfig } from "./cli/config-selector.js";
12
13
  import { processFileArguments } from "./cli/file-processor.js";
14
+ import { buildInitialMessage } from "./cli/initial-message.js";
13
15
  import { listModels } from "./cli/list-models.js";
14
16
  import { selectSession } from "./cli/session-picker.js";
15
- import { APP_NAME, getAgentDir, getModelsPath, VERSION } from "./config.js";
17
+ import { ENV_SESSION_DIR, expandTildePath, getAgentDir, VERSION } from "./config.js";
18
+ import { createAgentSessionRuntime } from "./core/agent-session-runtime.js";
19
+ import { createAgentSessionFromServices, createAgentSessionServices, } from "./core/agent-session-services.js";
20
+ import { formatNoModelsAvailableMessage } from "./core/auth-guidance.js";
16
21
  import { AuthStorage } from "./core/auth-storage.js";
17
22
  import { exportFromFile } from "./core/export-html/index.js";
18
23
  import { KeybindingsManager } from "./core/keybindings.js";
19
- import { ModelRegistry } from "./core/model-registry.js";
20
24
  import { resolveCliModel, resolveModelScope } from "./core/model-resolver.js";
21
- import { DefaultPackageManager } from "./core/package-manager.js";
22
- import { DefaultResourceLoader } from "./core/resource-loader.js";
23
- import { createAgentSession } from "./core/sdk.js";
25
+ import { restoreStdout, takeOverStdout } from "./core/output-guard.js";
26
+ import { formatMissingSessionCwdPrompt, getMissingSessionCwdIssue, MissingSessionCwdError, } from "./core/session-cwd.js";
24
27
  import { SessionManager } from "./core/session-manager.js";
25
28
  import { SettingsManager } from "./core/settings-manager.js";
26
- import { printTimings, time } from "./core/timings.js";
27
- import { allTools } from "./core/tools/index.js";
29
+ import { printTimings, resetTimings, time } from "./core/timings.js";
28
30
  import { runMigrations, showDeprecationWarnings } from "./migrations.js";
29
31
  import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index.js";
32
+ import { ExtensionSelectorComponent } from "./modes/interactive/components/extension-selector.js";
30
33
  import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme.js";
34
+ import { handleConfigCommand, handlePackageCommand } from "./package-manager-cli.js";
35
+ import { isLocalPath } from "./utils/paths.js";
31
36
  /**
32
37
  * Read all content from piped stdin.
33
38
  * Returns undefined if stdin is a TTY (interactive terminal).
@@ -49,13 +54,17 @@ async function readPipedStdin() {
49
54
  process.stdin.resume();
50
55
  });
51
56
  }
52
- function reportSettingsErrors(settingsManager, context) {
53
- const errors = settingsManager.drainErrors();
54
- for (const { scope, error } of errors) {
55
- console.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));
56
- if (error.stack) {
57
- console.error(chalk.dim(error.stack));
58
- }
57
+ function collectSettingsDiagnostics(settingsManager, context) {
58
+ return settingsManager.drainErrors().map(({ scope, error }) => ({
59
+ type: "warning",
60
+ message: `(${context}, ${scope} settings) ${error.message}`,
61
+ }));
62
+ }
63
+ function reportDiagnostics(diagnostics) {
64
+ for (const diagnostic of diagnostics) {
65
+ const color = diagnostic.type === "error" ? chalk.red : diagnostic.type === "warning" ? chalk.yellow : chalk.dim;
66
+ const prefix = diagnostic.type === "error" ? "Error: " : diagnostic.type === "warning" ? "Warning: " : "";
67
+ console.error(color(`${prefix}${diagnostic.message}`));
59
68
  }
60
69
  }
61
70
  function isTruthyEnvFlag(value) {
@@ -63,221 +72,32 @@ function isTruthyEnvFlag(value) {
63
72
  return false;
64
73
  return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
65
74
  }
66
- function getPackageCommandUsage(command) {
67
- switch (command) {
68
- case "install":
69
- return `${APP_NAME} install <source> [-l]`;
70
- case "remove":
71
- return `${APP_NAME} remove <source> [-l]`;
72
- case "update":
73
- return `${APP_NAME} update [source]`;
74
- case "list":
75
- return `${APP_NAME} list`;
76
- }
77
- }
78
- function printPackageCommandHelp(command) {
79
- switch (command) {
80
- case "install":
81
- console.log(`${chalk.bold("Usage:")}
82
- ${getPackageCommandUsage("install")}
83
-
84
- Install a package and add it to settings.
85
-
86
- Options:
87
- -l, --local Install project-locally (.pi/settings.json)
88
-
89
- Examples:
90
- ${APP_NAME} install npm:@foo/bar
91
- ${APP_NAME} install git:github.com/user/repo
92
- ${APP_NAME} install git:git@github.com:user/repo
93
- ${APP_NAME} install https://github.com/user/repo
94
- ${APP_NAME} install ssh://git@github.com/user/repo
95
- ${APP_NAME} install ./local/path
96
- `);
97
- return;
98
- case "remove":
99
- console.log(`${chalk.bold("Usage:")}
100
- ${getPackageCommandUsage("remove")}
101
-
102
- Remove a package and its source from settings.
103
-
104
- Options:
105
- -l, --local Remove from project settings (.pi/settings.json)
106
-
107
- Example:
108
- ${APP_NAME} remove npm:@foo/bar
109
- `);
110
- return;
111
- case "update":
112
- console.log(`${chalk.bold("Usage:")}
113
- ${getPackageCommandUsage("update")}
114
-
115
- Update installed packages.
116
- If <source> is provided, only that package is updated.
117
- `);
118
- return;
119
- case "list":
120
- console.log(`${chalk.bold("Usage:")}
121
- ${getPackageCommandUsage("list")}
122
-
123
- List installed packages from user and project settings.
124
- `);
125
- return;
75
+ function resolveAppMode(parsed, stdinIsTTY) {
76
+ if (parsed.mode === "rpc") {
77
+ return "rpc";
126
78
  }
127
- }
128
- function parsePackageCommand(args) {
129
- const [command, ...rest] = args;
130
- if (command !== "install" && command !== "remove" && command !== "update" && command !== "list") {
131
- return undefined;
79
+ if (parsed.mode === "json") {
80
+ return "json";
132
81
  }
133
- let local = false;
134
- let help = false;
135
- let invalidOption;
136
- let source;
137
- for (const arg of rest) {
138
- if (arg === "-h" || arg === "--help") {
139
- help = true;
140
- continue;
141
- }
142
- if (arg === "-l" || arg === "--local") {
143
- if (command === "install" || command === "remove") {
144
- local = true;
145
- }
146
- else {
147
- invalidOption = invalidOption ?? arg;
148
- }
149
- continue;
150
- }
151
- if (arg.startsWith("-")) {
152
- invalidOption = invalidOption ?? arg;
153
- continue;
154
- }
155
- if (!source) {
156
- source = arg;
157
- }
82
+ if (parsed.print || !stdinIsTTY) {
83
+ return "print";
158
84
  }
159
- return { command, source, local, help, invalidOption };
85
+ return "interactive";
160
86
  }
161
- async function handlePackageCommand(args) {
162
- const options = parsePackageCommand(args);
163
- if (!options) {
164
- return false;
165
- }
166
- if (options.help) {
167
- printPackageCommandHelp(options.command);
168
- return true;
169
- }
170
- if (options.invalidOption) {
171
- console.error(chalk.red(`Unknown option ${options.invalidOption} for "${options.command}".`));
172
- console.error(chalk.dim(`Use "${APP_NAME} --help" or "${getPackageCommandUsage(options.command)}".`));
173
- process.exitCode = 1;
174
- return true;
175
- }
176
- const source = options.source;
177
- if ((options.command === "install" || options.command === "remove") && !source) {
178
- console.error(chalk.red(`Missing ${options.command} source.`));
179
- console.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));
180
- process.exitCode = 1;
181
- return true;
182
- }
183
- const cwd = process.cwd();
184
- const agentDir = getAgentDir();
185
- const settingsManager = SettingsManager.create(cwd, agentDir);
186
- reportSettingsErrors(settingsManager, "package command");
187
- const packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });
188
- packageManager.setProgressCallback((event) => {
189
- if (event.type === "start") {
190
- process.stdout.write(chalk.dim(`${event.message}\n`));
191
- }
192
- });
193
- try {
194
- switch (options.command) {
195
- case "install":
196
- await packageManager.install(source, { local: options.local });
197
- packageManager.addSourceToSettings(source, { local: options.local });
198
- console.log(chalk.green(`Installed ${source}`));
199
- return true;
200
- case "remove": {
201
- await packageManager.remove(source, { local: options.local });
202
- const removed = packageManager.removeSourceFromSettings(source, { local: options.local });
203
- if (!removed) {
204
- console.error(chalk.red(`No matching package found for ${source}`));
205
- process.exitCode = 1;
206
- return true;
207
- }
208
- console.log(chalk.green(`Removed ${source}`));
209
- return true;
210
- }
211
- case "list": {
212
- const globalSettings = settingsManager.getGlobalSettings();
213
- const projectSettings = settingsManager.getProjectSettings();
214
- const globalPackages = globalSettings.packages ?? [];
215
- const projectPackages = projectSettings.packages ?? [];
216
- if (globalPackages.length === 0 && projectPackages.length === 0) {
217
- console.log(chalk.dim("No packages installed."));
218
- return true;
219
- }
220
- const formatPackage = (pkg, scope) => {
221
- const source = typeof pkg === "string" ? pkg : pkg.source;
222
- const filtered = typeof pkg === "object";
223
- const display = filtered ? `${source} (filtered)` : source;
224
- console.log(` ${display}`);
225
- const path = packageManager.getInstalledPath(source, scope);
226
- if (path) {
227
- console.log(chalk.dim(` ${path}`));
228
- }
229
- };
230
- if (globalPackages.length > 0) {
231
- console.log(chalk.bold("User packages:"));
232
- for (const pkg of globalPackages) {
233
- formatPackage(pkg, "user");
234
- }
235
- }
236
- if (projectPackages.length > 0) {
237
- if (globalPackages.length > 0)
238
- console.log();
239
- console.log(chalk.bold("Project packages:"));
240
- for (const pkg of projectPackages) {
241
- formatPackage(pkg, "project");
242
- }
243
- }
244
- return true;
245
- }
246
- case "update":
247
- await packageManager.update(source);
248
- if (source) {
249
- console.log(chalk.green(`Updated ${source}`));
250
- }
251
- else {
252
- console.log(chalk.green("Updated packages"));
253
- }
254
- return true;
255
- }
256
- }
257
- catch (error) {
258
- const message = error instanceof Error ? error.message : "Unknown package command error";
259
- console.error(chalk.red(`Error: ${message}`));
260
- process.exitCode = 1;
261
- return true;
262
- }
87
+ function toPrintOutputMode(appMode) {
88
+ return appMode === "json" ? "json" : "text";
263
89
  }
264
- async function prepareInitialMessage(parsed, autoResizeImages) {
90
+ async function prepareInitialMessage(parsed, autoResizeImages, stdinContent) {
265
91
  if (parsed.fileArgs.length === 0) {
266
- return {};
92
+ return buildInitialMessage({ parsed, stdinContent });
267
93
  }
268
94
  const { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });
269
- let initialMessage;
270
- if (parsed.messages.length > 0) {
271
- initialMessage = text + parsed.messages[0];
272
- parsed.messages.shift();
273
- }
274
- else {
275
- initialMessage = text;
276
- }
277
- return {
278
- initialMessage,
279
- initialImages: images.length > 0 ? images : undefined,
280
- };
95
+ return buildInitialMessage({
96
+ parsed,
97
+ fileText: text,
98
+ fileImages: images,
99
+ stdinContent,
100
+ });
281
101
  }
282
102
  /**
283
103
  * Resolve a session argument to a file path.
@@ -317,48 +137,89 @@ async function promptConfirm(message) {
317
137
  });
318
138
  });
319
139
  }
320
- async function createSessionManager(parsed, cwd) {
140
+ function validateForkFlags(parsed) {
141
+ if (!parsed.fork)
142
+ return;
143
+ const conflictingFlags = [
144
+ parsed.session ? "--session" : undefined,
145
+ parsed.continue ? "--continue" : undefined,
146
+ parsed.resume ? "--resume" : undefined,
147
+ parsed.noSession ? "--no-session" : undefined,
148
+ ].filter((flag) => flag !== undefined);
149
+ if (conflictingFlags.length > 0) {
150
+ console.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`));
151
+ process.exit(1);
152
+ }
153
+ }
154
+ function forkSessionOrExit(sourcePath, cwd, sessionDir) {
155
+ try {
156
+ return SessionManager.forkFrom(sourcePath, cwd, sessionDir);
157
+ }
158
+ catch (error) {
159
+ const message = error instanceof Error ? error.message : String(error);
160
+ console.error(chalk.red(`Error: ${message}`));
161
+ process.exit(1);
162
+ }
163
+ }
164
+ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
321
165
  if (parsed.noSession) {
322
166
  return SessionManager.inMemory();
323
167
  }
168
+ if (parsed.fork) {
169
+ const resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);
170
+ switch (resolved.type) {
171
+ case "path":
172
+ case "local":
173
+ case "global":
174
+ return forkSessionOrExit(resolved.path, cwd, sessionDir);
175
+ case "not_found":
176
+ console.error(chalk.red(`No session found matching '${resolved.arg}'`));
177
+ process.exit(1);
178
+ }
179
+ }
324
180
  if (parsed.session) {
325
- const resolved = await resolveSessionPath(parsed.session, cwd, parsed.sessionDir);
181
+ const resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);
326
182
  switch (resolved.type) {
327
183
  case "path":
328
184
  case "local":
329
- return SessionManager.open(resolved.path, parsed.sessionDir);
185
+ return SessionManager.open(resolved.path, sessionDir);
330
186
  case "global": {
331
- // Session found in different project - ask user if they want to fork
332
187
  console.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));
333
188
  const shouldFork = await promptConfirm("Fork this session into current directory?");
334
189
  if (!shouldFork) {
335
190
  console.log(chalk.dim("Aborted."));
336
191
  process.exit(0);
337
192
  }
338
- return SessionManager.forkFrom(resolved.path, cwd, parsed.sessionDir);
193
+ return forkSessionOrExit(resolved.path, cwd, sessionDir);
339
194
  }
340
195
  case "not_found":
341
196
  console.error(chalk.red(`No session found matching '${resolved.arg}'`));
342
197
  process.exit(1);
343
198
  }
344
199
  }
345
- if (parsed.continue) {
346
- return SessionManager.continueRecent(cwd, parsed.sessionDir);
200
+ if (parsed.resume) {
201
+ initTheme(settingsManager.getTheme(), true);
202
+ try {
203
+ const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), SessionManager.listAll);
204
+ if (!selectedPath) {
205
+ console.log(chalk.dim("No session selected"));
206
+ process.exit(0);
207
+ }
208
+ return SessionManager.open(selectedPath, sessionDir);
209
+ }
210
+ finally {
211
+ stopThemeWatcher();
212
+ }
347
213
  }
348
- // --resume is handled separately (needs picker UI)
349
- // If --session-dir provided without --continue/--resume, create new session there
350
- if (parsed.sessionDir) {
351
- return SessionManager.create(cwd, parsed.sessionDir);
214
+ if (parsed.continue) {
215
+ return SessionManager.continueRecent(cwd, sessionDir);
352
216
  }
353
- // Default case (new session) returns undefined, SDK will create one
354
- return undefined;
217
+ return SessionManager.create(cwd, sessionDir);
355
218
  }
356
- function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry, settingsManager) {
219
+ function buildSessionOptions(parsed, scopedModels, hasExistingSession, modelRegistry, settingsManager) {
357
220
  const options = {};
221
+ const diagnostics = [];
358
222
  let cliThinkingFromModel = false;
359
- if (sessionManager) {
360
- options.sessionManager = sessionManager;
361
- }
362
223
  // Model from CLI
363
224
  // - supports --provider <name> --model <pattern>
364
225
  // - supports --model <provider>/<pattern>
@@ -369,11 +230,10 @@ function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry
369
230
  modelRegistry,
370
231
  });
371
232
  if (resolved.warning) {
372
- console.warn(chalk.yellow(`Warning: ${resolved.warning}`));
233
+ diagnostics.push({ type: "warning", message: resolved.warning });
373
234
  }
374
235
  if (resolved.error) {
375
- console.error(chalk.red(resolved.error));
376
- process.exit(1);
236
+ diagnostics.push({ type: "error", message: resolved.error });
377
237
  }
378
238
  if (resolved.model) {
379
239
  options.model = resolved.model;
@@ -385,7 +245,7 @@ function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry
385
245
  }
386
246
  }
387
247
  }
388
- if (!options.model && scopedModels.length > 0 && !parsed.continue && !parsed.resume) {
248
+ if (!options.model && scopedModels.length > 0 && !hasExistingSession) {
389
249
  // Check if saved default is in scoped models - use it if so, otherwise first scoped model
390
250
  const savedProvider = settingsManager.getDefaultProvider();
391
251
  const savedModelId = settingsManager.getDefaultModel();
@@ -423,39 +283,42 @@ function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry
423
283
  // (handled by caller before createAgentSession)
424
284
  // Tools
425
285
  if (parsed.noTools) {
426
- // --no-tools: start with no built-in tools
427
- // --tools can still add specific ones back
428
- if (parsed.tools && parsed.tools.length > 0) {
429
- options.tools = parsed.tools.map((name) => allTools[name]);
430
- }
431
- else {
432
- options.tools = [];
433
- }
286
+ options.noTools = "all";
434
287
  }
435
- else if (parsed.tools) {
436
- options.tools = parsed.tools.map((name) => allTools[name]);
288
+ else if (parsed.noBuiltinTools) {
289
+ options.noTools = "builtin";
437
290
  }
438
- return { options, cliThinkingFromModel };
439
- }
440
- async function handleConfigCommand(args) {
441
- if (args[0] !== "config") {
442
- return false;
291
+ if (parsed.tools) {
292
+ options.tools = [...parsed.tools];
443
293
  }
444
- const cwd = process.cwd();
445
- const agentDir = getAgentDir();
446
- const settingsManager = SettingsManager.create(cwd, agentDir);
447
- reportSettingsErrors(settingsManager, "config command");
448
- const packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });
449
- const resolvedPaths = await packageManager.resolve();
450
- await selectConfig({
451
- resolvedPaths,
452
- settingsManager,
453
- cwd,
454
- agentDir,
294
+ return { options, cliThinkingFromModel, diagnostics };
295
+ }
296
+ function resolveCliPaths(cwd, paths) {
297
+ return paths?.map((value) => (isLocalPath(value) ? resolve(cwd, value) : value));
298
+ }
299
+ async function promptForMissingSessionCwd(issue, settingsManager) {
300
+ initTheme(settingsManager.getTheme());
301
+ setKeybindings(KeybindingsManager.create());
302
+ return new Promise((resolve) => {
303
+ const ui = new TUI(new ProcessTerminal(), settingsManager.getShowHardwareCursor());
304
+ ui.setClearOnShrink(settingsManager.getClearOnShrink());
305
+ let settled = false;
306
+ const finish = (result) => {
307
+ if (settled) {
308
+ return;
309
+ }
310
+ settled = true;
311
+ ui.stop();
312
+ resolve(result);
313
+ };
314
+ const selector = new ExtensionSelectorComponent(formatMissingSessionCwdPrompt(issue), ["Continue", "Cancel"], (option) => finish(option === "Continue" ? issue.fallbackCwd : undefined), () => finish(undefined), { tui: ui });
315
+ ui.addChild(selector);
316
+ ui.setFocus(selector);
317
+ ui.start();
455
318
  });
456
- process.exit(0);
457
319
  }
458
- export async function main(args) {
320
+ export async function main(args, options) {
321
+ resetTimings();
459
322
  const offlineMode = args.includes("--offline") || isTruthyEnvFlag(process.env.PI_OFFLINE);
460
323
  if (offlineMode) {
461
324
  process.env.PI_OFFLINE = "1";
@@ -467,79 +330,26 @@ export async function main(args) {
467
330
  if (await handleConfigCommand(args)) {
468
331
  return;
469
332
  }
470
- // Run migrations (pass cwd for project-local migrations)
471
- const { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());
472
- // First pass: parse args to get --extension paths
473
- const firstPass = parseArgs(args);
474
- // Early load extensions to discover their CLI flags
475
- const cwd = process.cwd();
476
- const agentDir = getAgentDir();
477
- const settingsManager = SettingsManager.create(cwd, agentDir);
478
- reportSettingsErrors(settingsManager, "startup");
479
- const authStorage = AuthStorage.create();
480
- const modelRegistry = new ModelRegistry(authStorage, getModelsPath());
481
- const resourceLoader = new DefaultResourceLoader({
482
- cwd,
483
- agentDir,
484
- settingsManager,
485
- additionalExtensionPaths: firstPass.extensions,
486
- additionalSkillPaths: firstPass.skills,
487
- additionalPromptTemplatePaths: firstPass.promptTemplates,
488
- additionalThemePaths: firstPass.themes,
489
- noExtensions: firstPass.noExtensions,
490
- noSkills: firstPass.noSkills,
491
- noPromptTemplates: firstPass.noPromptTemplates,
492
- noThemes: firstPass.noThemes,
493
- systemPrompt: firstPass.systemPrompt,
494
- appendSystemPrompt: firstPass.appendSystemPrompt,
495
- });
496
- await resourceLoader.reload();
497
- time("resourceLoader.reload");
498
- const extensionsResult = resourceLoader.getExtensions();
499
- for (const { path, error } of extensionsResult.errors) {
500
- console.error(chalk.red(`Failed to load extension "${path}": ${error}`));
501
- }
502
- // Apply pending provider registrations from extensions immediately
503
- // so they're available for model resolution before AgentSession is created
504
- for (const { name, config } of extensionsResult.runtime.pendingProviderRegistrations) {
505
- modelRegistry.registerProvider(name, config);
506
- }
507
- extensionsResult.runtime.pendingProviderRegistrations = [];
508
- const extensionFlags = new Map();
509
- for (const ext of extensionsResult.extensions) {
510
- for (const [name, flag] of ext.flags) {
511
- extensionFlags.set(name, { type: flag.type });
333
+ const parsed = parseArgs(args);
334
+ if (parsed.diagnostics.length > 0) {
335
+ for (const d of parsed.diagnostics) {
336
+ const color = d.type === "error" ? chalk.red : chalk.yellow;
337
+ console.error(color(`${d.type === "error" ? "Error" : "Warning"}: ${d.message}`));
338
+ }
339
+ if (parsed.diagnostics.some((d) => d.type === "error")) {
340
+ process.exit(1);
512
341
  }
513
342
  }
514
- // Second pass: parse args with extension flags
515
- const parsed = parseArgs(args, extensionFlags);
516
- // Pass flag values to extensions via runtime
517
- for (const [name, value] of parsed.unknownFlags) {
518
- extensionsResult.runtime.flagValues.set(name, value);
343
+ time("parseArgs");
344
+ let appMode = resolveAppMode(parsed, process.stdin.isTTY);
345
+ const shouldTakeOverStdout = appMode !== "interactive";
346
+ if (shouldTakeOverStdout) {
347
+ takeOverStdout();
519
348
  }
520
349
  if (parsed.version) {
521
350
  console.log(VERSION);
522
351
  process.exit(0);
523
352
  }
524
- if (parsed.help) {
525
- printHelp();
526
- process.exit(0);
527
- }
528
- if (parsed.listModels !== undefined) {
529
- const searchPattern = typeof parsed.listModels === "string" ? parsed.listModels : undefined;
530
- await listModels(modelRegistry, searchPattern);
531
- process.exit(0);
532
- }
533
- // Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
534
- if (parsed.mode !== "rpc") {
535
- const stdinContent = await readPipedStdin();
536
- if (stdinContent !== undefined) {
537
- // Force print mode since interactive mode requires a TTY for keyboard input
538
- parsed.print = true;
539
- // Prepend stdin content to messages
540
- parsed.messages.unshift(stdinContent);
541
- }
542
- }
543
353
  if (parsed.export) {
544
354
  let result;
545
355
  try {
@@ -558,72 +368,168 @@ export async function main(args) {
558
368
  console.error(chalk.red("Error: @file arguments are not supported in RPC mode"));
559
369
  process.exit(1);
560
370
  }
561
- const { initialMessage, initialImages } = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize());
562
- const isInteractive = !parsed.print && parsed.mode === undefined;
563
- const mode = parsed.mode || "text";
564
- initTheme(settingsManager.getTheme(), isInteractive);
565
- // Show deprecation warnings in interactive mode
566
- if (isInteractive && deprecationWarnings.length > 0) {
567
- await showDeprecationWarnings(deprecationWarnings);
568
- }
569
- let scopedModels = [];
570
- const modelPatterns = parsed.models ?? settingsManager.getEnabledModels();
571
- if (modelPatterns && modelPatterns.length > 0) {
572
- scopedModels = await resolveModelScope(modelPatterns, modelRegistry);
573
- }
574
- // Create session manager based on CLI flags
575
- let sessionManager = await createSessionManager(parsed, cwd);
576
- // Handle --resume: show session picker
577
- if (parsed.resume) {
578
- // Initialize keybindings so session picker respects user config
579
- KeybindingsManager.create();
580
- const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, parsed.sessionDir, onProgress), SessionManager.listAll);
581
- if (!selectedPath) {
582
- console.log(chalk.dim("No session selected"));
583
- stopThemeWatcher();
584
- process.exit(0);
371
+ validateForkFlags(parsed);
372
+ // Run migrations (pass cwd for project-local migrations)
373
+ const { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());
374
+ time("runMigrations");
375
+ const cwd = process.cwd();
376
+ const agentDir = getAgentDir();
377
+ const startupSettingsManager = SettingsManager.create(cwd, agentDir);
378
+ reportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, "startup session lookup"));
379
+ // Decide the final runtime cwd before creating cwd-bound runtime services.
380
+ // --session and --resume may select a session from another project, so project-local
381
+ // settings, resources, provider registrations, and models must be resolved only after
382
+ // the target session cwd is known. The startup-cwd settings manager is used only for
383
+ // sessionDir lookup during session selection.
384
+ const envSessionDir = process.env[ENV_SESSION_DIR];
385
+ const sessionDir = parsed.sessionDir ??
386
+ (envSessionDir ? expandTildePath(envSessionDir) : undefined) ??
387
+ startupSettingsManager.getSessionDir();
388
+ let sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager);
389
+ const missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);
390
+ if (missingSessionCwdIssue) {
391
+ if (appMode === "interactive") {
392
+ const selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);
393
+ if (!selectedCwd) {
394
+ process.exit(0);
395
+ }
396
+ sessionManager = SessionManager.open(missingSessionCwdIssue.sessionFile, sessionDir, selectedCwd);
585
397
  }
586
- sessionManager = SessionManager.open(selectedPath);
587
- }
588
- const { options: sessionOptions, cliThinkingFromModel } = buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry, settingsManager);
589
- sessionOptions.authStorage = authStorage;
590
- sessionOptions.modelRegistry = modelRegistry;
591
- sessionOptions.resourceLoader = resourceLoader;
592
- // Handle CLI --api-key as runtime override (not persisted)
593
- if (parsed.apiKey) {
594
- if (!sessionOptions.model) {
595
- console.error(chalk.red("--api-key requires a model to be specified via --model, --provider/--model, or --models"));
398
+ else {
399
+ console.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));
596
400
  process.exit(1);
597
401
  }
598
- authStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);
599
- }
600
- const { session, modelFallbackMessage } = await createAgentSession(sessionOptions);
601
- if (!isInteractive && !session.model) {
602
- console.error(chalk.red("No models available."));
603
- console.error(chalk.yellow("\nSet an API key environment variable:"));
604
- console.error(" ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, etc.");
605
- console.error(chalk.yellow(`\nOr create ${getModelsPath()}`));
606
- process.exit(1);
607
402
  }
608
- // Clamp thinking level to model capabilities for CLI-provided thinking levels.
609
- // This covers both --thinking <level> and --model <pattern>:<thinking>.
610
- const cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;
611
- if (session.model && cliThinkingOverride) {
612
- let effectiveThinking = session.thinkingLevel;
613
- if (!session.model.reasoning) {
614
- effectiveThinking = "off";
403
+ time("createSessionManager");
404
+ const resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);
405
+ const resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);
406
+ const resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);
407
+ const resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);
408
+ const authStorage = AuthStorage.create();
409
+ const createRuntime = async ({ cwd, agentDir, sessionManager, sessionStartEvent, }) => {
410
+ const services = await createAgentSessionServices({
411
+ cwd,
412
+ agentDir,
413
+ authStorage,
414
+ extensionFlagValues: parsed.unknownFlags,
415
+ resourceLoaderOptions: {
416
+ additionalExtensionPaths: resolvedExtensionPaths,
417
+ additionalSkillPaths: resolvedSkillPaths,
418
+ additionalPromptTemplatePaths: resolvedPromptTemplatePaths,
419
+ additionalThemePaths: resolvedThemePaths,
420
+ noExtensions: parsed.noExtensions,
421
+ noSkills: parsed.noSkills,
422
+ noPromptTemplates: parsed.noPromptTemplates,
423
+ noThemes: parsed.noThemes,
424
+ noContextFiles: parsed.noContextFiles,
425
+ systemPrompt: parsed.systemPrompt,
426
+ appendSystemPrompt: parsed.appendSystemPrompt,
427
+ extensionFactories: options?.extensionFactories,
428
+ },
429
+ });
430
+ const { settingsManager, modelRegistry, resourceLoader } = services;
431
+ const diagnostics = [
432
+ ...services.diagnostics,
433
+ ...collectSettingsDiagnostics(settingsManager, "runtime creation"),
434
+ ...resourceLoader.getExtensions().errors.map(({ path, error }) => ({
435
+ type: "error",
436
+ message: `Failed to load extension "${path}": ${error}`,
437
+ })),
438
+ ];
439
+ const modelPatterns = parsed.models ?? settingsManager.getEnabledModels();
440
+ const scopedModels = modelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];
441
+ const { options: sessionOptions, cliThinkingFromModel, diagnostics: sessionOptionDiagnostics, } = buildSessionOptions(parsed, scopedModels, sessionManager.buildSessionContext().messages.length > 0, modelRegistry, settingsManager);
442
+ diagnostics.push(...sessionOptionDiagnostics);
443
+ if (parsed.apiKey) {
444
+ if (!sessionOptions.model) {
445
+ diagnostics.push({
446
+ type: "error",
447
+ message: "--api-key requires a model to be specified via --model, --provider/--model, or --models",
448
+ });
449
+ }
450
+ else {
451
+ authStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);
452
+ }
615
453
  }
616
- else if (effectiveThinking === "xhigh" && !supportsXhigh(session.model)) {
617
- effectiveThinking = "high";
454
+ const created = await createAgentSessionFromServices({
455
+ services,
456
+ sessionManager,
457
+ sessionStartEvent,
458
+ model: sessionOptions.model,
459
+ thinkingLevel: sessionOptions.thinkingLevel,
460
+ scopedModels: sessionOptions.scopedModels,
461
+ tools: sessionOptions.tools,
462
+ noTools: sessionOptions.noTools,
463
+ customTools: sessionOptions.customTools,
464
+ });
465
+ const cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;
466
+ if (created.session.model && cliThinkingOverride) {
467
+ created.session.setThinkingLevel(created.session.thinkingLevel);
618
468
  }
619
- if (effectiveThinking !== session.thinkingLevel) {
620
- session.setThinkingLevel(effectiveThinking);
469
+ return {
470
+ ...created,
471
+ services,
472
+ diagnostics,
473
+ };
474
+ };
475
+ time("createRuntime");
476
+ const runtime = await createAgentSessionRuntime(createRuntime, {
477
+ cwd: sessionManager.getCwd(),
478
+ agentDir,
479
+ sessionManager,
480
+ });
481
+ const { services, session, modelFallbackMessage } = runtime;
482
+ const { settingsManager, modelRegistry, resourceLoader } = services;
483
+ if (parsed.help) {
484
+ const extensionFlags = resourceLoader
485
+ .getExtensions()
486
+ .extensions.flatMap((extension) => Array.from(extension.flags.values()));
487
+ printHelp(extensionFlags);
488
+ process.exit(0);
489
+ }
490
+ if (parsed.listModels !== undefined) {
491
+ const searchPattern = typeof parsed.listModels === "string" ? parsed.listModels : undefined;
492
+ await listModels(modelRegistry, searchPattern);
493
+ process.exit(0);
494
+ }
495
+ // Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
496
+ let stdinContent;
497
+ if (appMode !== "rpc") {
498
+ stdinContent = await readPipedStdin();
499
+ if (stdinContent !== undefined && appMode === "interactive") {
500
+ appMode = "print";
621
501
  }
622
502
  }
623
- if (mode === "rpc") {
624
- await runRpcMode(session);
503
+ time("readPipedStdin");
504
+ const { initialMessage, initialImages } = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize(), stdinContent);
505
+ time("prepareInitialMessage");
506
+ initTheme(settingsManager.getTheme(), appMode === "interactive");
507
+ time("initTheme");
508
+ // Show deprecation warnings in interactive mode
509
+ if (appMode === "interactive" && deprecationWarnings.length > 0) {
510
+ await showDeprecationWarnings(deprecationWarnings);
511
+ }
512
+ const scopedModels = [...session.scopedModels];
513
+ time("resolveModelScope");
514
+ reportDiagnostics(runtime.diagnostics);
515
+ if (runtime.diagnostics.some((diagnostic) => diagnostic.type === "error")) {
516
+ process.exit(1);
517
+ }
518
+ time("createAgentSession");
519
+ if (appMode !== "interactive" && !session.model) {
520
+ console.error(chalk.red(formatNoModelsAvailableMessage()));
521
+ process.exit(1);
625
522
  }
626
- else if (isInteractive) {
523
+ const startupBenchmark = isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK);
524
+ if (startupBenchmark && appMode !== "interactive") {
525
+ console.error(chalk.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode"));
526
+ process.exit(1);
527
+ }
528
+ if (appMode === "rpc") {
529
+ printTimings();
530
+ await runRpcMode(runtime);
531
+ }
532
+ else if (appMode === "interactive") {
627
533
  if (scopedModels.length > 0 && (parsed.verbose || !settingsManager.getQuietStartup())) {
628
534
  const modelList = scopedModels
629
535
  .map((sm) => {
@@ -633,8 +539,7 @@ export async function main(args) {
633
539
  .join(", ");
634
540
  console.log(chalk.dim(`Model scope: ${modelList} ${chalk.gray("(Ctrl+P to cycle)")}`));
635
541
  }
636
- printTimings();
637
- const mode = new InteractiveMode(session, {
542
+ const interactiveMode = new InteractiveMode(runtime, {
638
543
  migratedProviders,
639
544
  modelFallbackMessage,
640
545
  initialMessage,
@@ -642,20 +547,37 @@ export async function main(args) {
642
547
  initialMessages: parsed.messages,
643
548
  verbose: parsed.verbose,
644
549
  });
645
- await mode.run();
550
+ if (startupBenchmark) {
551
+ await interactiveMode.init();
552
+ time("interactiveMode.init");
553
+ printTimings();
554
+ interactiveMode.stop();
555
+ stopThemeWatcher();
556
+ if (process.stdout.writableLength > 0) {
557
+ await new Promise((resolve) => process.stdout.once("drain", resolve));
558
+ }
559
+ if (process.stderr.writableLength > 0) {
560
+ await new Promise((resolve) => process.stderr.once("drain", resolve));
561
+ }
562
+ return;
563
+ }
564
+ printTimings();
565
+ await interactiveMode.run();
646
566
  }
647
567
  else {
648
- await runPrintMode(session, {
649
- mode,
568
+ printTimings();
569
+ const exitCode = await runPrintMode(runtime, {
570
+ mode: toPrintOutputMode(appMode),
650
571
  messages: parsed.messages,
651
572
  initialMessage,
652
573
  initialImages,
653
574
  });
654
575
  stopThemeWatcher();
655
- if (process.stdout.writableLength > 0) {
656
- await new Promise((resolve) => process.stdout.once("drain", resolve));
576
+ restoreStdout();
577
+ if (exitCode !== 0) {
578
+ process.exitCode = exitCode;
657
579
  }
658
- process.exit(0);
580
+ return;
659
581
  }
660
582
  }
661
583
  //# sourceMappingURL=main.js.map