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,349 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
4
+ import { applyEdits, modify, parse as parseJsonc } from "jsonc-parser";
5
+ import { ensurePiToolsSuiteUserConfig, getPiToolsSuiteUserConfigPath } from "../config";
6
+ import { publishStartupSection } from "../startup-section";
7
+
8
+ type PromptCommand = {
9
+ description?: string;
10
+ prompt: string;
11
+ };
12
+
13
+ type PromptCommandsConfig = {
14
+ commands: Record<string, PromptCommand>;
15
+ };
16
+
17
+ const CONFIG_KEY = "promptCommands";
18
+ const COMMANDS_KEY = "commands";
19
+ const MENU_COMMAND = "prompt-commands";
20
+ const CREATE_LABEL = "+ Create command";
21
+ const RUN_LABEL = "▶ Run command";
22
+ const EDIT_LABEL = "✎ Edit command";
23
+ const RENAME_LABEL = "↪ Rename command";
24
+ const DELETE_LABEL = "⌫ Delete command";
25
+ const LIST_LABEL = "List commands";
26
+ const PATH_LABEL = "Show config path";
27
+ const NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;
28
+ const RESERVED_COMMAND_NAMES = new Set([
29
+ MENU_COMMAND,
30
+ "help",
31
+ "model",
32
+ "settings",
33
+ "reload",
34
+ "new",
35
+ "resume",
36
+ "fork",
37
+ "clone",
38
+ "tree",
39
+ "compact",
40
+ "login",
41
+ "logout",
42
+ "tools",
43
+ ]);
44
+
45
+ function getConfigPath(): string {
46
+ return getPiToolsSuiteUserConfigPath();
47
+ }
48
+
49
+ function isRecord(value: unknown): value is Record<string, unknown> {
50
+ return value !== null && typeof value === "object" && !Array.isArray(value);
51
+ }
52
+
53
+ function normalizeCommand(value: unknown): PromptCommand | undefined {
54
+ if (!isRecord(value)) return undefined;
55
+ if (typeof value.prompt !== "string" || !value.prompt.trim()) return undefined;
56
+ const command: PromptCommand = { prompt: value.prompt };
57
+ if (typeof value.description === "string" && value.description.trim()) {
58
+ command.description = value.description.trim();
59
+ }
60
+ return command;
61
+ }
62
+
63
+ function normalizeCommands(rawCommands: Record<string, unknown>): Record<string, PromptCommand> {
64
+ const commands: Record<string, PromptCommand> = {};
65
+ for (const [rawName, rawCommand] of Object.entries(rawCommands)) {
66
+ const name = rawName.trim();
67
+ if (!isValidCommandName(name)) continue;
68
+ const command = normalizeCommand(rawCommand);
69
+ if (command) commands[name] = command;
70
+ }
71
+ return commands;
72
+ }
73
+
74
+ function loadPromptCommandsConfig(): PromptCommandsConfig {
75
+ const configPath = getConfigPath();
76
+ if (!existsSync(configPath)) return { commands: {} };
77
+
78
+ const parsed = parseJsonc(readFileSync(configPath, "utf-8")) as unknown;
79
+ if (!isRecord(parsed)) throw new Error(`${configPath} must contain an object.`);
80
+
81
+ const rawPromptCommands = parsed[CONFIG_KEY];
82
+ if (rawPromptCommands === undefined) return { commands: {} };
83
+ if (!isRecord(rawPromptCommands)) throw new Error(`${configPath} ${CONFIG_KEY} must contain an object.`);
84
+
85
+ const rawCommands = rawPromptCommands[COMMANDS_KEY];
86
+ if (rawCommands === undefined) return { commands: {} };
87
+ if (!isRecord(rawCommands)) throw new Error(`${configPath} ${CONFIG_KEY}.${COMMANDS_KEY} must contain an object.`);
88
+
89
+ return { commands: normalizeCommands(rawCommands) };
90
+ }
91
+
92
+ function promptCommandsConfigForSave(config: PromptCommandsConfig): Record<string, unknown> {
93
+ return { [COMMANDS_KEY]: config.commands };
94
+ }
95
+
96
+ function writeSharedConfigValue(path: (string | number)[], value: unknown): void {
97
+ const configPath = getConfigPath();
98
+ ensurePiToolsSuiteUserConfig();
99
+ const original = existsSync(configPath) ? readFileSync(configPath, "utf-8") : "{}\n";
100
+ const edits = modify(original, path, value, {
101
+ formattingOptions: { insertSpaces: true, tabSize: 2, eol: "\n" },
102
+ });
103
+ const updated = applyEdits(original, edits);
104
+ mkdirSync(dirname(configPath), { recursive: true });
105
+ writeFileSync(configPath, updated.endsWith("\n") ? updated : `${updated}\n`, "utf-8");
106
+ }
107
+
108
+ function savePromptCommandsConfig(config: PromptCommandsConfig): void {
109
+ writeSharedConfigValue([CONFIG_KEY], promptCommandsConfigForSave(config));
110
+ }
111
+
112
+ function isValidCommandName(name: string): boolean {
113
+ return NAME_PATTERN.test(name) && !RESERVED_COMMAND_NAMES.has(name);
114
+ }
115
+
116
+ function validateCommandName(pi: ExtensionAPI, name: string, existingName?: string): string | undefined {
117
+ if (!NAME_PATTERN.test(name)) return "Use 1–64 chars: letters, numbers, _ or -, starting with a letter.";
118
+ if (RESERVED_COMMAND_NAMES.has(name)) return `/${name} is reserved.`;
119
+
120
+ const commands = safeGetCommands(pi);
121
+ const collides = commands.some((command) => command.name === name && name !== existingName);
122
+ if (collides) return `/${name} already exists.`;
123
+ return undefined;
124
+ }
125
+
126
+ function safeGetCommands(pi: ExtensionAPI): Array<{ name: string }> {
127
+ try {
128
+ const commands = typeof pi?.getCommands === "function" ? pi.getCommands() : [];
129
+ return Array.isArray(commands) ? commands.filter((command) => typeof command?.name === "string") : [];
130
+ } catch {
131
+ return [];
132
+ }
133
+ }
134
+
135
+ function sortedCommandNames(commands: Record<string, PromptCommand>): string[] {
136
+ return Object.keys(commands).sort((a, b) => a.localeCompare(b));
137
+ }
138
+
139
+ function notify(ctx: ExtensionContext, message: string, type: "info" | "warning" | "error" = "info"): void {
140
+ if (ctx.hasUI) ctx.ui.notify(message, type);
141
+ else console.log(message);
142
+ }
143
+
144
+ function commandLabel(name: string, command: PromptCommand): string {
145
+ const description = command.description ? ` — ${command.description}` : "";
146
+ return `/${name}${description}`;
147
+ }
148
+
149
+ function commandSummary(name: string, command: PromptCommand): string {
150
+ const description = command.description ? ` — ${command.description}` : "";
151
+ return `/${name}${description}\n ${truncate(command.prompt.replace(/\s+/g, " "), 120)}`;
152
+ }
153
+
154
+ function truncate(value: string, maxLength: number): string {
155
+ return value.length <= maxLength ? value : `${value.slice(0, Math.max(0, maxLength - 1))}…`;
156
+ }
157
+
158
+ function renderPrompt(command: PromptCommand, ctx: ExtensionContext): string {
159
+ let prompt = command.prompt;
160
+ prompt = prompt.split("{cwd}").join(ctx.cwd).split("{{cwd}}").join(ctx.cwd);
161
+ return prompt;
162
+ }
163
+
164
+ async function runPromptCommand(pi: ExtensionAPI, ctx: ExtensionCommandContext, name: string, command: PromptCommand): Promise<void> {
165
+ const prompt = renderPrompt(command, ctx).trim();
166
+ if (!prompt) return notify(ctx, `/${name} has an empty prompt.`, "error");
167
+
168
+ await ctx.waitForIdle();
169
+ pi.sendUserMessage(prompt);
170
+ }
171
+
172
+ async function reloadAfterConfigChange(ctx: ExtensionCommandContext, message: string): Promise<void> {
173
+ notify(ctx, `${message}\nReloading commands from ${getConfigPath()}…`);
174
+ await ctx.reload();
175
+ }
176
+
177
+ async function selectCommand(ctx: ExtensionContext, title: string, commands: Record<string, PromptCommand>): Promise<string | undefined> {
178
+ if (!ctx.hasUI) {
179
+ notify(ctx, "Prompt command menu requires interactive UI.", "warning");
180
+ return undefined;
181
+ }
182
+
183
+ const names = sortedCommandNames(commands);
184
+ if (names.length === 0) {
185
+ notify(ctx, `No prompt commands yet. Config: ${getConfigPath()}`, "warning");
186
+ return undefined;
187
+ }
188
+
189
+ const labels = names.map((name) => commandLabel(name, commands[name]));
190
+ const labelToName = new Map(labels.map((label, index) => [label, names[index]]));
191
+ const selected = await ctx.ui.select(title, labels);
192
+ return selected ? labelToName.get(selected) : undefined;
193
+ }
194
+
195
+ async function createOrEditCommand(pi: ExtensionAPI, ctx: ExtensionCommandContext, existingName?: string): Promise<void> {
196
+ if (!ctx.hasUI) return notify(ctx, "Prompt command editor requires interactive UI.", "warning");
197
+
198
+ const config = loadPromptCommandsConfig();
199
+ const existing = existingName ? config.commands[existingName] : undefined;
200
+ const name = existingName ?? (await ctx.ui.input("Slash command name (without /)", "review"))?.trim();
201
+ if (!name) return;
202
+
203
+ const nameError = validateCommandName(pi, name, existingName);
204
+ if (nameError) return notify(ctx, nameError, "error");
205
+
206
+ const description = (await ctx.ui.input("Description", existing?.description ?? "Run a saved prompt"))?.trim();
207
+ const initialPrompt = existing?.prompt ?? "Use this saved prompt.";
208
+ const prompt = await ctx.ui.editor(`Prompt for /${name}`, initialPrompt);
209
+ if (prompt === undefined) return;
210
+ if (!prompt.trim()) return notify(ctx, "Prompt cannot be empty.", "error");
211
+
212
+ config.commands[name] = {
213
+ ...(description ? { description } : {}),
214
+ prompt,
215
+ };
216
+ savePromptCommandsConfig(config);
217
+ await reloadAfterConfigChange(ctx, `Saved /${name}.`);
218
+ }
219
+
220
+ async function editCommand(pi: ExtensionAPI, ctx: ExtensionCommandContext): Promise<void> {
221
+ const config = loadPromptCommandsConfig();
222
+ const name = await selectCommand(ctx, "Edit prompt command", config.commands);
223
+ if (!name) return;
224
+ await createOrEditCommand(pi, ctx, name);
225
+ }
226
+
227
+ async function renameCommand(pi: ExtensionAPI, ctx: ExtensionCommandContext): Promise<void> {
228
+ if (!ctx.hasUI) return notify(ctx, "Prompt command editor requires interactive UI.", "warning");
229
+
230
+ const config = loadPromptCommandsConfig();
231
+ const oldName = await selectCommand(ctx, "Rename prompt command", config.commands);
232
+ if (!oldName) return;
233
+
234
+ const newName = (await ctx.ui.input(`New name for /${oldName}`, oldName))?.trim();
235
+ if (!newName || newName === oldName) return;
236
+
237
+ const nameError = validateCommandName(pi, newName, oldName);
238
+ if (nameError) return notify(ctx, nameError, "error");
239
+
240
+ config.commands[newName] = config.commands[oldName];
241
+ delete config.commands[oldName];
242
+ savePromptCommandsConfig(config);
243
+ await reloadAfterConfigChange(ctx, `Renamed /${oldName} to /${newName}.`);
244
+ }
245
+
246
+ async function deleteCommand(ctx: ExtensionCommandContext): Promise<void> {
247
+ if (!ctx.hasUI) return notify(ctx, "Prompt command editor requires interactive UI.", "warning");
248
+
249
+ const config = loadPromptCommandsConfig();
250
+ const name = await selectCommand(ctx, "Delete prompt command", config.commands);
251
+ if (!name) return;
252
+
253
+ const confirmed = await ctx.ui.confirm("Delete prompt command?", `Delete /${name} from ${getConfigPath()}?`);
254
+ if (!confirmed) return;
255
+
256
+ delete config.commands[name];
257
+ savePromptCommandsConfig(config);
258
+ await reloadAfterConfigChange(ctx, `Deleted /${name}.`);
259
+ }
260
+
261
+ function listCommands(ctx: ExtensionContext): void {
262
+ const commands = loadPromptCommandsConfig().commands;
263
+ const names = sortedCommandNames(commands);
264
+ if (names.length === 0) return notify(ctx, `No prompt commands. Config: ${getConfigPath()}`, "warning");
265
+ notify(ctx, [`Prompt commands (${getConfigPath()}):`, ...names.map((name) => commandSummary(name, commands[name]))].join("\n"));
266
+ }
267
+
268
+ async function runFromMenu(pi: ExtensionAPI, ctx: ExtensionCommandContext): Promise<void> {
269
+ if (!ctx.hasUI) return notify(ctx, "Prompt command menu requires interactive UI.", "warning");
270
+
271
+ const config = loadPromptCommandsConfig();
272
+ const name = await selectCommand(ctx, "Run prompt command", config.commands);
273
+ if (!name) return;
274
+
275
+ await runPromptCommand(pi, ctx, name, config.commands[name]);
276
+ }
277
+
278
+ async function showMenu(pi: ExtensionAPI, ctx: ExtensionCommandContext): Promise<void> {
279
+ if (!ctx.hasUI) return notify(ctx, "Prompt command menu requires interactive UI.", "warning");
280
+
281
+ const action = await ctx.ui.select("Prompt command builder", [
282
+ RUN_LABEL,
283
+ CREATE_LABEL,
284
+ EDIT_LABEL,
285
+ RENAME_LABEL,
286
+ DELETE_LABEL,
287
+ LIST_LABEL,
288
+ PATH_LABEL,
289
+ ]);
290
+
291
+ if (action === RUN_LABEL) await runFromMenu(pi, ctx);
292
+ else if (action === CREATE_LABEL) await createOrEditCommand(pi, ctx);
293
+ else if (action === EDIT_LABEL) await editCommand(pi, ctx);
294
+ else if (action === RENAME_LABEL) await renameCommand(pi, ctx);
295
+ else if (action === DELETE_LABEL) await deleteCommand(ctx);
296
+ else if (action === LIST_LABEL) listCommands(ctx);
297
+ else if (action === PATH_LABEL) notify(ctx, getConfigPath());
298
+ }
299
+
300
+ function publishPromptCommandsStartupSection(): void {
301
+ publishStartupSection({
302
+ id: "prompt-commands",
303
+ title: "prompt commands",
304
+ body: startupPromptCommandList(),
305
+ });
306
+ }
307
+
308
+ function startupPromptCommandList(): string {
309
+ try {
310
+ const names = sortedCommandNames(loadPromptCommandsConfig().commands);
311
+ return names.length > 0 ? names.map((name) => `/${name}`).join(", ") : "no commands";
312
+ } catch (error) {
313
+ const message = error instanceof Error ? error.message : String(error);
314
+ return `error loading prompt commands: ${message}`;
315
+ }
316
+ }
317
+
318
+ function registerDynamicPromptCommand(pi: ExtensionAPI, name: string): void {
319
+ pi.registerCommand(name, {
320
+ description: loadPromptCommandsConfig().commands[name]?.description ?? `Run saved prompt command /${name}`,
321
+ handler: async (_input, ctx) => {
322
+ const command = loadPromptCommandsConfig().commands[name];
323
+ if (!command) {
324
+ notify(ctx, `Prompt command /${name} no longer exists. Run /${MENU_COMMAND} or /reload.`, "warning");
325
+ return;
326
+ }
327
+ await runPromptCommand(pi, ctx, name, command);
328
+ },
329
+ });
330
+ }
331
+
332
+ function registerMenuCommand(pi: ExtensionAPI, name: string, description: string): void {
333
+ pi.registerCommand(name, {
334
+ description,
335
+ handler: async (_input, ctx) => {
336
+ return showMenu(pi, ctx);
337
+ },
338
+ });
339
+ }
340
+
341
+ export default function promptCommands(pi: ExtensionAPI): void {
342
+ publishPromptCommandsStartupSection();
343
+
344
+ registerMenuCommand(pi, MENU_COMMAND, "Create, edit, delete, list, and run saved prompt slash commands");
345
+
346
+ for (const name of sortedCommandNames(loadPromptCommandsConfig().commands)) {
347
+ registerDynamicPromptCommand(pi, name);
348
+ }
349
+ }