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,440 @@
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@mariozechner/pi-coding-agent"
2
+ import type { AutocompleteItem } from "@mariozechner/pi-tui"
3
+ import type { DcpState } from "./state.js"
4
+ import type { DcpConfig } from "./config.js"
5
+ import { isToolRecordProtected, markToolPruned } from "./pruner.js"
6
+ import { safeGetContextUsage } from "../context-usage.js"
7
+
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+
12
+ /** Tools whose outputs are always protected from sweep regardless of config. */
13
+ const ALWAYS_PROTECTED_TOOLS = ["compress", "write", "edit"] as const
14
+
15
+ export interface DcpCommandHooks {
16
+ onStateChanged?: (ctx: ExtensionCommandContext) => void
17
+ }
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // Formatting helpers
21
+ // ---------------------------------------------------------------------------
22
+
23
+ function fmt(n: number): string {
24
+ return n.toLocaleString()
25
+ }
26
+
27
+ // ---------------------------------------------------------------------------
28
+ // Help
29
+ // ---------------------------------------------------------------------------
30
+
31
+ const HELP_TEXT = `DCP — Dynamic Context Pruning
32
+
33
+ Commands:
34
+ /dcp context — Show context window usage breakdown
35
+ /dcp stats — Show pruning statistics for this session
36
+ /dcp sweep [N] — Prune last N tool outputs (default: all since last user msg)
37
+ /dcp manual — Show manual mode status
38
+ /dcp manual on — Enable manual mode (disable autonomous compression nudges)
39
+ /dcp manual off — Disable manual mode (enable autonomous compression nudges)
40
+ /dcp decompress — List active compression blocks
41
+ /dcp decompress N — Restore compression block N
42
+ /dcp recompress — List blocks restored by /dcp decompress
43
+ /dcp recompress N — Re-apply a user-restored compression block
44
+ /dcp compress — Trigger compression (sends compress tool invocation to LLM)`
45
+
46
+ function handleHelp(ctx: ExtensionCommandContext): void {
47
+ ctx.ui.notify(HELP_TEXT, "info")
48
+ }
49
+
50
+ // ---------------------------------------------------------------------------
51
+ // Context usage
52
+ // ---------------------------------------------------------------------------
53
+
54
+ function handleContext(ctx: ExtensionCommandContext, state: DcpState): void {
55
+ const usage = safeGetContextUsage(ctx)
56
+
57
+ const lines: string[] = []
58
+
59
+ if (usage && typeof usage.contextWindow === "number") {
60
+ if (typeof usage.tokens === "number") {
61
+ const pct = ((usage.tokens / usage.contextWindow) * 100).toFixed(1)
62
+ lines.push(
63
+ `Context Usage: ${pct}% (${fmt(usage.tokens)} / ${fmt(usage.contextWindow)} tokens)`,
64
+ )
65
+ } else {
66
+ lines.push(`Context Usage: unknown / ${fmt(usage.contextWindow)} tokens`)
67
+ }
68
+ } else {
69
+ lines.push("Context Usage: unavailable")
70
+ }
71
+
72
+ lines.push("")
73
+ lines.push("Session Stats:")
74
+ lines.push(` Tool calls tracked: ${fmt(state.toolCalls.size)}`)
75
+ lines.push(` Pruned tools: ${fmt(state.prunedToolIds.size)}`)
76
+ lines.push(` Compression blocks: ${state.compressionBlocks.filter((b) => b.active).length}`)
77
+ lines.push(` Tokens saved (estimated): ${fmt(state.tokensSaved)}`)
78
+
79
+ ctx.ui.notify(lines.join("\n"), "info")
80
+ }
81
+
82
+ // ---------------------------------------------------------------------------
83
+ // Stats
84
+ // ---------------------------------------------------------------------------
85
+
86
+ function handleStats(ctx: ExtensionCommandContext, state: DcpState): void {
87
+ const activeBlocks = state.compressionBlocks.filter((b) => b.active).length
88
+ const totalBlocks = state.compressionBlocks.length
89
+ const lines: string[] = []
90
+ lines.push("DCP Session Statistics:")
91
+ lines.push(` Tokens saved (estimated): ${fmt(state.tokensSaved)}`)
92
+ lines.push(` Total pruning operations: ${fmt(state.totalPruneCount)}`)
93
+ lines.push(` Compression blocks active: ${activeBlocks} / ${totalBlocks} total`)
94
+ lines.push(` Manual mode: ${state.manualMode ? "on" : "off"}`)
95
+
96
+ ctx.ui.notify(lines.join("\n"), "info")
97
+ }
98
+
99
+ // ---------------------------------------------------------------------------
100
+ // Sweep
101
+ // ---------------------------------------------------------------------------
102
+
103
+ async function handleSweep(
104
+ ctx: ExtensionCommandContext,
105
+ state: DcpState,
106
+ config: DcpConfig,
107
+ n: number,
108
+ ): Promise<void> {
109
+ await ctx.waitForIdle()
110
+
111
+ const branch = ctx.sessionManager.getBranch()
112
+
113
+ // Build the full set of protected tool names.
114
+ const protectedTools = new Set<string>([
115
+ ...ALWAYS_PROTECTED_TOOLS,
116
+ ...config.compress.protectedTools,
117
+ ...config.strategies.deduplication.protectedTools,
118
+ ...config.strategies.purgeErrors.protectedTools,
119
+ ...config.strategies.autoToolPruning.protectedTools,
120
+ ])
121
+
122
+ // Walk the branch (root → leaf) collecting toolCallIds in encounter order,
123
+ // and tracking where the last real user message was.
124
+ const allToolCallIds: string[] = []
125
+ const toolCallIdsSinceLastUser: string[] = []
126
+ const toolNamesByCallId = new Map<string, string>()
127
+ let lastUserMsgBranchIndex = -1
128
+
129
+ // First pass: find the last user message index.
130
+ for (let i = 0; i < branch.length; i++) {
131
+ const entry = branch[i]
132
+ if (entry.type !== "message") continue
133
+ const msg = (entry as any).message
134
+ if (msg.role === "user") {
135
+ lastUserMsgBranchIndex = i
136
+ }
137
+ }
138
+
139
+ // Second pass: collect tool result IDs in encounter order.
140
+ for (let i = 0; i < branch.length; i++) {
141
+ const entry = branch[i]
142
+ if (entry.type !== "message") continue
143
+ const msg = (entry as any).message
144
+ if (msg.role !== "toolResult") continue
145
+
146
+ const toolCallId = msg.toolCallId as string
147
+ allToolCallIds.push(toolCallId)
148
+ if (typeof msg.toolName === "string") toolNamesByCallId.set(toolCallId, msg.toolName)
149
+
150
+ if (lastUserMsgBranchIndex >= 0 && i > lastUserMsgBranchIndex) {
151
+ toolCallIdsSinceLastUser.push(toolCallId)
152
+ }
153
+ }
154
+
155
+ // Determine the candidate set based on the N argument.
156
+ let candidates: string[]
157
+ if (n > 0) {
158
+ // Last N tool results from the full session branch.
159
+ candidates = allToolCallIds.slice(-n)
160
+ } else {
161
+ // All tool results since the last user message (or everything if no user
162
+ // message exists yet — e.g. in a purely agentic session).
163
+ candidates =
164
+ lastUserMsgBranchIndex >= 0 ? toolCallIdsSinceLastUser : allToolCallIds
165
+ }
166
+
167
+ // Filter: skip already-pruned IDs and protected tool names.
168
+ const toAdd = candidates.filter((toolCallId) => {
169
+ if (state.prunedToolIds.has(toolCallId)) return false
170
+
171
+ // Tool name lookup: prefer the DCP tool-call record if tracked; fall back
172
+ // to the AgentMessage itself (msg.toolName is present on ToolResultMessage).
173
+ const record = state.toolCalls.get(toolCallId)
174
+ const toolName = record?.toolName ?? toolNamesByCallId.get(toolCallId)
175
+
176
+ if (record && isToolRecordProtected(record, config, Array.from(protectedTools))) return false
177
+ if (toolName !== undefined && protectedTools.has(toolName)) return false
178
+
179
+ return true
180
+ })
181
+
182
+ let count = 0
183
+ for (const toolCallId of toAdd) {
184
+ const record = state.toolCalls.get(toolCallId)
185
+ if (markToolPruned(state, toolCallId, "manual-sweep", record?.tokenEstimate ?? 0)) {
186
+ count++
187
+ }
188
+ }
189
+
190
+ ctx.ui.notify(`Swept ${count} tool output${count === 1 ? "" : "s"}`, "info")
191
+ }
192
+
193
+ // ---------------------------------------------------------------------------
194
+ // Manual mode
195
+ // ---------------------------------------------------------------------------
196
+
197
+ function handleManual(
198
+ ctx: ExtensionCommandContext,
199
+ state: DcpState,
200
+ subArg: string | undefined,
201
+ ): void {
202
+ if (subArg === "on") {
203
+ state.manualMode = true
204
+ ctx.ui.notify(
205
+ "Manual mode: on\nAutonomous compression nudges are disabled. Use /dcp compress to trigger manually.",
206
+ "info",
207
+ )
208
+ } else if (subArg === "off") {
209
+ state.manualMode = false
210
+ ctx.ui.notify("Manual mode: off\nAutonomous compression is enabled.", "info")
211
+ } else {
212
+ // Status display (no argument).
213
+ const status = state.manualMode ? "on" : "off"
214
+ ctx.ui.notify(
215
+ `Manual mode: ${status}\nWhen on: compress tool only fires when you explicitly request it.`,
216
+ "info",
217
+ )
218
+ }
219
+ }
220
+
221
+ // ---------------------------------------------------------------------------
222
+ // Decompress
223
+ // ---------------------------------------------------------------------------
224
+
225
+ function handleDecompress(
226
+ ctx: ExtensionCommandContext,
227
+ state: DcpState,
228
+ nArg: string | undefined,
229
+ ): void {
230
+ if (nArg === undefined) {
231
+ // List all active compression blocks.
232
+ const activeBlocks = state.compressionBlocks.filter((b) => b.active)
233
+
234
+ if (activeBlocks.length === 0) {
235
+ ctx.ui.notify("No active compression blocks.", "info")
236
+ return
237
+ }
238
+
239
+ const lines: string[] = ["Active compression blocks:"]
240
+ for (const block of activeBlocks) {
241
+ lines.push(
242
+ ` b${block.id} — "${block.topic}" (est. ${fmt(block.summaryTokenEstimate)} tokens)`,
243
+ )
244
+ }
245
+ lines.push("")
246
+ lines.push("Run /dcp decompress N to restore a block.")
247
+
248
+ ctx.ui.notify(lines.join("\n"), "info")
249
+ } else {
250
+ // Restore block N.
251
+ const id = parseInt(nArg, 10)
252
+
253
+ if (isNaN(id)) {
254
+ ctx.ui.notify(
255
+ `Invalid block ID: "${nArg}". Usage: /dcp decompress N`,
256
+ "error",
257
+ )
258
+ return
259
+ }
260
+
261
+ const block = state.compressionBlocks.find((b) => b.id === id)
262
+
263
+ if (!block) {
264
+ ctx.ui.notify(`No compression block found with id ${id}.`, "error")
265
+ return
266
+ }
267
+
268
+ if (!block.active) {
269
+ ctx.ui.notify(`Compression block b${id} is already decompressed.`, "info")
270
+ return
271
+ }
272
+
273
+ block.active = false
274
+ block.deactivatedByUser = true
275
+ ctx.ui.notify(`Decompressed block b${id}: "${block.topic}"`, "info")
276
+ }
277
+ }
278
+
279
+ // ---------------------------------------------------------------------------
280
+ // Recompress
281
+ // ---------------------------------------------------------------------------
282
+
283
+ function handleRecompress(
284
+ ctx: ExtensionCommandContext,
285
+ state: DcpState,
286
+ nArg: string | undefined,
287
+ ): void {
288
+ const recompressible = state.compressionBlocks.filter((b) => !b.active && b.deactivatedByUser)
289
+
290
+ if (nArg === undefined) {
291
+ if (recompressible.length === 0) {
292
+ ctx.ui.notify("No user-decompressed compression blocks are available to recompress.", "info")
293
+ return
294
+ }
295
+
296
+ const lines: string[] = ["Recompressible blocks:"]
297
+ for (const block of recompressible) {
298
+ lines.push(
299
+ ` b${block.id} — "${block.topic}" (est. ${fmt(block.summaryTokenEstimate)} tokens)`,
300
+ )
301
+ }
302
+ lines.push("")
303
+ lines.push("Run /dcp recompress N to re-apply a block.")
304
+ ctx.ui.notify(lines.join("\n"), "info")
305
+ return
306
+ }
307
+
308
+ const id = parseInt(nArg, 10)
309
+ if (isNaN(id)) {
310
+ ctx.ui.notify(`Invalid block ID: "${nArg}". Usage: /dcp recompress N`, "error")
311
+ return
312
+ }
313
+
314
+ const block = state.compressionBlocks.find((b) => b.id === id)
315
+ if (!block) {
316
+ ctx.ui.notify(`No compression block found with id ${id}.`, "error")
317
+ return
318
+ }
319
+ if (block.active) {
320
+ ctx.ui.notify(`Compression block b${id} is already active.`, "info")
321
+ return
322
+ }
323
+ if (!block.deactivatedByUser) {
324
+ ctx.ui.notify(`Compression block b${id} was superseded by another block and cannot be recompressed directly.`, "error")
325
+ return
326
+ }
327
+
328
+ for (const coveredId of block.coveredBlockIds ?? []) {
329
+ const covered = state.compressionBlocks.find((candidate) => candidate.id === coveredId)
330
+ if (covered) covered.active = false
331
+ }
332
+ block.active = true
333
+ block.deactivatedByUser = false
334
+ ctx.ui.notify(`Recompressed block b${id}: "${block.topic}"`, "info")
335
+ }
336
+
337
+ // ---------------------------------------------------------------------------
338
+ // Compress (trigger)
339
+ // ---------------------------------------------------------------------------
340
+
341
+ async function handleCompress(pi: ExtensionAPI, ctx: ExtensionCommandContext): Promise<void> {
342
+ await ctx.waitForIdle()
343
+
344
+ pi.sendMessage(
345
+ {
346
+ customType: "dcp-compress-trigger",
347
+ content:
348
+ "Please compress stale conversation sections using the compress tool now.",
349
+ display: false,
350
+ },
351
+ { triggerTurn: true, deliverAs: "followUp" },
352
+ )
353
+
354
+ ctx.ui.notify("Triggered compression", "info")
355
+ }
356
+
357
+ // ---------------------------------------------------------------------------
358
+ // Public API
359
+ // ---------------------------------------------------------------------------
360
+
361
+ export function registerCommands(
362
+ pi: ExtensionAPI,
363
+ state: DcpState,
364
+ config: DcpConfig,
365
+ hooks: DcpCommandHooks = {},
366
+ ): void {
367
+ pi.registerCommand("dcp", {
368
+ description: "Dynamic Context Pruning — manage context window usage",
369
+ getArgumentCompletions(prefix: string): AutocompleteItem[] | null {
370
+ const subcommands: AutocompleteItem[] = [
371
+ { value: "context", label: "context", description: "Show context window usage breakdown" },
372
+ { value: "stats", label: "stats", description: "Show pruning statistics" },
373
+ { value: "sweep", label: "sweep", description: "Prune tool outputs" },
374
+ { value: "manual", label: "manual", description: "Toggle manual mode" },
375
+ { value: "decompress", label: "decompress", description: "List or restore compression blocks" },
376
+ { value: "recompress", label: "recompress", description: "Re-apply a decompressed block" },
377
+ { value: "compress", label: "compress", description: "Trigger LLM compression" },
378
+ { value: "help", label: "help", description: "Show help" },
379
+ ]
380
+ const matched = subcommands
381
+ .filter((s) => typeof s.value === "string")
382
+ .filter((s) => s.value.startsWith(prefix))
383
+ return matched.length > 0 ? matched : null
384
+ },
385
+
386
+ async handler(args: string, ctx: ExtensionCommandContext): Promise<void> {
387
+ const parts = args.trim().split(/\s+/).filter(Boolean)
388
+ const sub = parts[0] ?? ""
389
+
390
+ try {
391
+ switch (sub) {
392
+ case "":
393
+ case "help":
394
+ handleHelp(ctx)
395
+ break
396
+
397
+ case "context":
398
+ handleContext(ctx, state)
399
+ break
400
+
401
+ case "stats":
402
+ handleStats(ctx, state)
403
+ break
404
+
405
+ case "sweep": {
406
+ const rawN = parts[1] !== undefined ? parseInt(parts[1], 10) : 0
407
+ const n = isNaN(rawN) || rawN < 0 ? 0 : rawN
408
+ await handleSweep(ctx, state, config, n)
409
+ break
410
+ }
411
+
412
+ case "manual":
413
+ handleManual(ctx, state, parts[1])
414
+ break
415
+
416
+ case "decompress":
417
+ handleDecompress(ctx, state, parts[1])
418
+ break
419
+
420
+ case "recompress":
421
+ handleRecompress(ctx, state, parts[1])
422
+ break
423
+
424
+ case "compress":
425
+ await handleCompress(pi, ctx)
426
+ break
427
+
428
+ default:
429
+ ctx.ui.notify(
430
+ `Unknown DCP command: "${sub}". Run /dcp help for available commands.`,
431
+ "error",
432
+ )
433
+ break
434
+ }
435
+ } finally {
436
+ hooks.onStateChanged?.(ctx)
437
+ }
438
+ },
439
+ })
440
+ }