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/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,12 @@
1
+ import { parseArgs } from "./app/cli.js";
2
+ import { PiUiExtendApp } from "./app/app.js";
3
+ import { stringifyUnknown } from "./app/message-content.js";
4
+ async function main() {
5
+ const options = parseArgs(process.argv.slice(2));
6
+ const app = new PiUiExtendApp(options);
7
+ await app.start();
8
+ }
9
+ main().catch((error) => {
10
+ console.error(error instanceof Error ? error.message : stringifyUnknown(error));
11
+ process.exitCode = 1;
12
+ });
@@ -0,0 +1,22 @@
1
+ import { type SyntaxLineHighlight, type ToolBodySyntaxHighlights } from "./syntax-highlight.js";
2
+ export type RenderedMarkdownLine = {
3
+ text: string;
4
+ segments: readonly {
5
+ start: number;
6
+ end: number;
7
+ bold: true;
8
+ }[];
9
+ };
10
+ export type RenderedMarkdownTextLine = {
11
+ text: string;
12
+ segments?: readonly {
13
+ start: number;
14
+ end: number;
15
+ bold: true;
16
+ }[] | undefined;
17
+ syntaxHighlight?: SyntaxLineHighlight | undefined;
18
+ };
19
+ export declare function formatMarkdownTables(text: string, maxWidth?: number): string;
20
+ export declare function renderMarkdownLine(text: string, start?: number): RenderedMarkdownLine;
21
+ export declare function renderMarkdownTextLines(text: string, width: number, start?: number): RenderedMarkdownTextLine[];
22
+ export declare function markdownSyntaxHighlightsForText(text: string, startColumn?: number): ToolBodySyntaxHighlights;
@@ -0,0 +1,542 @@
1
+ import { expandTabs, stringDisplayWidth } from "./terminal-width.js";
2
+ import { syntaxHighlightLanguageForMarkdownFence, } from "./syntax-highlight.js";
3
+ export function formatMarkdownTables(text, maxWidth) {
4
+ const lines = text.split("\n");
5
+ const formatted = [];
6
+ let fence;
7
+ for (let index = 0; index < lines.length;) {
8
+ const line = lines[index] ?? "";
9
+ const nextFence = markdownFence(line);
10
+ if (nextFence) {
11
+ if (!fence)
12
+ fence = nextFence;
13
+ else if (fence.marker === nextFence.marker && nextFence.length >= fence.length)
14
+ fence = undefined;
15
+ formatted.push(line);
16
+ index += 1;
17
+ continue;
18
+ }
19
+ if (!fence) {
20
+ const table = parseMarkdownTableBlock(lines, index);
21
+ if (table) {
22
+ formatted.push(...formatMarkdownTableBlock(table, maxWidth));
23
+ index += table.lineCount;
24
+ continue;
25
+ }
26
+ }
27
+ formatted.push(line);
28
+ index += 1;
29
+ }
30
+ return formatted.join("\n");
31
+ }
32
+ export function renderMarkdownLine(text, start = 0) {
33
+ const safeStart = Math.max(0, Math.min(text.length, start));
34
+ const segments = [];
35
+ let rendered = text.slice(0, safeStart);
36
+ let index = safeStart;
37
+ let inCode = false;
38
+ while (index < text.length) {
39
+ const char = text[index] ?? "";
40
+ if (char === "`" && !isEscaped(text, index)) {
41
+ rendered += char;
42
+ inCode = !inCode;
43
+ index += 1;
44
+ continue;
45
+ }
46
+ if (!inCode && text.startsWith("**", index) && !isEscaped(text, index)) {
47
+ const end = findMarkdownStrongEnd(text, index + 2);
48
+ if (end > index + 2) {
49
+ const segmentStart = rendered.length;
50
+ rendered += text.slice(index + 2, end);
51
+ segments.push({ start: segmentStart, end: rendered.length, bold: true });
52
+ index = end + 2;
53
+ continue;
54
+ }
55
+ }
56
+ rendered += char;
57
+ index += 1;
58
+ }
59
+ return { text: rendered, segments };
60
+ }
61
+ export function renderMarkdownTextLines(text, width, start = 0) {
62
+ const lines = [];
63
+ let fence;
64
+ for (const rawLine of formatMarkdownTables(sanitizeMarkdownText(text), width).split("\n")) {
65
+ const nextFence = markdownFence(rawLine);
66
+ const closesFence = Boolean(fence && nextFence && fence.marker === nextFence.marker && nextFence.length >= fence.length);
67
+ const opensFence = !fence && nextFence !== undefined;
68
+ const syntaxHighlight = markdownLineSyntaxHighlight(fence, Boolean(opensFence || closesFence), start);
69
+ const markdownLine = syntaxHighlight?.language === "markdown" ? renderMarkdownLine(rawLine) : undefined;
70
+ for (const wrapped of wrapRenderedMarkdownLine(markdownLine ?? { text: rawLine, segments: [] }, width)) {
71
+ lines.push({
72
+ text: wrapped.text,
73
+ ...(wrapped.segments.length > 0 ? { segments: wrapped.segments } : {}),
74
+ ...(syntaxHighlight ? { syntaxHighlight } : {}),
75
+ });
76
+ }
77
+ if (opensFence && nextFence) {
78
+ fence = { ...nextFence, language: syntaxHighlightLanguageForMarkdownFence(nextFence.info) };
79
+ }
80
+ else if (closesFence) {
81
+ fence = undefined;
82
+ }
83
+ }
84
+ return lines;
85
+ }
86
+ export function markdownSyntaxHighlightsForText(text, startColumn = 0) {
87
+ const highlights = [];
88
+ let fence;
89
+ for (const [lineIndex, line] of text.split("\n").entries()) {
90
+ const nextFence = markdownFence(line);
91
+ const closesFence = Boolean(fence && nextFence && fence.marker === nextFence.marker && nextFence.length >= fence.length);
92
+ const opensFence = !fence && nextFence !== undefined;
93
+ const language = markdownLineSyntaxHighlight(fence, opensFence || closesFence, startColumn)?.language;
94
+ if (language) {
95
+ highlights.push({ language, startLine: lineIndex, endLine: lineIndex + 1, startColumn });
96
+ }
97
+ if (opensFence && nextFence) {
98
+ fence = { ...nextFence, language: syntaxHighlightLanguageForMarkdownFence(nextFence.info) };
99
+ }
100
+ else if (closesFence) {
101
+ fence = undefined;
102
+ }
103
+ }
104
+ return highlights;
105
+ }
106
+ function wrapRenderedMarkdownLine(line, width) {
107
+ const safeWidth = Math.max(1, width);
108
+ if (stringDisplayWidth(line.text) <= safeWidth)
109
+ return [line];
110
+ return wrapDisplayLineByWordsWithRanges(line.text, safeWidth).map((range) => ({
111
+ text: range.text,
112
+ segments: line.segments.flatMap((segment) => shiftSegmentToRange(segment, range.start, range.end)),
113
+ }));
114
+ }
115
+ function wrapDisplayLineByWordsWithRanges(text, width) {
116
+ const chunks = [];
117
+ let chunkText = "";
118
+ let chunkStart = 0;
119
+ let chunkEnd = 0;
120
+ const setChunk = (chunk) => {
121
+ chunkText = chunk.text;
122
+ chunkStart = chunk.start;
123
+ chunkEnd = chunk.end;
124
+ };
125
+ const appendTokenToEmptyChunk = (token) => {
126
+ if (stringDisplayWidth(token.text) <= width) {
127
+ setChunk(token);
128
+ return;
129
+ }
130
+ const wrapped = wrapDisplayTokenByWidth(token, width);
131
+ chunks.push(...wrapped.slice(0, -1));
132
+ setChunk(wrapped.at(-1) ?? { text: "", start: token.end, end: token.end });
133
+ };
134
+ for (const token of displayTokensWithRanges(text)) {
135
+ if (token.whitespace) {
136
+ if (!chunkText) {
137
+ appendTokenToEmptyChunk(token);
138
+ continue;
139
+ }
140
+ const candidate = `${chunkText}${token.text}`;
141
+ if (stringDisplayWidth(candidate) <= width) {
142
+ chunkText = candidate;
143
+ chunkEnd = token.end;
144
+ }
145
+ else {
146
+ chunks.push(trimTrailingWhitespaceChunk(chunkText, chunkStart));
147
+ chunkText = "";
148
+ chunkStart = token.end;
149
+ chunkEnd = token.end;
150
+ }
151
+ continue;
152
+ }
153
+ if (!chunkText) {
154
+ appendTokenToEmptyChunk(token);
155
+ continue;
156
+ }
157
+ const candidate = `${chunkText}${token.text}`;
158
+ if (stringDisplayWidth(candidate) <= width) {
159
+ chunkText = candidate;
160
+ chunkEnd = token.end;
161
+ continue;
162
+ }
163
+ chunks.push(trimTrailingWhitespaceChunk(chunkText, chunkStart));
164
+ appendTokenToEmptyChunk(token);
165
+ }
166
+ chunks.push({ text: chunkText, start: chunkStart, end: chunkEnd });
167
+ return chunks;
168
+ }
169
+ function displayTokensWithRanges(text) {
170
+ const tokens = [];
171
+ let current = "";
172
+ let currentStart = 0;
173
+ let currentWhitespace;
174
+ for (let index = 0; index < text.length;) {
175
+ const codePoint = text.codePointAt(index) ?? 0;
176
+ const char = String.fromCodePoint(codePoint);
177
+ const whitespace = /\s/u.test(char);
178
+ if (current && currentWhitespace !== whitespace) {
179
+ tokens.push({ text: current, start: currentStart, end: index, whitespace: currentWhitespace ?? false });
180
+ current = "";
181
+ currentStart = index;
182
+ }
183
+ if (!current)
184
+ currentStart = index;
185
+ current += char;
186
+ currentWhitespace = whitespace;
187
+ index += char.length;
188
+ }
189
+ if (current)
190
+ tokens.push({ text: current, start: currentStart, end: text.length, whitespace: currentWhitespace ?? false });
191
+ return tokens;
192
+ }
193
+ function wrapDisplayTokenByWidth(token, width) {
194
+ const chunks = [];
195
+ let chunkText = "";
196
+ let chunkStart = token.start;
197
+ let chunkWidth = 0;
198
+ for (let index = token.start; index < token.end;) {
199
+ const codePoint = token.text.codePointAt(index - token.start) ?? 0;
200
+ const char = String.fromCodePoint(codePoint);
201
+ const charWidth = stringDisplayWidth(char);
202
+ if (chunkText && chunkWidth + charWidth > width) {
203
+ chunks.push({ text: chunkText, start: chunkStart, end: index });
204
+ chunkText = "";
205
+ chunkStart = index;
206
+ chunkWidth = 0;
207
+ }
208
+ chunkText += char;
209
+ chunkWidth += charWidth;
210
+ index += char.length;
211
+ }
212
+ chunks.push({ text: chunkText, start: chunkStart, end: token.end });
213
+ return chunks;
214
+ }
215
+ function trimTrailingWhitespaceChunk(text, start) {
216
+ const trimmed = text.replace(/\s+$/u, "");
217
+ return { text: trimmed, start, end: start + trimmed.length };
218
+ }
219
+ function shiftSegmentToRange(segment, rangeStart, rangeEnd) {
220
+ const start = Math.max(segment.start, rangeStart);
221
+ const end = Math.min(segment.end, rangeEnd);
222
+ if (end <= start)
223
+ return [];
224
+ return [{ ...segment, start: start - rangeStart, end: end - rangeStart }];
225
+ }
226
+ function parseMarkdownTableBlock(lines, start) {
227
+ const header = parseMarkdownTableRow(lines[start] ?? "");
228
+ if (!header)
229
+ return undefined;
230
+ const alignments = parseMarkdownTableSeparator(lines[start + 1] ?? "");
231
+ if (!alignments)
232
+ return undefined;
233
+ const columnCount = Math.max(header.cells.length, alignments.length);
234
+ if (columnCount < 2)
235
+ return undefined;
236
+ const bodyRows = [];
237
+ let index = start + 2;
238
+ while (index < lines.length) {
239
+ const row = parseMarkdownTableRow(lines[index] ?? "");
240
+ if (!row)
241
+ break;
242
+ bodyRows.push(row);
243
+ index += 1;
244
+ }
245
+ return { header, alignments, bodyRows, lineCount: index - start };
246
+ }
247
+ function formatMarkdownTableBlock(table, maxWidth) {
248
+ const rows = [table.header, ...table.bodyRows];
249
+ const columnCount = Math.max(table.alignments.length, ...rows.map((row) => row.cells.length));
250
+ const alignments = Array.from({ length: columnCount }, (_, index) => table.alignments[index] ?? "none");
251
+ const widths = markdownTableColumnWidths(rows, alignments, table.header.indent, maxWidth);
252
+ const indent = table.header.indent;
253
+ return [
254
+ formatMarkdownTableBorder(widths, indent, "top"),
255
+ ...formatMarkdownTableRow(table.header.cells, widths, alignments, indent),
256
+ formatMarkdownTableBorder(widths, indent, "middle"),
257
+ ...formatMarkdownTableBodyRows(table.bodyRows, widths, alignments, indent),
258
+ formatMarkdownTableBorder(widths, indent, "bottom"),
259
+ ];
260
+ }
261
+ function formatMarkdownTableBodyRows(rows, widths, alignments, indent) {
262
+ return rows.flatMap((row, index) => [
263
+ ...(index > 0 ? [formatMarkdownTableBorder(widths, indent, "middle")] : []),
264
+ ...formatMarkdownTableRow(row.cells, widths, alignments, indent),
265
+ ]);
266
+ }
267
+ function markdownTableColumnWidths(rows, alignments, indent, maxWidth) {
268
+ const naturalWidths = alignments.map((alignment, column) => columnWidth(rows, alignment, column));
269
+ if (maxWidth === undefined)
270
+ return naturalWidths;
271
+ const availableCellWidth = Math.floor(maxWidth) - stringDisplayWidth(indent) - markdownTableSyntaxWidth(alignments.length) - markdownTableHiddenWidthBudget(rows, alignments.length);
272
+ if (sumWidths(naturalWidths) <= availableCellWidth)
273
+ return naturalWidths;
274
+ const minWidths = alignments.map(minimumSeparatorWidth);
275
+ if (availableCellWidth <= sumWidths(minWidths))
276
+ return minWidths;
277
+ const widths = [...naturalWidths];
278
+ while (sumWidths(widths) > availableCellWidth) {
279
+ const shrinkColumn = widestShrinkableColumn(widths, minWidths);
280
+ if (shrinkColumn < 0)
281
+ break;
282
+ widths[shrinkColumn] = Math.max(minWidths[shrinkColumn] ?? 0, (widths[shrinkColumn] ?? 0) - 1);
283
+ }
284
+ return widths;
285
+ }
286
+ function markdownTableSyntaxWidth(columnCount) {
287
+ return columnCount * 3 + 1;
288
+ }
289
+ function markdownTableHiddenWidthBudget(rows, columnCount) {
290
+ let budget = 0;
291
+ for (let column = 0; column < columnCount; column += 1) {
292
+ budget += rows.reduce((width, row) => Math.max(width, markdownHiddenDisplayWidth(row.cells[column] ?? "")), 0);
293
+ }
294
+ return budget;
295
+ }
296
+ function markdownHiddenDisplayWidth(text) {
297
+ return Math.max(0, stringDisplayWidth(text) - markdownInlineDisplayWidth(text));
298
+ }
299
+ function sumWidths(widths) {
300
+ return widths.reduce((sum, width) => sum + width, 0);
301
+ }
302
+ function widestShrinkableColumn(widths, minWidths) {
303
+ let result = -1;
304
+ let resultRoom = 0;
305
+ for (const [column, width] of widths.entries()) {
306
+ const room = width - (minWidths[column] ?? 0);
307
+ if (room > resultRoom) {
308
+ result = column;
309
+ resultRoom = room;
310
+ }
311
+ }
312
+ return result;
313
+ }
314
+ function columnWidth(rows, alignment, column) {
315
+ const contentWidth = rows.reduce((width, row) => Math.max(width, markdownInlineDisplayWidth(row.cells[column] ?? "")), 0);
316
+ return Math.max(contentWidth, minimumSeparatorWidth(alignment));
317
+ }
318
+ function minimumSeparatorWidth(alignment) {
319
+ switch (alignment) {
320
+ case "center":
321
+ return 4;
322
+ case "left":
323
+ case "right":
324
+ return 3;
325
+ case "none":
326
+ return 3;
327
+ }
328
+ }
329
+ function formatMarkdownTableRow(cells, widths, alignments, indent) {
330
+ const wrappedCells = widths.map((width, index) => wrapMarkdownTableCell(cells[index] ?? "", width));
331
+ const rowHeight = Math.max(1, ...wrappedCells.map((cell) => cell.length));
332
+ return Array.from({ length: rowHeight }, (_, lineIndex) => {
333
+ const paddedCells = widths.map((width, column) => padMarkdownTableCell(wrappedCells[column]?.[lineIndex] ?? "", width, alignments[column] ?? "none"));
334
+ return `${indent}│ ${paddedCells.join(" │ ")} │`;
335
+ });
336
+ }
337
+ function formatMarkdownTableBorder(widths, indent, position) {
338
+ const chars = markdownTableBorderChars(position);
339
+ return `${indent}${chars.left}${widths.map((width) => "─".repeat(width + 2)).join(chars.join)}${chars.right}`;
340
+ }
341
+ function markdownTableBorderChars(position) {
342
+ switch (position) {
343
+ case "top":
344
+ return { left: "┌", join: "┬", right: "┐" };
345
+ case "middle":
346
+ return { left: "├", join: "┼", right: "┤" };
347
+ case "bottom":
348
+ return { left: "└", join: "┴", right: "┘" };
349
+ }
350
+ }
351
+ function padMarkdownTableCell(cell, width, alignment) {
352
+ const missing = Math.max(0, width - markdownInlineDisplayWidth(cell));
353
+ switch (alignment) {
354
+ case "center": {
355
+ const left = Math.floor(missing / 2);
356
+ return `${" ".repeat(left)}${cell}${" ".repeat(missing - left)}`;
357
+ }
358
+ case "right":
359
+ return `${" ".repeat(missing)}${cell}`;
360
+ case "left":
361
+ case "none":
362
+ return `${cell}${" ".repeat(missing)}`;
363
+ }
364
+ }
365
+ function wrapMarkdownTableCell(cell, width) {
366
+ const safeWidth = Math.max(1, width);
367
+ const words = cell.trim().split(/\s+/).filter(Boolean);
368
+ if (words.length === 0)
369
+ return [""];
370
+ const lines = [];
371
+ let current = "";
372
+ for (const word of words) {
373
+ if (!current) {
374
+ const wrappedWord = wrapMarkdownTableWord(word, safeWidth);
375
+ lines.push(...wrappedWord.slice(0, -1));
376
+ current = wrappedWord.at(-1) ?? "";
377
+ continue;
378
+ }
379
+ const candidate = `${current} ${word}`;
380
+ if (markdownInlineDisplayWidth(candidate) <= safeWidth) {
381
+ current = candidate;
382
+ continue;
383
+ }
384
+ lines.push(current);
385
+ const wrappedWord = wrapMarkdownTableWord(word, safeWidth);
386
+ lines.push(...wrappedWord.slice(0, -1));
387
+ current = wrappedWord.at(-1) ?? "";
388
+ }
389
+ if (current || lines.length === 0)
390
+ lines.push(current);
391
+ return lines;
392
+ }
393
+ function wrapMarkdownTableWord(word, width) {
394
+ if (markdownInlineDisplayWidth(word) <= width)
395
+ return [word];
396
+ const inlineCode = /^`([^`]+)`$/.exec(word)?.[1];
397
+ if (inlineCode !== undefined && width > 2) {
398
+ return wrapTextByDisplayWidth(inlineCode, width - 2).map((chunk) => `\`${chunk}\``);
399
+ }
400
+ return wrapTextByDisplayWidth(word, width);
401
+ }
402
+ function wrapTextByDisplayWidth(text, width) {
403
+ const chunks = [];
404
+ let remaining = text;
405
+ while (stringDisplayWidth(remaining) > width) {
406
+ const breakIndex = smartDisplayBreakIndex(remaining, width);
407
+ if (breakIndex <= 0)
408
+ break;
409
+ chunks.push(remaining.slice(0, breakIndex));
410
+ remaining = remaining.slice(breakIndex);
411
+ }
412
+ if (remaining)
413
+ chunks.push(remaining);
414
+ return chunks.length > 0 ? chunks : [""];
415
+ }
416
+ function smartDisplayBreakIndex(text, width) {
417
+ let used = 0;
418
+ let fallbackIndex = 0;
419
+ let breakIndex = 0;
420
+ for (let index = 0; index < text.length;) {
421
+ const codePoint = text.codePointAt(index) ?? 0;
422
+ const char = String.fromCodePoint(codePoint);
423
+ const nextIndex = index + char.length;
424
+ const nextUsed = used + stringDisplayWidth(char);
425
+ if (nextUsed > width)
426
+ break;
427
+ used = nextUsed;
428
+ fallbackIndex = nextIndex;
429
+ if (char === "/" && index > 0)
430
+ breakIndex = index;
431
+ else if (/[._:-]/u.test(char))
432
+ breakIndex = nextIndex;
433
+ index = nextIndex;
434
+ }
435
+ return breakIndex > 0 ? breakIndex : fallbackIndex;
436
+ }
437
+ function markdownInlineDisplayWidth(text) {
438
+ return stringDisplayWidth(renderMarkdownLine(text).text);
439
+ }
440
+ function findMarkdownStrongEnd(text, start) {
441
+ let inCode = false;
442
+ for (let index = start; index < text.length - 1; index += 1) {
443
+ const char = text[index] ?? "";
444
+ if (char === "`" && !isEscaped(text, index)) {
445
+ inCode = !inCode;
446
+ continue;
447
+ }
448
+ if (!inCode && text.startsWith("**", index) && !isEscaped(text, index))
449
+ return index;
450
+ }
451
+ return -1;
452
+ }
453
+ function isEscaped(text, index) {
454
+ let backslashes = 0;
455
+ for (let cursor = index - 1; cursor >= 0 && text[cursor] === "\\"; cursor -= 1)
456
+ backslashes += 1;
457
+ return backslashes % 2 === 1;
458
+ }
459
+ function parseMarkdownTableRow(line) {
460
+ const indent = /^\s*/.exec(line)?.[0] ?? "";
461
+ if (indent.includes("\t") || indent.length > 3)
462
+ return undefined;
463
+ const trimmed = line.trim();
464
+ if (!trimmed.includes("|"))
465
+ return undefined;
466
+ const cells = splitMarkdownTableCells(trimmed);
467
+ return cells.length >= 2 ? { cells, indent } : undefined;
468
+ }
469
+ function parseMarkdownTableSeparator(line) {
470
+ const row = parseMarkdownTableRow(line);
471
+ if (!row)
472
+ return undefined;
473
+ const alignments = row.cells.map(separatorAlignment);
474
+ return alignments.every((alignment) => alignment !== undefined) ? alignments : undefined;
475
+ }
476
+ function separatorAlignment(cell) {
477
+ const compact = cell.replace(/\s+/g, "");
478
+ if (!/^:?-{2,}:?$/.test(compact))
479
+ return undefined;
480
+ const left = compact.startsWith(":");
481
+ const right = compact.endsWith(":");
482
+ if (left && right)
483
+ return "center";
484
+ if (left)
485
+ return "left";
486
+ if (right)
487
+ return "right";
488
+ return "none";
489
+ }
490
+ function splitMarkdownTableCells(line) {
491
+ let body = line;
492
+ if (body.startsWith("|"))
493
+ body = body.slice(1);
494
+ if (body.endsWith("|") && !body.endsWith("\\|"))
495
+ body = body.slice(0, -1);
496
+ const cells = [];
497
+ let current = "";
498
+ let escaped = false;
499
+ let inCode = false;
500
+ for (const char of body) {
501
+ if (escaped) {
502
+ current += char;
503
+ escaped = false;
504
+ continue;
505
+ }
506
+ if (char === "\\") {
507
+ current += char;
508
+ escaped = true;
509
+ continue;
510
+ }
511
+ if (char === "`") {
512
+ current += char;
513
+ inCode = !inCode;
514
+ continue;
515
+ }
516
+ if (char === "|" && !inCode) {
517
+ cells.push(current.trim());
518
+ current = "";
519
+ continue;
520
+ }
521
+ current += char;
522
+ }
523
+ cells.push(current.trim());
524
+ return cells;
525
+ }
526
+ function markdownLineSyntaxHighlight(fence, fenceDelimiterLine, start) {
527
+ if (fenceDelimiterLine)
528
+ return { language: "markdown", start };
529
+ if (fence)
530
+ return fence.language ? { language: fence.language, start } : undefined;
531
+ return { language: "markdown", start };
532
+ }
533
+ function sanitizeMarkdownText(text) {
534
+ return expandTabs(text.replace(/\x1b/g, "␛").replace(/\r/g, ""));
535
+ }
536
+ function markdownFence(line) {
537
+ const match = /^\s{0,3}(`{3,}|~{3,})(.*)$/.exec(line);
538
+ const marker = match?.[1];
539
+ if (!marker)
540
+ return undefined;
541
+ return { marker: marker[0], length: marker.length, info: match[2] ?? "" };
542
+ }
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { isToastKind, Toast, TOAST_KINDS } from "./ui.js";
2
+ export type { ToastEntry, ToastKind, ToastNotifier, ToastState } from "./ui.js";
3
+ export type { AboveInputRenderer, ExtensionWidgetComponent, ExtensionWidgetContent, ExtensionWidgetFactory, PixMenuController, PixMenuItem, PixMenuOptions, PixMenuSelectOptions, PixMenuVariant, PixExtensionUIContext, WidgetPlacement, WidgetTuiHandle, } from "./app/types.js";
package/dist/sdk.js ADDED
@@ -0,0 +1 @@
1
+ export { isToastKind, Toast, TOAST_KINDS } from "./ui.js";
@@ -0,0 +1,22 @@
1
+ import type { Theme } from "./theme.js";
2
+ export type SyntaxHighlightLanguage = "c" | "cpp" | "csharp" | "css" | "go" | "html" | "java" | "javascript" | "json" | "markdown" | "python" | "rust" | "shell" | "typescript" | "yaml";
3
+ export type SyntaxLineHighlight = {
4
+ language: SyntaxHighlightLanguage;
5
+ start: number;
6
+ };
7
+ export type ToolBodySyntaxHighlight = {
8
+ language: SyntaxHighlightLanguage;
9
+ startLine: number;
10
+ endLine?: number;
11
+ startColumn?: number;
12
+ };
13
+ export type ToolBodySyntaxHighlights = ToolBodySyntaxHighlight | readonly ToolBodySyntaxHighlight[];
14
+ export type SyntaxHighlightSegment = {
15
+ start: number;
16
+ end: number;
17
+ foreground?: string;
18
+ bold?: boolean;
19
+ };
20
+ export declare function syntaxHighlightLanguageForPath(filePath: string): SyntaxHighlightLanguage | undefined;
21
+ export declare function syntaxHighlightLanguageForMarkdownFence(info: string): SyntaxHighlightLanguage | undefined;
22
+ export declare function syntaxHighlightSegmentsForLine(text: string, highlight: SyntaxLineHighlight, colors: Theme["colors"]): SyntaxHighlightSegment[];