pi-ui-extend 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/README.md +307 -0
  2. package/bin/pix.mjs +219 -0
  3. package/dist/app/app.d.ts +96 -0
  4. package/dist/app/app.js +871 -0
  5. package/dist/app/blink-controller.d.ts +23 -0
  6. package/dist/app/blink-controller.js +82 -0
  7. package/dist/app/cli.d.ts +8 -0
  8. package/dist/app/cli.js +83 -0
  9. package/dist/app/clipboard.d.ts +1 -0
  10. package/dist/app/clipboard.js +24 -0
  11. package/dist/app/command-controller.d.ts +18 -0
  12. package/dist/app/command-controller.js +58 -0
  13. package/dist/app/command-host.d.ts +44 -0
  14. package/dist/app/command-host.js +1 -0
  15. package/dist/app/command-model-actions.d.ts +12 -0
  16. package/dist/app/command-model-actions.js +176 -0
  17. package/dist/app/command-navigation-actions.d.ts +19 -0
  18. package/dist/app/command-navigation-actions.js +267 -0
  19. package/dist/app/command-registry.d.ts +32 -0
  20. package/dist/app/command-registry.js +225 -0
  21. package/dist/app/command-runtime.d.ts +5 -0
  22. package/dist/app/command-runtime.js +32 -0
  23. package/dist/app/command-session-actions.d.ts +20 -0
  24. package/dist/app/command-session-actions.js +295 -0
  25. package/dist/app/constants.d.ts +52 -0
  26. package/dist/app/constants.js +103 -0
  27. package/dist/app/conversation-entry-renderer.d.ts +21 -0
  28. package/dist/app/conversation-entry-renderer.js +81 -0
  29. package/dist/app/conversation-shell-renderer.d.ts +5 -0
  30. package/dist/app/conversation-shell-renderer.js +43 -0
  31. package/dist/app/conversation-tool-renderer.d.ts +16 -0
  32. package/dist/app/conversation-tool-renderer.js +216 -0
  33. package/dist/app/conversation-viewport.d.ts +55 -0
  34. package/dist/app/conversation-viewport.js +252 -0
  35. package/dist/app/dcp-stats.d.ts +2 -0
  36. package/dist/app/dcp-stats.js +116 -0
  37. package/dist/app/editor-layout-renderer.d.ts +31 -0
  38. package/dist/app/editor-layout-renderer.js +211 -0
  39. package/dist/app/editor-panels.d.ts +4 -0
  40. package/dist/app/editor-panels.js +130 -0
  41. package/dist/app/extension-actions-controller.d.ts +22 -0
  42. package/dist/app/extension-actions-controller.js +60 -0
  43. package/dist/app/extension-event-bus.d.ts +3 -0
  44. package/dist/app/extension-event-bus.js +23 -0
  45. package/dist/app/extension-ui-controller.d.ts +57 -0
  46. package/dist/app/extension-ui-controller.js +532 -0
  47. package/dist/app/file-link-opener.d.ts +2 -0
  48. package/dist/app/file-link-opener.js +66 -0
  49. package/dist/app/file-links.d.ts +10 -0
  50. package/dist/app/file-links.js +117 -0
  51. package/dist/app/guards.d.ts +3 -0
  52. package/dist/app/guards.js +9 -0
  53. package/dist/app/icons.d.ts +37 -0
  54. package/dist/app/icons.js +97 -0
  55. package/dist/app/id.d.ts +1 -0
  56. package/dist/app/id.js +4 -0
  57. package/dist/app/image-click-targets.d.ts +5 -0
  58. package/dist/app/image-click-targets.js +32 -0
  59. package/dist/app/image-opener.d.ts +2 -0
  60. package/dist/app/image-opener.js +64 -0
  61. package/dist/app/input-action-controller.d.ts +47 -0
  62. package/dist/app/input-action-controller.js +209 -0
  63. package/dist/app/input-controller.d.ts +60 -0
  64. package/dist/app/input-controller.js +425 -0
  65. package/dist/app/input-paste-handler.d.ts +27 -0
  66. package/dist/app/input-paste-handler.js +146 -0
  67. package/dist/app/menu-items-controller.d.ts +32 -0
  68. package/dist/app/menu-items-controller.js +182 -0
  69. package/dist/app/message-content.d.ts +8 -0
  70. package/dist/app/message-content.js +115 -0
  71. package/dist/app/model-ref.d.ts +13 -0
  72. package/dist/app/model-ref.js +50 -0
  73. package/dist/app/model-usage-controller.d.ts +35 -0
  74. package/dist/app/model-usage-controller.js +99 -0
  75. package/dist/app/model-usage-status.d.ts +125 -0
  76. package/dist/app/model-usage-status.js +749 -0
  77. package/dist/app/mouse-controller.d.ts +182 -0
  78. package/dist/app/mouse-controller.js +968 -0
  79. package/dist/app/native-modifiers.d.ts +3 -0
  80. package/dist/app/native-modifiers.js +60 -0
  81. package/dist/app/nerd-font-controller.d.ts +11 -0
  82. package/dist/app/nerd-font-controller.js +90 -0
  83. package/dist/app/popup-action-controller.d.ts +44 -0
  84. package/dist/app/popup-action-controller.js +278 -0
  85. package/dist/app/popup-menu-controller.d.ts +183 -0
  86. package/dist/app/popup-menu-controller.js +1070 -0
  87. package/dist/app/prompt-enhancer-controller.d.ts +40 -0
  88. package/dist/app/prompt-enhancer-controller.js +215 -0
  89. package/dist/app/queued-message-controller.d.ts +62 -0
  90. package/dist/app/queued-message-controller.js +377 -0
  91. package/dist/app/render-controller.d.ts +41 -0
  92. package/dist/app/render-controller.js +378 -0
  93. package/dist/app/render-text.d.ts +19 -0
  94. package/dist/app/render-text.js +67 -0
  95. package/dist/app/request-history.d.ts +23 -0
  96. package/dist/app/request-history.js +131 -0
  97. package/dist/app/runtime.d.ts +39 -0
  98. package/dist/app/runtime.js +195 -0
  99. package/dist/app/screen-selection.d.ts +6 -0
  100. package/dist/app/screen-selection.js +9 -0
  101. package/dist/app/screen-styler.d.ts +34 -0
  102. package/dist/app/screen-styler.js +168 -0
  103. package/dist/app/scroll-controller.d.ts +51 -0
  104. package/dist/app/scroll-controller.js +207 -0
  105. package/dist/app/session-event-controller.d.ts +69 -0
  106. package/dist/app/session-event-controller.js +338 -0
  107. package/dist/app/session-history.d.ts +23 -0
  108. package/dist/app/session-history.js +164 -0
  109. package/dist/app/session-lifecycle-controller.d.ts +55 -0
  110. package/dist/app/session-lifecycle-controller.js +116 -0
  111. package/dist/app/session-search.d.ts +24 -0
  112. package/dist/app/session-search.js +215 -0
  113. package/dist/app/shell-command.d.ts +27 -0
  114. package/dist/app/shell-command.js +176 -0
  115. package/dist/app/shell-controller.d.ts +28 -0
  116. package/dist/app/shell-controller.js +124 -0
  117. package/dist/app/slash-commands.d.ts +6 -0
  118. package/dist/app/slash-commands.js +75 -0
  119. package/dist/app/startup-checks.d.ts +8 -0
  120. package/dist/app/startup-checks.js +59 -0
  121. package/dist/app/startup-info.d.ts +3 -0
  122. package/dist/app/startup-info.js +176 -0
  123. package/dist/app/status-controller.d.ts +35 -0
  124. package/dist/app/status-controller.js +105 -0
  125. package/dist/app/status-line-renderer.d.ts +68 -0
  126. package/dist/app/status-line-renderer.js +453 -0
  127. package/dist/app/subagents-files.d.ts +10 -0
  128. package/dist/app/subagents-files.js +193 -0
  129. package/dist/app/subagents-model.d.ts +23 -0
  130. package/dist/app/subagents-model.js +224 -0
  131. package/dist/app/subagents-widget-controller.d.ts +43 -0
  132. package/dist/app/subagents-widget-controller.js +311 -0
  133. package/dist/app/tab-line-renderer.d.ts +26 -0
  134. package/dist/app/tab-line-renderer.js +222 -0
  135. package/dist/app/tabs-controller.d.ts +100 -0
  136. package/dist/app/tabs-controller.js +885 -0
  137. package/dist/app/terminal-controller.d.ts +40 -0
  138. package/dist/app/terminal-controller.js +135 -0
  139. package/dist/app/terminal-edit-shortcuts.d.ts +23 -0
  140. package/dist/app/terminal-edit-shortcuts.js +138 -0
  141. package/dist/app/terminal-output-buffer.d.ts +20 -0
  142. package/dist/app/terminal-output-buffer.js +52 -0
  143. package/dist/app/toast-controller.d.ts +13 -0
  144. package/dist/app/toast-controller.js +40 -0
  145. package/dist/app/toast-renderer.d.ts +9 -0
  146. package/dist/app/toast-renderer.js +79 -0
  147. package/dist/app/todo-model.d.ts +22 -0
  148. package/dist/app/todo-model.js +179 -0
  149. package/dist/app/todo-widget-controller.d.ts +21 -0
  150. package/dist/app/todo-widget-controller.js +59 -0
  151. package/dist/app/tool-block-renderer.d.ts +26 -0
  152. package/dist/app/tool-block-renderer.js +439 -0
  153. package/dist/app/types.d.ts +550 -0
  154. package/dist/app/types.js +1 -0
  155. package/dist/app/update.d.ts +36 -0
  156. package/dist/app/update.js +315 -0
  157. package/dist/app/voice-controller.d.ts +52 -0
  158. package/dist/app/voice-controller.js +600 -0
  159. package/dist/app/workspace-actions-controller.d.ts +40 -0
  160. package/dist/app/workspace-actions-controller.js +215 -0
  161. package/dist/app/workspace-undo.d.ts +44 -0
  162. package/dist/app/workspace-undo.js +215 -0
  163. package/dist/config.d.ts +62 -0
  164. package/dist/config.js +527 -0
  165. package/dist/context-progress-bar.d.ts +17 -0
  166. package/dist/context-progress-bar.js +48 -0
  167. package/dist/default-pix-config.d.ts +1 -0
  168. package/dist/default-pix-config.js +375 -0
  169. package/dist/fuzzy.d.ts +23 -0
  170. package/dist/fuzzy.js +165 -0
  171. package/dist/input-editor-files.d.ts +15 -0
  172. package/dist/input-editor-files.js +62 -0
  173. package/dist/input-editor.d.ts +186 -0
  174. package/dist/input-editor.js +835 -0
  175. package/dist/main.d.ts +1 -0
  176. package/dist/main.js +12 -0
  177. package/dist/markdown-format.d.ts +22 -0
  178. package/dist/markdown-format.js +542 -0
  179. package/dist/sdk.d.ts +3 -0
  180. package/dist/sdk.js +1 -0
  181. package/dist/syntax-highlight.d.ts +22 -0
  182. package/dist/syntax-highlight.js +528 -0
  183. package/dist/terminal-width.d.ts +6 -0
  184. package/dist/terminal-width.js +245 -0
  185. package/dist/theme.d.ts +56 -0
  186. package/dist/theme.js +118 -0
  187. package/dist/tool-renderers/apply-patch.d.ts +2 -0
  188. package/dist/tool-renderers/apply-patch.js +36 -0
  189. package/dist/tool-renderers/ast.d.ts +2 -0
  190. package/dist/tool-renderers/ast.js +5 -0
  191. package/dist/tool-renderers/compress.d.ts +2 -0
  192. package/dist/tool-renderers/compress.js +126 -0
  193. package/dist/tool-renderers/index.d.ts +3 -0
  194. package/dist/tool-renderers/index.js +44 -0
  195. package/dist/tool-renderers/question.d.ts +2 -0
  196. package/dist/tool-renderers/question.js +88 -0
  197. package/dist/tool-renderers/read.d.ts +2 -0
  198. package/dist/tool-renderers/read.js +36 -0
  199. package/dist/tool-renderers/repo.d.ts +2 -0
  200. package/dist/tool-renderers/repo.js +13 -0
  201. package/dist/tool-renderers/shell.d.ts +3 -0
  202. package/dist/tool-renderers/shell.js +27 -0
  203. package/dist/tool-renderers/skill.d.ts +2 -0
  204. package/dist/tool-renderers/skill.js +132 -0
  205. package/dist/tool-renderers/subagents.d.ts +2 -0
  206. package/dist/tool-renderers/subagents.js +51 -0
  207. package/dist/tool-renderers/todo.d.ts +2 -0
  208. package/dist/tool-renderers/todo.js +9 -0
  209. package/dist/tool-renderers/types.d.ts +42 -0
  210. package/dist/tool-renderers/types.js +1 -0
  211. package/dist/tool-renderers/utils.d.ts +31 -0
  212. package/dist/tool-renderers/utils.js +230 -0
  213. package/dist/tool-renderers/web.d.ts +3 -0
  214. package/dist/tool-renderers/web.js +9 -0
  215. package/dist/tool-renderers/write.d.ts +2 -0
  216. package/dist/tool-renderers/write.js +42 -0
  217. package/dist/ui.d.ts +56 -0
  218. package/dist/ui.js +94 -0
  219. package/docs/release.md +81 -0
  220. package/extensions/question/contract.ts +100 -0
  221. package/extensions/question/index.ts +34 -0
  222. package/extensions/question/render.ts +28 -0
  223. package/extensions/question/result.ts +86 -0
  224. package/extensions/question/tool-description.ts +11 -0
  225. package/extensions/question/tui.ts +629 -0
  226. package/extensions/question/types.ts +123 -0
  227. package/extensions/session-title/config.ts +169 -0
  228. package/extensions/session-title/index.ts +459 -0
  229. package/extensions/terminal-bell/index.ts +315 -0
  230. package/external/pi-tools-suite/README.md +242 -0
  231. package/external/pi-tools-suite/index.ts +1 -0
  232. package/external/pi-tools-suite/licenses/ollama-pi-web-search.MIT +21 -0
  233. package/external/pi-tools-suite/licenses/opencode-mystatus-MIT.txt +21 -0
  234. package/external/pi-tools-suite/package.json +53 -0
  235. package/external/pi-tools-suite/src/antigravity-auth/auth-store.ts +194 -0
  236. package/external/pi-tools-suite/src/antigravity-auth/commands.ts +80 -0
  237. package/external/pi-tools-suite/src/antigravity-auth/constants.ts +26 -0
  238. package/external/pi-tools-suite/src/antigravity-auth/headers.ts +20 -0
  239. package/external/pi-tools-suite/src/antigravity-auth/index.ts +104 -0
  240. package/external/pi-tools-suite/src/antigravity-auth/models.ts +86 -0
  241. package/external/pi-tools-suite/src/antigravity-auth/oauth.ts +305 -0
  242. package/external/pi-tools-suite/src/antigravity-auth/payload.ts +423 -0
  243. package/external/pi-tools-suite/src/antigravity-auth/status.ts +78 -0
  244. package/external/pi-tools-suite/src/antigravity-auth/stream.ts +302 -0
  245. package/external/pi-tools-suite/src/antigravity-auth/types.ts +113 -0
  246. package/external/pi-tools-suite/src/ast-grep/index.ts +6 -0
  247. package/external/pi-tools-suite/src/ast-grep/render.ts +70 -0
  248. package/external/pi-tools-suite/src/ast-grep/schema.ts +109 -0
  249. package/external/pi-tools-suite/src/ast-grep/tool.ts +345 -0
  250. package/external/pi-tools-suite/src/ast-grep/types.ts +55 -0
  251. package/external/pi-tools-suite/src/ast-grep/utils.ts +65 -0
  252. package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +222 -0
  253. package/external/pi-tools-suite/src/async-subagents/commands.ts +518 -0
  254. package/external/pi-tools-suite/src/async-subagents/constants.ts +11 -0
  255. package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +74 -0
  256. package/external/pi-tools-suite/src/async-subagents/core/attachment-bridge.ts +133 -0
  257. package/external/pi-tools-suite/src/async-subagents/core/cleanup.ts +66 -0
  258. package/external/pi-tools-suite/src/async-subagents/core/concurrency.ts +90 -0
  259. package/external/pi-tools-suite/src/async-subagents/core/config.ts +819 -0
  260. package/external/pi-tools-suite/src/async-subagents/core/log-limits.ts +166 -0
  261. package/external/pi-tools-suite/src/async-subagents/core/model-fallback.ts +133 -0
  262. package/external/pi-tools-suite/src/async-subagents/core/paths.ts +47 -0
  263. package/external/pi-tools-suite/src/async-subagents/core/pi-invocation.ts +35 -0
  264. package/external/pi-tools-suite/src/async-subagents/core/presets.ts +67 -0
  265. package/external/pi-tools-suite/src/async-subagents/core/process.ts +15 -0
  266. package/external/pi-tools-suite/src/async-subagents/core/prompt.ts +66 -0
  267. package/external/pi-tools-suite/src/async-subagents/core/registry.ts +224 -0
  268. package/external/pi-tools-suite/src/async-subagents/core/retry.ts +191 -0
  269. package/external/pi-tools-suite/src/async-subagents/core/routing.ts +259 -0
  270. package/external/pi-tools-suite/src/async-subagents/core/sessions.ts +138 -0
  271. package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +688 -0
  272. package/external/pi-tools-suite/src/async-subagents/core/state.ts +281 -0
  273. package/external/pi-tools-suite/src/async-subagents/core/stop.ts +131 -0
  274. package/external/pi-tools-suite/src/async-subagents/core/structured-result.ts +237 -0
  275. package/external/pi-tools-suite/src/async-subagents/core/tool-guard.ts +34 -0
  276. package/external/pi-tools-suite/src/async-subagents/core/types.ts +150 -0
  277. package/external/pi-tools-suite/src/async-subagents/core/ultrawork-auto.ts +184 -0
  278. package/external/pi-tools-suite/src/async-subagents/core/utils.ts +11 -0
  279. package/external/pi-tools-suite/src/async-subagents/format.ts +41 -0
  280. package/external/pi-tools-suite/src/async-subagents/index.ts +422 -0
  281. package/external/pi-tools-suite/src/async-subagents/lib.ts +88 -0
  282. package/external/pi-tools-suite/src/async-subagents/live.ts +10 -0
  283. package/external/pi-tools-suite/src/async-subagents/polling.ts +83 -0
  284. package/external/pi-tools-suite/src/async-subagents/render.ts +230 -0
  285. package/external/pi-tools-suite/src/async-subagents/subagent-overlay.ts +77 -0
  286. package/external/pi-tools-suite/src/async-subagents/tasks.ts +120 -0
  287. package/external/pi-tools-suite/src/async-subagents/tools/cleanup.ts +99 -0
  288. package/external/pi-tools-suite/src/async-subagents/tools/result.ts +179 -0
  289. package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +372 -0
  290. package/external/pi-tools-suite/src/async-subagents/tools/status.ts +60 -0
  291. package/external/pi-tools-suite/src/async-subagents/tools/stop.ts +79 -0
  292. package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +152 -0
  293. package/external/pi-tools-suite/src/async-subagents/tools/wait.ts +67 -0
  294. package/external/pi-tools-suite/src/async-subagents/types.ts +45 -0
  295. package/external/pi-tools-suite/src/async-subagents/ui.ts +5 -0
  296. package/external/pi-tools-suite/src/compress/commands.ts +440 -0
  297. package/external/pi-tools-suite/src/compress/compress-tool.ts +368 -0
  298. package/external/pi-tools-suite/src/compress/compression-blocks.ts +524 -0
  299. package/external/pi-tools-suite/src/compress/config.ts +310 -0
  300. package/external/pi-tools-suite/src/compress/dcp-tui-filter.ts +498 -0
  301. package/external/pi-tools-suite/src/compress/index.ts +397 -0
  302. package/external/pi-tools-suite/src/compress/prompts.ts +269 -0
  303. package/external/pi-tools-suite/src/compress/pruner-candidates.ts +176 -0
  304. package/external/pi-tools-suite/src/compress/pruner-compression-blocks.ts +260 -0
  305. package/external/pi-tools-suite/src/compress/pruner-message-ids.ts +147 -0
  306. package/external/pi-tools-suite/src/compress/pruner-metadata.ts +268 -0
  307. package/external/pi-tools-suite/src/compress/pruner-nudge.ts +315 -0
  308. package/external/pi-tools-suite/src/compress/pruner-tools.ts +263 -0
  309. package/external/pi-tools-suite/src/compress/pruner-types.ts +25 -0
  310. package/external/pi-tools-suite/src/compress/pruner.ts +92 -0
  311. package/external/pi-tools-suite/src/compress/state.ts +486 -0
  312. package/external/pi-tools-suite/src/compress/ui.ts +308 -0
  313. package/external/pi-tools-suite/src/config.ts +176 -0
  314. package/external/pi-tools-suite/src/context-usage.ts +31 -0
  315. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +355 -0
  316. package/external/pi-tools-suite/src/index.ts +46 -0
  317. package/external/pi-tools-suite/src/lib/lsp.ts +62 -0
  318. package/external/pi-tools-suite/src/lib/project.ts +42 -0
  319. package/external/pi-tools-suite/src/lib/tool-args.ts +137 -0
  320. package/external/pi-tools-suite/src/lsp/_shared/config.ts +156 -0
  321. package/external/pi-tools-suite/src/lsp/_shared/glob.ts +60 -0
  322. package/external/pi-tools-suite/src/lsp/_shared/output.ts +102 -0
  323. package/external/pi-tools-suite/src/lsp/_shared/paths.ts +138 -0
  324. package/external/pi-tools-suite/src/lsp/_shared/runner.ts +64 -0
  325. package/external/pi-tools-suite/src/lsp/_shared/template.ts +23 -0
  326. package/external/pi-tools-suite/src/lsp/_shared/trust.ts +116 -0
  327. package/external/pi-tools-suite/src/lsp/_shared/types.ts +98 -0
  328. package/external/pi-tools-suite/src/lsp/async.ts +29 -0
  329. package/external/pi-tools-suite/src/lsp/child-process.ts +81 -0
  330. package/external/pi-tools-suite/src/lsp/client.ts +340 -0
  331. package/external/pi-tools-suite/src/lsp/constants.ts +9 -0
  332. package/external/pi-tools-suite/src/lsp/diagnostics-store.ts +64 -0
  333. package/external/pi-tools-suite/src/lsp/documents.ts +24 -0
  334. package/external/pi-tools-suite/src/lsp/index.ts +31 -0
  335. package/external/pi-tools-suite/src/lsp/lsp-utils.ts +37 -0
  336. package/external/pi-tools-suite/src/lsp/manager.ts +190 -0
  337. package/external/pi-tools-suite/src/lsp/mutation-events.ts +78 -0
  338. package/external/pi-tools-suite/src/lsp/renderer.ts +1 -0
  339. package/external/pi-tools-suite/src/lsp/tool-result.ts +6 -0
  340. package/external/pi-tools-suite/src/lsp/tsserver.ts +107 -0
  341. package/external/pi-tools-suite/src/lsp/types.ts +15 -0
  342. package/external/pi-tools-suite/src/model-tools/apply-patch.ts +590 -0
  343. package/external/pi-tools-suite/src/model-tools/index.ts +430 -0
  344. package/external/pi-tools-suite/src/model-tools/path-utils.ts +6 -0
  345. package/external/pi-tools-suite/src/model-tools/tool-args.ts +11 -0
  346. package/external/pi-tools-suite/src/prompt-commands/index.ts +349 -0
  347. package/external/pi-tools-suite/src/repo-discovery/index.ts +384 -0
  348. package/external/pi-tools-suite/src/repo-discovery/project.ts +7 -0
  349. package/external/pi-tools-suite/src/startup-section.ts +13 -0
  350. package/external/pi-tools-suite/src/terminal-bell/index.ts +309 -0
  351. package/external/pi-tools-suite/src/todo/index.ts +201 -0
  352. package/external/pi-tools-suite/src/todo/state/auto-clear.ts +13 -0
  353. package/external/pi-tools-suite/src/todo/state/invariants.ts +21 -0
  354. package/external/pi-tools-suite/src/todo/state/persistence.ts +94 -0
  355. package/external/pi-tools-suite/src/todo/state/replay.ts +38 -0
  356. package/external/pi-tools-suite/src/todo/state/selectors.ts +49 -0
  357. package/external/pi-tools-suite/src/todo/state/state-reducer.ts +362 -0
  358. package/external/pi-tools-suite/src/todo/state/state.ts +18 -0
  359. package/external/pi-tools-suite/src/todo/state/store.ts +52 -0
  360. package/external/pi-tools-suite/src/todo/state/task-graph.ts +57 -0
  361. package/external/pi-tools-suite/src/todo/todo.ts +487 -0
  362. package/external/pi-tools-suite/src/todo/tool/response-envelope.ts +143 -0
  363. package/external/pi-tools-suite/src/todo/tool/types.ts +188 -0
  364. package/external/pi-tools-suite/src/todo/view/format.ts +18 -0
  365. package/external/pi-tools-suite/src/todo/view/labels.ts +13 -0
  366. package/external/pi-tools-suite/src/tool-descriptions.ts +369 -0
  367. package/external/pi-tools-suite/src/usage/index.ts +152 -0
  368. package/external/pi-tools-suite/src/usage/lib/copilot.ts +535 -0
  369. package/external/pi-tools-suite/src/usage/lib/google.ts +478 -0
  370. package/external/pi-tools-suite/src/usage/lib/openai.ts +268 -0
  371. package/external/pi-tools-suite/src/usage/lib/types.ts +114 -0
  372. package/external/pi-tools-suite/src/usage/lib/utils.ts +134 -0
  373. package/external/pi-tools-suite/src/usage/lib/zhipu.ts +228 -0
  374. package/external/pi-tools-suite/src/web-search/index.ts +397 -0
  375. package/package.json +89 -0
  376. package/skills/context7/SKILL.md +69 -0
  377. package/skills/context7/scripts/context7.sh +73 -0
  378. package/skills/handoff/SKILL.md +15 -0
  379. package/skills/pdf/LICENSE.txt +30 -0
  380. package/skills/pdf/SKILL.md +314 -0
  381. package/skills/pdf/forms.md +294 -0
  382. package/skills/pdf/reference.md +612 -0
  383. package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  384. package/skills/pdf/scripts/check_fillable_fields.py +11 -0
  385. package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  386. package/skills/pdf/scripts/create_validation_image.py +37 -0
  387. package/skills/pdf/scripts/extract_form_field_info.py +122 -0
  388. package/skills/pdf/scripts/extract_form_structure.py +115 -0
  389. package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  390. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  391. package/skills/playwright-cli/SKILL.md +388 -0
  392. package/skills/playwright-cli/references/element-attributes.md +23 -0
  393. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  394. package/skills/playwright-cli/references/request-mocking.md +87 -0
  395. package/skills/playwright-cli/references/running-code.md +241 -0
  396. package/skills/playwright-cli/references/session-management.md +225 -0
  397. package/skills/playwright-cli/references/spec-driven-testing.md +305 -0
  398. package/skills/playwright-cli/references/storage-state.md +275 -0
  399. package/skills/playwright-cli/references/test-generation.md +134 -0
  400. package/skills/playwright-cli/references/tracing.md +139 -0
  401. package/skills/playwright-cli/references/video-recording.md +143 -0
  402. package/skills/simplify/SKILL.md +51 -0
  403. package/skills/skill-creator/LICENSE.txt +202 -0
  404. package/skills/skill-creator/SKILL.md +485 -0
  405. package/skills/skill-creator/agents/analyzer.md +274 -0
  406. package/skills/skill-creator/agents/comparator.md +202 -0
  407. package/skills/skill-creator/agents/grader.md +223 -0
  408. package/skills/skill-creator/assets/eval_review.html +146 -0
  409. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  410. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  411. package/skills/skill-creator/references/schemas.md +430 -0
  412. package/skills/skill-creator/scripts/__init__.py +0 -0
  413. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  414. package/skills/skill-creator/scripts/generate_report.py +326 -0
  415. package/skills/skill-creator/scripts/improve_description.py +247 -0
  416. package/skills/skill-creator/scripts/package_skill.py +136 -0
  417. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  418. package/skills/skill-creator/scripts/run_eval.py +310 -0
  419. package/skills/skill-creator/scripts/run_loop.py +328 -0
  420. package/skills/skill-creator/scripts/utils.py +47 -0
@@ -0,0 +1,295 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { mkdir, readFile, rm } from "node:fs/promises";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { copyToClipboard, getAgentDir } from "@earendil-works/pi-coding-agent";
7
+ import { getIdleRuntime, getRuntime, parsePathArgument } from "./command-runtime.js";
8
+ import { createId } from "./id.js";
9
+ import { formatAccountUsageReport, queryAccountUsageReport } from "./model-usage-status.js";
10
+ import { checkPixUpdate, formatPixUpdateCheck, parsePixUpdateArgs, pixUpdateUsage } from "./update.js";
11
+ export class SessionCommandActions {
12
+ host;
13
+ constructor(host) {
14
+ this.host = host;
15
+ }
16
+ async runExportCommand(argumentsText) {
17
+ const runtime = getIdleRuntime(this.host, "export");
18
+ if (!runtime)
19
+ return;
20
+ const outputPath = parsePathArgument(argumentsText);
21
+ const resolvedOutputPath = outputPath ? resolve(runtime.cwd, outputPath) : undefined;
22
+ this.host.setStatus("exporting session");
23
+ this.host.render();
24
+ const filePath = resolvedOutputPath?.endsWith(".jsonl")
25
+ ? runtime.session.exportToJsonl(resolvedOutputPath)
26
+ : await runtime.session.exportToHtml(resolvedOutputPath);
27
+ this.host.addEntry({ id: createId("system"), kind: "system", text: `Session exported to: ${filePath}` });
28
+ this.host.setSessionStatus(runtime.session);
29
+ this.host.toast.success("Session exported");
30
+ }
31
+ async runImportCommand(argumentsText) {
32
+ const runtime = getIdleRuntime(this.host, "import");
33
+ if (!runtime)
34
+ return;
35
+ const inputPath = parsePathArgument(argumentsText);
36
+ if (!inputPath)
37
+ throw new Error("Usage: /import <path.jsonl>");
38
+ const resolvedInputPath = resolve(runtime.cwd, inputPath);
39
+ this.host.setStatus("importing session");
40
+ this.host.render();
41
+ const result = await runtime.importFromJsonl(resolvedInputPath);
42
+ if (result.cancelled) {
43
+ this.host.addEntry({ id: createId("system"), kind: "system", text: "Import cancelled." });
44
+ this.host.setSessionStatus(runtime.session);
45
+ return;
46
+ }
47
+ this.host.afterSessionReplacement(`Session imported from: ${resolvedInputPath}`);
48
+ }
49
+ async runShareCommand() {
50
+ const runtime = getIdleRuntime(this.host, "share");
51
+ if (!runtime)
52
+ return;
53
+ const authResult = spawnSync("gh", ["auth", "status"], { encoding: "utf8" });
54
+ if (authResult.status !== 0)
55
+ throw new Error("GitHub CLI is not installed or is not logged in. Run `gh auth login` first.");
56
+ const shareDir = join(getAgentDir(), "pix");
57
+ await mkdir(shareDir, { recursive: true });
58
+ const tmpFile = join(shareDir, `session-share-${randomUUID()}.html`);
59
+ try {
60
+ this.host.setStatus("creating share gist");
61
+ this.host.render();
62
+ await runtime.session.exportToHtml(tmpFile);
63
+ const gistResult = spawnSync("gh", ["gist", "create", "--public=false", tmpFile], { encoding: "utf8" });
64
+ if (gistResult.status !== 0)
65
+ throw new Error(gistResult.stderr?.trim() || "Failed to create gist");
66
+ const gistUrl = gistResult.stdout.trim();
67
+ this.host.addEntry({ id: createId("system"), kind: "system", text: `Shared session gist: ${gistUrl}` });
68
+ this.host.setSessionStatus(runtime.session);
69
+ this.host.toast.success("Session shared");
70
+ }
71
+ finally {
72
+ await rm(tmpFile, { force: true }).catch(() => undefined);
73
+ }
74
+ }
75
+ async runCopyCommand() {
76
+ const runtime = getRuntime(this.host, "copy");
77
+ if (!runtime)
78
+ return;
79
+ const text = runtime.session.getLastAssistantText();
80
+ if (!text)
81
+ throw new Error("No agent messages to copy yet");
82
+ await copyToClipboard(text);
83
+ this.host.addEntry({ id: createId("system"), kind: "system", text: "Copied last agent message to clipboard." });
84
+ this.host.setSessionStatus(runtime.session);
85
+ this.host.toast.success("Copied last agent message");
86
+ }
87
+ async runNameCommand(argumentsText) {
88
+ const runtime = getRuntime(this.host, "name");
89
+ if (!runtime)
90
+ return;
91
+ const name = argumentsText.trim();
92
+ if (!name) {
93
+ this.host.addEntry({ id: createId("system"), kind: "system", text: `Session name: ${runtime.session.sessionName ?? "(none)"}` });
94
+ this.host.setSessionStatus(runtime.session);
95
+ return;
96
+ }
97
+ runtime.session.setSessionName(name);
98
+ this.host.addEntry({ id: createId("system"), kind: "system", text: `Session name set: ${name}` });
99
+ this.host.setSessionStatus(runtime.session);
100
+ this.host.render();
101
+ }
102
+ async runSessionInfoCommand() {
103
+ const runtime = getRuntime(this.host, "session");
104
+ if (!runtime)
105
+ return;
106
+ const stats = runtime.session.getSessionStats();
107
+ const lines = [
108
+ "Session info",
109
+ ...(runtime.session.sessionName ? [`name: ${runtime.session.sessionName}`] : []),
110
+ `file: ${stats.sessionFile ?? "in-memory"}`,
111
+ `id: ${stats.sessionId}`,
112
+ "",
113
+ "Messages",
114
+ `user: ${stats.userMessages.toLocaleString()}`,
115
+ `assistant: ${stats.assistantMessages.toLocaleString()}`,
116
+ `tool calls: ${stats.toolCalls.toLocaleString()}`,
117
+ `tool results: ${stats.toolResults.toLocaleString()}`,
118
+ `total: ${stats.totalMessages.toLocaleString()}`,
119
+ "",
120
+ "Tokens",
121
+ `input: ${stats.tokens.input.toLocaleString()}`,
122
+ `output: ${stats.tokens.output.toLocaleString()}`,
123
+ `cache read: ${stats.tokens.cacheRead.toLocaleString()}`,
124
+ `cache write: ${stats.tokens.cacheWrite.toLocaleString()}`,
125
+ `total: ${stats.tokens.total.toLocaleString()}`,
126
+ ...(stats.cost > 0 ? ["", `cost: ${stats.cost.toFixed(4)}`] : []),
127
+ ];
128
+ this.host.addEntry({ id: createId("system"), kind: "system", text: lines.join("\n") });
129
+ this.host.setSessionStatus(runtime.session);
130
+ }
131
+ async runUsageCommand() {
132
+ const runtime = getRuntime(this.host, "usage");
133
+ if (!runtime)
134
+ return;
135
+ this.host.setStatus("loading usage");
136
+ this.host.render();
137
+ const accountReport = await queryAccountUsageReport();
138
+ const accountUsage = formatAccountUsageReport(accountReport);
139
+ if (accountUsage) {
140
+ this.host.addEntry({ id: createId("system"), kind: "system", text: accountUsage });
141
+ this.host.setSessionStatus(runtime.session);
142
+ return;
143
+ }
144
+ const stats = runtime.session.getSessionStats();
145
+ const contextUsage = stats.contextUsage ?? runtime.session.getContextUsage();
146
+ const model = runtime.session.model ? this.host.modelRef(runtime.session.model) : "not selected";
147
+ const lines = [
148
+ "Usage",
149
+ `model: ${model}`,
150
+ "",
151
+ "Tokens",
152
+ `input: ${stats.tokens.input.toLocaleString()}`,
153
+ `output: ${stats.tokens.output.toLocaleString()}`,
154
+ `cache read: ${stats.tokens.cacheRead.toLocaleString()}`,
155
+ `cache write: ${stats.tokens.cacheWrite.toLocaleString()}`,
156
+ `total: ${stats.tokens.total.toLocaleString()}`,
157
+ ...(stats.cost > 0 ? [`cost: ${stats.cost.toFixed(4)}`] : []),
158
+ "",
159
+ "Context",
160
+ ...this.formatContextUsageLines(contextUsage),
161
+ ];
162
+ this.host.addEntry({ id: createId("system"), kind: "system", text: lines.join("\n") });
163
+ this.host.setSessionStatus(runtime.session);
164
+ }
165
+ async runChangelogCommand() {
166
+ const changelogPath = join(this.piPackageRoot(), "CHANGELOG.md");
167
+ const raw = await readFile(changelogPath, "utf8");
168
+ const lines = raw.trim().split(/\r?\n/).slice(0, 140);
169
+ this.host.addEntry({ id: createId("system"), kind: "system", text: lines.join("\n") });
170
+ this.host.setSessionStatus(this.host.runtime()?.session);
171
+ }
172
+ async runUpdateCommand(argumentsText) {
173
+ const runtime = getRuntime(this.host, "update");
174
+ if (!runtime)
175
+ return;
176
+ const options = parsePixUpdateArgs(splitUpdateArguments(argumentsText));
177
+ if (options.help) {
178
+ this.host.addEntry({ id: createId("system"), kind: "system", text: pixUpdateUsage() });
179
+ this.host.setSessionStatus(runtime.session);
180
+ return;
181
+ }
182
+ this.host.setStatus("checking updates");
183
+ this.host.render();
184
+ const result = await checkPixUpdate();
185
+ const forceHint = options.force ? "\n\n/update is check-only. To force a reinstall, run `pix update --force` in your shell and restart Pix." : "";
186
+ this.host.addEntry({ id: createId("system"), kind: "system", text: `${formatPixUpdateCheck(result)}${forceHint}` });
187
+ this.host.setSessionStatus(runtime.session);
188
+ if (result.status === "newer")
189
+ this.host.toast.info("Pix update available");
190
+ else if (result.status === "current")
191
+ this.host.toast.success("Pix is up to date");
192
+ else
193
+ this.host.toast.warning("Pix update check incomplete");
194
+ }
195
+ async runHotkeysCommand() {
196
+ this.host.addEntry({
197
+ id: createId("system"),
198
+ kind: "system",
199
+ text: [
200
+ "Keyboard shortcuts",
201
+ "Enter: send message / run selected command",
202
+ "!command: run a local shell command in chat (not saved to the session)",
203
+ "while shell is running: Enter sends editor text to stdin; Ctrl-C interrupts; !!command uses the raw terminal",
204
+ "Tab: autocomplete selected popup item",
205
+ "Esc: close popup; abort running work when input is empty",
206
+ "Up/Down: history or popup navigation",
207
+ "PageUp/PageDown or Cmd+Up/Cmd+Down: scroll conversation by page",
208
+ "Mouse wheel or right scrollbar: scroll conversation/popup",
209
+ "/enhance or status magic-wand icon: improve the current prompt draft",
210
+ "Status model/thinking/session/enhance/voice areas are clickable when shown.",
211
+ ].join("\n"),
212
+ });
213
+ this.host.setSessionStatus(this.host.runtime()?.session);
214
+ }
215
+ async runReloadCommand() {
216
+ const runtime = getIdleRuntime(this.host, "reload");
217
+ if (!runtime)
218
+ return;
219
+ this.host.setStatus("reloading");
220
+ this.host.render();
221
+ try {
222
+ await runtime.session.reload();
223
+ this.host.setSessionStatus(runtime.session);
224
+ this.host.addEntry({ id: createId("system"), kind: "system", text: "Reloaded keybindings, extensions, skills, prompts, themes" });
225
+ this.host.toast.success("Reloaded resources");
226
+ }
227
+ catch (error) {
228
+ this.host.setSessionStatus(runtime.session);
229
+ this.host.addEntry({ id: createId("error"), kind: "error", text: `Reload failed: ${error instanceof Error ? error.message : String(error)}` });
230
+ this.host.toast.error("Reload failed");
231
+ }
232
+ }
233
+ async runNewSessionCommand() {
234
+ const runtime = getIdleRuntime(this.host, "new");
235
+ if (!runtime)
236
+ return;
237
+ this.host.setStatus("starting new session");
238
+ this.host.render();
239
+ const result = await runtime.newSession();
240
+ if (result.cancelled) {
241
+ this.host.addEntry({ id: createId("system"), kind: "system", text: "New session cancelled." });
242
+ this.host.setSessionStatus(runtime.session);
243
+ return;
244
+ }
245
+ this.host.resetSessionView();
246
+ this.host.addEntry({ id: createId("system"), kind: "system", text: `Started a new session. cwd=${runtime.cwd}` });
247
+ if (runtime.modelFallbackMessage)
248
+ this.host.addEntry({ id: createId("system"), kind: "system", text: runtime.modelFallbackMessage });
249
+ for (const diag of runtime.diagnostics ?? []) {
250
+ const kind = diag.type === "error" ? "error" : "system";
251
+ this.host.addEntry({ id: createId("system"), kind, text: `[${diag.type}] ${diag.message}` });
252
+ }
253
+ this.host.setSessionStatus(runtime.session);
254
+ }
255
+ async runCompactCommand(customInstructions) {
256
+ const runtime = getRuntime(this.host, "compact");
257
+ if (!runtime)
258
+ return;
259
+ if (runtime.session.isCompacting) {
260
+ this.host.toast.warning("Compaction already running");
261
+ return;
262
+ }
263
+ this.host.setStatus(customInstructions ? "compacting with instructions" : "compacting");
264
+ this.host.render();
265
+ const result = await runtime.session.compact(customInstructions);
266
+ this.host.addEntry({
267
+ id: createId("system"),
268
+ kind: "system",
269
+ text: `Compacted context (${result.tokensBefore} tokens before compaction).`,
270
+ });
271
+ this.host.setSessionStatus(runtime.session);
272
+ this.host.toast.success(`Compacted ${result.tokensBefore} tokens`);
273
+ }
274
+ piPackageRoot() {
275
+ return dirname(dirname(fileURLToPath(import.meta.resolve("@earendil-works/pi-coding-agent"))));
276
+ }
277
+ formatContextUsageLines(usage) {
278
+ if (!usage)
279
+ return ["unavailable"];
280
+ const tokens = usage.tokens == null ? "unknown" : usage.tokens.toLocaleString();
281
+ const percent = usage.percent == null ? "unknown" : `${trimDecimal(usage.percent)}%`;
282
+ return [
283
+ `tokens: ${tokens}`,
284
+ `window: ${usage.contextWindow.toLocaleString()}`,
285
+ `used: ${percent}`,
286
+ ];
287
+ }
288
+ }
289
+ function trimDecimal(value) {
290
+ return value.toFixed(1).replace(/\.0$/, "");
291
+ }
292
+ function splitUpdateArguments(argumentsText) {
293
+ const trimmed = argumentsText.trim();
294
+ return trimmed ? trimmed.split(/\s+/u) : [];
295
+ }
@@ -0,0 +1,52 @@
1
+ import type { ResolvedToolRule } from "../config.js";
2
+ export declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
3
+ export declare const THINKING_MENU_MAX_ROWS: number;
4
+ export declare const PI_FAVORITE_MODEL_REFS: readonly ["amazon-bedrock/us.anthropic.claude-opus-4-6-v1", "anthropic/claude-opus-4-8", "openai/gpt-5.4", "azure-openai-responses/gpt-5.4", "openai-codex/gpt-5.5", "deepseek/deepseek-v4-pro", "google/gemini-3.1-pro-preview", "google-vertex/gemini-3.1-pro-preview", "github-copilot/gpt-5.4", "openrouter/moonshotai/kimi-k2.6", "vercel-ai-gateway/zai/glm-5.1", "xai/grok-4.20-0309-reasoning", "groq/openai/gpt-oss-120b", "cerebras/zai-glm-4.7", "zai/glm-5.1", "mistral/devstral-medium-latest", "minimax/MiniMax-M2.7", "minimax-cn/MiniMax-M2.7", "moonshotai/kimi-k2.6", "moonshotai-cn/kimi-k2.6", "huggingface/moonshotai/Kimi-K2.6", "fireworks/accounts/fireworks/models/kimi-k2p6", "together/moonshotai/Kimi-K2.6", "opencode/kimi-k2.6", "opencode-go/kimi-k2.6", "kimi-coding/kimi-for-coding", "cloudflare-workers-ai/@cf/moonshotai/kimi-k2.6", "cloudflare-ai-gateway/workers-ai/@cf/moonshotai/kimi-k2.6", "xiaomi/mimo-v2.5-pro", "xiaomi-token-plan-cn/mimo-v2.5-pro", "xiaomi-token-plan-ams/mimo-v2.5-pro", "xiaomi-token-plan-sgp/mimo-v2.5-pro"];
5
+ export declare const SLASH_COMMAND_MENU_MAX_ROWS = 6;
6
+ export declare const RESUME_MENU_MAX_ROWS = 20;
7
+ export declare const RESUME_MENU_INITIAL_SESSION_ROWS = 30;
8
+ export declare const RESUME_MENU_LOAD_BATCH_ROWS = 10;
9
+ export declare const RESUME_MENU_LOAD_THRESHOLD_ROWS = 10;
10
+ export declare const SLASH_COMMAND_DESCRIPTION_COLUMN = 36;
11
+ export declare const INPUT_MAX_ROWS = 8;
12
+ export declare const RUNTIME_DISPOSE_GRACE_MS = 250;
13
+ export declare const PASTE_DUPLICATE_WINDOW_MS = 1200;
14
+ export declare const TOAST_DURATION_MS = 5000;
15
+ export declare const STATUS_BLINK_INTERVAL_MS = 500;
16
+ export declare const MODEL_USAGE_STATUS_TICK_MS = 60000;
17
+ export declare const MODEL_USAGE_POLL_INTERVAL_MS: number;
18
+ export declare const REQUEST_HISTORY_VERSION = 1;
19
+ export declare const REQUEST_HISTORY_MAX_ENTRIES = 200;
20
+ export declare const REQUEST_HISTORY_MAX_BYTES: number;
21
+ export declare const REQUEST_HISTORY_MAX_ENTRY_BYTES: number;
22
+ export declare const ENABLE_TERMINAL_KEY_REPORTING = "\u001B[>7u\u001B[>4;2m";
23
+ export declare const DISABLE_TERMINAL_KEY_REPORTING = "\u001B[<u\u001B[>4;0m";
24
+ export declare const ENABLE_BRACKETED_PASTE = "\u001B[?2004h";
25
+ export declare const DISABLE_BRACKETED_PASTE = "\u001B[?2004l";
26
+ export declare const DISABLE_TERMINAL_WRAP = "\u001B[?7l";
27
+ export declare const ENABLE_TERMINAL_WRAP = "\u001B[?7h";
28
+ export declare const HIDE_CURSOR = "\u001B[?25l";
29
+ export declare const SHOW_CURSOR = "\u001B[?25h";
30
+ export declare const CLEAR_TERMINAL = "\u001B[2J\u001B[3J\u001B[H";
31
+ export declare const THINKING_TOOL_NAME = "thinking";
32
+ export declare const SUBAGENTS_TOOL_NAME = "subagents";
33
+ export declare const SUBAGENTS_TOOL_NAME_PREFIX = "async_subagents_";
34
+ export declare const SUBAGENTS_RUN_ROOT: string;
35
+ export declare const SUBAGENTS_REGISTRY_FILE = "registry.json";
36
+ export declare const SUBAGENT_PARENT_SESSION_FILE = "parent_session";
37
+ export declare const SUBAGENTS_POLL_INTERVAL_MS = 1500;
38
+ export declare const SUBAGENTS_WIDGET_MAX_ROWS = 8;
39
+ export declare const DEFAULT_THINKING_TOOL_RULE: ResolvedToolRule;
40
+ export declare const TERMINAL_COMMAND_MODIFIER_FLAG = 8;
41
+ export declare const GIT_BRANCH_CACHE_MS = 2000;
42
+ export declare const TODO_TOOL_NAME = "todo";
43
+ export declare const TODO_ACTIONS: readonly ["create", "update", "batch_create", "batch_update", "list", "get", "delete", "clear", "export", "import"];
44
+ export declare const TODO_STATUSES: readonly ["pending", "in_progress", "deferred", "completed", "deleted"];
45
+ export declare const TODO_PRIORITIES: readonly ["low", "medium", "high", "urgent"];
46
+ export declare const SUBAGENT_STATUSES: readonly ["planned", "running", "retrying", "done", "failed", "stopped"];
47
+ export declare const SUBAGENT_ACTIVE_STATUSES: readonly ["planned", "running", "retrying"];
48
+ export declare const SUBAGENT_TERMINAL_STATUSES: readonly ["done", "failed", "stopped"];
49
+ export declare const SUBAGENT_RENDER_MODES: readonly ["spawn", "status", "wait", "stop", "completion"];
50
+ export declare const ABOVE_EDITOR_WIDGET_KEY_GROUPS: readonly (readonly string[])[];
51
+ export declare const LEGACY_TODO_WIDGET_KEYS: Set<string>;
52
+ export declare const BUILT_IN_SUBAGENTS_WIDGET_KEYS: Set<string>;
@@ -0,0 +1,103 @@
1
+ import { join } from "node:path";
2
+ export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
3
+ export const THINKING_MENU_MAX_ROWS = THINKING_LEVELS.length + 1;
4
+ export const PI_FAVORITE_MODEL_REFS = [
5
+ "amazon-bedrock/us.anthropic.claude-opus-4-6-v1",
6
+ "anthropic/claude-opus-4-8",
7
+ "openai/gpt-5.4",
8
+ "azure-openai-responses/gpt-5.4",
9
+ "openai-codex/gpt-5.5",
10
+ "deepseek/deepseek-v4-pro",
11
+ "google/gemini-3.1-pro-preview",
12
+ "google-vertex/gemini-3.1-pro-preview",
13
+ "github-copilot/gpt-5.4",
14
+ "openrouter/moonshotai/kimi-k2.6",
15
+ "vercel-ai-gateway/zai/glm-5.1",
16
+ "xai/grok-4.20-0309-reasoning",
17
+ "groq/openai/gpt-oss-120b",
18
+ "cerebras/zai-glm-4.7",
19
+ "zai/glm-5.1",
20
+ "mistral/devstral-medium-latest",
21
+ "minimax/MiniMax-M2.7",
22
+ "minimax-cn/MiniMax-M2.7",
23
+ "moonshotai/kimi-k2.6",
24
+ "moonshotai-cn/kimi-k2.6",
25
+ "huggingface/moonshotai/Kimi-K2.6",
26
+ "fireworks/accounts/fireworks/models/kimi-k2p6",
27
+ "together/moonshotai/Kimi-K2.6",
28
+ "opencode/kimi-k2.6",
29
+ "opencode-go/kimi-k2.6",
30
+ "kimi-coding/kimi-for-coding",
31
+ "cloudflare-workers-ai/@cf/moonshotai/kimi-k2.6",
32
+ "cloudflare-ai-gateway/workers-ai/@cf/moonshotai/kimi-k2.6",
33
+ "xiaomi/mimo-v2.5-pro",
34
+ "xiaomi-token-plan-cn/mimo-v2.5-pro",
35
+ "xiaomi-token-plan-ams/mimo-v2.5-pro",
36
+ "xiaomi-token-plan-sgp/mimo-v2.5-pro",
37
+ ];
38
+ export const SLASH_COMMAND_MENU_MAX_ROWS = 6;
39
+ export const RESUME_MENU_MAX_ROWS = 20;
40
+ export const RESUME_MENU_INITIAL_SESSION_ROWS = 30;
41
+ export const RESUME_MENU_LOAD_BATCH_ROWS = 10;
42
+ export const RESUME_MENU_LOAD_THRESHOLD_ROWS = 10;
43
+ export const SLASH_COMMAND_DESCRIPTION_COLUMN = 36;
44
+ export const INPUT_MAX_ROWS = 8;
45
+ export const RUNTIME_DISPOSE_GRACE_MS = 250;
46
+ export const PASTE_DUPLICATE_WINDOW_MS = 1200;
47
+ export const TOAST_DURATION_MS = 5000;
48
+ export const STATUS_BLINK_INTERVAL_MS = 500;
49
+ export const MODEL_USAGE_STATUS_TICK_MS = 60_000;
50
+ export const MODEL_USAGE_POLL_INTERVAL_MS = 5 * 60_000;
51
+ export const REQUEST_HISTORY_VERSION = 1;
52
+ export const REQUEST_HISTORY_MAX_ENTRIES = 200;
53
+ export const REQUEST_HISTORY_MAX_BYTES = 128 * 1024;
54
+ export const REQUEST_HISTORY_MAX_ENTRY_BYTES = 16 * 1024;
55
+ export const ENABLE_TERMINAL_KEY_REPORTING = "\x1b[>7u\x1b[>4;2m";
56
+ export const DISABLE_TERMINAL_KEY_REPORTING = "\x1b[<u\x1b[>4;0m";
57
+ export const ENABLE_BRACKETED_PASTE = "\x1b[?2004h";
58
+ export const DISABLE_BRACKETED_PASTE = "\x1b[?2004l";
59
+ export const DISABLE_TERMINAL_WRAP = "\x1b[?7l";
60
+ export const ENABLE_TERMINAL_WRAP = "\x1b[?7h";
61
+ export const HIDE_CURSOR = "\x1b[?25l";
62
+ export const SHOW_CURSOR = "\x1b[?25h";
63
+ export const CLEAR_TERMINAL = "\x1b[2J\x1b[3J\x1b[H";
64
+ export const THINKING_TOOL_NAME = "thinking";
65
+ export const SUBAGENTS_TOOL_NAME = "subagents";
66
+ export const SUBAGENTS_TOOL_NAME_PREFIX = "async_subagents_";
67
+ export const SUBAGENTS_RUN_ROOT = join(".pi", "subagents");
68
+ export const SUBAGENTS_REGISTRY_FILE = "registry.json";
69
+ export const SUBAGENT_PARENT_SESSION_FILE = "parent_session";
70
+ export const SUBAGENTS_POLL_INTERVAL_MS = 1_500;
71
+ export const SUBAGENTS_WIDGET_MAX_ROWS = 8;
72
+ export const DEFAULT_THINKING_TOOL_RULE = {
73
+ previewLines: 0,
74
+ direction: "head",
75
+ color: "accent",
76
+ };
77
+ export const TERMINAL_COMMAND_MODIFIER_FLAG = 8;
78
+ export const GIT_BRANCH_CACHE_MS = 2_000;
79
+ export const TODO_TOOL_NAME = "todo";
80
+ export const TODO_ACTIONS = [
81
+ "create",
82
+ "update",
83
+ "batch_create",
84
+ "batch_update",
85
+ "list",
86
+ "get",
87
+ "delete",
88
+ "clear",
89
+ "export",
90
+ "import",
91
+ ];
92
+ export const TODO_STATUSES = ["pending", "in_progress", "deferred", "completed", "deleted"];
93
+ export const TODO_PRIORITIES = ["low", "medium", "high", "urgent"];
94
+ export const SUBAGENT_STATUSES = ["planned", "running", "retrying", "done", "failed", "stopped"];
95
+ export const SUBAGENT_ACTIVE_STATUSES = ["planned", "running", "retrying"];
96
+ export const SUBAGENT_TERMINAL_STATUSES = ["done", "failed", "stopped"];
97
+ export const SUBAGENT_RENDER_MODES = ["spawn", "status", "wait", "stop", "completion"];
98
+ export const ABOVE_EDITOR_WIDGET_KEY_GROUPS = [
99
+ ["rpiv-todos", "plan-todos"],
100
+ ["async-subagents-live"],
101
+ ];
102
+ export const LEGACY_TODO_WIDGET_KEYS = new Set(["rpiv-todos", "plan-todos"]);
103
+ export const BUILT_IN_SUBAGENTS_WIDGET_KEYS = new Set(["async-subagents-live"]);
@@ -0,0 +1,21 @@
1
+ import { type PixConfig } from "../config.js";
2
+ import type { Theme } from "../theme.js";
3
+ import type { Entry, RenderedLine } from "./types.js";
4
+ export type InlineUserMessageMenuContext = {
5
+ userContentWidth: number;
6
+ userContentLeft: number;
7
+ userLine: (text: string, entryId?: string, syntaxHighlight?: RenderedLine["syntaxHighlight"]) => RenderedLine;
8
+ };
9
+ export type ConversationEntryRenderOptions = {
10
+ cwd: string;
11
+ colors: Theme["colors"];
12
+ pixConfig: PixConfig;
13
+ outputFilters: readonly RegExp[];
14
+ suppressPendingDcpIdMetadata: boolean;
15
+ superCompactTools?: boolean;
16
+ allThinkingExpanded?: boolean;
17
+ renderInlineUserMessageMenu: (entry: Extract<Entry, {
18
+ kind: "user";
19
+ }>, context: InlineUserMessageMenuContext) => RenderedLine[];
20
+ };
21
+ export declare function renderConversationEntry(entry: Entry, width: number, options: ConversationEntryRenderOptions): RenderedLine[];
@@ -0,0 +1,81 @@
1
+ import { applyOutputFilters, stripDcpDisplayMetadata, suppressPendingDcpIdMetadataLine } from "../config.js";
2
+ import { renderMarkdownTextLines } from "../markdown-format.js";
3
+ import { attachImageClickTargets } from "./image-click-targets.js";
4
+ import { horizontalPaddingLayout, padHorizontalText, wrapText } from "./render-text.js";
5
+ import { renderConversationShellEntry } from "./conversation-shell-renderer.js";
6
+ import { renderConversationToolEntry, renderThinkingEntry } from "./conversation-tool-renderer.js";
7
+ export function renderConversationEntry(entry, width, options) {
8
+ const { left: userContentLeft, contentWidth: userContentWidth } = horizontalPaddingLayout(width);
9
+ const userLine = (text, entryId, syntaxHighlight, segments) => ({
10
+ text: padHorizontalText(text, width),
11
+ colorOverride: options.colors.inputForeground,
12
+ backgroundOverride: options.colors.userMessageBackground,
13
+ ...(segments && segments.length > 0 ? { segments: segments.map((segment) => ({ ...segment, start: segment.start + userContentLeft, end: segment.end + userContentLeft })) } : {}),
14
+ ...(syntaxHighlight === undefined ? {} : { syntaxHighlight }),
15
+ ...(entryId === undefined ? {} : { target: { kind: "user-message", id: entryId } }),
16
+ });
17
+ const queuedLine = (text, entryId) => ({
18
+ text: padHorizontalText(text, width),
19
+ variant: "muted",
20
+ backgroundOverride: options.colors.userMessageBackground,
21
+ target: { kind: "queue-message", id: entryId },
22
+ });
23
+ const userMessageLines = (userEntry) => {
24
+ const lines = [
25
+ userLine("", userEntry.id),
26
+ ...renderMarkdownTextLines(userEntry.text, userContentWidth, userContentLeft).map((line) => userLine(line.text, userEntry.id, line.syntaxHighlight, line.segments)),
27
+ ];
28
+ lines.push(...options.renderInlineUserMessageMenu(userEntry, { userContentWidth, userContentLeft, userLine }));
29
+ lines.push(userLine("", userEntry.id));
30
+ return attachImageClickTargets(lines, userEntry.id, userEntry.images, { foreground: options.colors.info, underline: true });
31
+ };
32
+ const queuedMessageLines = (queuedEntry) => [
33
+ queuedLine("", queuedEntry.id),
34
+ ...wrapText(`↳ queued ${queuedEntry.mode}: ${queuedEntry.text}`, userContentWidth).map((text) => queuedLine(text, queuedEntry.id)),
35
+ queuedLine("", queuedEntry.id),
36
+ ];
37
+ switch (entry.kind) {
38
+ case "system":
39
+ return wrapText(`system: ${entry.text}`, width).map((text) => ({ text, variant: "muted" }));
40
+ case "user":
41
+ return userMessageLines(entry);
42
+ case "queued":
43
+ return queuedMessageLines(entry);
44
+ case "assistant":
45
+ return renderAssistantLines(entry.text, width, options);
46
+ case "custom":
47
+ return renderCustomEntry(entry, width);
48
+ case "session-aborted":
49
+ return wrapText(entry.text, width).map((text) => ({ text, variant: "error" }));
50
+ case "shell":
51
+ return renderConversationShellEntry(entry, width, options);
52
+ case "thinking":
53
+ return renderThinkingEntry(entry, width, options);
54
+ case "error":
55
+ return wrapText(`error: ${entry.text}`, width).map((text) => ({ text, variant: "error" }));
56
+ case "tool":
57
+ return renderConversationToolEntry(entry, width, options);
58
+ }
59
+ }
60
+ function renderCustomEntry(entry, width) {
61
+ const label = `[${entry.customType}]`;
62
+ return wrapText(`${label}\n${entry.text}`, width).map((text, index) => ({
63
+ text,
64
+ variant: index === 0 ? "accent" : "normal",
65
+ }));
66
+ }
67
+ function renderAssistantLines(text, width, options) {
68
+ const displayText = displayAssistantText(text, options.outputFilters, options.suppressPendingDcpIdMetadata);
69
+ if (!displayText)
70
+ return [];
71
+ return renderMarkdownTextLines(displayText, width).map((line) => ({
72
+ text: line.text,
73
+ colorOverride: options.colors.assistantForeground,
74
+ ...(line.segments && line.segments.length > 0 ? { segments: line.segments } : {}),
75
+ ...(line.syntaxHighlight ? { syntaxHighlight: line.syntaxHighlight } : {}),
76
+ }));
77
+ }
78
+ function displayAssistantText(text, outputFilters, suppressPendingDcpIdMetadata) {
79
+ const filtered = stripDcpDisplayMetadata(applyOutputFilters(text, outputFilters)).trimEnd();
80
+ return suppressPendingDcpIdMetadata ? suppressPendingDcpIdMetadataLine(filtered) : filtered;
81
+ }
@@ -0,0 +1,5 @@
1
+ import type { Entry, RenderedLine } from "./types.js";
2
+ import type { ConversationToolRenderOptions } from "./conversation-tool-renderer.js";
3
+ export declare function renderConversationShellEntry(entry: Extract<Entry, {
4
+ kind: "shell";
5
+ }>, width: number, options: ConversationToolRenderOptions): RenderedLine[];
@@ -0,0 +1,43 @@
1
+ import { resolveToolRule } from "../config.js";
2
+ import { renderToolBlock } from "./tool-block-renderer.js";
3
+ export function renderConversationShellEntry(entry, width, options) {
4
+ const body = shellEntryBody(entry);
5
+ return renderToolBlock({
6
+ id: entry.id,
7
+ toolName: "shell",
8
+ headerArgs: entry.command,
9
+ expanded: entry.expanded,
10
+ status: entry.status,
11
+ isError: shellEntryIsError(entry),
12
+ output: body,
13
+ collapsedBody: body,
14
+ expandedText: body,
15
+ preserveAnsi: true,
16
+ }, resolveToolRule("shell", options.pixConfig.toolRenderer), width, options.colors, { superCompact: Boolean(options.superCompactTools) });
17
+ }
18
+ function shellEntryBody(entry) {
19
+ const output = entry.output.trimEnd();
20
+ const status = shellEntryStatusLine(entry);
21
+ if (!output)
22
+ return status;
23
+ return `${output}\n${status}`;
24
+ }
25
+ function shellEntryStatusLine(entry) {
26
+ return `\x1b[90m[pix] ${shellEntryStatusText(entry)}\x1b[0m`;
27
+ }
28
+ function shellEntryStatusText(entry) {
29
+ if (entry.status === "running")
30
+ return "running — submit editor text to send stdin, Ctrl-C to interrupt";
31
+ if (entry.error)
32
+ return `failed to start: ${entry.error}`;
33
+ if (entry.signal)
34
+ return `terminated by ${entry.signal}`;
35
+ return `exit ${entry.exitCode ?? 0}`;
36
+ }
37
+ function shellEntryIsError(entry) {
38
+ if (entry.status !== "done")
39
+ return false;
40
+ if (entry.error || entry.signal)
41
+ return true;
42
+ return (entry.exitCode ?? 0) !== 0;
43
+ }
@@ -0,0 +1,16 @@
1
+ import { type PixConfig } from "../config.js";
2
+ import type { Theme } from "../theme.js";
3
+ import type { Entry, RenderedLine } from "./types.js";
4
+ export type ConversationToolRenderOptions = {
5
+ cwd: string;
6
+ pixConfig: PixConfig;
7
+ colors: Theme["colors"];
8
+ superCompactTools?: boolean;
9
+ allThinkingExpanded?: boolean;
10
+ };
11
+ export declare function renderConversationToolEntry(entry: Extract<Entry, {
12
+ kind: "tool";
13
+ }>, width: number, options: ConversationToolRenderOptions): RenderedLine[];
14
+ export declare function renderThinkingEntry(entry: Extract<Entry, {
15
+ kind: "thinking";
16
+ }>, width: number, options: ConversationToolRenderOptions): RenderedLine[];