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
package/README.md ADDED
@@ -0,0 +1,307 @@
1
+ # Pix
2
+
3
+ Pix is a custom terminal UI for the Pi coding agent. It is built on the `@earendil-works/pi-coding-agent` SDK and provides its own renderer, input loop, session tabs, tool output controls, extension UI surface, and local voice input.
4
+
5
+ The npm package is currently named `pi-ui-extend` and installs the `pix` CLI.
6
+
7
+ ## Highlights
8
+
9
+ - SDK-first Pi runtime integration; Pix does not use Pi's built-in `InteractiveMode`.
10
+ - Custom terminal renderer with streaming assistant output, thinking streams, tool rows, scrollback, and clickable tool expand/collapse state.
11
+ - Workspace-scoped session tabs and persistent Pi sessions.
12
+ - Local shell helpers through `!command` and raw TTY commands through `!!command`.
13
+ - Optional local Vosk voice dictation with Russian and English models.
14
+ - Pix extension UI helpers for toasts, menus, and rows above the input editor.
15
+ - Bundled `pi-tools-suite` payload. On startup, Pix links it into Pi's standard user extension directory.
16
+
17
+ ## Requirements
18
+
19
+ - Node.js `24.x` (`24.16.0` is pinned for development).
20
+ - A terminal with good Unicode support. JetBrainsMono Nerd Font is recommended for the default icon theme.
21
+ - Optional for voice input: SoX (`rec`/`sox`), `ffmpeg`, or Linux `arecord`.
22
+
23
+ Development uses `mise` when available. `.node-version` and `.nvmrc` are also provided for other Node version managers.
24
+
25
+ ## Installation
26
+
27
+ After publication, install Pix globally from npm:
28
+
29
+ ```bash
30
+ npm install -g pi-ui-extend --ignore-scripts
31
+ ```
32
+
33
+ The published package contains built JavaScript, the `pix` launcher, renderer extensions, documentation, and the bundled `pi-tools-suite` extension payload. Users do not need to clone the repository or build TypeScript locally.
34
+
35
+ On startup, Pix ensures the bundled suite is available at:
36
+
37
+ ```text
38
+ ~/.pi/agent/extensions/pi-tools-suite
39
+ ```
40
+
41
+ If that path already contains a real directory, Pix leaves it untouched. If it is a Pix-managed symlink, Pix refreshes it as needed.
42
+
43
+ ## Quick start
44
+
45
+ ```bash
46
+ pix --cwd /path/to/workspace
47
+ ```
48
+
49
+ If `--cwd` is omitted, Pix uses the current directory as the agent workspace.
50
+
51
+ Useful flags:
52
+
53
+ - `--cwd <path>`: workspace used for Pi tools, settings, resources, and sessions.
54
+ - `--no-session`: run with an in-memory SDK session.
55
+ - `--model <provider/model[:thinking]>`: request a specific model, for example `anthropic/claude-sonnet-4-20250514:medium`.
56
+ - `--reload-on-build`: restart the running Pix process after a successful watcher build.
57
+
58
+ ## Updating Pix
59
+
60
+ Inside Pix, run:
61
+
62
+ ```text
63
+ /update
64
+ ```
65
+
66
+ This checks the currently installed package version without mutating the running process.
67
+
68
+ From a shell:
69
+
70
+ ```bash
71
+ pix update --check # check only
72
+ pix update # update a package-manager install
73
+ pix update --force # reinstall even when the check cannot prove an update is needed
74
+ ```
75
+
76
+ `pix update` updates the Pix npm package, pinned Pi SDK dependencies, renderer-owned extensions, and the bundled `pi-tools-suite` payload. The next Pix startup refreshes the extension link in `~/.pi/agent/extensions/pi-tools-suite`.
77
+
78
+ Update checks respect:
79
+
80
+ - `PI_OFFLINE=1`
81
+ - `PI_SKIP_VERSION_CHECK=1`
82
+ - `PIX_SKIP_VERSION_CHECK=1`
83
+
84
+ Pi packages managed separately by Pi still use Pi's package manager:
85
+
86
+ ```bash
87
+ pi update --extensions
88
+ # or
89
+ pi update
90
+ ```
91
+
92
+ ## Local development
93
+
94
+ Install dependencies:
95
+
96
+ ```bash
97
+ npm install --ignore-scripts
98
+ ```
99
+
100
+ Link the local `pix` command:
101
+
102
+ ```bash
103
+ npm run link:pix
104
+ ```
105
+
106
+ Run Pix against a workspace:
107
+
108
+ ```bash
109
+ pix --cwd /path/to/workspace
110
+ ```
111
+
112
+ During UI development, run the watcher in another terminal:
113
+
114
+ ```bash
115
+ npm run watch:pix
116
+ ```
117
+
118
+ Each running instance can reload after successful builds:
119
+
120
+ ```bash
121
+ PIX_RELOAD_ON_BUILD=1 pix --cwd /path/to/workspace
122
+ # or
123
+ pix --reload-on-build --cwd /path/to/workspace
124
+ ```
125
+
126
+ For a one-shot dev launch that rebuilds and refreshes the global link first:
127
+
128
+ ```bash
129
+ npm run dev -- --cwd /path/to/workspace
130
+ ```
131
+
132
+ Before committing code changes, run:
133
+
134
+ ```bash
135
+ npm run check
136
+ ```
137
+
138
+ ## Configuration
139
+
140
+ Useful environment variables:
141
+
142
+ - `PIX_DISABLE_TERMINAL_OUTPUT_BUFFER=1` or `PIX_TERMINAL_OUTPUT_BUFFER=0`: disable Pix terminal output region buffering.
143
+ - `PIX_USE_FALLBACK_ICONS=1` or `PIX_ICON_THEME=fallback`: use plain fallback icons when Nerd Font glyphs are unavailable.
144
+ - `PIX_ICON_THEME=nerdFont`: force the Nerd Font icon theme.
145
+ - `PIX_ANTIGRAVITY_GOOGLE_CLIENT_ID` / `ANTIGRAVITY_GOOGLE_CLIENT_ID`: Google OAuth client ID used for Antigravity quota/login integrations.
146
+ - `PIX_ANTIGRAVITY_GOOGLE_CLIENT_SECRET` / `ANTIGRAVITY_GOOGLE_CLIENT_SECRET`: Google OAuth client secret used for Antigravity quota/login integrations.
147
+
148
+ Pix user configuration is read from:
149
+
150
+ ```text
151
+ ~/.config/pi/pix.jsonc
152
+ ```
153
+
154
+ Example fallback icon configuration:
155
+
156
+ ```jsonc
157
+ {
158
+ "iconTheme": "fallback"
159
+ }
160
+ ```
161
+
162
+ ## Controls
163
+
164
+ - `Enter`: submit the prompt.
165
+ - `!command`: run a local shell command in an in-chat ephemeral block. Output is visible only in the local UI and is not saved to the SDK session.
166
+ - While a `!command` shell is running: `Enter` sends editor text to shell stdin; `Ctrl+C` interrupts the shell process.
167
+ - `!!command`: run a shell command in the raw interactive terminal for full-screen or TTY programs.
168
+ - `Ctrl+C`: exit Pix, or abort the running agent first.
169
+ - `Ctrl+D`: exit when the input line is empty.
170
+ - `Ctrl+L`: redraw.
171
+ - `Ctrl+G`: start or stop local Vosk voice input.
172
+ - `PageUp` / `PageDown`: scroll the conversation.
173
+ - Mouse wheel: scroll the conversation.
174
+ - Click a tool row: expand or collapse that tool result.
175
+ - Click the right-aligned microphone/language status widget: toggle voice input and switch Russian/English dictation.
176
+
177
+ ## Voice input
178
+
179
+ Pix can dictate into the prompt through local Vosk. The first start for each language downloads the small model into the gitignored `models/vosk/` directory inside this project:
180
+
181
+ - Russian: `vosk-model-small-ru-0.22`
182
+ - English: `vosk-model-small-en-us-0.15`
183
+
184
+ Runtime requirements:
185
+
186
+ - Optional npm package `vosk`. Pix installs or rebuilds it automatically with scripts enabled on first voice start if the native binding is missing.
187
+ - A local recorder: SoX (`rec`/`sox`) preferred, or `ffmpeg`; Linux also supports `arecord`.
188
+ - JetBrainsMono Nerd Font for default app icons. On macOS, Pix checks this at startup and can install the Homebrew cask `font-jetbrains-mono-nerd-font` when it is missing.
189
+
190
+ If your terminal renders missing glyphs, start Pix with `PIX_USE_FALLBACK_ICONS=1` or set `iconTheme` to `fallback` in `~/.config/pi/pix.jsonc`.
191
+
192
+ ## Pix extension SDK
193
+
194
+ Pix exposes a small SDK surface for extensions that need renderer-specific UI features. Import types and helpers from `pi-ui-extend/sdk`:
195
+
196
+ ```ts
197
+ import type {
198
+ ExtensionWidgetFactory,
199
+ PixExtensionUIContext,
200
+ PixMenuItem,
201
+ ToastKind,
202
+ ToastNotifier,
203
+ } from "pi-ui-extend/sdk";
204
+ import { TOAST_KINDS, isToastKind } from "pi-ui-extend/sdk";
205
+ ```
206
+
207
+ The same public entrypoint is also exported from `pi-ui-extend`, but `pi-ui-extend/sdk` is the preferred explicit import path for extension-facing APIs.
208
+
209
+ ### Toasts
210
+
211
+ Pix toasts are stackable by design: showing a new toast does not replace existing visible toasts. Each toast auto-hides independently after the renderer timeout.
212
+
213
+ Supported toast kinds:
214
+
215
+ - `success`
216
+ - `error`
217
+ - `warning`
218
+ - `info`
219
+
220
+ Use `ctx.ui.toast` from a Pix extension UI context:
221
+
222
+ ```ts
223
+ export async function activate(ctx: { ui: PixExtensionUIContext }) {
224
+ ctx.ui.toast.success("Saved");
225
+ ctx.ui.toast.error("Build failed");
226
+ ctx.ui.toast.warning("Using fallback model");
227
+ ctx.ui.toast.info("Index refreshed");
228
+
229
+ ctx.ui.toast.show("Custom message", "success");
230
+ }
231
+ ```
232
+
233
+ `ctx.ui.notify(message, kind)` also maps to Pix toasts and accepts the same `ToastKind` values:
234
+
235
+ ```ts
236
+ ctx.ui.notify("Retry succeeded", "success");
237
+ ctx.ui.notify("Check config", "warning");
238
+ ```
239
+
240
+ ### Rendering above the input
241
+
242
+ Use `ctx.ui.aboveInput` to render extension-controlled rows above the prompt editor, in the same area where Pix shows built-in todo and subagents panels.
243
+
244
+ ```ts
245
+ ctx.ui.aboveInput.set("my-extension/status", [
246
+ "My extension is watching files",
247
+ "Press /my-command for details",
248
+ ]);
249
+
250
+ ctx.ui.aboveInput.clear("my-extension/status");
251
+ ```
252
+
253
+ For dynamic content, pass a widget factory. It receives a `WidgetTuiHandle` with `requestRender()`, `showToast()`, `toast`, `showMenu()`, and `menu` helpers, plus the current theme.
254
+
255
+ ```ts
256
+ const widget: ExtensionWidgetFactory = (tui) => ({
257
+ render: () => ["Dynamic extension row"],
258
+ invalidate: () => tui.requestRender(),
259
+ });
260
+
261
+ ctx.ui.renderAboveInput("my-extension/dynamic", widget);
262
+ ```
263
+
264
+ The lower-level `ctx.ui.setWidget(key, content, { placement })` API is still available. `aboveInput` is the preferred Pix SDK wrapper for rows above the input. Use `placement: "belowEditor"` only when you explicitly need rows below the prompt editor.
265
+
266
+ ### Menus
267
+
268
+ Use `ctx.ui.menu.show()` or `ctx.ui.showMenu()` to open a Pix popup menu. The promise resolves to the selected item value, or `undefined` when the menu is cancelled.
269
+
270
+ ```ts
271
+ const choice = await ctx.ui.menu.show<string>([
272
+ { value: "copy", label: "Copy", description: "Copy result" },
273
+ { value: "open", label: "Open", description: "Open in editor" },
274
+ { value: "delete", label: "Delete", description: "Remove item", variant: "error" },
275
+ ], {
276
+ title: "Choose an action",
277
+ placeholder: "Filter actions",
278
+ });
279
+
280
+ if (choice === "copy") ctx.ui.toast.success("Copied");
281
+ ```
282
+
283
+ Menu items are searchable by label and `keywords` by default. Pass `searchable: false` to disable filtering. `ctx.ui.select(title, options)` is implemented on top of the same Pix menu renderer for simple string choices.
284
+
285
+ ## Release process
286
+
287
+ Maintainers publish a new npm version with:
288
+
289
+ ```bash
290
+ npm run publish-npm # patch release
291
+ npm run publish-npm -- minor # minor release
292
+ npm run publish-npm -- major # major release
293
+ ```
294
+
295
+ The publish command requires a clean `master`, runs release checks, bumps the root package version, smoke-tests the packed tarball, and pushes the release tag. GitHub Actions publishes tagged releases to npm using the `NPM_TOKEN` repository secret.
296
+
297
+ For the full release checklist, see [docs/release.md](docs/release.md).
298
+
299
+ ## Current limitations
300
+
301
+ Pix is actively evolving. Known gaps include:
302
+
303
+ - Text selection/copy support in the custom renderer.
304
+ - Full prompt editor parity with mature terminal editors.
305
+ - Dedicated session picker/fork UI.
306
+ - Dedicated model picker UI.
307
+ - Extension dialog rendering beyond SDK defaults.
package/bin/pix.mjs ADDED
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { existsSync, readdirSync, statSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const requiredNodeMajor = 24;
8
+ const launcherPath = fileURLToPath(import.meta.url);
9
+ const mainPath = fileURLToPath(new URL("../dist/main.js", import.meta.url));
10
+ const updatePath = fileURLToPath(new URL("../dist/app/update.js", import.meta.url));
11
+ const distPath = dirname(mainPath);
12
+ const rawArgs = process.argv.slice(2);
13
+ const childArgs = [];
14
+ let reloadOnBuild = truthyEnv(process.env.PIX_RELOAD_ON_BUILD);
15
+
16
+ if (currentNodeMajor() !== requiredNodeMajor && process.env.PIX_NODE24_REEXEC !== "1") {
17
+ await reexecWithNode24(rawArgs);
18
+ }
19
+
20
+ for (const arg of rawArgs) {
21
+ if (arg === "--reload-on-build") {
22
+ reloadOnBuild = true;
23
+ continue;
24
+ }
25
+ if (arg === "--no-reload-on-build") {
26
+ reloadOnBuild = false;
27
+ continue;
28
+ }
29
+ childArgs.push(arg);
30
+ }
31
+
32
+ if (childArgs[0] === "update") {
33
+ if (!existsSync(updatePath)) {
34
+ console.error("pix update is not built yet. Run `npm run build:pix` or update from a published package.");
35
+ process.exit(1);
36
+ }
37
+ const { runPixUpdateCli } = await import(new URL("../dist/app/update.js", import.meta.url));
38
+ process.exit(await runPixUpdateCli(childArgs.slice(1)));
39
+ }
40
+
41
+ if (!existsSync(mainPath)) {
42
+ console.error("pix is not built yet. Run `npm run build:pix` or `npm run watch:pix`.");
43
+ process.exit(1);
44
+ }
45
+
46
+ let child = undefined;
47
+ let reloadTimer = undefined;
48
+ let distPollTimer = undefined;
49
+ let distSnapshot = snapshotDist();
50
+ let restarting = false;
51
+ let shuttingDown = false;
52
+
53
+ startChild();
54
+ if (reloadOnBuild) startDistPolling();
55
+
56
+ for (const signal of ["SIGINT", "SIGTERM"]) {
57
+ process.on(signal, () => {
58
+ shuttingDown = true;
59
+ stopDistPolling();
60
+ child?.kill(signal);
61
+ });
62
+ }
63
+
64
+ function truthyEnv(value) {
65
+ if (!value) return false;
66
+ return !["0", "false", "no", "off"].includes(value.toLowerCase());
67
+ }
68
+
69
+ function currentNodeMajor() {
70
+ return Number.parseInt(process.versions.node.split(".")[0] ?? "", 10);
71
+ }
72
+
73
+ async function reexecWithNode24(args) {
74
+ console.error(`[pix] switching from Node ${process.versions.node} to Node 24.16.0`);
75
+ const candidates = node24Candidates(args);
76
+
77
+ for (const candidate of candidates) {
78
+ const result = await runNode24Candidate(candidate.command, candidate.args);
79
+ if (!result.launched) continue;
80
+ if (result.signal) process.exitCode = result.signal === "SIGINT" ? 130 : result.signal === "SIGTERM" ? 143 : 1;
81
+ else process.exitCode = result.code ?? 1;
82
+ process.exit();
83
+ }
84
+
85
+ console.error("[pix] Node 24 is required. Install/use it with `mise install node@24.16.0` or set PIX_NODE24=/path/to/node24.");
86
+ process.exit(1);
87
+ }
88
+
89
+ function node24Candidates(args) {
90
+ const envNode = process.env.PIX_NODE24;
91
+ return [
92
+ ...(envNode ? [{ command: envNode, args: [launcherPath, ...args] }] : []),
93
+ { command: "mise", args: ["exec", "node@24.16.0", "--", "node", launcherPath, ...args] },
94
+ { command: "node24", args: [launcherPath, ...args] },
95
+ { command: "node-24", args: [launcherPath, ...args] },
96
+ ];
97
+ }
98
+
99
+ async function runNode24Candidate(command, args) {
100
+ return await new Promise((resolve) => {
101
+ const child = spawn(command, args, {
102
+ stdio: "inherit",
103
+ env: { ...process.env, PIX_NODE24_REEXEC: "1" },
104
+ });
105
+
106
+ child.once("error", (error) => {
107
+ if (error && error.code === "ENOENT") resolve({ launched: false });
108
+ else {
109
+ console.error(error?.message ?? String(error));
110
+ resolve({ launched: true, code: 1 });
111
+ }
112
+ });
113
+ child.once("exit", (code, signal) => resolve({ launched: true, code, signal }));
114
+ });
115
+ }
116
+
117
+ function startChild() {
118
+ child = spawn(process.execPath, [mainPath, ...childArgs], {
119
+ stdio: "inherit",
120
+ });
121
+
122
+ child.on("error", (error) => {
123
+ console.error(error.message);
124
+ process.exitCode = 1;
125
+ });
126
+
127
+ child.on("exit", (code, signal) => {
128
+ child = undefined;
129
+ if (restarting) return;
130
+
131
+ shuttingDown = true;
132
+ stopDistPolling();
133
+ if (signal) {
134
+ process.exitCode = signal === "SIGINT" ? 130 : signal === "SIGTERM" ? 143 : 1;
135
+ return;
136
+ }
137
+ process.exitCode = code ?? 1;
138
+ });
139
+ }
140
+
141
+ function startDistPolling() {
142
+ const pollInterval = Number(process.env.PIX_RELOAD_POLL_MS ?? 1000);
143
+ distPollTimer = setInterval(() => {
144
+ const nextSnapshot = snapshotDist();
145
+ if (nextSnapshot === distSnapshot) return;
146
+
147
+ distSnapshot = nextSnapshot;
148
+ queueReload();
149
+ }, Number.isFinite(pollInterval) && pollInterval > 0 ? pollInterval : 1000);
150
+ }
151
+
152
+ function stopDistPolling() {
153
+ if (reloadTimer) clearTimeout(reloadTimer);
154
+ if (distPollTimer) clearInterval(distPollTimer);
155
+ reloadTimer = undefined;
156
+ distPollTimer = undefined;
157
+ }
158
+
159
+ function queueReload() {
160
+ if (shuttingDown) return;
161
+ if (reloadTimer) clearTimeout(reloadTimer);
162
+ reloadTimer = setTimeout(() => {
163
+ reloadTimer = undefined;
164
+ restartChild();
165
+ }, 250);
166
+ }
167
+
168
+ function restartChild() {
169
+ if (shuttingDown) return;
170
+ if (!child) {
171
+ startChild();
172
+ return;
173
+ }
174
+
175
+ restarting = true;
176
+ const currentChild = child;
177
+ currentChild.once("exit", () => {
178
+ restarting = false;
179
+ if (!shuttingDown) startChild();
180
+ });
181
+ console.error("[pix] dist changed; restarting renderer");
182
+ currentChild.kill("SIGTERM");
183
+ }
184
+
185
+ function snapshotDist() {
186
+ let newestMtime = 0;
187
+ let runtimeFileCount = 0;
188
+ const pendingDirs = [distPath];
189
+
190
+ while (pendingDirs.length > 0) {
191
+ const currentDir = pendingDirs.pop();
192
+ if (!currentDir) continue;
193
+
194
+ let entries;
195
+ try {
196
+ entries = readdirSync(currentDir, { withFileTypes: true });
197
+ } catch {
198
+ continue;
199
+ }
200
+
201
+ for (const entry of entries) {
202
+ const entryPath = join(currentDir, entry.name);
203
+ if (entry.isDirectory()) {
204
+ pendingDirs.push(entryPath);
205
+ continue;
206
+ }
207
+ if (!entry.isFile() || !entry.name.endsWith(".js")) continue;
208
+
209
+ runtimeFileCount += 1;
210
+ try {
211
+ newestMtime = Math.max(newestMtime, statSync(entryPath).mtimeMs);
212
+ } catch {
213
+ // If tsc is replacing a file while we scan, the next poll will see the final state.
214
+ }
215
+ }
216
+ }
217
+
218
+ return `${runtimeFileCount}:${newestMtime}`;
219
+ }
@@ -0,0 +1,96 @@
1
+ import type { AppOptions } from "./types.js";
2
+ export declare class PiUiExtendApp {
3
+ private readonly entries;
4
+ private readonly options;
5
+ private readonly theme;
6
+ private readonly blinkController;
7
+ private readonly screenStyler;
8
+ private readonly statusController;
9
+ private readonly statusLineRenderer;
10
+ private readonly modelUsageController;
11
+ private readonly tabsController;
12
+ private readonly tabLineRenderer;
13
+ private readonly editorLayoutRenderer;
14
+ private readonly renderController;
15
+ private readonly sessionLifecycle;
16
+ private readonly conversationViewport;
17
+ private readonly scrollController;
18
+ private readonly extensionUiController;
19
+ private readonly extensionActions;
20
+ private readonly pixConfig;
21
+ private readonly outputFilters;
22
+ private readonly suppressPendingDcpIdMetadata;
23
+ private readonly commandController;
24
+ private readonly inputActions;
25
+ private readonly inputController;
26
+ private readonly menuItems;
27
+ private readonly subagentsWidgetController;
28
+ private readonly todoWidgetController;
29
+ private readonly terminalController;
30
+ private readonly toastController;
31
+ private readonly nerdFontController;
32
+ private readonly popupActions;
33
+ private readonly promptEnhancer;
34
+ private readonly mouseController;
35
+ private readonly popupMenus;
36
+ private readonly voiceController;
37
+ private readonly sessionEvents;
38
+ private readonly shellController;
39
+ private readonly queuedMessages;
40
+ private readonly workspaceActions;
41
+ private readonly slashCommands;
42
+ private readonly toastNotifier;
43
+ private readonly extensionShutdownHandler;
44
+ private runtime;
45
+ private readonly inputEditor;
46
+ private readonly requestHistory;
47
+ /** Shortcut: get/set the editor text as a plain string. */
48
+ private get input();
49
+ private set input(value);
50
+ private running;
51
+ private todoPanelExpanded;
52
+ private subagentsPanelExpanded;
53
+ private allThinkingExpanded;
54
+ private superCompactTools;
55
+ private voicePartialText;
56
+ private resumeSessions;
57
+ private resumeLoading;
58
+ constructor(options: AppOptions);
59
+ start(): Promise<void>;
60
+ private bindCurrentSession;
61
+ private activateRuntime;
62
+ private createExtensionEventBus;
63
+ private handleTerminalBellAttention;
64
+ private afterSessionReplacement;
65
+ private requireRuntime;
66
+ private restoreSessionStatus;
67
+ private setInput;
68
+ private resetInputAfterProgrammaticEdit;
69
+ private restoreTabInputState;
70
+ private clearPersistedInputDraft;
71
+ private insertVoiceTranscript;
72
+ private setVoicePartialTranscript;
73
+ private addVoiceSystemMessage;
74
+ private resetSessionView;
75
+ private loadSessionHistory;
76
+ private openSearchResultInNewTab;
77
+ private loadSessionHistoryAsync;
78
+ private handleSessionEvent;
79
+ private findEntry;
80
+ private findUserEntry;
81
+ private touchEntry;
82
+ private addEntry;
83
+ private setStatus;
84
+ private setSessionStatus;
85
+ private setSessionActivity;
86
+ private toolDefaultExpanded;
87
+ private stopBlinking;
88
+ private stop;
89
+ private refreshModelUsageStatusFromClick;
90
+ private showToast;
91
+ private clearToastTimers;
92
+ private render;
93
+ private renderStatusLine;
94
+ private terminalColumns;
95
+ private terminalRows;
96
+ }