@astralyn/pi 1.0.5 → 1.2.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 (436) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/bundle/chunks/anthropic-messages-NVP5OPIM.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +1 -1
  4. package/dist/bundle/chunks/{azure-openai-responses-LDW4FGAQ.js → azure-openai-responses-IBTOZ5MH.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  6. package/dist/bundle/chunks/chunk-4XZYHGVN.js +11 -0
  7. package/dist/bundle/chunks/{chunk-GIG5IHES.js → chunk-5KJH3GGH.js} +1 -1
  8. package/dist/bundle/chunks/chunk-6VYRLG5F.js +2 -0
  9. package/dist/bundle/chunks/{chunk-UCXU7KLO.js → chunk-7HJ6CHUB.js} +1 -1
  10. package/dist/bundle/chunks/chunk-7UBIBLPN.js +2 -0
  11. package/dist/bundle/chunks/{chunk-IE3Z7ESB.js → chunk-A5HU4TE6.js} +418 -362
  12. package/dist/bundle/chunks/{chunk-HDHRZ7GT.js → chunk-B2UOWO4A.js} +1 -1
  13. package/dist/bundle/chunks/chunk-J75WV3FL.js +2 -0
  14. package/dist/bundle/chunks/{chunk-A6ALEEY5.js → chunk-LHSPN2IO.js} +1 -1
  15. package/dist/bundle/chunks/chunk-Q74S7ILH.js +2 -0
  16. package/dist/bundle/chunks/chunk-QDDSFJ35.js +2 -0
  17. package/dist/bundle/chunks/{chunk-IFELM7MW.js → chunk-UQECUCUH.js} +1 -1
  18. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-HGOVFZDC.js +2 -0
  19. package/dist/bundle/chunks/codemode-worker.js +18 -10
  20. package/dist/bundle/chunks/github-copilot.js +1 -1
  21. package/dist/bundle/chunks/{google-generative-ai-S5A5IBU4.js → google-generative-ai-M44TSMAN.js} +1 -1
  22. package/dist/bundle/chunks/{google-vertex-UBRQFDB4.js → google-vertex-3C4OWLFX.js} +1 -1
  23. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  24. package/dist/bundle/chunks/{llama-cpp-classify-R7DQLTQN.js → llama-cpp-classify-H3IZDR5O.js} +2 -2
  25. package/dist/bundle/chunks/mistral-conversations-I5PL4VCZ.js +5 -0
  26. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  27. package/dist/bundle/chunks/openai-codex-responses-O5EUDL54.js +10 -0
  28. package/dist/bundle/chunks/openai-codex.js +1 -1
  29. package/dist/bundle/chunks/{openai-completions-H4VMO7AU.js → openai-completions-X3SSG5BQ.js} +1 -1
  30. package/dist/bundle/chunks/openai-decisions-TVCDIPZX.js +5 -0
  31. package/dist/bundle/chunks/{openai-responses-G4PGNM2H.js → openai-responses-NYPNKVDV.js} +1 -1
  32. package/dist/bundle/chunks/{openrouter-images-YP3YVB54.js → openrouter-images-TDLJV5N4.js} +1 -1
  33. package/dist/bundle/chunks/{pi-messages-HZZ7GEEW.js → pi-messages-ZXNERWJG.js} +1 -1
  34. package/dist/bundle/chunks/typesafe-system-one-LWPJYTJP.js +2 -0
  35. package/dist/bundle/chunks/{virtual-modules-46MSJGKO.js → virtual-modules-OZTPKGU7.js} +1 -1
  36. package/dist/bundle/cli.js +1 -1
  37. package/dist/bundle/index.js +1 -1
  38. package/dist/bundle/rpc-entry.js +1 -1
  39. package/dist/cli/args.d.ts +1 -1
  40. package/dist/cli/args.d.ts.map +1 -1
  41. package/dist/cli/args.js +13 -1
  42. package/dist/cli/args.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +26 -7
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +190 -183
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/auth-storage.d.ts.map +1 -1
  48. package/dist/core/auth-storage.js +20 -13
  49. package/dist/core/auth-storage.js.map +1 -1
  50. package/dist/core/bash-executor.d.ts.map +1 -1
  51. package/dist/core/bash-executor.js +40 -45
  52. package/dist/core/bash-executor.js.map +1 -1
  53. package/dist/core/bug-report.d.ts +9 -1
  54. package/dist/core/bug-report.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.d.ts +6 -0
  56. package/dist/core/compaction/utils.d.ts.map +1 -1
  57. package/dist/core/compaction/utils.js +7 -8
  58. package/dist/core/compaction/utils.js.map +1 -1
  59. package/dist/core/context-snapshot.d.ts +4 -1
  60. package/dist/core/context-snapshot.d.ts.map +1 -1
  61. package/dist/core/context-snapshot.js +45 -0
  62. package/dist/core/context-snapshot.js.map +1 -1
  63. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  64. package/dist/core/export-html/tool-renderer.js +2 -0
  65. package/dist/core/export-html/tool-renderer.js.map +1 -1
  66. package/dist/core/extensions/index.d.ts +1 -1
  67. package/dist/core/extensions/index.d.ts.map +1 -1
  68. package/dist/core/extensions/index.js.map +1 -1
  69. package/dist/core/extensions/runner.d.ts +4 -2
  70. package/dist/core/extensions/runner.d.ts.map +1 -1
  71. package/dist/core/extensions/runner.js +2 -3
  72. package/dist/core/extensions/runner.js.map +1 -1
  73. package/dist/core/extensions/types.d.ts +42 -7
  74. package/dist/core/extensions/types.d.ts.map +1 -1
  75. package/dist/core/extensions/types.js.map +1 -1
  76. package/dist/core/key-id-schema.d.ts +6 -0
  77. package/dist/core/key-id-schema.d.ts.map +1 -0
  78. package/dist/core/key-id-schema.js +16 -0
  79. package/dist/core/key-id-schema.js.map +1 -0
  80. package/dist/core/keybinding-registry.d.ts +4 -3
  81. package/dist/core/keybinding-registry.d.ts.map +1 -1
  82. package/dist/core/keybinding-registry.js +4 -3
  83. package/dist/core/keybinding-registry.js.map +1 -1
  84. package/dist/core/keybindings-schema.d.ts +4 -0
  85. package/dist/core/keybindings-schema.d.ts.map +1 -0
  86. package/dist/core/keybindings-schema.js +16 -0
  87. package/dist/core/keybindings-schema.js.map +1 -0
  88. package/dist/core/keybindings.d.ts +258 -81
  89. package/dist/core/keybindings.d.ts.map +1 -1
  90. package/dist/core/keybindings.js +27 -24
  91. package/dist/core/keybindings.js.map +1 -1
  92. package/dist/core/model-config.d.ts +713 -180
  93. package/dist/core/model-config.d.ts.map +1 -1
  94. package/dist/core/model-config.js +18 -179
  95. package/dist/core/model-config.js.map +1 -1
  96. package/dist/core/model-runtime.d.ts.map +1 -1
  97. package/dist/core/model-runtime.js +13 -7
  98. package/dist/core/model-runtime.js.map +1 -1
  99. package/dist/core/nested-tool-calls.d.ts +1 -0
  100. package/dist/core/nested-tool-calls.d.ts.map +1 -1
  101. package/dist/core/nested-tool-calls.js +1 -0
  102. package/dist/core/nested-tool-calls.js.map +1 -1
  103. package/dist/core/package-manager.d.ts.map +1 -1
  104. package/dist/core/package-manager.js +3 -3
  105. package/dist/core/package-manager.js.map +1 -1
  106. package/dist/core/project-trust.d.ts.map +1 -1
  107. package/dist/core/project-trust.js +2 -1
  108. package/dist/core/project-trust.js.map +1 -1
  109. package/dist/core/remote-catalog-provider.d.ts +12 -1
  110. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  111. package/dist/core/remote-catalog-provider.js +82 -24
  112. package/dist/core/remote-catalog-provider.js.map +1 -1
  113. package/dist/core/resource-loader.d.ts.map +1 -1
  114. package/dist/core/resource-loader.js +7 -2
  115. package/dist/core/resource-loader.js.map +1 -1
  116. package/dist/core/sdk.d.ts +4 -0
  117. package/dist/core/sdk.d.ts.map +1 -1
  118. package/dist/core/sdk.js +17 -5
  119. package/dist/core/sdk.js.map +1 -1
  120. package/dist/core/settings-defaults.d.ts +65 -0
  121. package/dist/core/settings-defaults.d.ts.map +1 -0
  122. package/dist/core/settings-defaults.js +66 -0
  123. package/dist/core/settings-defaults.js.map +1 -0
  124. package/dist/core/settings-manager.d.ts +15 -147
  125. package/dist/core/settings-manager.d.ts.map +1 -1
  126. package/dist/core/settings-manager.js +85 -57
  127. package/dist/core/settings-manager.js.map +1 -1
  128. package/dist/core/settings-schema.d.ts +231 -0
  129. package/dist/core/settings-schema.d.ts.map +1 -0
  130. package/dist/core/settings-schema.js +294 -0
  131. package/dist/core/settings-schema.js.map +1 -0
  132. package/dist/core/tasks/session.d.ts +9 -0
  133. package/dist/core/tasks/session.d.ts.map +1 -1
  134. package/dist/core/tasks/session.js +21 -0
  135. package/dist/core/tasks/session.js.map +1 -1
  136. package/dist/core/tools/render-utils.d.ts +18 -0
  137. package/dist/core/tools/render-utils.d.ts.map +1 -1
  138. package/dist/core/tools/render-utils.js +46 -0
  139. package/dist/core/tools/render-utils.js.map +1 -1
  140. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  141. package/dist/core/tools/renderers/bash.js +21 -45
  142. package/dist/core/tools/renderers/bash.js.map +1 -1
  143. package/dist/core/tools/renderers/edit.js +1 -1
  144. package/dist/core/tools/renderers/edit.js.map +1 -1
  145. package/dist/extensions/btw/keybindings.d.ts +2 -2
  146. package/dist/extensions/btw/keybindings.d.ts.map +1 -1
  147. package/dist/extensions/btw/keybindings.js.map +1 -1
  148. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  149. package/dist/extensions/codemode/execute.js +115 -40
  150. package/dist/extensions/codemode/execute.js.map +1 -1
  151. package/dist/extensions/codemode/index.d.ts.map +1 -1
  152. package/dist/extensions/codemode/index.js +3 -7
  153. package/dist/extensions/codemode/index.js.map +1 -1
  154. package/dist/extensions/codemode/renderer.d.ts +2 -2
  155. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  156. package/dist/extensions/codemode/renderer.js +9 -3
  157. package/dist/extensions/codemode/renderer.js.map +1 -1
  158. package/dist/extensions/codemode/tool.d.ts +6 -12
  159. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  160. package/dist/extensions/codemode/tool.js +46 -34
  161. package/dist/extensions/codemode/tool.js.map +1 -1
  162. package/dist/extensions/index.js +2 -2
  163. package/dist/extensions/index.js.map +1 -1
  164. package/dist/extensions/list-keybindings.d.ts +2 -2
  165. package/dist/extensions/list-keybindings.d.ts.map +1 -1
  166. package/dist/extensions/list-keybindings.js.map +1 -1
  167. package/dist/extensions/llama/provider.d.ts.map +1 -1
  168. package/dist/extensions/llama/provider.js +34 -11
  169. package/dist/extensions/llama/provider.js.map +1 -1
  170. package/dist/extensions/mcp/cli.js +22 -31
  171. package/dist/extensions/mcp/cli.js.map +1 -1
  172. package/dist/extensions/mcp/index.d.ts.map +1 -1
  173. package/dist/extensions/mcp/index.js +187 -95
  174. package/dist/extensions/mcp/index.js.map +1 -1
  175. package/dist/extensions/mcp/oauth.d.ts +5 -3
  176. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  177. package/dist/extensions/mcp/oauth.js +36 -10
  178. package/dist/extensions/mcp/oauth.js.map +1 -1
  179. package/dist/extensions/mcp/resources.d.ts +0 -6
  180. package/dist/extensions/mcp/resources.d.ts.map +1 -1
  181. package/dist/extensions/mcp/resources.js +1 -1
  182. package/dist/extensions/mcp/resources.js.map +1 -1
  183. package/dist/extensions/mcp/runtime.d.ts +3 -6
  184. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  185. package/dist/extensions/mcp/runtime.js +4 -39
  186. package/dist/extensions/mcp/runtime.js.map +1 -1
  187. package/dist/extensions/mcp/tools.d.ts +2 -3
  188. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  189. package/dist/extensions/mcp/tools.js +62 -6
  190. package/dist/extensions/mcp/tools.js.map +1 -1
  191. package/dist/extensions/mcp/ui.d.ts +3 -3
  192. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  193. package/dist/extensions/mcp/ui.js +10 -2
  194. package/dist/extensions/mcp/ui.js.map +1 -1
  195. package/dist/extensions/provider/keybindings.d.ts +2 -2
  196. package/dist/extensions/provider/keybindings.d.ts.map +1 -1
  197. package/dist/extensions/provider/keybindings.js.map +1 -1
  198. package/dist/extensions/search/code-search.d.ts +27 -0
  199. package/dist/extensions/search/code-search.d.ts.map +1 -0
  200. package/dist/extensions/search/code-search.js +120 -0
  201. package/dist/extensions/search/code-search.js.map +1 -0
  202. package/dist/extensions/search/command.d.ts +5 -0
  203. package/dist/extensions/search/command.d.ts.map +1 -0
  204. package/dist/extensions/search/command.js +69 -0
  205. package/dist/extensions/search/command.js.map +1 -0
  206. package/dist/extensions/search/credential.d.ts +25 -0
  207. package/dist/extensions/search/credential.d.ts.map +1 -0
  208. package/dist/extensions/search/credential.js +117 -0
  209. package/dist/extensions/search/credential.js.map +1 -0
  210. package/dist/extensions/search/devin.d.ts +34 -0
  211. package/dist/extensions/search/devin.d.ts.map +1 -0
  212. package/dist/extensions/search/devin.js +210 -0
  213. package/dist/extensions/search/devin.js.map +1 -0
  214. package/dist/extensions/search/index.d.ts +5 -0
  215. package/dist/extensions/search/index.d.ts.map +1 -0
  216. package/dist/extensions/search/index.js +113 -0
  217. package/dist/extensions/search/index.js.map +1 -0
  218. package/dist/extensions/search/panel.d.ts +53 -0
  219. package/dist/extensions/search/panel.d.ts.map +1 -0
  220. package/dist/extensions/search/panel.js +157 -0
  221. package/dist/extensions/search/panel.js.map +1 -0
  222. package/dist/extensions/search/prompt.d.ts +14 -0
  223. package/dist/extensions/search/prompt.d.ts.map +1 -0
  224. package/dist/extensions/search/prompt.js +221 -0
  225. package/dist/extensions/search/prompt.js.map +1 -0
  226. package/dist/extensions/search/render.d.ts +28 -0
  227. package/dist/extensions/search/render.d.ts.map +1 -0
  228. package/dist/extensions/search/render.js +86 -0
  229. package/dist/extensions/search/render.js.map +1 -0
  230. package/dist/extensions/search/workspace.d.ts +39 -0
  231. package/dist/extensions/search/workspace.d.ts.map +1 -0
  232. package/dist/extensions/search/workspace.js +363 -0
  233. package/dist/extensions/search/workspace.js.map +1 -0
  234. package/dist/extensions/tool-search/index.d.ts.map +1 -1
  235. package/dist/extensions/tool-search/index.js +1 -6
  236. package/dist/extensions/tool-search/index.js.map +1 -1
  237. package/dist/extensions/tool-search/tool.d.ts +0 -2
  238. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  239. package/dist/extensions/tool-search/tool.js +2 -4
  240. package/dist/extensions/tool-search/tool.js.map +1 -1
  241. package/dist/index.d.ts +1 -1
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js.map +1 -1
  244. package/dist/main.js +3 -3
  245. package/dist/main.js.map +1 -1
  246. package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  247. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  248. package/dist/modes/interactive/components/bash-execution.js +14 -14
  249. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  250. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  251. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/branch-summary-message.js +5 -2
  253. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  254. package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
  255. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
  257. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  258. package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
  259. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/custom-entry.js +7 -2
  261. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  262. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  263. package/dist/modes/interactive/components/custom-message.js +1 -0
  264. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  265. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  266. package/dist/modes/interactive/components/settings-selector.js +4 -3
  267. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  268. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  269. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
  271. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  272. package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
  273. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/status-indicator.js +2 -2
  275. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  276. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  277. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  278. package/dist/modes/interactive/interactive-mode.js +63 -64
  279. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  280. package/dist/modes/interactive/program-status-reporter.d.ts +34 -0
  281. package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
  282. package/dist/modes/interactive/program-status-reporter.js +107 -0
  283. package/dist/modes/interactive/program-status-reporter.js.map +1 -0
  284. package/dist/modes/interactive/tasks/host-hooks.d.ts +14 -0
  285. package/dist/modes/interactive/tasks/host-hooks.d.ts.map +1 -0
  286. package/dist/modes/interactive/tasks/host-hooks.js +31 -0
  287. package/dist/modes/interactive/tasks/host-hooks.js.map +1 -0
  288. package/dist/modes/interactive/theme/dark.json +1 -1
  289. package/dist/modes/interactive/theme/light.json +1 -1
  290. package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
  291. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  292. package/dist/modes/interactive/theme/theme-schema.js +105 -0
  293. package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  294. package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
  295. package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
  296. package/dist/modes/interactive/theme/theme-tokens.js +94 -0
  297. package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
  298. package/dist/modes/interactive/theme/theme.d.ts +13 -16
  299. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  300. package/dist/modes/interactive/theme/theme.js +23 -31
  301. package/dist/modes/interactive/theme/theme.js.map +1 -1
  302. package/dist/modes/interactive/tool-view/tool-execution.d.ts +5 -0
  303. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
  304. package/dist/modes/interactive/tool-view/tool-execution.js +7 -0
  305. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
  306. package/dist/modes/print-mode.d.ts.map +1 -1
  307. package/dist/modes/print-mode.js +4 -0
  308. package/dist/modes/print-mode.js.map +1 -1
  309. package/dist/package-manager-cli.d.ts.map +1 -1
  310. package/dist/package-manager-cli.js +24 -0
  311. package/dist/package-manager-cli.js.map +1 -1
  312. package/dist/utils/ansi.d.ts +8 -0
  313. package/dist/utils/ansi.d.ts.map +1 -1
  314. package/dist/utils/ansi.js +30 -11
  315. package/dist/utils/ansi.js.map +1 -1
  316. package/dist/utils/clipboard.d.ts.map +1 -1
  317. package/dist/utils/clipboard.js +18 -12
  318. package/dist/utils/clipboard.js.map +1 -1
  319. package/dist/utils/image-resize-core.d.ts +12 -0
  320. package/dist/utils/image-resize-core.d.ts.map +1 -1
  321. package/dist/utils/image-resize-core.js +5 -0
  322. package/dist/utils/image-resize-core.js.map +1 -1
  323. package/dist/utils/image-resize-worker.js +3 -2
  324. package/dist/utils/image-resize-worker.js.map +1 -1
  325. package/dist/utils/image-resize.d.ts.map +1 -1
  326. package/dist/utils/image-resize.js +9 -10
  327. package/dist/utils/image-resize.js.map +1 -1
  328. package/docs/bundled/README.md +1 -1
  329. package/docs/bundled/extensions/provider.md +1 -1
  330. package/docs/bundled/extensions/question.md +1 -1
  331. package/docs/bundled/extensions/search.md +51 -0
  332. package/docs/bundled/extensions/statusline.md +15 -41
  333. package/docs/codemode.md +24 -4
  334. package/docs/compaction.md +2 -2
  335. package/docs/docs.json +0 -4
  336. package/docs/environment-variables.md +3 -1
  337. package/docs/extensions.md +15 -5
  338. package/docs/json.md +2 -2
  339. package/docs/keybindings.md +1 -0
  340. package/docs/llama-cpp.md +8 -1
  341. package/docs/mcp.md +1 -1
  342. package/docs/models.md +5 -1
  343. package/docs/providers.md +33 -0
  344. package/docs/rpc.md +6 -3
  345. package/docs/session-format.md +1 -0
  346. package/docs/settings.md +5 -5
  347. package/docs/terminal-setup.md +14 -0
  348. package/docs/themes.md +4 -2
  349. package/docs/tui.md +1 -1
  350. package/docs/usage.md +7 -3
  351. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  352. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  353. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  354. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  355. package/examples/extensions/gondolin/package-lock.json +2 -2
  356. package/examples/extensions/gondolin/package.json +1 -1
  357. package/examples/extensions/overlay-test.ts +2 -2
  358. package/examples/extensions/plan-mode/index.ts +6 -2
  359. package/examples/extensions/sandbox/package-lock.json +2 -2
  360. package/examples/extensions/sandbox/package.json +1 -1
  361. package/examples/extensions/with-deps/package-lock.json +2 -2
  362. package/examples/extensions/with-deps/package.json +1 -1
  363. package/npm-shrinkwrap.json +54 -102
  364. package/package.json +10 -20
  365. package/schemas/keybindings.schema.json +453 -0
  366. package/schemas/models.schema.json +1157 -0
  367. package/schemas/settings.schema.json +782 -0
  368. package/schemas/theme.schema.json +365 -0
  369. package/dist/bundle/chunks/anthropic-messages-YIOJIMVL.js +0 -6
  370. package/dist/bundle/chunks/chunk-57XI7YJH.js +0 -2
  371. package/dist/bundle/chunks/chunk-JI4WGISU.js +0 -2
  372. package/dist/bundle/chunks/chunk-TCQ4HHQD.js +0 -2
  373. package/dist/bundle/chunks/chunk-TXJO4AJ7.js +0 -11
  374. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-OWU5SM6J.js +0 -2
  375. package/dist/bundle/chunks/mistral-conversations-A2N5FSOV.js +0 -5
  376. package/dist/bundle/chunks/openai-codex-responses-Q6JHCWLE.js +0 -10
  377. package/dist/bundle/chunks/typesafe-system-one-KYKKNU3E.js +0 -2
  378. package/dist/extensions/web-search/auth.d.ts +0 -12
  379. package/dist/extensions/web-search/auth.d.ts.map +0 -1
  380. package/dist/extensions/web-search/auth.js +0 -90
  381. package/dist/extensions/web-search/auth.js.map +0 -1
  382. package/dist/extensions/web-search/constants.d.ts +0 -13
  383. package/dist/extensions/web-search/constants.d.ts.map +0 -1
  384. package/dist/extensions/web-search/constants.js +0 -26
  385. package/dist/extensions/web-search/constants.js.map +0 -1
  386. package/dist/extensions/web-search/execute.d.ts +0 -9
  387. package/dist/extensions/web-search/execute.d.ts.map +0 -1
  388. package/dist/extensions/web-search/execute.js +0 -96
  389. package/dist/extensions/web-search/execute.js.map +0 -1
  390. package/dist/extensions/web-search/format.d.ts +0 -21
  391. package/dist/extensions/web-search/format.d.ts.map +0 -1
  392. package/dist/extensions/web-search/format.js +0 -117
  393. package/dist/extensions/web-search/format.js.map +0 -1
  394. package/dist/extensions/web-search/index.d.ts +0 -6
  395. package/dist/extensions/web-search/index.d.ts.map +0 -1
  396. package/dist/extensions/web-search/index.js +0 -50
  397. package/dist/extensions/web-search/index.js.map +0 -1
  398. package/dist/extensions/web-search/providers/deepseek.d.ts +0 -13
  399. package/dist/extensions/web-search/providers/deepseek.d.ts.map +0 -1
  400. package/dist/extensions/web-search/providers/deepseek.js +0 -110
  401. package/dist/extensions/web-search/providers/deepseek.js.map +0 -1
  402. package/dist/extensions/web-search/providers/http.d.ts +0 -4
  403. package/dist/extensions/web-search/providers/http.d.ts.map +0 -1
  404. package/dist/extensions/web-search/providers/http.js +0 -42
  405. package/dist/extensions/web-search/providers/http.js.map +0 -1
  406. package/dist/extensions/web-search/providers/minimax.d.ts +0 -12
  407. package/dist/extensions/web-search/providers/minimax.d.ts.map +0 -1
  408. package/dist/extensions/web-search/providers/minimax.js +0 -61
  409. package/dist/extensions/web-search/providers/minimax.js.map +0 -1
  410. package/dist/extensions/web-search/render.d.ts +0 -15
  411. package/dist/extensions/web-search/render.d.ts.map +0 -1
  412. package/dist/extensions/web-search/render.js +0 -142
  413. package/dist/extensions/web-search/render.js.map +0 -1
  414. package/dist/extensions/web-search/results.d.ts +0 -35
  415. package/dist/extensions/web-search/results.d.ts.map +0 -1
  416. package/dist/extensions/web-search/results.js +0 -167
  417. package/dist/extensions/web-search/results.js.map +0 -1
  418. package/dist/extensions/web-search/schema.d.ts +0 -10
  419. package/dist/extensions/web-search/schema.d.ts.map +0 -1
  420. package/dist/extensions/web-search/schema.js +0 -36
  421. package/dist/extensions/web-search/schema.js.map +0 -1
  422. package/dist/extensions/web-search/types.d.ts +0 -51
  423. package/dist/extensions/web-search/types.d.ts.map +0 -1
  424. package/dist/extensions/web-search/types.js +0 -5
  425. package/dist/extensions/web-search/types.js.map +0 -1
  426. package/dist/modes/interactive/theme/theme-json.d.ts +0 -85
  427. package/dist/modes/interactive/theme/theme-json.d.ts.map +0 -1
  428. package/dist/modes/interactive/theme/theme-json.js +0 -132
  429. package/dist/modes/interactive/theme/theme-json.js.map +0 -1
  430. package/dist/modes/interactive/theme/theme-schema.json +0 -361
  431. package/docs/bundled/extensions/web-search.md +0 -46
  432. package/examples/plugins/pi-example-plugin/README.md +0 -38
  433. package/examples/plugins/pi-example-plugin/package.json +0 -10
  434. package/examples/plugins/pi-example-plugin/src/contract.ts +0 -13
  435. package/examples/plugins/pi-example-plugin/src/session.ts +0 -24
  436. package/examples/plugins/pi-example-plugin/src/tui.ts +0 -31
package/docs/docs.json CHANGED
@@ -80,10 +80,6 @@
80
80
  "title": "Statusline",
81
81
  "path": "bundled/extensions/statusline.md"
82
82
  },
83
- {
84
- "title": "Web Search",
85
- "path": "bundled/extensions/web-search.md"
86
- },
87
83
  {
88
84
  "title": "Bundled themes",
89
85
  "path": "bundled/themes.md"
@@ -86,9 +86,11 @@ These variables are read by Pi itself:
86
86
  | `PI_TELEMETRY` | Override optional provider attribution headers: `1`/`true`/`yes` or `0`/`false`/`no`. This does not disable version checks |
87
87
  | `PI_CACHE_RETENTION` | Set to `long` for extended provider prompt caching where supported |
88
88
  | `PI_SHARE_VIEWER_URL` | Override the base URL used by `/share` |
89
- | `PI_RADIUS_GATEWAY` | Override the Radius gateway origin used by `/bug` uploads and Radius relay connections |
89
+ | `PI_RADIUS_GATEWAY` | Override the Radius gateway origin used by `/bug` uploads |
90
90
  | `PI_HARDWARE_CURSOR` | Set to `1` to show the hardware cursor; see [Terminal setup](terminal-setup.md) |
91
+ | `PI_CLIPBOARD_OSC52` | Set to `1` to also send copied text to the terminal with OSC 52 after the local clipboard write, as Pi does over SSH. Use it when a remote client reaches Pi without SSH variables, such as a multiplexer attached from another machine or a remote IDE daemon |
91
92
  | `PI_HYPERLINKS` | Override OSC 8 hyperlink detection with `1`, `0`, or `auto` |
93
+ | `PI_PROGRAM_STATUS` | Override OSC 7501 program status detection: `1` always reports, `0` never reports; otherwise Pi reports only after the terminal confirms support. See [Terminal setup](terminal-setup.md#program-status) |
92
94
  | `PI_IMAGE_PROTOCOL` | Override inline image detection with `kitty`, `iterm2`, `none`, or `auto` |
93
95
  | `PI_TRUE_COLOR` | Override truecolor detection with `1`, `0`, or `auto` |
94
96
  | `PI_TUI_ESC_TIMEOUT` | How long to wait after a lone ESC before treating it as Escape, in milliseconds; defaults to `100` over SSH and `10` otherwise. Increase it if Alt-key input is misread as Escape |
@@ -555,6 +555,10 @@ pi.on("before_agent_start", async (event, ctx) => {
555
555
  // event.systemPrompt - current chained system prompt for this handler
556
556
  // (includes changes from earlier before_agent_start handlers)
557
557
  // event.systemPromptOptions - structured options used to build the system prompt
558
+ // event.messageType - what started the run: "user" (a prompt or
559
+ // pi.sendUserMessage(), with prompt and images) or "custom"
560
+ // (pi.sendMessage(..., { triggerTurn: true }), with the starting message and
561
+ // no prompt); a returned message is added to either kind of run
558
562
  // .customPrompt - exact prompt prefix from --system-prompt, SYSTEM.md, or custom templates
559
563
  // .forceSystemPrompt - optional exact replacement for the complete prompt
560
564
  // .selectedTools - tools currently active in the prompt
@@ -586,7 +590,7 @@ Inside `before_agent_start`, `event.systemPrompt` and `ctx.getSystemPrompt()` bo
586
590
 
587
591
  #### agent_start / agent_end / agent_before_settle / agent_settled
588
592
 
589
- `agent_start` fires when a low-level agent run begins. `agent_end` fires when that run ends, but Pi may still auto-retry, auto-compact and retry, or continue with queued follow-up messages. `agent_before_settle` is the final actionable boundary: it can append session entries and request one continuation. `agent_settled` is final and notification-only; use it for status integrations that need to know Pi will not continue running automatically.
593
+ `agent_start` fires when a low-level agent run begins. Pi counts as busy while a run starts, including the compaction check and `before_agent_start`, so messages sent meanwhile go into the starting run. `agent_end` fires when that run ends, but Pi may still auto-retry, auto-compact and retry, or continue with queued follow-up messages. `agent_before_settle` is the final actionable boundary: it can append session entries and request one continuation. `agent_settled` is final and notification-only; use it for status integrations that need to know Pi will not continue running automatically.
590
594
 
591
595
  ```typescript
592
596
  pi.on("agent_start", async (_event, ctx) => {});
@@ -610,7 +614,8 @@ pi.on("agent_before_settle", async (event, ctx) => {
610
614
  };
611
615
  });
612
616
 
613
- pi.on("agent_settled", async (_event, ctx) => {
617
+ pi.on("agent_settled", async (event, ctx) => {
618
+ // event.aborted is true when the run ended because it was aborted, for example with Escape.
614
619
  // ctx.isIdle() is true; runs requested here start after all settled handlers finish.
615
620
  });
616
621
  ```
@@ -731,6 +736,7 @@ pi.on("tool_execution_update", async (event, ctx) => {
731
736
 
732
737
  pi.on("tool_execution_end", async (event, ctx) => {
733
738
  // event.toolCallId, event.toolName, event.result, event.isError
739
+ // event.durationMs - execute() time in ms (monotonic); absent when the tool did not run
734
740
  });
735
741
  ```
736
742
 
@@ -2473,6 +2479,8 @@ pi.registerTool({
2473
2479
  - `lastComponent` - the previously returned component for that slot, if any
2474
2480
  - `invalidate()` - request a rerender of this tool row
2475
2481
  - `toolCallId`, `cwd`, `executionStarted`, `argsComplete`, `isPartial`, `expanded`, `showImages`, `isError`
2482
+ - `durationMs` - how long the tool's execution took, from the final result; `undefined` while it runs, when it did not run, or for results stored before durations were recorded
2483
+ - `outputPad` - horizontal padding from the `outputPad` setting; renderers with `renderShell: "self"` apply it themselves
2476
2484
  - `result` - the current partial or final result, if one has arrived
2477
2485
 
2478
2486
  Use `context.state` for cross-slot shared state. Keep slot-local caches on the returned component instance when you want to reuse and mutate the same component across renders.
@@ -3216,9 +3224,9 @@ A tool can run other tools with `ctx.executeTool(name, args, { signal, onUpdate
3216
3224
  - `deferred`: like `codemode`, but codemode tools do not list it; `tool_search` can find and activate it.
3217
3225
  - `hidden`: registered but unreachable. Re-register a tool with `exposure: "hidden"` to withdraw it, since tools cannot be unregistered.
3218
3226
 
3219
- `namespace: { name, description, instructions }` groups related tools, as MCP servers do. Codemode tools list a namespace under one heading with its `description`. `instructions` holds longer usage guidance; it is not listed, and codemode scripts read it with `describeNamespace(name)`.
3227
+ `namespace: { name, aliases, description, instructions }` groups related tools, as MCP servers do. Codemode tools list a namespace under one heading with its `description`. `instructions` holds longer usage guidance; it is not listed, and codemode scripts read it with `describeNamespace(name)`. `aliases` are other names scripts may look the namespace up by, for example the server name `docs` for `mcp__docs`; a name and the same name as a script identifier (`my-docs`, `my_docs`) match alike.
3220
3228
 
3221
- Registering a `direct` or `model-only` tool activates it; the other exposures are not activated on registration. The active set (`pi.getActiveTools()`, `pi.setActiveTools()`) is the set of tools declared to the model. `pi.getAllTools()` reports each tool's `exposure`, `namespace`, and `annotations`.
3229
+ Registering a `direct` or `model-only` tool activates it; the other exposures are not activated on registration. The active set (`pi.getActiveTools()`, `pi.setActiveTools()`) is the set of tools declared to the model. `pi.getAllTools()` reports each tool's `exposure`, `namespace`, `annotations`, and `reachesTools`.
3222
3230
 
3223
3231
  `annotations` are hints about what a tool does, with the meaning of MCP tool annotations: `readOnlyHint`, `destructiveHint`, `idempotentHint`, and `openWorldHint`. MCP tools carry the hints their server declares. Missing hints take the MCP defaults: a tool is not read-only, and may be destructive and reach an open world. The hints are not verified, but a permission extension can use them to decide which calls to confirm. This confirms the calls Codex asks approval for:
3224
3232
 
@@ -3234,7 +3242,9 @@ pi.on("tool_call", async (event, ctx) => {
3234
3242
  });
3235
3243
  ```
3236
3244
 
3237
- A tool that orchestrates other tools can adjust what the model sees while it is active with `prepareLoadout(loadout)`. It runs whenever the active tools change and receives the declared tools, the callable tools, and every registered tool with its exposure, namespace, and prompt guidelines. It returns replacement `descriptions` for declared tools (including its own) and `hiddenDeclarations`: active tools whose declarations requests leave out while they stay active and callable. The default system prompt leaves hidden tools out of its tool list and rules, and names no tool in the skills hint when the file reader is hidden, so the orchestrating tool should present their guidelines itself. `codemode` uses only this hook, `exposure`, and `ctx.executeTool()`, so another tool can implement the same behavior under a different name.
3245
+ A tool that orchestrates other tools can adjust what the model sees while it is active with `prepareLoadout(loadout)`. It runs whenever the active tools change and receives the declared tools, the callable tools, and every registered tool with its exposure, namespace, and prompt guidelines. It returns replacement `descriptions` for declared tools (including its own) and `hiddenDeclarations`: active tools whose declarations requests leave out while they stay active and callable. The default system prompt leaves hidden tools out of its tool list and rules, and names no tool in the skills hint when the file reader is hidden, so the orchestrating tool should present their guidelines itself. `codemode` uses only this hook, `exposure`, `reachesTools`, and `ctx.executeTool()`, so another tool can implement the same behavior under a different name.
3246
+
3247
+ A tool that reaches other tools declares which ones a call may reach with `reachesTools(input)`: `"all"`, or the words of the input that may name them, where a word refers to every tool or namespace whose name it contains. `codemode` returns `"all"` for scripts that search or list tools and the words of the script otherwise; `tool_search` always returns `"all"`. Extensions that register tools late use it from their `tool_call` handler to finish registering the tools a call needs before it runs, as the MCP extension does for servers that are still connecting. The MCP extension also activates `codemode` or `tool_search` for MCP tools only when the tool of that name declares `reachesTools`.
3238
3248
 
3239
3249
  ### Tool renderer resolution
3240
3250
 
package/docs/json.md CHANGED
@@ -32,7 +32,7 @@ Session events are defined by `AgentSessionEvent`:
32
32
  type AgentSessionEvent =
33
33
  | Exclude<AgentEvent, { type: "agent_end" }>
34
34
  | { type: "agent_end"; messages: AgentMessage[]; willRetry: boolean }
35
- | { type: "agent_settled" }
35
+ | { type: "agent_settled"; aborted: boolean }
36
36
  | { type: "queue_update"; steering: readonly string[]; followUp: readonly string[] }
37
37
  | { type: "compaction_start"; reason: "manual" | "threshold" | "overflow" }
38
38
  | { type: "entry_appended"; entry: SessionEntry }
@@ -68,7 +68,7 @@ type AgentEvent =
68
68
  // Tool execution
69
69
  | { type: "tool_execution_start"; toolCallId: string; toolName: string; args: any }
70
70
  | { type: "tool_execution_update"; toolCallId: string; toolName: string; args: any; partialResult: any }
71
- | { type: "tool_execution_end"; toolCallId: string; toolName: string; result: any; isError: boolean };
71
+ | { type: "tool_execution_end"; toolCallId: string; toolName: string; result: any; isError: boolean; durationMs?: number };
72
72
  ```
73
73
 
74
74
  ## Message Types
@@ -244,6 +244,7 @@ Create `~/.pi/agent/keybindings.json`:
244
244
 
245
245
  ```json
246
246
  {
247
+ "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/schemas/keybindings.schema.json",
247
248
  "tui.editor.historyPrevious": "ctrl+p",
248
249
  "tui.editor.historyNext": "ctrl+n",
249
250
  "tui.editor.deleteWordBackward": ["ctrl+w", "alt+backspace"]
package/docs/llama-cpp.md CHANGED
@@ -102,7 +102,14 @@ curl http://127.0.0.1:8080/models
102
102
 
103
103
  ## Classification
104
104
 
105
- Every model listed for chat is also listed as a classifier model with the same ID and the `llama-cpp-classify` API. Classifier models answer typed `choice`, `bool`, and `score` questions about JSON state, like TypeSafe's Jev models. The model reaches them from [`codemode`](usage.md#enable-codemode) scripts, and extensions through `ctx.modelRegistry.classify()`; see [Classifier models](models.md#use-classifier-models).
105
+ Classifier models answer typed `choice`, `bool`, and `score` questions about JSON state, like TypeSafe's Jev models. The model reaches them from [`codemode`](usage.md#enable-codemode) scripts, and extensions through `ctx.modelRegistry.classify()`; see [Classifier models](models.md#use-classifier-models). Pi lists llama.cpp models as classifiers in two ways:
106
+
107
+ - **Decision models** such as [Julia-1, Laya, Kev, lev, and OpenJev](https://huggingface.co/collections/ggml-org/decision-models-6abf80cca3c83f127060a769) answer natively through llama.cpp's `/v1/systemone` endpoint. They appear only as classifiers, with the `typesafe-system-one` API, and not in `/model`.
108
+ - **Chat models** are also listed as classifiers with the same ID and the `llama-cpp-classify` API, which reads answers from next-token probabilities as described below.
109
+
110
+ llama.cpp 0.6.0 and later report decision models in the router's model list: their `architecture.output_modalities` contains `decisions`. The router reads this from the GGUF metadata without loading the model, so Pi recognizes unloaded and sleeping decision models too. Older llama.cpp builds do not report it, and Pi lists their decision models as chat models.
111
+
112
+ ### Chat models as classifiers
106
113
 
107
114
  The model does not generate an answer. Each question becomes one chat prompt: the state, every question of the request, the state again, and then the question with its answers under single-token labels. Labels are letters for a choice (up to 62 options), `Yes`/`No` for a bool, and digits for a score (up to 10 levels). The second copy of the state is read with the questions in view, which improved accuracy on JevBench with small models. Pi reads the probabilities of the labels as the next token and normalizes them. A choice returns every option's probability and a confidence of `(n * peak - 1) / (n - 1)`; a score returns the expected level.
108
115
 
package/docs/mcp.md CHANGED
@@ -265,7 +265,7 @@ Changes to enabled state or exposure apply only to the current session. A file-c
265
265
 
266
266
  An installed extension that registers `/mcp`, such as `pi-mcp-adapter`, replaces the built-in MCP support for sessions. Pi then does not read `mcp.json` or connect its servers in a session, and `/mcp` belongs to the extension. Remove the extension to restore the built-in behavior. To disable built-in MCP support without a replacement, disable `mcp` under Built-in in `pi config`, set `"extensions": ["-builtin:mcp"]` in [settings](settings.md#resources), or pass `--no-mcp` to disable it for one run.
267
267
 
268
- An extension that registers `codemode` or `tool_search` similarly replaces the built-in tool with that name. Shell-level `pi mcp` commands always use the built-in implementation.
268
+ An extension that registers `codemode` or `tool_search` similarly replaces the built-in tool with that name. Pi activates the replacement for MCP servers, and waits for the servers its calls need, only when it declares [`reachesTools`](extensions.md#tool-exposure). Shell-level `pi mcp` commands always use the built-in implementation.
269
269
 
270
270
  ### Use MCP from the SDK
271
271
 
package/docs/models.md CHANGED
@@ -31,6 +31,7 @@ For local OpenAI-compatible servers such as Ollama, LM Studio, and vLLM, each mo
31
31
 
32
32
  ```json
33
33
  {
34
+ "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/schemas/models.schema.json",
34
35
  "providers": {
35
36
  "ollama": {
36
37
  "baseUrl": "http://localhost:11434/v1",
@@ -703,7 +704,7 @@ For `bedrock-converse-stream`, `compat.supportsStrictMode` controls Bedrock stri
703
704
 
704
705
  ## Use classifier models
705
706
 
706
- Classifier models do not chat. They answer typed questions about JSON state: pick one of several choices, answer yes or no, or give a score, each with probabilities. Pi includes TypeSafe's Jev model from these providers, and Cloudflare's Clef and Clef Flash models from Workers AI:
707
+ Classifier models do not chat. They answer typed questions about JSON state: pick one of several choices, answer yes or no, or give a score, each with probabilities. Pi includes TypeSafe's Jev model from these providers, Cloudflare's Clef and Clef Flash models from Workers AI, and OpenAI's GPT-6 Luna through the [Decisions API](https://developers.openai.com/api/docs/guides/decisions):
707
708
 
708
709
  | Provider | Model IDs | Authentication |
709
710
  |---|---|---|
@@ -712,9 +713,12 @@ Classifier models do not chat. They answer typed questions about JSON state: pic
712
713
  | `cloudflare-workers-ai` | `typesafe/jev`, `@cf/cloudflare/clef`, `@cf/cloudflare/clef-flash` | `CLOUDFLARE_API_KEY` and `CLOUDFLARE_ACCOUNT_ID` |
713
714
  | `vercel-ai-gateway` | `typesafe-ai/jev` | `AI_GATEWAY_API_KEY` |
714
715
  | `opencode` | `jev-1.13`, `jev-1.13-free` | `OPENCODE_API_KEY` |
716
+ | `openai` | `gpt-6-luna` | `OPENAI_API_KEY` |
715
717
 
716
718
  Chat models on a [llama.cpp router](llama-cpp.md#classification) are also listed as classifier models.
717
719
 
720
+ OpenAI's Decisions API needs an API key. Sign in with ChatGPT credentials do not work with it, so `gpt-6-luna` is not listed as available while `openai` is logged in through `/login`, even when `OPENAI_API_KEY` is set; log out of `openai` to use the key. GPT-6 Luna also judges images passed in `images` (see [Codemode](codemode.md#classify)); other classifier models return an error for them. The API rejects inputs above 922K tokens, but requests that run longer than about five seconds, currently above roughly 600K input tokens, fail with a gateway timeout.
721
+
718
722
  Classifier models do not appear in `/model`. The model reaches them through the [`codemode`](usage.md#enable-codemode) tool, which is off unless an MCP server turned it on. Enable it with `"defaultTools": ["+codemode"]` in [settings](settings.md#tools). Scripts then list classifier models with `models.getAvailableOfType("classifier")` and call `models.classify(model, { state, questions })`:
719
723
 
720
724
  ```js
package/docs/providers.md CHANGED
@@ -60,6 +60,22 @@ When the browser runs on another machine, select the copy code login method in `
60
60
  - On remote or headless machines (for example over SSH), paste the final redirect URL or authorization code into the login prompt when the browser cannot reach the loopback callback
61
61
  - `OPENROUTER_API_KEY` remains available through **Use an API key**
62
62
 
63
+ With a key, Pi lists only the OpenRouter chat models that key may use, with the key's context size, max output, and prices. These come from OpenRouter's `/models/user` endpoint and reflect guardrails and provider restrictions set in OpenRouter. Image and classifier models are not filtered.
64
+
65
+ Pi refreshes the list in the background at startup in interactive mode, when `/model` opens, after `/login`, and on `pi update --models`. The last list is saved and used offline and in `pi -p` and RPC mode. After switching keys outside `/login`, the previous key's list stays until the next refresh.
66
+
67
+ Regional endpoints filter models to their region. To use one, set the base URL in [`models.json`](models.md):
68
+
69
+ ```json
70
+ {
71
+ "providers": {
72
+ "openrouter": { "baseUrl": "https://us.openrouter.ai/api/v1" }
73
+ }
74
+ }
75
+ ```
76
+
77
+ If the base URL rejects the key at `/models/user` or does not have that endpoint, for example a proxy configured as the OpenRouter base URL, Pi lists every OpenRouter model.
78
+
63
79
  ### Radius
64
80
 
65
81
  Radius is a service by Earendil Works, the builders of upstream Pi. It provides an AI gateway with organization-level controls and analytics, and artifacts for sharing what you create with Pi. It is in early alpha; see [radius.earendil.com](https://radius.earendil.com).
@@ -222,6 +238,23 @@ The `auth.json` key for this provider is `azure`, renamed from `azure-openai-res
222
238
 
223
239
  The `azure` provider serves both Azure OpenAI Responses deployments and Azure AI Foundry Chat Completions deployments (for example `azure/deepseek-v4-pro`).
224
240
 
241
+ Pi sends the model ID as the deployment name. If a deployment has a different name, map it with `AZURE_OPENAI_DEPLOYMENT_NAME_MAP`.
242
+
243
+ To use a Foundry model that Pi does not include, add it under `azure` in [`models.json`](models.md#configure-a-compatible-endpoint) with `api: "openai-completions"`. Custom models require a `baseUrl`; `AZURE_OPENAI_BASE_URL` and `AZURE_OPENAI_RESOURCE_NAME` take priority over it when set:
244
+
245
+ ```json
246
+ {
247
+ "providers": {
248
+ "azure": {
249
+ "baseUrl": "https://your-resource.services.ai.azure.com",
250
+ "models": [
251
+ { "id": "your-deployment", "api": "openai-completions" }
252
+ ]
253
+ }
254
+ }
255
+ }
256
+ ```
257
+
225
258
  ### Amazon Bedrock
226
259
 
227
260
  Use `/login amazon-bedrock` to store a Bedrock API key, or configure one of the ambient AWS credential sources below:
package/docs/rpc.md CHANGED
@@ -941,8 +941,10 @@ Emitted when one low-level agent run completes. Contains all messages generated
941
941
 
942
942
  Emitted after the full session-level run settles. At this point Pi will not continue automatically through retry, compaction retry, or queued follow-up messages.
943
943
 
944
+ `aborted` is `true` when the run ended because it was aborted, for example with Escape.
945
+
944
946
  ```json
945
- {"type": "agent_settled"}
947
+ {"type": "agent_settled", "aborted": false}
946
948
  ```
947
949
 
948
950
  ### turn_start / turn_end
@@ -1083,11 +1085,12 @@ When complete:
1083
1085
  "content": [{"type": "text", "text": "total 48\n..."}],
1084
1086
  "details": {...}
1085
1087
  },
1086
- "isError": false
1088
+ "isError": false,
1089
+ "durationMs": 42
1087
1090
  }
1088
1091
  ```
1089
1092
 
1090
- Use `toolCallId` to correlate events. The `partialResult` shape is tool-defined; built-in bash snapshots can be rendered by replacement, while other tools may use a different shape.
1093
+ `durationMs` is how long the tool's `execute()` took, measured with a monotonic clock; it is absent when the tool did not run. Use `toolCallId` to correlate events. The `partialResult` shape is tool-defined; built-in bash snapshots can be rendered by replacement, while other tools may use a different shape.
1091
1094
 
1092
1095
  ### queue_update
1093
1096
 
@@ -125,6 +125,7 @@ interface AssistantMessage {
125
125
  responseModel?: string;
126
126
  responseId?: string;
127
127
  providerThinkingLevel?: string;
128
+ thinkingLevel?: ModelThinkingLevel;
128
129
  diagnostics?: AssistantMessageDiagnostic[];
129
130
  usage: Usage;
130
131
  stopReason: "pending" | "stop" | "length" | "toolUse" | "error" | "aborted" | "deferred";
package/docs/settings.md CHANGED
@@ -7,7 +7,7 @@ Pi uses JSON settings files with project settings overriding global settings. JS
7
7
  | `~/.pi/agent/settings.json` | Global (all projects) |
8
8
  | `.pi/settings.json` | Project (current directory) |
9
9
 
10
- Edit directly or use `/settings` for common options.
10
+ Edit directly or use `/settings` for common options. Add `"$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/schemas/settings.schema.json"` to `settings.json` for editor validation and completion.
11
11
 
12
12
  ## Project Trust
13
13
 
@@ -88,9 +88,9 @@ Selecting a model or thinking level with Enter changes only the current session.
88
88
  | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
89
89
  | `treeFilterMode` | string | `"default"` | Default filter for `/tree`: `"default"`, `"no-tools"`, `"user-only"`, `"labeled-only"`, `"all"` |
90
90
  | `editorPaddingX` | number | `0` | Horizontal padding for input editor (0-3) |
91
- | `outputPad` | number | `1` | Horizontal padding for user messages, assistant messages, and thinking (0 or 1) |
91
+ | `outputPad` | number | `1` | Horizontal padding for messages, `!` command output, and summary blocks, and for tool output that renders its own shell (0 or 1) |
92
92
  | `autocompleteMaxVisible` | number | `5` | Max visible items in autocomplete dropdown (3-20) |
93
- | `showHardwareCursor` | boolean | `false` | Show the terminal cursor while TUI positions it for IME support |
93
+ | `showHardwareCursor` | boolean | `false` | Use the terminal cursor instead of Pi's drawn cursor. Pi still positions it for IME support |
94
94
  | `tuiMode` | string | `"fullscreen"` | Interactive TUI mode: `"fullscreen"` or `"regular"`. Changes from `/settings` apply immediately; `--tui-mode` overrides this setting at startup |
95
95
  | `fullscreenExitOutput` | string | `"transcript"` | Fullscreen exit output: `"transcript"` prints the final transcript and resume hint, while `"resume-hint"` restores the previous screen and prints only the resume hint. Has no effect in regular TUI mode |
96
96
  | `fullscreenScrollbar` | string | `"auto"` | Fullscreen transcript scrollbar: `"auto"` shows it temporarily while scrolling, `"always"` reserves the rightmost column and keeps it visible, and `"hidden"` hides it. Has no effect in regular TUI mode |
@@ -440,9 +440,9 @@ A list of only `+name` and `-name` entries changes the inherited selection inste
440
440
 
441
441
  This replaces `bash` with `powershell` and enables `grep`: `["-bash", "+powershell", "+grep"]`. Project settings apply on top of user settings: a project list with only `+name` and `-name` entries changes the user's selection, and a project list with a plain name replaces it. In one list, plain names form the selection, and `+name` and `-name` then apply in order.
442
442
 
443
- `/reload` enables tools newly added to `defaultTools`. It does not disable tools removed from it or re-enable unchanged tools you turned off. `--tools`, `--no-tools`, and `--no-builtin-tools` override `defaultTools`, also on reload.
443
+ `/reload` enables tools newly added to `defaultTools`. It does not disable tools removed from it or re-enable unchanged tools you turned off. `--tools` with plain names, `--no-tools`, and `--no-builtin-tools` override `defaultTools`, also on reload.
444
444
 
445
- CLI tool options override this setting for one invocation; `--tools` does not accept `+name` or `-name`. See [Command Line](usage.md#tools).
445
+ CLI tool options override this setting for one invocation. `--tools` with only `+name` and `-name` entries changes the resolved `defaultTools` selection instead, for example `pi --tools +codemode`. On `/reload`, these entries apply to the reloaded setting too, so a tool removed with `-name` stays removed. See [Command Line](usage.md#tools).
446
446
 
447
447
  | Setting | Default | Meaning |
448
448
  |---|---|---|
@@ -175,3 +175,17 @@ The built-in terminal has limited escape sequence support. Shift+Enter cannot be
175
175
  If you want the hardware cursor visible, set `PI_HARDWARE_CURSOR=1` before running pi (disabled by default for compatibility).
176
176
 
177
177
  Consider using a dedicated terminal emulator for the best experience.
178
+
179
+ ## Program status
180
+
181
+ Pi reports its state with the [Program Status Protocol (OSC 7501)](https://www.superlogical.com/rex/docs/build/program-status), so terminals and agent dashboards can show whether it is working, waiting for you, done, or failed:
182
+
183
+ | State | When |
184
+ |---|---|
185
+ | `working` | An agent run or compaction is in progress. The message is the session name. |
186
+ | `blocked` | An extension dialog or login waits for you. The message is the dialog title. |
187
+ | `done` | A run finished. The message is the session name. |
188
+ | `error` | A run ended with an error that is not retried. The message is the first line of the error. |
189
+ | `idle` | Pi started, or you cancelled the run. |
190
+
191
+ Reports never contain prompts or model output. Pi sends them only after the terminal answers the protocol's support query; tmux and screen do not forward them. Set `PI_PROGRAM_STATUS=1` to send reports without asking, or `PI_PROGRAM_STATUS=0` to turn them off.
package/docs/themes.md CHANGED
@@ -69,7 +69,7 @@ vim ~/.pi/agent/themes/my-theme.json
69
69
 
70
70
  ```json
71
71
  {
72
- "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/src/modes/interactive/theme/theme-schema.json",
72
+ "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/schemas/theme.schema.json",
73
73
  "name": "my-theme",
74
74
  "vars": {
75
75
  "primary": "#00aaff",
@@ -143,7 +143,7 @@ vim ~/.pi/agent/themes/my-theme.json
143
143
 
144
144
  ```json
145
145
  {
146
- "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/src/modes/interactive/theme/theme-schema.json",
146
+ "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/schemas/theme.schema.json",
147
147
  "name": "my-theme",
148
148
  "vars": {
149
149
  "blue": "#0066cc",
@@ -165,6 +165,8 @@ vim ~/.pi/agent/themes/my-theme.json
165
165
 
166
166
  The `$schema` field enables editor auto-completion and validation.
167
167
 
168
+ Theme objects are strict: only documented top-level fields and color tokens are accepted. Define reusable custom colors under `vars`; custom keys under `colors` or `export` and additional top-level metadata are rejected.
169
+
168
170
  ## Color Tokens
169
171
 
170
172
  Every theme must define all 51 required color tokens. The optional tokens preserve compatibility with existing themes: `thinkingMax` falls back to `thinkingXhigh`, `scrollbarThumb` and `searchMatchBg` fall back to `selectedBg`, and `searchMatchText` falls back to `text`. Other search matches use `searchMatchText` on `searchMatchBg` with an underline; the current match reverses that foreground/background pair and uses bold text.
package/docs/tui.md CHANGED
@@ -51,7 +51,7 @@ class CursorCell implements Component, Focusable {
51
51
  }
52
52
  ```
53
53
 
54
- When a focused component has a `focused` property, TUI sets it and looks for `CURSOR_MARKER` in its rendered lines to position the hardware cursor. `Input` and `Editor` already implement this. An extension can query or change the injected TUI's hardware-cursor setting with `tui.getShowHardwareCursor()` and `tui.setShowHardwareCursor(enabled)`; changing it affects the whole application UI.
54
+ When a focused component has a `focused` property, TUI sets it and looks for `CURSOR_MARKER` in its rendered lines to position the hardware cursor. Wrap the cursor cell in `renderFakeCursor()` so the TUI draws it in reverse video, or hides it after `CURSOR_MARKER` when the hardware cursor is shown. `Input` and `Editor` already implement this. An extension can query or change the injected TUI's hardware-cursor setting with `tui.getShowHardwareCursor()` and `tui.setShowHardwareCursor(enabled)`; changing it affects the whole application UI.
55
55
 
56
56
  A container that owns an `Input` or `Editor` must forward both focus and input to its child. `Container` only groups and renders children; it does not route input for them.
57
57
 
package/docs/usage.md CHANGED
@@ -176,6 +176,8 @@ See [Pi Packages](packages.md) for package sources and security notes.
176
176
 
177
177
  `--mode` accepts only `text`, `json`, or `rpc`. A missing or invalid value is reported as an error and pi exits with a nonzero status instead of falling back to another mode.
178
178
 
179
+ Print mode writes errors to stderr. A final assistant response with an `error` or `aborted` stop reason exits nonzero; a response cut off at the model's output token limit (a `length` stop reason) still prints its partial text to stdout, warns on stderr, and also exits nonzero.
180
+
179
181
  In print mode, pi also reads piped stdin and merges it into the initial prompt:
180
182
 
181
183
  ```bash
@@ -209,13 +211,15 @@ cat README.md | pi -p "Summarize this text"
209
211
 
210
212
  | Option | Description |
211
213
  |--------|-------------|
212
- | `--tools <list>`, `-t <list>` | Allowlist specific built-in, extension, and custom tools; entries are names or `*` patterns, and MCP tools are kept unless an entry starts with `mcp__` |
214
+ | `--tools <list>`, `-t <list>` | Allowlist specific built-in, extension, and custom tools; entries are names or `*` patterns, and MCP tools are kept unless an entry starts with `mcp__`. A list of only `+name` and `-name` entries changes the default selection instead |
213
215
  | `--exclude-tools <list>`, `-xt <list>` | Disable tools by name or `*` pattern, MCP tools included |
214
216
  | `--no-builtin-tools`, `-nbt` | Disable built-in tools but keep extension/custom tools enabled |
215
217
  | `--no-tools`, `-nt` | Disable all tools, MCP tools included |
216
218
 
217
219
  Built-in tools: `read`, `bash`, `powershell` (Windows), `edit`, `write`, `grep`, `find`, `ls`.
218
220
 
221
+ Like `defaultTools`, `--tools` also accepts a list of only `+name` and `-name` entries, which adds tools to or removes them from the default selection: `pi --tools +codemode,-write` keeps the other default tools, enables `codemode`, and disables `write`. These entries take exact tool names, not `*` patterns; use `--exclude-tools` to disable tools by pattern. Plain names and `+name`/`-name` entries cannot be mixed. `/reload` enables tools newly added to `defaultTools`, but a tool removed with `-name` stays removed.
222
+
219
223
  `--tools` selects the tools declared to the model. It does not remove MCP tools, whose reach is set by their [exposure](mcp.md#control-tool-exposure): `pi --tools read,codemode` keeps every MCP tool callable from codemode scripts. An MCP tool that no entry names or matches is never declared directly, whatever its exposure; only `tool_search`, if listed, can load it. Once an entry starts with `mcp__`, `--tools` filters MCP tools too, so this keeps only the tools of the `radius` server:
220
224
 
221
225
  ```bash
@@ -336,10 +340,10 @@ To turn on `codemode` for every session, add it to the default tools in `~/.pi/a
336
340
  }
337
341
  ```
338
342
 
339
- This keeps `read`, `bash`, `edit`, and `write` and adds `codemode`. For one invocation, list every tool, since `--tools` replaces the selection:
343
+ This keeps `read`, `bash`, `edit`, and `write` and adds `codemode`. For one invocation, add it with `--tools`:
340
344
 
341
345
  ```sh
342
- pi --tools read,bash,edit,write,codemode
346
+ pi --tools +codemode
343
347
  ```
344
348
 
345
349
  Codemode is useful without MCP: scripts can run several tool calls in parallel, filter large output before it reaches the model, call classifier models such as TypeSafe's Jev through `models.classify()` (see [Classifier models](models.md#use-classifier-models)), and generate images through `models.generateImages()` (see [Image models](models.md#use-image-models)).
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "1.0.4",
3
+ "version": "1.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "1.0.4",
9
+ "version": "1.2.0",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "1.0.4",
4
+ "version": "1.2.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "1.0.4",
4
+ "version": "1.2.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
2
+ "$schema": "https://pi.dev/schemas/theme.schema.json",
3
3
  "name": "dynamic-resources",
4
4
  "vars": {
5
5
  "cyan": "#00d7ff",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "1.0.4",
3
+ "version": "1.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "1.0.4",
9
+ "version": "1.2.0",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "1.0.4",
4
+ "version": "1.2.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@earendil-works/pi-coding-agent";
12
- import { CURSOR_MARKER, type Focusable, matchesKey, visibleWidth } from "@earendil-works/pi-tui";
12
+ import { CURSOR_MARKER, type Focusable, matchesKey, renderFakeCursor, visibleWidth } from "@earendil-works/pi-tui";
13
13
 
14
14
  export default function (pi: ExtensionAPI) {
15
15
  pi.registerCommand("overlay-test", {
@@ -131,7 +131,7 @@ class OverlayTestComponent implements Focusable {
131
131
  const after = inputDisplay.slice(item.cursor + 1);
132
132
  // Emit hardware cursor marker for IME support when focused
133
133
  const marker = this.focused ? CURSOR_MARKER : "";
134
- inputDisplay = `${before}${marker}\x1b[7m${cursorChar}\x1b[27m${after}`;
134
+ inputDisplay = `${before}${marker}${renderFakeCursor(cursorChar)}${after}`;
135
135
  }
136
136
  content = `${prefix + label} ${inputDisplay}`;
137
137
  } else {
@@ -197,8 +197,12 @@ export default function planModeExtension(pi: ExtensionAPI): void {
197
197
  };
198
198
  });
199
199
 
200
- // Inject plan/execution context before agent starts
201
- pi.on("before_agent_start", async () => {
200
+ // Inject plan/execution context before a user prompt. Runs started by custom messages, such as
201
+ // background task notifications, skip it: the context from the last prompt is still in the
202
+ // conversation, and adding it again on every notification would only repeat it.
203
+ pi.on("before_agent_start", async (event) => {
204
+ if (event.messageType !== "user") return;
205
+
202
206
  if (planModeEnabled) {
203
207
  return {
204
208
  message: {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.0.4",
3
+ "version": "1.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.0.4",
9
+ "version": "1.2.0",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.0.4",
4
+ "version": "1.2.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "1.0.4",
3
+ "version": "1.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "1.0.4",
9
+ "version": "1.2.0",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "1.0.4",
4
+ "version": "1.2.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",