@astralyn/pi 0.85.1 → 0.85.3

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 (316) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/bundle/chunks/anthropic-messages-IHRRITCV.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +75 -0
  4. package/dist/bundle/chunks/azure-openai-responses-QXBIDYXO.js +2 -0
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +78 -0
  6. package/dist/bundle/chunks/chunk-37ATLPRE.js +2 -0
  7. package/dist/bundle/chunks/chunk-4L3WN2XY.js +2 -0
  8. package/dist/bundle/chunks/chunk-5B3S5DVL.js +4 -0
  9. package/dist/bundle/chunks/chunk-5FDOJRDS.js +2 -0
  10. package/dist/bundle/chunks/chunk-6CYCI3EJ.js +12 -0
  11. package/dist/bundle/chunks/chunk-7LO5Z4WE.js +2 -0
  12. package/dist/bundle/chunks/chunk-APKJ4JGA.js +2 -0
  13. package/dist/bundle/chunks/chunk-EDBLK2JQ.js +2 -0
  14. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +2 -0
  15. package/dist/bundle/chunks/chunk-JEIV47WR.js +2 -0
  16. package/dist/bundle/chunks/chunk-JSJPY26N.js +2 -0
  17. package/dist/bundle/chunks/chunk-KI6LC764.js +42 -0
  18. package/dist/bundle/chunks/chunk-LB4P77SH.js +1688 -0
  19. package/dist/bundle/chunks/chunk-NUHFSC37.js +25 -0
  20. package/dist/bundle/chunks/chunk-O36ZMA3U.js +2 -0
  21. package/dist/bundle/chunks/chunk-OWESLY5T.js +11 -0
  22. package/dist/bundle/chunks/chunk-RRBI7OUG.js +50 -0
  23. package/dist/bundle/chunks/chunk-S2DJQQI2.js +2 -0
  24. package/dist/bundle/chunks/chunk-UP6RLTHQ.js +2 -0
  25. package/dist/bundle/chunks/chunk-UUSTLCVC.js +2 -0
  26. package/dist/bundle/chunks/chunk-WWBSZG5V.js +2 -0
  27. package/dist/bundle/chunks/chunk-YZJWMPUI.js +2 -0
  28. package/dist/bundle/chunks/github-copilot.js +2 -0
  29. package/dist/bundle/chunks/google-generative-ai-NBOR3IQR.js +2 -0
  30. package/dist/bundle/chunks/google-vertex-VTHX3SUB.js +2 -0
  31. package/dist/bundle/chunks/https-proxy-agent-2VXB7436.js +13 -0
  32. package/dist/bundle/chunks/image-resize-worker.js +2 -0
  33. package/dist/bundle/chunks/kimi-coding.js +2 -0
  34. package/dist/bundle/chunks/mistral-conversations-NO4ANAA5.js +5 -0
  35. package/dist/bundle/chunks/multipart-parser-SQ6GDJL7.js +3 -0
  36. package/dist/bundle/chunks/node-7L5OTM6S.js +2 -0
  37. package/dist/bundle/chunks/node-G4XOIDPH.js +16 -0
  38. package/dist/bundle/chunks/openai-codex-responses-5S3T3HMA.js +10 -0
  39. package/dist/bundle/chunks/openai-codex.js +75 -0
  40. package/dist/bundle/chunks/openai-completions-CXRRTRWE.js +7 -0
  41. package/dist/bundle/chunks/openai-responses-CV3MH6VP.js +2 -0
  42. package/dist/bundle/chunks/openrouter-images-6XDE2CEW.js +2 -0
  43. package/dist/bundle/chunks/openrouter.js +75 -0
  44. package/dist/bundle/chunks/pi-messages-PE6B42TG.js +8 -0
  45. package/dist/bundle/chunks/radius.js +75 -0
  46. package/dist/bundle/chunks/src-UK77SYZE.js +4 -0
  47. package/dist/bundle/chunks/xai.js +2 -0
  48. package/dist/bundle/cli.js +3 -0
  49. package/dist/bundle/index.js +2 -0
  50. package/dist/bundle/rpc-entry.js +3 -0
  51. package/dist/cli.js +5 -2469
  52. package/dist/core/agent-session.d.ts.map +1 -1
  53. package/dist/core/agent-session.js +2 -6
  54. package/dist/core/agent-session.js.map +1 -1
  55. package/dist/core/background/history.d.ts.map +1 -1
  56. package/dist/core/background/history.js +6 -0
  57. package/dist/core/background/history.js.map +1 -1
  58. package/dist/core/background/presentation.d.ts.map +1 -1
  59. package/dist/core/background/presentation.js +41 -4
  60. package/dist/core/background/presentation.js.map +1 -1
  61. package/dist/core/background/service.d.ts +2 -2
  62. package/dist/core/background/service.d.ts.map +1 -1
  63. package/dist/core/background/service.js +38 -15
  64. package/dist/core/background/service.js.map +1 -1
  65. package/dist/core/background/types.d.ts +9 -0
  66. package/dist/core/background/types.d.ts.map +1 -1
  67. package/dist/core/background/types.js +4 -0
  68. package/dist/core/background/types.js.map +1 -1
  69. package/dist/core/compaction/compaction.d.ts +5 -12
  70. package/dist/core/compaction/compaction.d.ts.map +1 -1
  71. package/dist/core/compaction/compaction.js +11 -19
  72. package/dist/core/compaction/compaction.js.map +1 -1
  73. package/dist/core/compaction/settings.d.ts +27 -0
  74. package/dist/core/compaction/settings.d.ts.map +1 -0
  75. package/dist/core/compaction/settings.js +40 -0
  76. package/dist/core/compaction/settings.js.map +1 -0
  77. package/dist/core/extensions/index.d.ts +1 -1
  78. package/dist/core/extensions/index.d.ts.map +1 -1
  79. package/dist/core/extensions/index.js.map +1 -1
  80. package/dist/core/extensions/runner.d.ts +0 -1
  81. package/dist/core/extensions/runner.d.ts.map +1 -1
  82. package/dist/core/extensions/runner.js +0 -6
  83. package/dist/core/extensions/runner.js.map +1 -1
  84. package/dist/core/extensions/types.d.ts +0 -11
  85. package/dist/core/extensions/types.d.ts.map +1 -1
  86. package/dist/core/extensions/types.js.map +1 -1
  87. package/dist/core/keybindings.d.ts +15 -0
  88. package/dist/core/keybindings.d.ts.map +1 -1
  89. package/dist/core/keybindings.js +12 -0
  90. package/dist/core/keybindings.js.map +1 -1
  91. package/dist/core/model-config.d.ts +32 -10
  92. package/dist/core/model-config.d.ts.map +1 -1
  93. package/dist/core/model-config.js +38 -1
  94. package/dist/core/model-config.js.map +1 -1
  95. package/dist/core/model-runtime.d.ts +2 -0
  96. package/dist/core/model-runtime.d.ts.map +1 -1
  97. package/dist/core/model-runtime.js +4 -0
  98. package/dist/core/model-runtime.js.map +1 -1
  99. package/dist/core/settings-manager.d.ts +4 -7
  100. package/dist/core/settings-manager.d.ts.map +1 -1
  101. package/dist/core/settings-manager.js +7 -6
  102. package/dist/core/settings-manager.js.map +1 -1
  103. package/dist/core/tools/bash.d.ts +3 -9
  104. package/dist/core/tools/bash.d.ts.map +1 -1
  105. package/dist/core/tools/bash.js +3 -8
  106. package/dist/core/tools/bash.js.map +1 -1
  107. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  108. package/dist/core/tools/shell-execution.js +3 -1
  109. package/dist/core/tools/shell-execution.js.map +1 -1
  110. package/dist/extensions/background/manager.d.ts +8 -5
  111. package/dist/extensions/background/manager.d.ts.map +1 -1
  112. package/dist/extensions/background/manager.js +115 -39
  113. package/dist/extensions/background/manager.js.map +1 -1
  114. package/dist/extensions/background/task-view.d.ts +5 -0
  115. package/dist/extensions/background/task-view.d.ts.map +1 -1
  116. package/dist/extensions/background/task-view.js +4 -0
  117. package/dist/extensions/background/task-view.js.map +1 -1
  118. package/dist/extensions/btw/controller.d.ts +1 -1
  119. package/dist/extensions/btw/controller.d.ts.map +1 -1
  120. package/dist/extensions/btw/controller.js +4 -4
  121. package/dist/extensions/btw/controller.js.map +1 -1
  122. package/dist/extensions/btw/index.js +3 -3
  123. package/dist/extensions/btw/index.js.map +1 -1
  124. package/dist/extensions/index.js +2 -2
  125. package/dist/extensions/index.js.map +1 -1
  126. package/dist/extensions/provider/catalog.d.ts +57 -0
  127. package/dist/extensions/provider/catalog.d.ts.map +1 -0
  128. package/dist/extensions/provider/catalog.js +181 -0
  129. package/dist/extensions/provider/catalog.js.map +1 -0
  130. package/dist/extensions/provider/compat-fields.d.ts +25 -0
  131. package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
  132. package/dist/extensions/provider/compat-fields.js +148 -0
  133. package/dist/extensions/provider/compat-fields.js.map +1 -0
  134. package/dist/extensions/provider/configuration.d.ts +8 -0
  135. package/dist/extensions/provider/configuration.d.ts.map +1 -0
  136. package/dist/extensions/provider/configuration.js +21 -0
  137. package/dist/extensions/provider/configuration.js.map +1 -0
  138. package/dist/extensions/provider/connection.d.ts +14 -0
  139. package/dist/extensions/provider/connection.d.ts.map +1 -0
  140. package/dist/extensions/provider/connection.js +86 -0
  141. package/dist/extensions/provider/connection.js.map +1 -0
  142. package/dist/extensions/provider/constants.d.ts +38 -0
  143. package/dist/extensions/provider/constants.d.ts.map +1 -0
  144. package/dist/extensions/provider/constants.js +75 -0
  145. package/dist/extensions/provider/constants.js.map +1 -0
  146. package/dist/extensions/provider/index.d.ts +4 -0
  147. package/dist/extensions/provider/index.d.ts.map +1 -0
  148. package/dist/extensions/provider/index.js +65 -0
  149. package/dist/extensions/provider/index.js.map +1 -0
  150. package/dist/extensions/provider/probe.d.ts +34 -0
  151. package/dist/extensions/provider/probe.d.ts.map +1 -0
  152. package/dist/extensions/provider/probe.js +178 -0
  153. package/dist/extensions/provider/probe.js.map +1 -0
  154. package/dist/extensions/provider/refresh.d.ts +30 -0
  155. package/dist/extensions/provider/refresh.d.ts.map +1 -0
  156. package/dist/extensions/provider/refresh.js +66 -0
  157. package/dist/extensions/provider/refresh.js.map +1 -0
  158. package/dist/extensions/provider/store.d.ts +131 -0
  159. package/dist/extensions/provider/store.d.ts.map +1 -0
  160. package/dist/extensions/provider/store.js +503 -0
  161. package/dist/extensions/provider/store.js.map +1 -0
  162. package/dist/extensions/provider/ui/app.d.ts +25 -0
  163. package/dist/extensions/provider/ui/app.d.ts.map +1 -0
  164. package/dist/extensions/provider/ui/app.js +153 -0
  165. package/dist/extensions/provider/ui/app.js.map +1 -0
  166. package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
  167. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
  168. package/dist/extensions/provider/ui/builtin-data.js +315 -0
  169. package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
  170. package/dist/extensions/provider/ui/compat.d.ts +57 -0
  171. package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
  172. package/dist/extensions/provider/ui/compat.js +427 -0
  173. package/dist/extensions/provider/ui/compat.js.map +1 -0
  174. package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
  175. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
  176. package/dist/extensions/provider/ui/dialogs.js +89 -0
  177. package/dist/extensions/provider/ui/dialogs.js.map +1 -0
  178. package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
  179. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
  180. package/dist/extensions/provider/ui/dictionary.js +385 -0
  181. package/dist/extensions/provider/ui/dictionary.js.map +1 -0
  182. package/dist/extensions/provider/ui/editor.d.ts +91 -0
  183. package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
  184. package/dist/extensions/provider/ui/editor.js +667 -0
  185. package/dist/extensions/provider/ui/editor.js.map +1 -0
  186. package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
  187. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
  188. package/dist/extensions/provider/ui/fetch-models.js +320 -0
  189. package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
  190. package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
  191. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
  192. package/dist/extensions/provider/ui/model-fields.js +441 -0
  193. package/dist/extensions/provider/ui/model-fields.js.map +1 -0
  194. package/dist/extensions/provider/ui/model-options.d.ts +93 -0
  195. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
  196. package/dist/extensions/provider/ui/model-options.js +529 -0
  197. package/dist/extensions/provider/ui/model-options.js.map +1 -0
  198. package/dist/extensions/provider/ui/pane.d.ts +81 -0
  199. package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
  200. package/dist/extensions/provider/ui/pane.js +3 -0
  201. package/dist/extensions/provider/ui/pane.js.map +1 -0
  202. package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
  203. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
  204. package/dist/extensions/provider/ui/provider-fields.js +326 -0
  205. package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
  206. package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
  207. package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
  208. package/dist/extensions/provider/ui/provider-list.js +162 -0
  209. package/dist/extensions/provider/ui/provider-list.js.map +1 -0
  210. package/dist/extensions/provider/ui/session.d.ts +20 -0
  211. package/dist/extensions/provider/ui/session.d.ts.map +1 -0
  212. package/dist/extensions/provider/ui/session.js +52 -0
  213. package/dist/extensions/provider/ui/session.js.map +1 -0
  214. package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
  215. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
  216. package/dist/extensions/provider/ui/thinking-map.js +166 -0
  217. package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
  218. package/dist/extensions/provider/ui/value-row.d.ts +88 -0
  219. package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
  220. package/dist/extensions/provider/ui/value-row.js +158 -0
  221. package/dist/extensions/provider/ui/value-row.js.map +1 -0
  222. package/dist/extensions/statusline/index.js +2 -2
  223. package/dist/extensions/statusline/index.js.map +1 -1
  224. package/dist/extensions/subagent/index.d.ts.map +1 -1
  225. package/dist/extensions/subagent/index.js +4 -2
  226. package/dist/extensions/subagent/index.js.map +1 -1
  227. package/dist/extensions/subagent/resolve.d.ts +5 -0
  228. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  229. package/dist/extensions/subagent/resolve.js +15 -7
  230. package/dist/extensions/subagent/resolve.js.map +1 -1
  231. package/dist/extensions/subagent/schema.d.ts +2 -0
  232. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  233. package/dist/extensions/subagent/schema.js +1 -0
  234. package/dist/extensions/subagent/schema.js.map +1 -1
  235. package/dist/index.d.ts +1 -1
  236. package/dist/index.d.ts.map +1 -1
  237. package/dist/index.js.map +1 -1
  238. package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
  239. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/tool-execution.js +20 -2
  241. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  242. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  243. package/dist/modes/interactive/interactive-mode.js +6 -1
  244. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  245. package/dist/rpc-entry.js +10 -2469
  246. package/docs/bundled/README.md +1 -1
  247. package/docs/bundled/extensions/background.md +5 -5
  248. package/docs/bundled/extensions/provider.md +117 -0
  249. package/docs/bundled/extensions/statusline.md +1 -1
  250. package/docs/bundled/extensions/subagent.md +7 -3
  251. package/docs/compaction.md +16 -6
  252. package/docs/development.md +1 -1
  253. package/docs/docs.json +2 -2
  254. package/docs/extensions.md +0 -13
  255. package/docs/keybindings.md +3 -0
  256. package/docs/settings.md +11 -7
  257. package/npm-shrinkwrap.json +4 -4
  258. package/package.json +6 -5
  259. package/dist/extensions/router/constants.d.ts +0 -23
  260. package/dist/extensions/router/constants.d.ts.map +0 -1
  261. package/dist/extensions/router/constants.js +0 -30
  262. package/dist/extensions/router/constants.js.map +0 -1
  263. package/dist/extensions/router/dialog-host.d.ts +0 -60
  264. package/dist/extensions/router/dialog-host.d.ts.map +0 -1
  265. package/dist/extensions/router/dialog-host.js +0 -196
  266. package/dist/extensions/router/dialog-host.js.map +0 -1
  267. package/dist/extensions/router/dialog.d.ts +0 -45
  268. package/dist/extensions/router/dialog.d.ts.map +0 -1
  269. package/dist/extensions/router/dialog.js +0 -378
  270. package/dist/extensions/router/dialog.js.map +0 -1
  271. package/dist/extensions/router/identity.d.ts +0 -15
  272. package/dist/extensions/router/identity.d.ts.map +0 -1
  273. package/dist/extensions/router/identity.js +0 -173
  274. package/dist/extensions/router/identity.js.map +0 -1
  275. package/dist/extensions/router/index.d.ts +0 -15
  276. package/dist/extensions/router/index.d.ts.map +0 -1
  277. package/dist/extensions/router/index.js +0 -70
  278. package/dist/extensions/router/index.js.map +0 -1
  279. package/dist/extensions/router/presets.d.ts +0 -51
  280. package/dist/extensions/router/presets.d.ts.map +0 -1
  281. package/dist/extensions/router/presets.js +0 -108
  282. package/dist/extensions/router/presets.js.map +0 -1
  283. package/dist/extensions/router/probe.d.ts +0 -26
  284. package/dist/extensions/router/probe.d.ts.map +0 -1
  285. package/dist/extensions/router/probe.js +0 -216
  286. package/dist/extensions/router/probe.js.map +0 -1
  287. package/dist/extensions/router/register.d.ts +0 -12
  288. package/dist/extensions/router/register.d.ts.map +0 -1
  289. package/dist/extensions/router/register.js +0 -90
  290. package/dist/extensions/router/register.js.map +0 -1
  291. package/dist/extensions/router/state.d.ts +0 -20
  292. package/dist/extensions/router/state.d.ts.map +0 -1
  293. package/dist/extensions/router/state.js +0 -169
  294. package/dist/extensions/router/state.js.map +0 -1
  295. package/dist/extensions/router/store.d.ts +0 -12
  296. package/dist/extensions/router/store.d.ts.map +0 -1
  297. package/dist/extensions/router/store.js +0 -266
  298. package/dist/extensions/router/store.js.map +0 -1
  299. package/dist/extensions/router/stream.d.ts +0 -12
  300. package/dist/extensions/router/stream.d.ts.map +0 -1
  301. package/dist/extensions/router/stream.js +0 -233
  302. package/dist/extensions/router/stream.js.map +0 -1
  303. package/dist/extensions/router/transport.d.ts +0 -9
  304. package/dist/extensions/router/transport.d.ts.map +0 -1
  305. package/dist/extensions/router/transport.js +0 -81
  306. package/dist/extensions/router/transport.js.map +0 -1
  307. package/dist/extensions/router/types.d.ts +0 -39
  308. package/dist/extensions/router/types.d.ts.map +0 -1
  309. package/dist/extensions/router/types.js +0 -2
  310. package/dist/extensions/router/types.js.map +0 -1
  311. package/dist/extensions/router/ui.d.ts +0 -26
  312. package/dist/extensions/router/ui.d.ts.map +0 -1
  313. package/dist/extensions/router/ui.js +0 -897
  314. package/dist/extensions/router/ui.js.map +0 -1
  315. package/dist/image-resize-worker.js +0 -2
  316. package/docs/bundled/extensions/router.md +0 -197
@@ -13,7 +13,7 @@ These hidden built-ins use the same public Extension API available to external e
13
13
  | [BTW](extensions/btw.md) | `/btw [question]` | Ask temporary side questions with the current context while the main task continues |
14
14
  | [DeepWiki](extensions/deepwiki.md) | `deepwiki` | Query indexed public GitHub repository documentation |
15
15
  | [Question](extensions/question.md) | `question` | Ask structured questions through native interactive UI |
16
- | [Router](extensions/router.md) | `/router` | Configure and probe Codex-style routing endpoints |
16
+ | [Provider](extensions/provider.md) | `/provider` | Edit models.json providers: connection, API type, and models |
17
17
  | [Statusline](extensions/statusline.md) | Footer status | Show concise extension-managed activity state |
18
18
  | [Subagent](extensions/subagent.md) | `subagent`, `/agents` | Delegate bounded work to isolated child Pi sessions |
19
19
  | [Todo](extensions/todo.md) | `todo`, `/todos` | Track ordered multi-step work in a compact one-line widget |
@@ -68,12 +68,12 @@ The panel opens as a fullscreen overlay framed by horizontal rules, matching Pi'
68
68
 
69
69
  The list groups executions into **Running** (newest started first) and **Finished** (newest ended first). A row shows the shared status marker, the task label, and a right-aligned runtime or finish age; running rows animate the spinner on the one-second refresh. Ids, modes, and log paths live in the detail pane, not the list. Worker rows nest indented under their Subagent group. Status glyphs and colors come from the shared status-marker vocabulary — spinner/`›` running, `✓` completed, red `×` failed, yellow `×` timeout, yellow `○` cancelled/stopping/partial, muted `○` queued, `!` waiting on input — which transcript notifications, completion cards and Subagent results also use.
70
70
 
71
- **Running** also lists live foreground executions, tagged `fg`, so the currently running command or group can be watched or stopped. **Finished** holds backgrounded work only: a settled foreground execution already delivered its result inline in the transcript, so it leaves the panel and is counted in the title as `N foreground hidden`. A selected row is the exception — it never disappears mid-watch when its foreground execution settles, and leaves once the selection moves away.
71
+ **Running** also lists live foreground executions so the currently running command or group can be watched or stopped. **Finished** holds background shell tasks and all Subagent groups, including groups that ran in the foreground. Foreground rows carry an `fg` tag in either section. Settled foreground shell commands deliver inline in the transcript, leave the panel, and are counted in the title as `N foreground shells hidden`. A selected shell row is the exception — it never disappears mid-watch when its execution settles, and leaves once the selection moves away.
72
72
 
73
73
  The detail pane shows an aligned field table — status with mode and runtime, full execution id, highlighted command, directory, log path, and diagnostics — above a scrollable output region. Subagent groups list one compact line per worker — marker, label, status and task description — as an index into the worker rows; worker views render **Prompt** and **Outcome** as Markdown around a plain **Activity** section.
74
74
 
75
75
  - Bash rows and Subagent group/worker rows retain stable selection as status and ordering change.
76
- - Running foreground rows carry an `fg` tag; foreground/background mode is explicit in the detail status line.
76
+ - Foreground rows carry an `fg` tag; foreground/background mode is explicit in the detail status line.
77
77
  - Worker detail shows identity/profile, group, model and usage on separate rows that wrap rather than truncate, plus Prompt, Activity and Outcome from the public projection.
78
78
  - Opening a view does not reattach the parent wait. Closing it never kills execution.
79
79
  - Selected groups are pinned against history eviction until selection changes or the panel closes.
@@ -89,7 +89,7 @@ The detail pane shows an aligned field table — status with mode and runtime, f
89
89
  | Escape | Return from detail, then close |
90
90
  | Ctrl+B | Detach eligible foreground executions through the host |
91
91
 
92
- Preview positions are retained per row while the panel is open, including across focus changes, updates and resizes. Worker previews start at the top. Shell previews initially follow the tail; scrolling up switches to **browsing**, and only explicit downward scrolling to the bottom resumes **following**. Neither mode pauses execution. The range counter on the output divider describes the visible lines within the bounded preview, not the entire log. The detail table stays above the scrolling content; on very short terminals, status and diagnostics take priority.
92
+ Preview positions are retained per row while the panel is open, including across focus changes, updates and resizes. Worker previews start at the top. Shell previews initially follow the tail; scrolling up switches to **browsing**, which keeps that row's current bounded output snapshot while task status continues updating. Explicit downward scrolling to the bottom resumes **following** and reads the latest tail. Neither mode pauses execution. The range counter on the output divider describes the visible lines within the bounded preview, not the entire log. The detail table stays above the scrolling content; on very short terminals, status and diagnostics take priority.
93
93
 
94
94
  Controls follow `app.backgroundTasks.focusList`, `app.backgroundTasks.focusPreview`, `tui.select.*`, `app.backgroundTasks.kill`, and `app.backgroundTasks.detach`. List paging uses `tui.select.pageUp`/`pageDown`; preview paging uses `tui.editor.pageUp`/`pageDown`, so the two can be rebound independently. Theme colors are semantic. Only visible selected output is read, at most once per second and within a 128KB request budget (the service may impose a smaller bound), with at most 2,000 viewport lines. Settled output is read once. Unselected work continues collecting progress independently of the panel.
95
95
 
@@ -115,9 +115,9 @@ Interactive mode enables Background. Built-in print, JSON, and RPC modes and ord
115
115
 
116
116
  Managed shell output is collected continuously from startup, including before detach. Background shell output is capped at 20 MiB; crossing the cap fails and stops the command. Foreground output retains its existing uncapped log behavior: detaching a command already over the background budget stops it without deleting the prior bytes. No timeout is supplied by default, and a supplied timeout remains measured from command startup, in seconds, across detach.
117
117
 
118
- Managed logs are ephemeral: they are retained with the runtime record and cleaned up when that record is evicted or the runtime shuts down. Save needed output elsewhere before then. The core defaults to eight active managed executions, with bounded terminal history (32 records plus a separate bounded pending-notification allowance); pins temporarily defer history eviction, not runtime shutdown. These are service limits, not new user settings.
118
+ Managed logs are ephemeral: they are retained with the runtime record and cleaned up when that record is evicted or the runtime shuts down. Save needed output elsewhere before then. The core defaults to eight active managed executions and two independent terminal histories: 32 background shell tasks/Subagent groups, plus 32 foreground shell records. Each Subagent invocation counts as one group, whether it ran in the foreground or background. Foreground shell traffic can only evict older foreground shell records. Pending delivery, pins, active reads and cleanup use a separate allowance within the bounded total; pins temporarily defer history eviction, not runtime shutdown. These are service limits, not new user settings.
119
119
 
120
- Terminal snapshots persist as version-2 `background-task-result` custom entries, including the structured presentation projection; usage remains in independent version-1 `background-usage` entries. `/bg` restores only version-2 terminal history from the selected branch. Older result records are left in the session file and are not migrated or restored. This is observation only: live execution never resumes after restart, and restoration does not replay accounting or completion events. A saved log path is not a durable attachment. See [session format](../../session-format.md#background-records).
120
+ Terminal snapshots persist as version-2 `background-task-result` custom entries, including the structured presentation projection; usage remains in independent version-1 `background-usage` entries. `/bg` restores only version-2 terminal history from the selected branch, selecting the newest records independently for each history. Older result records are left in the session file and are not migrated or restored. This is observation only: live execution never resumes after restart, and restoration does not replay accounting or completion events. A saved log path is not a durable attachment. See [session format](../../session-format.md#background-records).
121
121
 
122
122
  Delivered history outside the selected branch can be released and restored on return, so it does not fill the new branch's history budget. Undelivered completions stay protected while their branch is hidden. Pending delivery, pins and active reads use a separate allowance within the total runtime retention cap; restoration respects the same cap.
123
123
 
@@ -0,0 +1,117 @@
1
+ # provider — visual models.json editor
2
+
3
+ Minimalist visual editor for the `providers` record of `models.json` (`~/.pi/agent/models.json`; respects `PI_CODING_AGENT_DIR`). The extension never registers runtime providers and stores no parallel configuration; Pi's native [models.json](../../models.md) mechanism remains the source of truth. See [Providers](../../providers.md) for credential setup and runtime resolution.
4
+
5
+ ## Usage
6
+
7
+ `/provider` requires interactive TUI mode. The provider list and the editor share the same fixed frame height, so opening a provider never resizes the dialog.
8
+
9
+ ```text
10
+ /provider Open the searchable provider list (+ Add Provider; a fruitless search prefills the new id)
11
+ /provider <id> Jump straight into a provider editor
12
+ ```
13
+
14
+ ## Editor layout and controls
15
+
16
+ `/provider` presents a two-pane editor:
17
+
18
+ - **Left column:** Navigation list containing API Auth, Fetch Models, the provider's configured models (display name → `id` → `"New Model"` draft fallback; at most one draft at a time), `+ Add Model`, and `Delete Provider`.
19
+ - **Right column:** Hosts the selected item's field pane and sub-pane stack.
20
+
21
+ Both columns keep independent selection and scroll positions. The frame height is fixed: instead of resizing, each column scrolls inside a fixed window with a `(n/N)` position indicator (the `/model` selector convention), and pinned rows such as filter inputs and error lines stay on screen. Exactly one accent `›` selection marker is shown at any time — the pane holding keyboard focus; unfocused panes keep their content readable without any selection marker.
22
+
23
+ Fixed fields keep their `Key: ` prefix while editing, and the selected key and value are highlighted together. Typing or pasting replaces the value; Enter opens the existing value for adjustment. Escape cancels that edit.
24
+
25
+ ### Key controls
26
+
27
+ | Key | Default | Action |
28
+ |---|---|---|
29
+ | `↑` / `↓` | `up` / `down` | Navigate rows (wraps at list boundaries) |
30
+ | `←` | `app.provider.switchPaneLeft` (`left`) | Focus the left navigation pane |
31
+ | `→` | `app.provider.switchPaneRight` (`right`) | Focus the right detail pane (never activates an action row) |
32
+ | `Enter` | `enter` | Tweak a value, enter a sub-pane, or activate the selected action row (Fetch Models, + Add Model, Delete Provider) |
33
+ | Printable typing | | Overwrite the highlighted text or numeric value |
34
+ | `Space` | `app.list.toggle` (`space`) | Toggle booleans and checklist items |
35
+ | `Ctrl+X` | `app.provider.removeEntry` (`ctrl+x`) | Remove the selected compat or dictionary entry |
36
+ | `Esc` | `escape` | Cancel the current edit, discard a model draft (confirming when it has fields), pop the sub-pane, or return to the provider list |
37
+
38
+ ## Provider configuration
39
+
40
+ ### API Auth
41
+
42
+ Configures the provider's connection in one page:
43
+
44
+ - **`baseUrl`**: Endpoint URL (for example, `http://localhost:11434/v1`). The expected shape depends on the API type: OpenAI-style APIs need the version path in the URL (`https://api.openai.com/v1`), while the Anthropic and Mistral clients append `/v1` themselves (`https://api.anthropic.com`). A hint line on the page states the convention for the selected API type.
45
+ - **`apiKey`**: Provider API key or credential expression. Literal keys are masked in the display (e.g. `••••••1234`), while environment variable references (`$VAR`) and command substitutions (`!command`) are displayed verbatim. Values are stored raw in `models.json`; variable and command references resolve dynamically at request time.
46
+ - **API Type**: Opens a single-select picker over Pi's supported API protocols. Common protocols are listed first:
47
+
48
+ 1. `openai-responses`
49
+ 2. `openai-completions`
50
+ 3. `anthropic-messages`
51
+ 4. `google-generative-ai`
52
+ 5. `azure-openai-responses`
53
+ 6. `openai-codex-responses`
54
+ 7. `mistral-conversations`
55
+ 8. `google-vertex`
56
+ 9. `bedrock-converse-stream`
57
+ 10. `pi-messages`
58
+
59
+ Custom `api` strings already present in `models.json` are preserved. The provider API type can be cleared when every model defines its own `api` (see Model-Specific API); on a built-in provider the catalog defaults apply.
60
+
61
+ - **Precedence hints**: When a higher-priority credential source is active (such as a saved token in `auth.json` or an environment variable), an informational notice indicates that the higher-priority source takes precedence over the `apiKey` row.
62
+
63
+ ## Model configuration
64
+
65
+ Selecting a model in the left column displays its editable fields in the right column:
66
+
67
+ - **`id`**: Model identifier (required, unique per provider). Renaming waits for a successful save before switching the editor to the new id; conflicts leave the original model selected.
68
+ - **`name`**: Human-readable display name. When unset, interfaces fall back to showing the `id`.
69
+ - **`reasoning`**: Boolean toggle (`true`, `false`, or unset).
70
+ - **`thinkingLevelMap`**: Sub-pane configuring mappings for all seven Pi thinking levels (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`). Each level supports three states:
71
+ - **String target:** Maps to a specific provider effort string.
72
+ - **Hidden (`null`):** Explicitly hides the thinking level from selection.
73
+ - **Inherit:** Removes the key, falling back to Pi's default level handling.
74
+ - **`input`**: Modality checkboxes for `text` and `image`. At least one input modality must remain selected.
75
+ - **`cost`**: Sub-pane for $/M-token rates (`input`, `output`, `cacheRead`, `cacheWrite`). Edits require a complete cost object (unspecified rates default to `0`). Existing custom cost `tiers` are preserved read-only.
76
+ - **`contextWindow`**: Positive integer total context token limit.
77
+ - **`maxTokens`**: Positive integer maximum generation token limit.
78
+ - **`compat`**: Sub-pane configuring flags consumed by the selected API implementation. Open dictionary fields (`chatTemplateKwargs` and `chatTemplateArgs`) allow arbitrary keys and Pi thinking variables, including `thinking.budget`. Nested JSON values use the core models.json validation rules. Pressing `Ctrl+X` removes an entry to restore inherited behavior.
79
+ - **Model-Specific API**: Sub-page for model-level `baseUrl` and API Type overrides. Rows display the inherited provider or built-in value dimmed; editing a value writes an override for this model only, and clearing it returns to inheritance.
80
+
81
+ The active session model and its provider cannot be deleted or renamed; switch models with `/model` first.
82
+
83
+ ## Fetch Models
84
+
85
+ For OpenAI-compatible APIs, discovery uses `GET {baseUrl}/models`. Anthropic Messages uses `{baseUrl}/v1/models`, without repeating an existing `/v1` suffix. The pane's idle action row shows the discovery URL; `Enter` starts the request. Without a `baseUrl`, the pane instead explains what to configure and discovery cannot start.
86
+
87
+ Accepted catalog shapes are `data[]`, `models[]`, or a bare array. Entries can provide `id` or `slug`, plus an optional `name`, `display_name`, or `displayName`. Discovery imports identifiers and labels; model capabilities remain explicit configuration or opt-in built-in data. Native Google catalog shapes are not supported.
88
+
89
+ - **Authentication:** Credentials resolve through Pi's canonical resolution chain. Header-only resolved authentication is supported, and the default scheme follows the API type. Unsaved connection changes block discovery. Raw `$VAR` or `!command` placeholders are never transmitted unresolved; discovery aborts if configured credentials cannot be resolved. Known resolved credentials are redacted from server errors.
90
+ - **Limits:** Discovery has a 10-second deadline including preparation and authentication waits. Responses are bounded to 4 MiB (error payloads are bounded to 4 KiB and displayed up to 400 characters). Catalogs are capped at 2,000 models. A response declaring `has_more` is marked partial; further pages are not fetched automatically.
91
+ - **Checklist import:** Discovered models appear in a searchable checklist. Models already configured in `models.json` are marked `Added` and cannot be checked. Confirming imports the checked models — or just the highlighted one when nothing is checked — as `{ id, name? }` records, saves immediately, and refreshes the provider runtime. `Esc` discards the results.
92
+
93
+ ## Use Built-in Data
94
+
95
+ The `Use Built-in Data` row in a model's field list provides field-level completion from Pi's built-in model catalog:
96
+
97
+ - **Matching:** Queries Pi's catalog using exact ID matches first, then normalized ID comparisons, then fuzzy search. Ties prefer entries sharing the model's effective API protocol. Up to 8 candidates are presented.
98
+ - **Preview:** Selecting a candidate displays a per-field comparison (`current → reference`). Applying verifies that the model and its effective API still match the preview. Existing cost tiers and unrelated nested compatibility entries are retained.
99
+ - **Default selections:** Unset scalar fields (`name`, `reasoning`, `input`, `contextWindow`, `maxTokens`) are pre-checked. Explicitly configured values remain unchecked. `thinkingLevelMap`, `compat`, and `cost` are always opt-in.
100
+ - **Safety boundaries:** Cross-API thinking maps and compat dictionaries are view-only and cannot be imported. Cost tiers from the reference are never imported. Identity and connection fields (`provider`, `id`, `api`, `baseUrl`, keys) are never altered. Pressing `Esc` discards the preview without applying changes.
101
+
102
+ ## Persistence and runtime refresh
103
+
104
+ - **Atomic locking:** Edits save immediately. Writes acquire a cross-process lock via `proper-lockfile`, write to a temporary file in the same directory, validate the candidate file with `ModelConfig`, and atomically rename it into place.
105
+ - **Backup:** The first write over an existing file creates a `.bak` copy of its content. Symlinked configuration files are edited at their resolved target without replacing the symlink.
106
+ - **Formatting:** Comments and custom indentation are normalized to two-space JSON on save. Unknown top-level and nested values are preserved.
107
+ - **Conflict resolution:** Every save re-reads the file under a cross-process lock and applies pending edits onto the freshest content, so unrelated external edits merge automatically and a same-field race resolves last-writer-wins. Edits targeting externally removed models simply miss, and the view resyncs onto the merged result after each save.
108
+ - **Runtime refresh:** An offline-scoped refresh (`allowNetwork: false`) synchronizes the runtime when `/provider` closes (or immediately following a Fetch Models import). Save errors and runtime refresh errors are reported independently.
109
+ - **Recovery:** Failed edits remain pending and retry automatically with the next save. Closing offers return, retry, or explicit discard. Fetch refreshes retain the changed-model information needed to update the active session model on close. Leaving a pane cancels its outstanding discovery and prevents late results from changing another page.
110
+ - **Overlay behavior:** Configuring a provider whose ID matches a Pi built-in provider overlays that catalog. Deleting the provider configuration unmasks the built-in models. Existing `modelOverrides` in `models.json` remain preserved and take precedence over fields edited here.
111
+
112
+ ## Migration from router
113
+
114
+ The `provider` extension replaces the retired `router` extension.
115
+
116
+ - Existing `~/.pi/agent/router.json` and `~/.pi/agent/router-client.json` files remain on disk unmigrated for manual reference.
117
+ - The previous Codex 0.153.4-pinned relay request profile is discontinued. Requests now follow Pi's native API implementations and standard `models.json` `compat` options.
@@ -32,7 +32,7 @@ CTX 2.1%/1.0M ↑13k ↓13k R440k CH99.4% $0.074
32
32
  **Left**
33
33
 
34
34
  - **Context:** used percentage plus context-window size. The percentage uses
35
- fixed semantic tiers: accent normally, warning above 70%, error above 90%.
35
+ fixed semantic tiers: accent normally, warning above 40%, error above 80%.
36
36
 
37
37
  **Right**
38
38
 
@@ -12,6 +12,7 @@ Every call supplies one ordered `tasks` array with 1–8 items and an optional t
12
12
  "tasks": [
13
13
  {
14
14
  "prompt": "Locate the provider retry implementation and report exact symbols.",
15
+ "description": "Find provider retry code",
15
16
  "agent": "explorer",
16
17
  "cwd": "src/core"
17
18
  }
@@ -24,9 +25,10 @@ Every call supplies one ordered `tasks` array with 1–8 items and an optional t
24
25
  Each item has:
25
26
 
26
27
  ```text
27
- prompt Required self-contained worker briefing
28
- agent? explorer or general; defaults to explorer
29
- cwd? Directory inside the parent working directory
28
+ prompt Required self-contained worker briefing
29
+ description? Short task label for the /bg list, live rows, and report headings; derived from the prompt when omitted
30
+ agent? explorer or general; defaults to explorer
31
+ cwd? Directory inside the parent working directory
30
32
  ```
31
33
 
32
34
  There is no separate single-task or parallel mode. One item launches one worker; multiple items launch concurrent workers. A session-scoped gate permits at most six active workers across all sibling `subagent` calls, so additional items wait for a slot. Results always follow input order, regardless of completion order.
@@ -94,6 +96,8 @@ Background support is enabled by interactive mode. Built-in print, JSON, and RPC
94
96
 
95
97
  After handoff, the transcript row is a settled submission snapshot, not a still-pending worker view. Use `/bg` for live group/worker progress and outcomes: wide terminals show list and detail side by side, narrow terminals enter detail from the list. Worker display numbers there are stable within the extension runtime; transcript ordinals below remain local input positions. Opening detail only observes work and does not make the parent wait again.
96
98
 
99
+ Completed groups remain in `/bg` under **Finished** whether they ran in the foreground or background; foreground groups keep an `fg` tag. Subagent groups share a bounded history with background shell tasks, separate from foreground shell logs, so ordinary shell commands cannot evict their reports. The same independent histories restore from the selected session branch after reload or restart.
100
+
97
101
  Pi's native tool chrome owns the aggregate `● Subagent` call marker and the dim continuation rail. The collapsed view is a compact flow containing one cell per task:
98
102
 
99
103
  ```text
@@ -26,10 +26,12 @@ Both use the same structured summary format and track file operations cumulative
26
26
  Auto-compaction triggers when:
27
27
 
28
28
  ```
29
- contextTokens > contextWindow - reserveTokens
29
+ contextTokens > contextWindow × triggerPercent / 100
30
30
  ```
31
31
 
32
- By default, `reserveTokens` is 16384 tokens (configurable in `~/.pi/agent/settings.json` or `<project-dir>/.pi/settings.json`). This leaves room for the LLM's response.
32
+ By default, `triggerPercent` is 85 (configurable in `~/.pi/agent/settings.json` or `<project-dir>/.pi/settings.json`, accepted range 20–95 with out-of-range values clamped): compaction starts once context usage passes 85% of the model's context window — e.g. ~850K tokens on a 1M window or ~170K on a 200K window. Non-finite SDK values fall back to 85. Retention and summary budgets also shrink for smaller windows or lower trigger percentages, as described below.
33
+
34
+ > **Distribution note:** upstream Pi triggers at `contextWindow − reserveTokens` (a fixed 16384-token reserve by default), which on large windows delays compaction until ~98% usage. This distribution replaces that setting with the proportional `triggerPercent`. A `reserveTokens` key left over in an existing settings file is ignored; it no longer has any effect.
33
35
 
34
36
  During a multi-turn agent run, Pi checks this threshold after tools finish and their results are appended, before starting the next assistant response. If the threshold is crossed, Pi compacts inside the same agent run and resumes with the summary and retained messages. It skips this between-turn check when the completed tool batch terminates the run and no queued message requires another response. Pi also checks the threshold before a new user prompt and after a low-level agent run ends.
35
37
 
@@ -39,12 +41,18 @@ You can also trigger manually with `/compact [instructions]`, where optional ins
39
41
 
40
42
  ### How It Works
41
43
 
42
- 1. **Find cut point**: Walk backwards from newest message, accumulating token estimates until `keepRecentTokens` (default 20k, configurable in `~/.pi/agent/settings.json` or `<project-dir>/.pi/settings.json`) is reached
44
+ 1. **Find cut point**: Walk backwards from newest message until the effective retention target is reached: `keepRecentTokens` (default 20k), capped at half the configured trigger's token budget
43
45
  2. **Extract messages**: Collect messages from the previous kept boundary (or session start) up to the cut point
44
46
  3. **Generate summary**: Call LLM to summarize with structured format, passing the previous summary as iterative context when present
45
47
  4. **Append entry**: Save `CompactionEntry` with summary and `firstKeptEntryId`
46
48
  5. **Rebuilds context**: Session rebuilds the context for the next request, using summary + messages from `firstKeptEntryId` onwards
47
49
 
50
+ For both automatic and manual compaction, the model's context window limits the recent-message target to half the trigger budget. The internal summary reserve is capped at one quarter of that budget, up to its existing 16384-token maximum. History summaries can use 80% of this reserve and split-turn prefix summaries can use 50%; each is also limited by the model's output cap. This leaves room below the trigger for summary framing and continued work instead of retaining the entire context at a low threshold. The configured settings are not rewritten.
51
+
52
+ For example, a 64K window with `triggerPercent: 20` triggers above 12.8K tokens. Its recent-message target is at most 6.4K, with output limits of 2560 tokens for a history summary and 1600 for a split-turn prefix summary. Default 200K and 1M windows keep the existing retention and summary budgets. These are budget targets, not hard bounds on retained content: whole messages and tool-call/result groups remain intact and can exceed the target.
53
+
54
+ SDK callers using `prepareCompaction()` directly should pass `model.contextWindow` as the third argument to apply the same retention cap. The two-argument form preserves the configured retention target when the window is unknown.
55
+
48
56
  ```
49
57
  Before compaction:
50
58
 
@@ -403,7 +411,7 @@ Configure compaction in `~/.pi/agent/settings.json` or `<project-dir>/.pi/settin
403
411
  {
404
412
  "compaction": {
405
413
  "enabled": true,
406
- "reserveTokens": 16384,
414
+ "triggerPercent": 85,
407
415
  "keepRecentTokens": 20000
408
416
  }
409
417
  }
@@ -412,7 +420,9 @@ Configure compaction in `~/.pi/agent/settings.json` or `<project-dir>/.pi/settin
412
420
  | Setting | Default | Description |
413
421
  |---------|---------|-------------|
414
422
  | `enabled` | `true` | Enable auto-compaction |
415
- | `reserveTokens` | `16384` | Tokens to reserve for LLM response |
416
- | `keepRecentTokens` | `20000` | Recent tokens to keep (not summarized) |
423
+ | `triggerPercent` | `85` | Percentage of the context window that triggers auto-compaction (clamped to 20–95) |
424
+ | `keepRecentTokens` | `20000` | Recent-message retention target, capped at half the trigger token budget when the model window is known |
417
425
 
418
426
  Disable auto-compaction with `"enabled": false`. You can still compact manually with `/compact`.
427
+
428
+ Upstream Pi's `compaction.reserveTokens` setting does not exist here and is ignored when present; the trigger is always the percentage above.
@@ -29,7 +29,7 @@ npm run test:isolated -- test/model-selector.test.ts
29
29
  npm run test:isolated -- test/model-selector.test.ts -t "configured save binding"
30
30
  ```
31
31
 
32
- The build emits the stable SDK and type declarations, then bundles the CLI, RPC entrypoint, and image-resize worker. Run the resulting CLI with `node dist/cli.js`. After deleting sources or changing build exclusions, run `npm run clean` before building.
32
+ The build emits the stable SDK and type declarations, then bundles the Node entrypoints with shared chunks and separately loaded OAuth, Bedrock, and image-worker modules under `dist/bundle/`. Run the resulting CLI with `node dist/bundle/cli.js`. After deleting sources or changing build exclusions, run `npm run clean` before building.
33
33
 
34
34
  Installed dependency versions are checked before npm builds/tests and repository checks. For a complete suite, omit the isolated runner's arguments:
35
35
 
package/docs/docs.json CHANGED
@@ -73,8 +73,8 @@
73
73
  "path": "bundled/extensions/question.md"
74
74
  },
75
75
  {
76
- "title": "Router",
77
- "path": "bundled/extensions/router.md"
76
+ "title": "Provider",
77
+ "path": "bundled/extensions/provider.md"
78
78
  },
79
79
  {
80
80
  "title": "Statusline",
@@ -1223,19 +1223,6 @@ ctx.compact({
1223
1223
  });
1224
1224
  ```
1225
1225
 
1226
- ### ctx.getShellSettings()
1227
-
1228
- Returns the session's shell settings (`shellPath`, `commandPrefix`) exactly as the built-in bash tool uses them. Returns `undefined` on hosts that do not provide shell settings; fall back to reading settings from disk if your extension must. Optional on `ExtensionContext` for the same reason.
1229
-
1230
- ```typescript
1231
- pi.on("session_start", (_event, ctx) => {
1232
- const shell = ctx.getShellSettings?.();
1233
- if (shell?.commandPrefix) {
1234
- // Commands spawned by this extension should honor the same prefix as bash.
1235
- }
1236
- });
1237
- ```
1238
-
1239
1226
  ### ctx.getSystemPrompt()
1240
1227
 
1241
1228
  Returns Pi's current system prompt string.
@@ -171,6 +171,9 @@ These actions apply while the [BTW panel](bundled/extensions/btw.md) is open and
171
171
  | `app.model.cycleForward` | `ctrl+p` | Cycle to next model |
172
172
  | `app.model.cycleBackward` | `shift+ctrl+p` (`alt+p` on Windows and WSL) | Cycle to previous model |
173
173
  | `app.models.save` | `ctrl+s` | Save the selected default model or scoped model configuration to settings |
174
+ | `app.provider.switchPaneLeft` | `left` | Focus the left pane in /provider |
175
+ | `app.provider.switchPaneRight` | `right` | Focus the right pane in /provider |
176
+ | `app.provider.removeEntry` | `ctrl+x` | Remove the selected compat or dictionary entry in /provider |
174
177
  | `app.thinking.cycle` | `shift+tab` | Cycle thinking level |
175
178
  | `app.thinking.save` | `ctrl+s` | Save current thinking level to settings |
176
179
  | `app.thinking.toggle` | `ctrl+t` | Collapse or expand thinking blocks |
package/docs/settings.md CHANGED
@@ -118,19 +118,23 @@ Version checks read the latest `@astralyn/pi` version from npm. Set `PI_SKIP_VER
118
118
  | Setting | Type | Default | Description |
119
119
  |---------|------|---------|-------------|
120
120
  | `compaction.enabled` | boolean | `true` | Enable auto-compaction |
121
- | `compaction.reserveTokens` | number | `16384` | Tokens reserved for LLM response |
122
- | `compaction.keepRecentTokens` | number | `20000` | Recent tokens to keep (not summarized) |
121
+ | `compaction.triggerPercent` | number | `85` | Percentage of the context window that triggers auto-compaction (clamped to 20–95) |
122
+ | `compaction.keepRecentTokens` | number | `20000` | Recent-message retention target, capped at half the trigger token budget |
123
123
 
124
124
  ```json
125
125
  {
126
126
  "compaction": {
127
127
  "enabled": true,
128
- "reserveTokens": 16384,
128
+ "triggerPercent": 85,
129
129
  "keepRecentTokens": 20000
130
130
  }
131
131
  }
132
132
  ```
133
133
 
134
+ Note: upstream Pi's `compaction.reserveTokens` setting is not supported and is ignored when present; the trigger is always `triggerPercent` (values outside 20–95 are clamped).
135
+
136
+ Retention and summary budgets shrink for small windows or low trigger percentages without changing the saved settings. Whole messages and tool-call/result groups can exceed the retention target. See [Compaction](compaction.md#how-it-works) for the budget rules and examples.
137
+
134
138
  ### Branch Summary
135
139
 
136
140
  | Setting | Type | Default | Description |
@@ -332,7 +336,7 @@ See [packages.md](packages.md) for package management details.
332
336
  "theme": "dark",
333
337
  "compaction": {
334
338
  "enabled": true,
335
- "reserveTokens": 16384,
339
+ "triggerPercent": 85,
336
340
  "keepRecentTokens": 20000
337
341
  },
338
342
  "retry": {
@@ -355,17 +359,17 @@ Project settings (`.pi/settings.json`) override global settings. Nested objects
355
359
  // ~/.pi/agent/settings.json (global)
356
360
  {
357
361
  "theme": "dark",
358
- "compaction": { "enabled": true, "reserveTokens": 16384 }
362
+ "compaction": { "enabled": true, "triggerPercent": 85 }
359
363
  }
360
364
 
361
365
  // .pi/settings.json (project)
362
366
  {
363
- "compaction": { "reserveTokens": 8192 }
367
+ "compaction": { "triggerPercent": 70 }
364
368
  }
365
369
 
366
370
  // Result
367
371
  {
368
372
  "theme": "dark",
369
- "compaction": { "enabled": true, "reserveTokens": 8192 }
373
+ "compaction": { "enabled": true, "triggerPercent": 70 }
370
374
  }
371
375
  ```
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@astralyn/pi",
3
- "version": "0.85.1",
3
+ "version": "0.85.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@astralyn/pi",
9
- "version": "0.85.1",
9
+ "version": "0.85.3",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
+ "@earendil-works/chord": "0.85.1",
12
13
  "@earendil-works/pi-agent-core": "0.85.1",
13
14
  "@earendil-works/pi-ai": "0.85.1",
14
15
  "@earendil-works/pi-tui": "0.85.1",
@@ -29,13 +30,12 @@
29
30
  "yaml": "2.9.0"
30
31
  },
31
32
  "bin": {
32
- "pi": "dist/cli.js"
33
+ "pi": "dist/bundle/cli.js"
33
34
  },
34
35
  "devDependencies": {
35
36
  "@anthropic-ai/sandbox-runtime": "0.0.26",
36
37
  "@anthropic-ai/sdk": "0.52.0",
37
38
  "@biomejs/biome": "2.3.5",
38
- "@earendil-works/chord": "0.85.1",
39
39
  "@earendil-works/pi-client": "0.85.1",
40
40
  "@earendil-works/pi-protocol": "0.85.1",
41
41
  "@earendil-works/pi-server": "0.85.1",
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@astralyn/pi",
3
- "version": "0.85.1",
3
+ "version": "0.85.3",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
7
7
  "configDir": ".pi"
8
8
  },
9
9
  "bin": {
10
- "pi": "dist/cli.js"
10
+ "pi": "dist/bundle/cli.js"
11
11
  },
12
12
  "main": "./dist/index.js",
13
13
  "types": "./dist/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "import": "./dist/index.js"
18
18
  },
19
19
  "./rpc-entry": {
20
- "import": "./dist/rpc-entry.js"
20
+ "import": "./dist/bundle/rpc-entry.js"
21
21
  },
22
22
  "./client": {
23
23
  "source": "./src/client/index.ts"
@@ -39,7 +39,8 @@
39
39
  "scripts": {
40
40
  "clean": "shx rm -rf dist",
41
41
  "prebuild": "npm run check:installed-deps",
42
- "build": "tsc -p tsconfig.build.json && npm run copy-assets && npm run build:bundle && shx chmod +x dist/cli.js dist/rpc-entry.js",
42
+ "build": "npm run build:unbundled && npm run build:bundle",
43
+ "build:unbundled": "tsc -p tsconfig.build.json && shx chmod +x dist/cli.js dist/rpc-entry.js && npm run copy-assets",
43
44
  "build:bundle": "node scripts/build-bundle.mjs",
44
45
  "copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/",
45
46
  "dev": "node scripts/run-source.mjs",
@@ -61,6 +62,7 @@
61
62
  "prepublishOnly": "npm run clean && npm run build"
62
63
  },
63
64
  "dependencies": {
65
+ "@earendil-works/chord": "0.85.1",
64
66
  "@earendil-works/pi-agent-core": "0.85.1",
65
67
  "@earendil-works/pi-ai": "0.85.1",
66
68
  "@earendil-works/pi-tui": "0.85.1",
@@ -87,7 +89,6 @@
87
89
  "@anthropic-ai/sandbox-runtime": "0.0.26",
88
90
  "@anthropic-ai/sdk": "0.52.0",
89
91
  "@biomejs/biome": "2.3.5",
90
- "@earendil-works/chord": "0.85.1",
91
92
  "@earendil-works/pi-client": "0.85.1",
92
93
  "@earendil-works/pi-protocol": "0.85.1",
93
94
  "@earendil-works/pi-server": "0.85.1",
@@ -1,23 +0,0 @@
1
- export declare const COMMAND_NAME = "router";
2
- export declare const COMMAND_DESCRIPTION = "Manage Codex-style API relays";
3
- /** Responses protocol identity; streaming is provider-owned. */
4
- export declare const ROUTER_API: "openai-responses";
5
- export declare const CONFIG_VERSION: 1;
6
- export declare const DEFAULTS: {
7
- readonly contextWindow: 272000;
8
- readonly maxTokens: 128000;
9
- readonly probeTimeoutMs: 10000;
10
- readonly probeBodyBytes: number;
11
- readonly probeMaxModels: 2000;
12
- readonly originator: "codex";
13
- };
14
- /** Thinking levels understood by Pi and the relay config format. */
15
- export declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
16
- export type ThinkingLevel = (typeof THINKING_LEVELS)[number];
17
- /** All editable Pi thinking levels. */
18
- export declare const ROUTER_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
19
- export declare const NO_UI_WARNING = "/router requires an interactive UI.";
20
- export declare function isValidRelayId(id: string): boolean;
21
- export declare function truncate(value: string, maxLength: number): string;
22
- export declare function formatError(error: unknown): string;
23
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,mBAAmB,kCAAkC,CAAC;AAEnE,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAG,kBAA2B,CAAC;AAEtD,eAAO,MAAM,cAAc,EAAG,CAAU,CAAC;AAEzC,eAAO,MAAM,QAAQ;;;;;;;CAOX,CAAC;AAEX,oEAAoE;AACpE,eAAO,MAAM,eAAe,sEAAuE,CAAC;AACpG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,uCAAuC;AACvC,eAAO,MAAM,sBAAsB,sEAAkB,CAAC;AAEtD,eAAO,MAAM,aAAa,wCAAwC,CAAC;AAEnE,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD"}
@@ -1,30 +0,0 @@
1
- export const COMMAND_NAME = "router";
2
- export const COMMAND_DESCRIPTION = "Manage Codex-style API relays";
3
- /** Responses protocol identity; streaming is provider-owned. */
4
- export const ROUTER_API = "openai-responses";
5
- export const CONFIG_VERSION = 1;
6
- export const DEFAULTS = {
7
- contextWindow: 272_000,
8
- maxTokens: 128_000,
9
- probeTimeoutMs: 10_000,
10
- probeBodyBytes: 4 * 1024 * 1024,
11
- probeMaxModels: 2_000,
12
- originator: "codex",
13
- };
14
- /** Thinking levels understood by Pi and the relay config format. */
15
- export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
16
- /** All editable Pi thinking levels. */
17
- export const ROUTER_THINKING_LEVELS = THINKING_LEVELS;
18
- export const NO_UI_WARNING = "/router requires an interactive UI.";
19
- export function isValidRelayId(id) {
20
- return Boolean(id) && !id.includes("/") && !/[\u0000-\u001f\u007f]/.test(id);
21
- }
22
- export function truncate(value, maxLength) {
23
- if (value.length <= maxLength)
24
- return value;
25
- return `${value.slice(0, Math.max(0, maxLength - 1))}…`;
26
- }
27
- export function formatError(error) {
28
- return error instanceof Error ? error.message : String(error);
29
- }
30
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/router/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;AAEnE,gEAAgE;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,kBAA2B,CAAC;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACvB,aAAa,EAAE,OAAO;IACtB,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAC/B,cAAc,EAAE,KAAK;IACrB,UAAU,EAAE,OAAO;CACV,CAAC;AAEX,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAGpG,uCAAuC;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,qCAAqC,CAAC;AAEnE,MAAM,UAAU,cAAc,CAAC,EAAU;IACxC,OAAO,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,SAAiB;IACxD,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["export const COMMAND_NAME = \"router\";\nexport const COMMAND_DESCRIPTION = \"Manage Codex-style API relays\";\n\n/** Responses protocol identity; streaming is provider-owned. */\nexport const ROUTER_API = \"openai-responses\" as const;\n\nexport const CONFIG_VERSION = 1 as const;\n\nexport const DEFAULTS = {\n\tcontextWindow: 272_000,\n\tmaxTokens: 128_000,\n\tprobeTimeoutMs: 10_000,\n\tprobeBodyBytes: 4 * 1024 * 1024,\n\tprobeMaxModels: 2_000,\n\toriginator: \"codex\",\n} as const;\n\n/** Thinking levels understood by Pi and the relay config format. */\nexport const THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nexport type ThinkingLevel = (typeof THINKING_LEVELS)[number];\n\n/** All editable Pi thinking levels. */\nexport const ROUTER_THINKING_LEVELS = THINKING_LEVELS;\n\nexport const NO_UI_WARNING = \"/router requires an interactive UI.\";\n\nexport function isValidRelayId(id: string): boolean {\n\treturn Boolean(id) && !id.includes(\"/\") && !/[\\u0000-\\u001f\\u007f]/.test(id);\n}\n\nexport function truncate(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) return value;\n\treturn `${value.slice(0, Math.max(0, maxLength - 1))}…`;\n}\n\nexport function formatError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"]}
@@ -1,60 +0,0 @@
1
- /** Extension-owned dialog host that keeps every /router TUI page in one modal lifecycle. */
2
- import { type Component, Container, type Focusable, type TUI } from "@earendil-works/pi-tui";
3
- import type { ExtensionCommandContext } from "../../core/extensions/types.ts";
4
- import type { KeybindingsManager } from "../../core/keybindings.ts";
5
- import type { Theme } from "../../modes/interactive/theme/theme.ts";
6
- export type RouterComponent = Component & {
7
- dispose?(): void;
8
- };
9
- export type RouterComponentFactory<T> = (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: T) => void) => RouterComponent | Promise<RouterComponent>;
10
- interface RouterDialogBase {
11
- input(title: string, placeholder?: string): Promise<string | undefined>;
12
- confirm(title: string, message: string): Promise<boolean>;
13
- }
14
- export interface RouterNativeDialogs extends RouterDialogBase {
15
- readonly kind: "native";
16
- select(title: string, options: string[]): Promise<string | undefined>;
17
- }
18
- export interface RouterTuiDialogs extends RouterDialogBase {
19
- readonly kind: "tui";
20
- show<T>(factory: RouterComponentFactory<T>): Promise<T>;
21
- }
22
- export type RouterDialogs = RouterNativeDialogs | RouterTuiDialogs;
23
- export declare class RouterTuiSessionClosedError extends Error {
24
- constructor();
25
- }
26
- export declare function createNativeRouterDialogs(ctx: ExtensionCommandContext): RouterNativeDialogs;
27
- /**
28
- * Persistent root mounted by one ctx.ui.custom() call. Child dialogs resolve
29
- * without closing this root, so async flow continuations can replace them
30
- * without exposing the main editor between pages.
31
- */
32
- export declare class RouterTuiSession extends Container implements Focusable, RouterTuiDialogs {
33
- readonly kind: "tui";
34
- private readonly tui;
35
- private readonly theme;
36
- private readonly keybindings;
37
- private readonly onTransitionClose;
38
- private activeScreen;
39
- private pendingReject;
40
- private transitionTimer;
41
- private acceptsInput;
42
- private closeRequested;
43
- private disposed;
44
- private _focused;
45
- constructor(tui: TUI, theme: Theme, keybindings: KeybindingsManager, onTransitionClose: () => void);
46
- get focused(): boolean;
47
- set focused(value: boolean);
48
- show<T>(factory: RouterComponentFactory<T>): Promise<T>;
49
- input(title: string, placeholder?: string): Promise<string | undefined>;
50
- confirm(title: string, message: string): Promise<boolean>;
51
- handleInput(data: string): void;
52
- dispose(): void;
53
- private beginTransition;
54
- private clearTransitionTimer;
55
- private setActiveScreen;
56
- private disposeActiveScreen;
57
- private disposeScreen;
58
- }
59
- export {};
60
- //# sourceMappingURL=dialog-host.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog-host.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/dialog-host.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAE5F,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,KAAK,SAAS,EAA6B,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACxH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAKpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG;IAAE,OAAO,CAAC,IAAI,IAAI,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,CACvC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KACrB,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAEhD,UAAU,gBAAgB;IACzB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC5D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAEnE,qBAAa,2BAA4B,SAAQ,KAAK;;CAKrD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,uBAAuB,GAAG,mBAAmB,CAO3F;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,SAAU,YAAW,SAAS,EAAE,gBAAgB;IACrF,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAE/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAC/C,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,IAAI;IAiBlG,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAKzB;IAED,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA8CvD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAOjE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAU/B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,aAAa;CASrB"}