@astralyn/pi 1.4.11 → 1.5.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 (546) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/bundle/chunks/anthropic-messages-G5ZGBHOH.js +6 -0
  3. package/dist/bundle/chunks/azure-openai-responses-EMPTMYNF.js +2 -0
  4. package/dist/bundle/chunks/bedrock-converse-stream.js +22 -15
  5. package/dist/bundle/chunks/chunk-AXX7FFFD.js +2 -0
  6. package/dist/bundle/chunks/chunk-FNGB3ASD.js +2 -0
  7. package/dist/bundle/chunks/chunk-FPALVF3F.js +4 -0
  8. package/dist/bundle/chunks/chunk-H3UF54OB.js +9 -0
  9. package/dist/bundle/chunks/chunk-IC6JXX2J.js +10 -0
  10. package/dist/bundle/chunks/{chunk-TH3QDDPD.js → chunk-IRUUTK4W.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-MZJC45TM.js → chunk-J7L6O5XA.js} +3 -3
  12. package/dist/bundle/chunks/{chunk-DLVLAQEG.js → chunk-KBFO53OG.js} +3 -3
  13. package/dist/bundle/chunks/{chunk-TPVFPFJP.js → chunk-P7VXFB2M.js} +1 -1
  14. package/dist/bundle/chunks/chunk-PSYLMRL6.js +9 -0
  15. package/dist/bundle/chunks/chunk-QNZARXLE.js +82 -0
  16. package/dist/bundle/chunks/chunk-R3YHAMWH.js +1503 -0
  17. package/dist/bundle/chunks/chunk-RAIYJ5FC.js +4 -0
  18. package/dist/bundle/chunks/{chunk-OV2VMHBX.js → chunk-SR6EWNPW.js} +1 -1
  19. package/dist/bundle/chunks/chunk-TA3YH2ZI.js +16 -0
  20. package/dist/bundle/chunks/{chunk-NUQMVNKQ.js → chunk-THAJ4BZF.js} +58 -62
  21. package/dist/bundle/chunks/{chunk-24FY4C5S.js → chunk-TRSJS3FM.js} +1 -1
  22. package/dist/bundle/chunks/chunk-ZRI3ICDE.js +2 -0
  23. package/dist/bundle/chunks/{cli-MBFCFGI2.js → cli-LAZQG54B.js} +11 -9
  24. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-7BKATOEJ.js → cloudflare-workers-ai-system-one-4L2ABUJE.js} +1 -1
  25. package/dist/bundle/chunks/{execute-VLAIP26K.js → execute-ACWDKC3C.js} +1 -1
  26. package/dist/bundle/chunks/github-copilot.js +1 -1
  27. package/dist/bundle/chunks/{google-generative-ai-HTUSU45F.js → google-generative-ai-OOVDGS5W.js} +1 -1
  28. package/dist/bundle/chunks/{google-vertex-AVQV4P76.js → google-vertex-IK5RNG7J.js} +1 -1
  29. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  30. package/dist/bundle/chunks/kimi-coding.js +1 -1
  31. package/dist/bundle/chunks/{llama-cpp-classify-27QYLJZY.js → llama-cpp-classify-XHAVT37C.js} +1 -1
  32. package/dist/bundle/chunks/meta.js +1 -1
  33. package/dist/bundle/chunks/mistral-conversations-Z56KY4OJ.js +5 -0
  34. package/dist/bundle/chunks/{openai-codex-responses-Q25MHDFX.js → openai-codex-responses-5NAH3SK6.js} +1 -1
  35. package/dist/bundle/chunks/openai-completions-S7S6PO3J.js +7 -0
  36. package/dist/bundle/chunks/{openai-decisions-3WYFPGSK.js → openai-decisions-7A36EAHE.js} +1 -1
  37. package/dist/bundle/chunks/{openai-responses-E4BNZIQK.js → openai-responses-ZQRZJKH4.js} +1 -1
  38. package/dist/bundle/chunks/{openrouter-images-CBP3OPOD.js → openrouter-images-X7PX72ON.js} +1 -1
  39. package/dist/bundle/chunks/pi-messages-TXNWPLI4.js +8 -0
  40. package/dist/bundle/chunks/radius.js +1 -1
  41. package/dist/bundle/chunks/{runtime-3RPOJS5T.js → runtime-X3XOMNXQ.js} +1 -1
  42. package/dist/bundle/chunks/{typesafe-system-one-BNICP2LS.js → typesafe-system-one-XJGMSHWL.js} +1 -1
  43. package/dist/bundle/chunks/virtual-modules-T2KLVAFL.js +2 -0
  44. package/dist/bundle/cli.js +1 -1
  45. package/dist/bundle/index.js +1 -1
  46. package/dist/bundle/rpc-entry.js +1 -1
  47. package/dist/cli/args.d.ts.map +1 -1
  48. package/dist/cli/args.js +8 -7
  49. package/dist/cli/args.js.map +1 -1
  50. package/dist/config.d.ts +10 -0
  51. package/dist/config.d.ts.map +1 -1
  52. package/dist/config.js +24 -5
  53. package/dist/config.js.map +1 -1
  54. package/dist/core/agent-session-runtime.d.ts +0 -5
  55. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  56. package/dist/core/agent-session-runtime.js +12 -28
  57. package/dist/core/agent-session-runtime.js.map +1 -1
  58. package/dist/core/agent-session.d.ts +21 -14
  59. package/dist/core/agent-session.d.ts.map +1 -1
  60. package/dist/core/agent-session.js +67 -93
  61. package/dist/core/agent-session.js.map +1 -1
  62. package/dist/core/compaction/branch-summarization.d.ts +4 -2
  63. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  64. package/dist/core/compaction/branch-summarization.js +16 -4
  65. package/dist/core/compaction/branch-summarization.js.map +1 -1
  66. package/dist/core/exec.d.ts +9 -1
  67. package/dist/core/exec.d.ts.map +1 -1
  68. package/dist/core/exec.js +104 -60
  69. package/dist/core/exec.js.map +1 -1
  70. package/dist/core/export-html/template.css +9 -0
  71. package/dist/core/export-html/template.js +165 -45
  72. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  73. package/dist/core/export-html/tool-renderer.js +5 -0
  74. package/dist/core/export-html/tool-renderer.js.map +1 -1
  75. package/dist/core/extensions/index.d.ts +1 -1
  76. package/dist/core/extensions/index.d.ts.map +1 -1
  77. package/dist/core/extensions/index.js.map +1 -1
  78. package/dist/core/extensions/loader.d.ts.map +1 -1
  79. package/dist/core/extensions/loader.js +7 -6
  80. package/dist/core/extensions/loader.js.map +1 -1
  81. package/dist/core/extensions/pi-ai-extension-view.d.ts +19 -0
  82. package/dist/core/extensions/pi-ai-extension-view.d.ts.map +1 -0
  83. package/dist/core/extensions/pi-ai-extension-view.js +22 -0
  84. package/dist/core/extensions/pi-ai-extension-view.js.map +1 -0
  85. package/dist/core/extensions/runner.d.ts +0 -1
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +7 -12
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +41 -23
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  93. package/dist/core/extensions/virtual-modules.js +8 -7
  94. package/dist/core/extensions/virtual-modules.js.map +1 -1
  95. package/dist/core/mcp-servers.d.ts +11 -4
  96. package/dist/core/mcp-servers.d.ts.map +1 -1
  97. package/dist/core/mcp-servers.js +15 -5
  98. package/dist/core/mcp-servers.js.map +1 -1
  99. package/dist/core/model-config.d.ts +1678 -2029
  100. package/dist/core/model-config.d.ts.map +1 -1
  101. package/dist/core/model-config.js +2 -3
  102. package/dist/core/model-config.js.map +1 -1
  103. package/dist/core/model-resolver.d.ts.map +1 -1
  104. package/dist/core/model-resolver.js +16 -10
  105. package/dist/core/model-resolver.js.map +1 -1
  106. package/dist/core/package-manager.d.ts +14 -0
  107. package/dist/core/package-manager.d.ts.map +1 -1
  108. package/dist/core/package-manager.js +160 -46
  109. package/dist/core/package-manager.js.map +1 -1
  110. package/dist/core/pi-ai-schemas.d.ts +163 -0
  111. package/dist/core/pi-ai-schemas.d.ts.map +1 -0
  112. package/dist/core/pi-ai-schemas.js +21 -0
  113. package/dist/core/pi-ai-schemas.js.map +1 -0
  114. package/dist/core/pi-manifest.d.ts +1 -0
  115. package/dist/core/pi-manifest.d.ts.map +1 -1
  116. package/dist/core/pi-manifest.js +4 -0
  117. package/dist/core/pi-manifest.js.map +1 -1
  118. package/dist/core/project-trust.js +1 -1
  119. package/dist/core/project-trust.js.map +1 -1
  120. package/dist/core/quiescence.d.ts +24 -0
  121. package/dist/core/quiescence.d.ts.map +1 -0
  122. package/dist/core/quiescence.js +81 -0
  123. package/dist/core/quiescence.js.map +1 -0
  124. package/dist/core/resource-loader.d.ts +4 -1
  125. package/dist/core/resource-loader.d.ts.map +1 -1
  126. package/dist/core/resource-loader.js +41 -28
  127. package/dist/core/resource-loader.js.map +1 -1
  128. package/dist/core/sdk.d.ts.map +1 -1
  129. package/dist/core/sdk.js +3 -1
  130. package/dist/core/sdk.js.map +1 -1
  131. package/dist/core/session-manager.d.ts +7 -0
  132. package/dist/core/session-manager.d.ts.map +1 -1
  133. package/dist/core/session-manager.js +32 -13
  134. package/dist/core/session-manager.js.map +1 -1
  135. package/dist/core/settings-manager.d.ts +2 -0
  136. package/dist/core/settings-manager.d.ts.map +1 -1
  137. package/dist/core/settings-manager.js +11 -0
  138. package/dist/core/settings-manager.js.map +1 -1
  139. package/dist/core/settings-schema.d.ts +4 -2
  140. package/dist/core/settings-schema.d.ts.map +1 -1
  141. package/dist/core/settings-schema.js +8 -1
  142. package/dist/core/settings-schema.js.map +1 -1
  143. package/dist/core/skills.d.ts.map +1 -1
  144. package/dist/core/skills.js +6 -14
  145. package/dist/core/skills.js.map +1 -1
  146. package/dist/core/slash-command-name.d.ts +6 -0
  147. package/dist/core/slash-command-name.d.ts.map +1 -0
  148. package/dist/core/slash-command-name.js +11 -0
  149. package/dist/core/slash-command-name.js.map +1 -0
  150. package/dist/core/slash-commands.js +2 -2
  151. package/dist/core/slash-commands.js.map +1 -1
  152. package/dist/core/source-info.d.ts +9 -0
  153. package/dist/core/source-info.d.ts.map +1 -1
  154. package/dist/core/source-info.js +13 -0
  155. package/dist/core/source-info.js.map +1 -1
  156. package/dist/core/system-prompt.d.ts.map +1 -1
  157. package/dist/core/system-prompt.js +5 -6
  158. package/dist/core/system-prompt.js.map +1 -1
  159. package/dist/core/tasks/codec.d.ts +14 -0
  160. package/dist/core/tasks/codec.d.ts.map +1 -1
  161. package/dist/core/tasks/codec.js +57 -4
  162. package/dist/core/tasks/codec.js.map +1 -1
  163. package/dist/core/tasks/record.d.ts +1 -7
  164. package/dist/core/tasks/record.d.ts.map +1 -1
  165. package/dist/core/tasks/record.js +0 -18
  166. package/dist/core/tasks/record.js.map +1 -1
  167. package/dist/core/tasks/reminder.d.ts +3 -2
  168. package/dist/core/tasks/reminder.d.ts.map +1 -1
  169. package/dist/core/tasks/reminder.js +4 -3
  170. package/dist/core/tasks/reminder.js.map +1 -1
  171. package/dist/core/tasks/runtime.d.ts +0 -2
  172. package/dist/core/tasks/runtime.d.ts.map +1 -1
  173. package/dist/core/tasks/runtime.js +2 -15
  174. package/dist/core/tasks/runtime.js.map +1 -1
  175. package/dist/core/tasks/session.d.ts +9 -2
  176. package/dist/core/tasks/session.d.ts.map +1 -1
  177. package/dist/core/tasks/session.js +23 -9
  178. package/dist/core/tasks/session.js.map +1 -1
  179. package/dist/core/tasks/types.d.ts +1 -18
  180. package/dist/core/tasks/types.d.ts.map +1 -1
  181. package/dist/core/tasks/types.js +1 -1
  182. package/dist/core/tasks/types.js.map +1 -1
  183. package/dist/core/tools/bash.d.ts +8 -7
  184. package/dist/core/tools/bash.d.ts.map +1 -1
  185. package/dist/core/tools/bash.js +6 -5
  186. package/dist/core/tools/bash.js.map +1 -1
  187. package/dist/core/tools/edit.d.ts +3 -3
  188. package/dist/core/tools/edit.d.ts.map +1 -1
  189. package/dist/core/tools/edit.js +2 -4
  190. package/dist/core/tools/edit.js.map +1 -1
  191. package/dist/core/tools/find.d.ts +2 -2
  192. package/dist/core/tools/find.d.ts.map +1 -1
  193. package/dist/core/tools/find.js.map +1 -1
  194. package/dist/core/tools/grep.d.ts +2 -2
  195. package/dist/core/tools/grep.d.ts.map +1 -1
  196. package/dist/core/tools/grep.js +1 -1
  197. package/dist/core/tools/grep.js.map +1 -1
  198. package/dist/core/tools/ls.d.ts +2 -2
  199. package/dist/core/tools/ls.d.ts.map +1 -1
  200. package/dist/core/tools/ls.js.map +1 -1
  201. package/dist/core/tools/powershell.d.ts +1 -5
  202. package/dist/core/tools/powershell.d.ts.map +1 -1
  203. package/dist/core/tools/read.d.ts +2 -2
  204. package/dist/core/tools/read.d.ts.map +1 -1
  205. package/dist/core/tools/read.js.map +1 -1
  206. package/dist/core/tools/render-utils.d.ts +4 -6
  207. package/dist/core/tools/render-utils.d.ts.map +1 -1
  208. package/dist/core/tools/render-utils.js +19 -41
  209. package/dist/core/tools/render-utils.js.map +1 -1
  210. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  211. package/dist/core/tools/renderers/bash.js +3 -25
  212. package/dist/core/tools/renderers/bash.js.map +1 -1
  213. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  214. package/dist/core/tools/renderers/write.js +18 -19
  215. package/dist/core/tools/renderers/write.js.map +1 -1
  216. package/dist/core/tools/shell-execution.d.ts +20 -13
  217. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  218. package/dist/core/tools/shell-execution.js +165 -183
  219. package/dist/core/tools/shell-execution.js.map +1 -1
  220. package/dist/core/tools/shell-tool.d.ts +9 -14
  221. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  222. package/dist/core/tools/shell-tool.js +38 -66
  223. package/dist/core/tools/shell-tool.js.map +1 -1
  224. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -4
  225. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  226. package/dist/core/tools/tool-definition-wrapper.js +2 -3
  227. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  228. package/dist/core/tools/write.d.ts +2 -2
  229. package/dist/core/tools/write.d.ts.map +1 -1
  230. package/dist/core/tools/write.js.map +1 -1
  231. package/dist/core/trust-manager.d.ts.map +1 -1
  232. package/dist/core/trust-manager.js +30 -13
  233. package/dist/core/trust-manager.js.map +1 -1
  234. package/dist/core/usage-totals.d.ts +0 -9
  235. package/dist/core/usage-totals.d.ts.map +1 -1
  236. package/dist/core/usage-totals.js +24 -91
  237. package/dist/core/usage-totals.js.map +1 -1
  238. package/dist/extensions/agent/activity-lines.d.ts +2 -3
  239. package/dist/extensions/agent/activity-lines.d.ts.map +1 -1
  240. package/dist/extensions/agent/activity-lines.js +5 -9
  241. package/dist/extensions/agent/activity-lines.js.map +1 -1
  242. package/dist/extensions/agent/activity.d.ts +0 -2
  243. package/dist/extensions/agent/activity.d.ts.map +1 -1
  244. package/dist/extensions/agent/activity.js +1 -1
  245. package/dist/extensions/agent/activity.js.map +1 -1
  246. package/dist/extensions/agent/progress.d.ts +0 -3
  247. package/dist/extensions/agent/progress.d.ts.map +1 -1
  248. package/dist/extensions/agent/progress.js +2 -8
  249. package/dist/extensions/agent/progress.js.map +1 -1
  250. package/dist/extensions/agent/render.js +1 -1
  251. package/dist/extensions/agent/render.js.map +1 -1
  252. package/dist/extensions/agent/tool.d.ts.map +1 -1
  253. package/dist/extensions/agent/tool.js +0 -6
  254. package/dist/extensions/agent/tool.js.map +1 -1
  255. package/dist/{core/isolated-session.d.ts → extensions/agent/worker-session.d.ts} +6 -6
  256. package/dist/extensions/agent/worker-session.d.ts.map +1 -0
  257. package/dist/{core/isolated-session.js → extensions/agent/worker-session.js} +9 -9
  258. package/dist/extensions/agent/worker-session.js.map +1 -0
  259. package/dist/extensions/agent/worker.d.ts +0 -3
  260. package/dist/extensions/agent/worker.d.ts.map +1 -1
  261. package/dist/extensions/agent/worker.js +2 -3
  262. package/dist/extensions/agent/worker.js.map +1 -1
  263. package/dist/extensions/btw/agent.d.ts.map +1 -1
  264. package/dist/extensions/btw/agent.js +2 -1
  265. package/dist/extensions/btw/agent.js.map +1 -1
  266. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  267. package/dist/extensions/cached-compaction/render.js +3 -3
  268. package/dist/extensions/cached-compaction/render.js.map +1 -1
  269. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  270. package/dist/extensions/codemode/renderer.js +6 -2
  271. package/dist/extensions/codemode/renderer.js.map +1 -1
  272. package/dist/extensions/codemode/tool.d.ts +2 -1
  273. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  274. package/dist/extensions/codemode/tool.js +33 -8
  275. package/dist/extensions/codemode/tool.js.map +1 -1
  276. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  277. package/dist/extensions/deepwiki/schema.js +1 -1
  278. package/dist/extensions/deepwiki/schema.js.map +1 -1
  279. package/dist/extensions/llama/ui.d.ts.map +1 -1
  280. package/dist/extensions/llama/ui.js +16 -4
  281. package/dist/extensions/llama/ui.js.map +1 -1
  282. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  283. package/dist/extensions/mcp/cli.js +34 -8
  284. package/dist/extensions/mcp/cli.js.map +1 -1
  285. package/dist/extensions/mcp/oauth.d.ts +1 -1
  286. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  287. package/dist/extensions/mcp/oauth.js +36 -13
  288. package/dist/extensions/mcp/oauth.js.map +1 -1
  289. package/dist/extensions/mcp/ui.d.ts +1 -0
  290. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  291. package/dist/extensions/mcp/ui.js +33 -24
  292. package/dist/extensions/mcp/ui.js.map +1 -1
  293. package/dist/extensions/run-summary/index.d.ts +1 -1
  294. package/dist/extensions/run-summary/index.d.ts.map +1 -1
  295. package/dist/extensions/run-summary/index.js +11 -23
  296. package/dist/extensions/run-summary/index.js.map +1 -1
  297. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  298. package/dist/extensions/statusline/usage.js +2 -1
  299. package/dist/extensions/statusline/usage.js.map +1 -1
  300. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  301. package/dist/extensions/tasks/tool/schema.js +1 -1
  302. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  303. package/dist/extensions/tasks/ui/completion-render.d.ts +5 -1
  304. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  305. package/dist/extensions/tasks/ui/completion-render.js +25 -70
  306. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  307. package/dist/extensions/tasks/ui/inspector.d.ts +1 -1
  308. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  309. package/dist/extensions/tasks/ui/inspector.js +0 -6
  310. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  311. package/dist/extensions/tasks/ui/manager.d.ts +1 -1
  312. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  313. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  314. package/dist/extensions/tasks/ui/views.d.ts +2 -4
  315. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  316. package/dist/extensions/tasks/ui/views.js +3 -7
  317. package/dist/extensions/tasks/ui/views.js.map +1 -1
  318. package/dist/extensions/tool-presentation/fallback.d.ts.map +1 -0
  319. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.js +5 -5
  320. package/dist/extensions/tool-presentation/fallback.js.map +1 -0
  321. package/dist/extensions/tool-presentation/index.js +1 -1
  322. package/dist/extensions/tool-presentation/index.js.map +1 -1
  323. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.d.ts +1 -1
  324. package/dist/extensions/tool-presentation/shell.d.ts.map +1 -0
  325. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.js +3 -3
  326. package/dist/extensions/tool-presentation/shell.js.map +1 -0
  327. package/dist/extensions/tool-search/tool.d.ts +21 -6
  328. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  329. package/dist/extensions/tool-search/tool.js +104 -36
  330. package/dist/extensions/tool-search/tool.js.map +1 -1
  331. package/dist/index.d.ts +2 -2
  332. package/dist/index.d.ts.map +1 -1
  333. package/dist/index.js.map +1 -1
  334. package/dist/main.d.ts.map +1 -1
  335. package/dist/main.js +15 -8
  336. package/dist/main.js.map +1 -1
  337. package/dist/modes/interactive/components/assistant-message.d.ts +5 -3
  338. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  339. package/dist/modes/interactive/components/assistant-message.js +61 -45
  340. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  341. package/dist/modes/interactive/components/config-selector-skills.d.ts +54 -0
  342. package/dist/modes/interactive/components/config-selector-skills.d.ts.map +1 -0
  343. package/dist/modes/interactive/components/config-selector-skills.js +178 -0
  344. package/dist/modes/interactive/components/config-selector-skills.js.map +1 -0
  345. package/dist/modes/interactive/components/config-selector.d.ts +2 -11
  346. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  347. package/dist/modes/interactive/components/config-selector.js +31 -181
  348. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  349. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  350. package/dist/modes/interactive/components/custom-editor.js +7 -0
  351. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  352. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  353. package/dist/modes/interactive/components/custom-entry.js +2 -1
  354. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  355. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  356. package/dist/modes/interactive/components/custom-message.js +2 -1
  357. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  358. package/dist/modes/interactive/components/extension-editor.d.ts +2 -0
  359. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  360. package/dist/modes/interactive/components/extension-editor.js +4 -0
  361. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  362. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  363. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/login-dialog.js +103 -10
  365. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  366. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -1
  367. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  368. package/dist/modes/interactive/components/markdown-transform.js +3 -2
  369. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  370. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  371. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  372. package/dist/modes/interactive/components/model-selector.js +17 -6
  373. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  374. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -0
  375. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/oauth-selector.js +13 -4
  377. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  378. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -0
  379. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/scoped-models-selector.js +14 -3
  381. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  382. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  383. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  384. package/dist/modes/interactive/components/session-selector-search.js +86 -22
  385. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  386. package/dist/modes/interactive/components/session-selector.d.ts +2 -1
  387. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/session-selector.js +15 -23
  389. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  390. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  391. package/dist/modes/interactive/components/settings-submenu.js +2 -0
  392. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  393. package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
  394. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  395. package/dist/modes/interactive/components/tool-execution.js +48 -9
  396. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  397. package/dist/modes/interactive/components/tree-selector.d.ts +1 -0
  398. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  399. package/dist/modes/interactive/components/tree-selector.js +5 -6
  400. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  401. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -0
  402. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  403. package/dist/modes/interactive/components/user-message-selector.js +9 -1
  404. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  405. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  406. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  407. package/dist/modes/interactive/components/user-message.js +4 -2
  408. package/dist/modes/interactive/components/user-message.js.map +1 -1
  409. package/dist/modes/interactive/editor-host.d.ts.map +1 -1
  410. package/dist/modes/interactive/editor-host.js +3 -2
  411. package/dist/modes/interactive/editor-host.js.map +1 -1
  412. package/dist/modes/interactive/external-editor.d.ts +1 -0
  413. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  414. package/dist/modes/interactive/external-editor.js +17 -5
  415. package/dist/modes/interactive/external-editor.js.map +1 -1
  416. package/dist/modes/interactive/interactive-mode.d.ts +8 -12
  417. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  418. package/dist/modes/interactive/interactive-mode.js +169 -112
  419. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  420. package/dist/modes/interactive/model-search.d.ts +10 -0
  421. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  422. package/dist/modes/interactive/model-search.js +21 -0
  423. package/dist/modes/interactive/model-search.js.map +1 -1
  424. package/dist/modes/interactive/theme/theme.d.ts +10 -0
  425. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  426. package/dist/modes/interactive/theme/theme.js +30 -23
  427. package/dist/modes/interactive/theme/theme.js.map +1 -1
  428. package/dist/modes/interactive/tool-view/chat.d.ts +2 -2
  429. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  430. package/dist/modes/interactive/tool-view/chat.js +22 -19
  431. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  432. package/dist/modes/interactive/transcript-layout.d.ts +2 -0
  433. package/dist/modes/interactive/transcript-layout.d.ts.map +1 -1
  434. package/dist/modes/interactive/transcript-layout.js +5 -2
  435. package/dist/modes/interactive/transcript-layout.js.map +1 -1
  436. package/dist/modes/rpc/rpc-client.d.ts +9 -1
  437. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  438. package/dist/modes/rpc/rpc-client.js +23 -23
  439. package/dist/modes/rpc/rpc-client.js.map +1 -1
  440. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  441. package/dist/modes/rpc/rpc-mode.js +0 -3
  442. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  443. package/dist/package-manager-cli.d.ts.map +1 -1
  444. package/dist/package-manager-cli.js +55 -4
  445. package/dist/package-manager-cli.js.map +1 -1
  446. package/dist/utils/ansi.d.ts.map +1 -1
  447. package/dist/utils/ansi.js +5 -2
  448. package/dist/utils/ansi.js.map +1 -1
  449. package/dist/utils/clipboard-command.d.ts.map +1 -1
  450. package/dist/utils/clipboard-command.js +4 -0
  451. package/dist/utils/clipboard-command.js.map +1 -1
  452. package/dist/utils/git.d.ts +1 -1
  453. package/dist/utils/git.d.ts.map +1 -1
  454. package/dist/utils/git.js.map +1 -1
  455. package/dist/utils/image-resize-core.d.ts.map +1 -1
  456. package/dist/utils/image-resize-core.js +5 -3
  457. package/dist/utils/image-resize-core.js.map +1 -1
  458. package/dist/utils/open-browser.d.ts.map +1 -1
  459. package/dist/utils/open-browser.js +4 -1
  460. package/dist/utils/open-browser.js.map +1 -1
  461. package/dist/utils/paths.d.ts +17 -0
  462. package/dist/utils/paths.d.ts.map +1 -1
  463. package/dist/utils/paths.js +42 -1
  464. package/dist/utils/paths.js.map +1 -1
  465. package/dist/utils/shell.d.ts.map +1 -1
  466. package/dist/utils/shell.js +14 -0
  467. package/dist/utils/shell.js.map +1 -1
  468. package/dist/utils/syntax-highlight.d.ts +5 -0
  469. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  470. package/dist/utils/syntax-highlight.js +7 -0
  471. package/dist/utils/syntax-highlight.js.map +1 -1
  472. package/dist/utils/tools-manager.d.ts.map +1 -1
  473. package/dist/utils/tools-manager.js +30 -35
  474. package/dist/utils/tools-manager.js.map +1 -1
  475. package/dist/utils/usage.d.ts +5 -0
  476. package/dist/utils/usage.d.ts.map +1 -0
  477. package/dist/utils/usage.js +16 -0
  478. package/dist/utils/usage.js.map +1 -0
  479. package/docs/bundled/README.md +1 -1
  480. package/docs/bundled/extensions/agent.md +5 -5
  481. package/docs/bundled/extensions/run-summary.md +4 -4
  482. package/docs/bundled/tasks.md +2 -4
  483. package/docs/bundled/tool-presentation.md +2 -2
  484. package/docs/custom-provider.md +1 -1
  485. package/docs/environment-variables.md +2 -0
  486. package/docs/extensions.md +36 -21
  487. package/docs/keybindings.md +1 -1
  488. package/docs/llama-cpp.md +17 -12
  489. package/docs/mcp.md +6 -4
  490. package/docs/packages.md +26 -1
  491. package/docs/rpc.md +1 -1
  492. package/docs/sdk.md +7 -5
  493. package/docs/session-format.md +2 -2
  494. package/docs/sessions.md +10 -0
  495. package/docs/settings.md +5 -4
  496. package/docs/terminal-setup.md +2 -2
  497. package/docs/tmux.md +6 -0
  498. package/docs/tui.md +12 -7
  499. package/docs/usage.md +19 -9
  500. package/docs/windows.md +29 -0
  501. package/examples/extensions/README.md +2 -1
  502. package/examples/extensions/custom-provider-anthropic/index.ts +27 -31
  503. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  504. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  505. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  506. package/examples/extensions/debug-provider.ts +2 -2
  507. package/examples/extensions/gondolin/package-lock.json +19 -29
  508. package/examples/extensions/gondolin/package.json +2 -2
  509. package/examples/extensions/preset.ts +2 -0
  510. package/examples/extensions/reload-runtime.ts +17 -5
  511. package/examples/extensions/tools.ts +2 -0
  512. package/examples/extensions/with-deps/package-lock.json +2 -2
  513. package/examples/extensions/with-deps/package.json +1 -1
  514. package/package.json +9 -9
  515. package/schemas/models.schema.json +36 -36
  516. package/schemas/settings.schema.json +17 -0
  517. package/dist/bundle/chunks/anthropic-messages-HWL6AS7T.js +0 -6
  518. package/dist/bundle/chunks/azure-openai-responses-4YYPDYV5.js +0 -2
  519. package/dist/bundle/chunks/chunk-6JS2SOFO.js +0 -11
  520. package/dist/bundle/chunks/chunk-ANCZPKX7.js +0 -2
  521. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +0 -2
  522. package/dist/bundle/chunks/chunk-LPF7HQ3S.js +0 -4
  523. package/dist/bundle/chunks/chunk-MMNIHCU7.js +0 -2
  524. package/dist/bundle/chunks/chunk-PUU43PDV.js +0 -1484
  525. package/dist/bundle/chunks/chunk-R267VV5T.js +0 -82
  526. package/dist/bundle/chunks/chunk-RVKT7OUB.js +0 -9
  527. package/dist/bundle/chunks/chunk-SA2AQYEI.js +0 -7
  528. package/dist/bundle/chunks/chunk-ZAIGBRV5.js +0 -16
  529. package/dist/bundle/chunks/mistral-conversations-V2JJTMJ5.js +0 -5
  530. package/dist/bundle/chunks/openai-completions-TXZXILJR.js +0 -7
  531. package/dist/bundle/chunks/pi-messages-LBJQ4NGP.js +0 -8
  532. package/dist/bundle/chunks/virtual-modules-63XNTSVN.js +0 -2
  533. package/dist/core/isolated-session.d.ts.map +0 -1
  534. package/dist/core/isolated-session.js.map +0 -1
  535. package/dist/modes/interactive/tool-view/fallback.d.ts.map +0 -1
  536. package/dist/modes/interactive/tool-view/fallback.js.map +0 -1
  537. package/dist/modes/interactive/tool-view/shell.d.ts.map +0 -1
  538. package/dist/modes/interactive/tool-view/shell.js.map +0 -1
  539. package/dist/utils/path-identity.d.ts +0 -12
  540. package/dist/utils/path-identity.d.ts.map +0 -1
  541. package/dist/utils/path-identity.js +0 -63
  542. package/dist/utils/path-identity.js.map +0 -1
  543. package/examples/extensions/sandbox/index.ts +0 -321
  544. package/examples/extensions/sandbox/package-lock.json +0 -92
  545. package/examples/extensions/sandbox/package.json +0 -19
  546. /package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.d.ts +0 -0
@@ -30,6 +30,7 @@ import { RADIUS_MCP_URL, RADIUS_PROVIDER_ID } from "../../core/radius.js";
30
30
  import { formatMissingSessionCwdPrompt, MissingSessionCwdError } from "../../core/session-cwd.js";
31
31
  import { SessionManager, sessionEntryToContextMessages, } from "../../core/session-manager.js";
32
32
  import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
33
+ import { getSourcePackageKey } from "../../core/source-info.js";
33
34
  import { isInstallTelemetryEnabled } from "../../core/telemetry.js";
34
35
  import { withBuiltInRenderers } from "../../core/tools/renderers/index.js";
35
36
  import { hasTrustRequiringProjectResources, ProjectTrustStore } from "../../core/trust-manager.js";
@@ -40,16 +41,17 @@ import { copyToClipboard, readClipboardFilePaths, readClipboardText } from "../.
40
41
  import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
41
42
  import { parseGitUrl } from "../../utils/git.js";
42
43
  import { ensurePngTranscoder } from "../../utils/image-convert.js";
43
- import { getCwdRelativePath } from "../../utils/paths.js";
44
+ import { getCwdRelativePath, shortenHomePath } from "../../utils/paths.js";
44
45
  import { getPiUserAgent } from "../../utils/pi-user-agent.js";
45
46
  import { killTrackedDetachedChildren } from "../../utils/shell.js";
46
47
  import { loadAllHighlightLanguages } from "../../utils/syntax-highlight.js";
48
+ import { stripBom } from "../../utils/text.js";
47
49
  import { ensureTool } from "../../utils/tools-manager.js";
48
50
  import { checkForNewPiVersion } from "../../utils/version-check.js";
49
51
  import { reportBug } from "./bug-report.js";
50
52
  import { createChatViewport } from "./chat-viewport.js";
51
53
  import { ArminComponent } from "./components/armin.js";
52
- import { AssistantMessageComponent, DEFAULT_ACTIVE_THINKING_LABEL } from "./components/assistant-message.js";
54
+ import { AssistantMessageComponent } from "./components/assistant-message.js";
53
55
  import { BashExecutionComponent } from "./components/bash-execution.js";
54
56
  import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
55
57
  import { CompactionSummaryMessageComponent } from "./components/compaction-summary-message.js";
@@ -123,9 +125,6 @@ class BuiltInHeader extends ExpandableText {
123
125
  return { handled: true };
124
126
  }
125
127
  }
126
- function isTranscriptNote(item) {
127
- return "type" in item && item.type === "transcript_note";
128
- }
129
128
  function isCustomSessionEntry(item) {
130
129
  return "type" in item && item.type === "custom";
131
130
  }
@@ -262,10 +261,12 @@ export class InteractiveMode {
262
261
  this.workingVisible = true;
263
262
  this.workingIndicatorOptions = undefined;
264
263
  this.defaultWorkingMessage = "Working";
265
- this.activeThinkingLabel = DEFAULT_ACTIVE_THINKING_LABEL;
264
+ this.defaultHiddenThinkingLabel = "Thinking...";
265
+ this.hiddenThinkingLabel = this.defaultHiddenThinkingLabel;
266
266
  this.lastSigintTime = 0;
267
267
  this.lastEscapeTime = 0;
268
268
  this.changelogMarkdown = undefined;
269
+ this.extensionChangelogUpdates = [];
269
270
  this.startupNoticesShown = false;
270
271
  this.anthropicSubscriptionWarningShown = false;
271
272
  // Status line tracking (for mutating immediately-sequential status updates)
@@ -323,10 +324,6 @@ export class InteractiveMode {
323
324
  // The last entry is visible; see pushExtensionDialog().
324
325
  this.extensionDialogs = [];
325
326
  this.extensionTerminalInputSubscriptions = new Set();
326
- // Ephemeral extension notes anchored to session entries and rebuilt with the transcript.
327
- this.extensionTranscriptNotes = new Map();
328
- this.hasRenderedTranscript = false;
329
- this.transcriptNotesRefreshScheduled = false;
330
327
  // Extension widgets (components rendered above/below the editor)
331
328
  this.extensionWidgetsAbove = new Map();
332
329
  this.extensionWidgetsBelow = new Map();
@@ -550,24 +547,44 @@ export class InteractiveMode {
550
547
  return;
551
548
  }
552
549
  this.startupNoticesShown = true;
553
- if (!this.changelogMarkdown) {
550
+ if (!this.changelogMarkdown && this.extensionChangelogUpdates.length === 0) {
554
551
  return;
555
552
  }
556
553
  if (this.chatContainer.children.length > 0) {
557
554
  this.chatContainer.addChild(new Spacer(1));
558
555
  }
559
556
  this.chatContainer.addChild(new DynamicBorder());
560
- if (this.settingsManager.getCollapseChangelog()) {
561
- const versionMatch = this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
562
- const latestVersion = versionMatch ? versionMatch[1] : this.version;
563
- const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
564
- this.chatContainer.addChild(new Text(condensedText, 1, 0));
557
+ if (this.changelogMarkdown) {
558
+ if (this.settingsManager.getCollapseChangelog()) {
559
+ const versionMatch = this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
560
+ const latestVersion = versionMatch ? versionMatch[1] : this.version;
561
+ const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
562
+ this.chatContainer.addChild(new Text(condensedText, 1, 0));
563
+ }
564
+ else {
565
+ this.chatContainer.addChild(new ThemedText(() => theme.bold(theme.fg("accent", "What's New")), 1, 0));
566
+ this.chatContainer.addChild(new Spacer(1));
567
+ this.chatContainer.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, this.getMarkdownThemeWithSettings()));
568
+ this.chatContainer.addChild(new Spacer(1));
569
+ }
565
570
  }
566
- else {
567
- this.chatContainer.addChild(new ThemedText(() => theme.bold(theme.fg("accent", "What's New")), 1, 0));
568
- this.chatContainer.addChild(new Spacer(1));
569
- this.chatContainer.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, this.getMarkdownThemeWithSettings()));
570
- this.chatContainer.addChild(new Spacer(1));
571
+ if (this.extensionChangelogUpdates.length > 0) {
572
+ if (this.changelogMarkdown) {
573
+ this.chatContainer.addChild(new Spacer(1));
574
+ }
575
+ if (this.settingsManager.getCollapseChangelog()) {
576
+ const condensedText = this.extensionChangelogUpdates
577
+ .map((update) => `Updated ${update.name} to v${update.version}.`)
578
+ .join("\n");
579
+ this.chatContainer.addChild(new Text(condensedText, 1, 0));
580
+ }
581
+ else {
582
+ this.chatContainer.addChild(new ThemedText(() => theme.bold(theme.fg("accent", "Extension Updates")), 1, 0));
583
+ this.chatContainer.addChild(new Spacer(1));
584
+ const markdown = this.extensionChangelogUpdates.map((update) => update.markdown).join("\n\n");
585
+ this.chatContainer.addChild(new Markdown(markdown, 1, 0, this.getMarkdownThemeWithSettings()));
586
+ this.chatContainer.addChild(new Spacer(1));
587
+ }
571
588
  }
572
589
  this.chatContainer.addChild(new DynamicBorder());
573
590
  }
@@ -644,20 +661,15 @@ export class InteractiveMode {
644
661
  if (this.isInitialized)
645
662
  return;
646
663
  this.registerSignalHandlers();
647
- // Load changelog (only show new entries, skip for resumed sessions)
664
+ // Load changelogs (only show new entries, skip for resumed sessions)
648
665
  this.changelogMarkdown = this.getChangelogForDisplay();
649
- if (this.session.scopedModels.length > 0 && this.shouldShowStartupDetails()) {
650
- const modelList = this.session.scopedModels
651
- .map((sm) => {
652
- const thinkingStr = sm.thinkingLevel ? `:${sm.thinkingLevel}` : "";
653
- return `${sm.model.id}${thinkingStr}`;
654
- })
655
- .join(", ");
656
- const cycleKeys = this.keybindings.getKeys("app.model.cycleForward");
657
- const cycleHint = cycleKeys.length > 0
658
- ? theme.fg("muted", ` (${formatKeyText(cycleKeys.join("/"), { capitalize: true })} to cycle)`)
659
- : "";
660
- console.log(theme.fg("dim", `Model scope: ${modelList}${cycleHint}`));
666
+ this.extensionChangelogUpdates = this.getExtensionChangelogUpdates();
667
+ // Fullscreen renders on the alternate screen, so text printed to stdout here would stay in the shell
668
+ // after exit. Fullscreen shows the notice in the header instead (#11508).
669
+ if (this.renderer.mode !== "fullscreen") {
670
+ const modelScopeNotice = this.getModelScopeNotice();
671
+ if (modelScopeNotice)
672
+ console.log(modelScopeNotice);
661
673
  }
662
674
  // Keep one component tree and remount it when changing renderers.
663
675
  this.renderWidgets(); // Initialize with default spacer
@@ -759,6 +771,8 @@ export class InteractiveMode {
759
771
  this.builtInHeader = new Text("", 0, 0);
760
772
  this.headerContainer.addChild(this.builtInHeader);
761
773
  }
774
+ if (this.renderer.mode === "fullscreen")
775
+ this.showFullscreenModelScopeNotice();
762
776
  this.ui.requestRender();
763
777
  // Ensure fd and rg are available after mounting the TUI (downloads if missing, adds to PATH via getBinDir)
764
778
  // so slow downloads do not make startup appear frozen.
@@ -996,6 +1010,58 @@ export class InteractiveMode {
996
1010
  }
997
1011
  return undefined;
998
1012
  }
1013
+ getExtensionChangelogUpdates() {
1014
+ // Skip changelog for resumed/continued sessions (already have messages)
1015
+ if (this.session.state.messages.length > 0) {
1016
+ return [];
1017
+ }
1018
+ const seenKeys = new Set();
1019
+ const updates = [];
1020
+ for (const { sourceInfo } of this.session.resourceLoader.getExtensions().extensions) {
1021
+ if (sourceInfo.origin !== "package" || !sourceInfo.baseDir || !sourceInfo.changelogPath) {
1022
+ continue;
1023
+ }
1024
+ const key = getSourcePackageKey(sourceInfo);
1025
+ if (seenKeys.has(key)) {
1026
+ continue;
1027
+ }
1028
+ seenKeys.add(key);
1029
+ const pkg = this.readPackageJson(sourceInfo.baseDir);
1030
+ if (!pkg?.version) {
1031
+ continue;
1032
+ }
1033
+ const lastVersion = this.settingsManager.getExtensionChangelogVersion(key);
1034
+ if (!lastVersion) {
1035
+ // Fresh install - record the version, don't show changelog
1036
+ this.settingsManager.setExtensionChangelogVersion(key, pkg.version);
1037
+ continue;
1038
+ }
1039
+ const newEntries = getNewEntries(parseChangelog(sourceInfo.changelogPath), lastVersion);
1040
+ if (newEntries.length > 0) {
1041
+ this.settingsManager.setExtensionChangelogVersion(key, pkg.version);
1042
+ const name = pkg.name || sourceInfo.source;
1043
+ // Prefix each "## [x.y.z]" heading with the package name so entries render like Pi's own.
1044
+ const markdown = newEntries
1045
+ .map((entry) => entry.content.replace(/^##\s+/, `## ${name} `))
1046
+ .join("\n\n")
1047
+ .trim();
1048
+ updates.push({ name, version: pkg.version, markdown });
1049
+ }
1050
+ }
1051
+ return updates;
1052
+ }
1053
+ readPackageJson(packageRoot) {
1054
+ try {
1055
+ const pkg = JSON.parse(stripBom(fs.readFileSync(path.join(packageRoot, "package.json"), "utf-8")));
1056
+ return {
1057
+ name: typeof pkg.name === "string" ? pkg.name : undefined,
1058
+ version: typeof pkg.version === "string" ? pkg.version : undefined,
1059
+ };
1060
+ }
1061
+ catch {
1062
+ return undefined;
1063
+ }
1064
+ }
999
1065
  reportInstallTelemetry(version) {
1000
1066
  if (process.env.PI_OFFLINE) {
1001
1067
  return;
@@ -1024,13 +1090,7 @@ export class InteractiveMode {
1024
1090
  // Extension System
1025
1091
  // =========================================================================
1026
1092
  formatDisplayPath(p) {
1027
- const home = os.homedir();
1028
- let result = p;
1029
- // Replace home directory with ~
1030
- if (result.startsWith(home)) {
1031
- result = `~${result.slice(home.length)}`;
1032
- }
1033
- return result;
1093
+ return shortenHomePath(p);
1034
1094
  }
1035
1095
  formatExtensionDisplayPath(path) {
1036
1096
  let result = this.formatDisplayPath(path);
@@ -1054,6 +1114,27 @@ export class InteractiveMode {
1054
1114
  return this.options.verbose === true || this.settingsManager.getQuietStartup() !== true;
1055
1115
  }
1056
1116
  /** Startup details (model scope, loaded resources). Hidden by quietStartup: true or "header". */
1117
+ getModelScopeNotice() {
1118
+ if (this.session.scopedModels.length === 0 || !this.shouldShowStartupDetails())
1119
+ return undefined;
1120
+ const modelList = this.session.scopedModels
1121
+ .map((sm) => {
1122
+ const thinkingStr = sm.thinkingLevel ? `:${sm.thinkingLevel}` : "";
1123
+ return `${sm.model.id}${thinkingStr}`;
1124
+ })
1125
+ .join(", ");
1126
+ const cycleKeys = this.keybindings.getKeys("app.model.cycleForward");
1127
+ const cycleHint = cycleKeys.length > 0
1128
+ ? theme.fg("muted", ` (${formatKeyText(cycleKeys.join("/"), { capitalize: true })} to cycle)`)
1129
+ : "";
1130
+ return theme.fg("dim", `Model scope: ${modelList}${cycleHint}`);
1131
+ }
1132
+ showFullscreenModelScopeNotice() {
1133
+ if (!this.getModelScopeNotice())
1134
+ return;
1135
+ this.headerContainer.addChild(new ThemedText(() => this.getModelScopeNotice() ?? "", 1, 0));
1136
+ this.headerContainer.addChild(new Spacer(1));
1137
+ }
1057
1138
  shouldShowStartupDetails() {
1058
1139
  return this.options.verbose === true || this.settingsManager.getQuietStartup() === false;
1059
1140
  }
@@ -1424,7 +1505,7 @@ export class InteractiveMode {
1424
1505
  const skillDiagnostics = skillsResult.diagnostics;
1425
1506
  if (skillDiagnostics.length > 0) {
1426
1507
  const warningLines = () => this.formatDiagnostics(skillDiagnostics, sourceInfos);
1427
- this.loadedResourcesContainer.addChild(new ThemedText(() => `${theme.fg("warning", "[Skill conflicts]")}\n${warningLines()}`, 0, 0));
1508
+ this.loadedResourcesContainer.addChild(new ThemedText(() => `${theme.fg("warning", "[Skill warnings]")}\n${warningLines()}`, 0, 0));
1428
1509
  this.loadedResourcesContainer.addChild(new Spacer(1));
1429
1510
  }
1430
1511
  const promptDiagnostics = promptsResult.diagnostics;
@@ -1792,14 +1873,14 @@ export class InteractiveMode {
1792
1873
  this.ui.requestRender();
1793
1874
  }
1794
1875
  setHiddenThinkingLabel(label) {
1795
- this.activeThinkingLabel = label ?? DEFAULT_ACTIVE_THINKING_LABEL;
1876
+ this.hiddenThinkingLabel = label ?? this.defaultHiddenThinkingLabel;
1796
1877
  for (const child of this.chatContainer.children) {
1797
1878
  if (child instanceof AssistantMessageComponent) {
1798
- child.setHiddenThinkingLabel(this.activeThinkingLabel);
1879
+ child.setHiddenThinkingLabel(this.hiddenThinkingLabel);
1799
1880
  }
1800
1881
  }
1801
1882
  if (this.streamingComponent) {
1802
- this.streamingComponent.setHiddenThinkingLabel(this.activeThinkingLabel);
1883
+ this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel);
1803
1884
  }
1804
1885
  this.ui.requestRender();
1805
1886
  }
@@ -1853,9 +1934,6 @@ export class InteractiveMode {
1853
1934
  }
1854
1935
  resetExtensionUI() {
1855
1936
  this.editorHost.clear();
1856
- this.extensionTranscriptNotes.clear();
1857
- this.hasRenderedTranscript = false;
1858
- this.transcriptNotesRefreshScheduled = false;
1859
1937
  if (this.extensionDialogs.length > 0) {
1860
1938
  for (const dialog of this.extensionDialogs) {
1861
1939
  dialog.component.dispose?.();
@@ -2027,7 +2105,6 @@ export class InteractiveMode {
2027
2105
  setWorkingIndicator: (options) => this.setWorkingIndicator(options),
2028
2106
  setHiddenThinkingLabel: (label) => this.setHiddenThinkingLabel(label),
2029
2107
  setWidget: (key, content, options) => this.setExtensionWidget(key, content, options),
2030
- addTranscriptNote: (key, text, options) => this.addExtensionTranscriptNote(key, text, options),
2031
2108
  setFooter: (factory) => this.setExtensionFooter(factory),
2032
2109
  setHeader: (factory) => this.setExtensionHeader(factory),
2033
2110
  setTitle: (title) => this.ui.terminal.setTitle(title),
@@ -2173,8 +2250,12 @@ export class InteractiveMode {
2173
2250
  this.editorComponentFactory = factory;
2174
2251
  // Save text from current editor before switching
2175
2252
  const currentText = this.editor.getText();
2176
- this.disposeActiveSelector();
2177
- this.editorContainer.clear();
2253
+ // An open extension dialog keeps the editor slot; the new editor is shown when the last dialog closes.
2254
+ const dialogOpen = this.extensionDialogs.length > 0;
2255
+ if (!dialogOpen) {
2256
+ this.disposeActiveSelector();
2257
+ this.editorContainer.clear();
2258
+ }
2178
2259
  if (factory) {
2179
2260
  // Create the custom editor with tui, theme, and keybindings
2180
2261
  const newEditor = factory(this.ui, getEditorTheme(), this.keybindings);
@@ -2225,7 +2306,8 @@ export class InteractiveMode {
2225
2306
  this.defaultEditor.setText(currentText);
2226
2307
  this.editor = this.defaultEditor;
2227
2308
  }
2228
- this.editorContainer.addChild(this.editor);
2309
+ if (!dialogOpen)
2310
+ this.editorContainer.addChild(this.editor);
2229
2311
  if (this.activeStatusIndicator) {
2230
2312
  this.statusContainer.clear();
2231
2313
  this.activeWorkingIndicatorEmbedded = this.setEditorWorkingStatusIndicator(this.activeStatusIndicator);
@@ -2233,7 +2315,8 @@ export class InteractiveMode {
2233
2315
  this.statusContainer.addChild(this.activeStatusIndicator);
2234
2316
  }
2235
2317
  }
2236
- this.ui.setFocus(this.editor);
2318
+ if (!dialogOpen)
2319
+ this.ui.setFocus(this.editor);
2237
2320
  this.ui.requestRender();
2238
2321
  }
2239
2322
  /**
@@ -2305,7 +2388,7 @@ export class InteractiveMode {
2305
2388
  options?.onHandle?.(overlayHandle);
2306
2389
  }
2307
2390
  else {
2308
- this.pushExtensionDialog(c);
2391
+ this.pushExtensionDialog(c, options?.blocked);
2309
2392
  }
2310
2393
  })
2311
2394
  .catch((err) => {
@@ -2762,7 +2845,7 @@ export class InteractiveMode {
2762
2845
  this.ui.requestRender();
2763
2846
  }
2764
2847
  else if (event.message.role === "assistant") {
2765
- this.streamingComponent = new AssistantMessageComponent(undefined, this.hideThinkingBlock, this.getMarkdownThemeWithSettings(), this.activeThinkingLabel, this.outputPad, this.getMarkdownTransformers());
2848
+ this.streamingComponent = new AssistantMessageComponent(undefined, this.hideThinkingBlock, this.getMarkdownThemeWithSettings(), this.hiddenThinkingLabel, this.outputPad, this.getMarkdownTransformers());
2766
2849
  this.streamingMessage = event.message;
2767
2850
  this.chatContainer.addChild(this.streamingComponent);
2768
2851
  this.streamingComponent.updateContent(this.streamingMessage, true);
@@ -3064,41 +3147,6 @@ export class InteractiveMode {
3064
3147
  this.lastStatusText = text;
3065
3148
  this.ui.requestRender();
3066
3149
  }
3067
- addExtensionTranscriptNote(key, text, options) {
3068
- if (this.extensionTranscriptNotes.has(key))
3069
- return;
3070
- const note = { key, text, afterEntryId: options.afterEntryId };
3071
- this.extensionTranscriptNotes.set(key, note);
3072
- if (this.hasRenderedTranscript && options.afterEntryId === this.sessionManager.getLeafId()) {
3073
- this.addTranscriptNoteToChat({ type: "transcript_note", ...note });
3074
- this.ui.requestRender();
3075
- return;
3076
- }
3077
- this.scheduleTranscriptNotesRefresh();
3078
- }
3079
- /** Coalesce restored historical notes into one rebuild; initial rendering will pick them up itself. */
3080
- scheduleTranscriptNotesRefresh() {
3081
- if (!this.hasRenderedTranscript || this.transcriptNotesRefreshScheduled || !this.session.isIdle)
3082
- return;
3083
- this.transcriptNotesRefreshScheduled = true;
3084
- const session = this.session;
3085
- queueMicrotask(() => {
3086
- if (this.session !== session || !this.transcriptNotesRefreshScheduled)
3087
- return;
3088
- this.transcriptNotesRefreshScheduled = false;
3089
- if (!session.isIdle)
3090
- return;
3091
- this.rebuildTranscriptWithNotes();
3092
- });
3093
- }
3094
- rebuildTranscriptWithNotes() {
3095
- this.chatContainer.clear();
3096
- this.renderInitialMessages({ populateHistory: false });
3097
- }
3098
- addTranscriptNoteToChat(note) {
3099
- this.chatContainer.addChild(new Spacer(1));
3100
- this.chatContainer.addChild(new ThemedText(() => theme.fg("dim", note.text), this.outputPad, 0));
3101
- }
3102
3150
  addCustomEntryToChat(entry) {
3103
3151
  const renderer = this.session.extensionRunner.getEntryRenderer(entry.customType);
3104
3152
  if (!renderer) {
@@ -3169,12 +3217,12 @@ export class InteractiveMode {
3169
3217
  // Render user message separately if present
3170
3218
  if (skillBlock.userMessage) {
3171
3219
  this.chatContainer.addChild(new Spacer(1));
3172
- const userComponent = new UserMessageComponent(skillBlock.userMessage, this.getMarkdownThemeWithSettings(), this.outputPad, this.getMarkdownTransformers());
3220
+ const userComponent = new UserMessageComponent(skillBlock.userMessage, this.getMarkdownThemeWithSettings(), this.outputPad, this.getMarkdownTransformers(), options?.messageId, options?.timestamp);
3173
3221
  this.chatContainer.addChild(userComponent);
3174
3222
  }
3175
3223
  }
3176
3224
  else {
3177
- const userComponent = new UserMessageComponent(textContent, this.getMarkdownThemeWithSettings(), this.outputPad, this.getMarkdownTransformers());
3225
+ const userComponent = new UserMessageComponent(textContent, this.getMarkdownThemeWithSettings(), this.outputPad, this.getMarkdownTransformers(), options?.messageId, options?.timestamp);
3178
3226
  this.chatContainer.addChild(userComponent);
3179
3227
  }
3180
3228
  if (options?.populateHistory) {
@@ -3184,7 +3232,7 @@ export class InteractiveMode {
3184
3232
  break;
3185
3233
  }
3186
3234
  case "assistant": {
3187
- const assistantComponent = new AssistantMessageComponent(message, this.hideThinkingBlock, this.getMarkdownThemeWithSettings(), this.activeThinkingLabel, this.outputPad, this.getMarkdownTransformers());
3235
+ const assistantComponent = new AssistantMessageComponent(message, this.hideThinkingBlock, this.getMarkdownThemeWithSettings(), this.hiddenThinkingLabel, this.outputPad, this.getMarkdownTransformers(), options?.messageId, options?.timestamp);
3188
3236
  this.chatContainer.addChild(assistantComponent);
3189
3237
  break;
3190
3238
  }
@@ -3197,7 +3245,7 @@ export class InteractiveMode {
3197
3245
  }
3198
3246
  }
3199
3247
  }
3200
- renderSessionItems(items, options = {}) {
3248
+ renderSessionItems(items, messageMeta, options = {}) {
3201
3249
  this.pendingTools.clear();
3202
3250
  const renderedPendingTools = new Map();
3203
3251
  // Cache misses are not persisted, unlike successful cache-warming usage.
@@ -3210,10 +3258,6 @@ export class InteractiveMode {
3210
3258
  this.updateEditorBorderColor();
3211
3259
  }
3212
3260
  for (const item of items) {
3213
- if (isTranscriptNote(item)) {
3214
- this.addTranscriptNoteToChat(item);
3215
- continue;
3216
- }
3217
3261
  if (isCustomSessionEntry(item)) {
3218
3262
  this.addCustomEntryToChat(item);
3219
3263
  continue;
@@ -3229,7 +3273,11 @@ export class InteractiveMode {
3229
3273
  const message = item;
3230
3274
  // Assistant messages need special handling for tool calls
3231
3275
  if (message.role === "assistant") {
3232
- this.addMessageToChat(message);
3276
+ const meta = messageMeta?.get(message);
3277
+ this.addMessageToChat(message, {
3278
+ messageId: meta?.id,
3279
+ timestamp: meta?.timestamp,
3280
+ });
3233
3281
  // Render tool call components
3234
3282
  for (const content of message.content) {
3235
3283
  if (content.type === "toolCall") {
@@ -3275,7 +3323,12 @@ export class InteractiveMode {
3275
3323
  }
3276
3324
  else {
3277
3325
  // All other messages use standard rendering
3278
- this.addMessageToChat(message, options);
3326
+ const meta = messageMeta?.get(message);
3327
+ this.addMessageToChat(message, {
3328
+ ...options,
3329
+ messageId: meta?.id,
3330
+ timestamp: meta?.timestamp,
3331
+ });
3279
3332
  }
3280
3333
  }
3281
3334
  for (const [toolCallId, component] of renderedPendingTools) {
@@ -3293,22 +3346,21 @@ export class InteractiveMode {
3293
3346
  // Selection coordinates point into the transcript being replaced (#9311).
3294
3347
  if (this.renderer instanceof TuiAltScreen)
3295
3348
  this.renderer.resetTextSelection();
3349
+ const messageMeta = new Map();
3296
3350
  const items = entries.flatMap((entry) => {
3297
- const notes = [...this.extensionTranscriptNotes.values()]
3298
- .filter((note) => note.afterEntryId === entry.id)
3299
- .map((note) => ({ type: "transcript_note", ...note }));
3300
3351
  if (entry.type === "custom" || (entry.type === "usage" && entry.kind === "cache_warm")) {
3301
- return [entry, ...notes];
3352
+ return [entry];
3302
3353
  }
3303
3354
  const messages = sessionEntryToContextMessages(entry);
3355
+ for (const msg of messages) {
3356
+ messageMeta.set(msg, { id: entry.id, timestamp: entry.timestamp });
3357
+ }
3304
3358
  if ((entry.type === "compaction" || entry.type === "branch_summary") && entry.usage && messages.length > 0) {
3305
- return [...messages, { type: "compaction_cost", kind: entry.type, usage: entry.usage }, ...notes];
3359
+ return [...messages, { type: "compaction_cost", kind: entry.type, usage: entry.usage }];
3306
3360
  }
3307
- return [...messages, ...notes];
3361
+ return messages;
3308
3362
  });
3309
- this.renderSessionItems(items, options);
3310
- this.hasRenderedTranscript = true;
3311
- this.transcriptNotesRefreshScheduled = false;
3363
+ this.renderSessionItems(items, messageMeta, options);
3312
3364
  }
3313
3365
  addCacheWarmingUsage(entry) {
3314
3366
  if (!this.settingsManager.getShowCacheMissNotices())
@@ -3396,11 +3448,11 @@ export class InteractiveMode {
3396
3448
  this.chatContainer.addChild(new Spacer(1));
3397
3449
  this.chatContainer.addChild(new ThemedText(() => theme.fg("warning", `${label}: ${reBilled}`), 1, 0));
3398
3450
  }
3399
- renderInitialMessages(options = {}) {
3451
+ renderInitialMessages() {
3400
3452
  const entries = this.sessionManager.buildContextEntries();
3401
3453
  this.renderSessionEntries(entries, {
3402
3454
  updateFooter: true,
3403
- populateHistory: options.populateHistory ?? true,
3455
+ populateHistory: true,
3404
3456
  });
3405
3457
  this.renderProjectTrustWarningIfNeeded();
3406
3458
  // Show compaction info if session was compacted
@@ -3457,7 +3509,6 @@ export class InteractiveMode {
3457
3509
  if (this.isShuttingDown)
3458
3510
  return;
3459
3511
  this.isShuttingDown = true;
3460
- this.session.tasks.close();
3461
3512
  // Keep signal handlers registered until terminal cleanup has completed.
3462
3513
  // `signal-exit` checks the listener list during the same SIGTERM/SIGHUP
3463
3514
  // dispatch and re-sends the signal if only its own listeners remain.
@@ -3480,9 +3531,12 @@ export class InteractiveMode {
3480
3531
  // the final frame while the process is exiting.
3481
3532
  // Drain any in-flight Kitty key release events before stopping.
3482
3533
  // This prevents escape sequences from leaking to the parent shell over slow SSH.
3534
+ // Close task admission first, so no completion turn starts while the terminal drains.
3535
+ const stoppingTasks = this.session.shutdownTasks();
3483
3536
  this.themeController.disableAutoSync();
3484
3537
  await this.ui.terminal.drainInput(1000);
3485
3538
  this.stop();
3539
+ await stoppingTasks;
3486
3540
  await this.runtimeHost.dispose();
3487
3541
  const resumeCommand = formatResumeCommand(this.sessionManager);
3488
3542
  if (resumeCommand) {
@@ -3754,6 +3808,9 @@ export class InteractiveMode {
3754
3808
  if (result.status === "complete") {
3755
3809
  this.editor.setText(result.content);
3756
3810
  }
3811
+ else {
3812
+ this.showStatus(result.message);
3813
+ }
3757
3814
  }
3758
3815
  finally {
3759
3816
  this.ui.start();