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,528 @@
1
+ import { basename, extname } from "node:path";
2
+ const EXTENSION_LANGUAGES = {
3
+ ".c": "c",
4
+ ".cc": "cpp",
5
+ ".cpp": "cpp",
6
+ ".cs": "csharp",
7
+ ".css": "css",
8
+ ".cxx": "cpp",
9
+ ".go": "go",
10
+ ".h": "c",
11
+ ".hpp": "cpp",
12
+ ".html": "html",
13
+ ".java": "java",
14
+ ".js": "javascript",
15
+ ".jsx": "javascript",
16
+ ".json": "json",
17
+ ".jsonc": "json",
18
+ ".md": "markdown",
19
+ ".mjs": "javascript",
20
+ ".py": "python",
21
+ ".rs": "rust",
22
+ ".sh": "shell",
23
+ ".ts": "typescript",
24
+ ".tsx": "typescript",
25
+ ".yaml": "yaml",
26
+ ".yml": "yaml",
27
+ };
28
+ const BASENAME_LANGUAGES = {
29
+ dockerfile: "shell",
30
+ makefile: "shell",
31
+ };
32
+ const MARKDOWN_FENCE_LANGUAGES = {
33
+ bash: "shell",
34
+ c: "c",
35
+ cc: "cpp",
36
+ cpp: "cpp",
37
+ cs: "csharp",
38
+ csharp: "csharp",
39
+ css: "css",
40
+ cxx: "cpp",
41
+ go: "go",
42
+ html: "html",
43
+ java: "java",
44
+ javascript: "javascript",
45
+ js: "javascript",
46
+ json: "json",
47
+ jsonc: "json",
48
+ jsx: "javascript",
49
+ python: "python",
50
+ py: "python",
51
+ rust: "rust",
52
+ rs: "rust",
53
+ sh: "shell",
54
+ shell: "shell",
55
+ ts: "typescript",
56
+ tsx: "typescript",
57
+ typescript: "typescript",
58
+ yaml: "yaml",
59
+ yml: "yaml",
60
+ zsh: "shell",
61
+ };
62
+ const JS_KEYWORDS = words("as async await break case catch class const continue debugger default delete do else export extends finally for from function get if implements import in instanceof interface let new of private protected public readonly return satisfies set static super switch this throw try type typeof var void while with yield");
63
+ const JS_TYPES = words("Array bigint boolean Map never number object Promise Record Set string symbol unknown any void");
64
+ const JS_CONSTANTS = words("false Infinity NaN null true undefined");
65
+ const PY_KEYWORDS = words("and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield");
66
+ const PY_CONSTANTS = words("cls False None self True");
67
+ const GO_KEYWORDS = words("break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var");
68
+ const GO_CONSTANTS = words("false iota nil true");
69
+ const RUST_KEYWORDS = words("as async await break const continue crate dyn else enum extern fn for if impl in let loop match mod move mut pub ref return self static struct super trait type unsafe use where while");
70
+ const RUST_TYPES = words("Box Option Result Self String Vec");
71
+ const RUST_CONSTANTS = words("Err false None Ok Some true");
72
+ const JAVA_KEYWORDS = words("abstract assert break case catch class const continue default do else enum extends final finally for if implements import instanceof interface native new package private protected public return static strictfp super switch synchronized this throw throws transient try volatile while");
73
+ const JAVA_TYPES = words("boolean byte char double float int long short String var void");
74
+ const JAVA_CONSTANTS = words("false null true");
75
+ const C_LIKE_KEYWORDS = words("break case const continue default do else enum extern for goto if inline register restrict return sizeof static struct switch typedef union volatile while");
76
+ const C_LIKE_TYPES = words("bool char double float int int16_t int32_t int64_t int8_t long short size_t ssize_t uint16_t uint32_t uint64_t uint8_t unsigned void");
77
+ const CPP_KEYWORDS = words("alignas alignof and asm auto bitand bitor break case catch class compl concept const consteval constexpr constinit const_cast continue co_await co_return co_yield decltype default delete do dynamic_cast else enum explicit export extern for friend goto if import inline mutable namespace new noexcept not operator or private protected public register reinterpret_cast requires return sizeof static static_assert static_cast struct switch template this thread_local throw try typedef typeid typename union using virtual volatile while xor");
78
+ const CPP_TYPES = words("bool char char16_t char32_t double float int long short signed size_t std string unsigned void wchar_t");
79
+ const C_CONSTANTS = words("false NULL nullptr true");
80
+ const CSHARP_KEYWORDS = words("abstract as async await base break case catch checked class const continue default delegate do else enum event explicit extern finally fixed for foreach get goto if implicit in interface internal is lock namespace new operator out override params private protected public readonly ref return sealed set sizeof stackalloc static struct switch this throw try typeof unchecked unsafe using virtual void volatile while yield");
81
+ const CSHARP_TYPES = words("bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var");
82
+ const CSHARP_CONSTANTS = words("false null true");
83
+ const SHELL_KEYWORDS = words("case do done elif else esac fi for function if in local readonly return select then until while");
84
+ const SHELL_CONSTANTS = words("false true");
85
+ const CODE_LANGUAGE_SPECS = {
86
+ c: { keywords: C_LIKE_KEYWORDS, types: C_LIKE_TYPES, constants: C_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
87
+ cpp: { keywords: CPP_KEYWORDS, types: CPP_TYPES, constants: C_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
88
+ csharp: { keywords: CSHARP_KEYWORDS, types: CSHARP_TYPES, constants: CSHARP_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
89
+ go: { keywords: GO_KEYWORDS, constants: GO_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
90
+ java: { keywords: JAVA_KEYWORDS, types: JAVA_TYPES, constants: JAVA_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
91
+ javascript: { keywords: JS_KEYWORDS, types: JS_TYPES, constants: JS_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
92
+ python: { keywords: PY_KEYWORDS, constants: PY_CONSTANTS, lineComment: "#" },
93
+ rust: { keywords: RUST_KEYWORDS, types: RUST_TYPES, constants: RUST_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
94
+ shell: { keywords: SHELL_KEYWORDS, constants: SHELL_CONSTANTS, lineComment: "#" },
95
+ typescript: { keywords: JS_KEYWORDS, types: JS_TYPES, constants: JS_CONSTANTS, lineComment: "//", blockComment: ["/*", "*/"] },
96
+ };
97
+ export function syntaxHighlightLanguageForPath(filePath) {
98
+ const name = basename(filePath).toLowerCase();
99
+ if (name.endsWith(".d.ts"))
100
+ return "typescript";
101
+ const byName = BASENAME_LANGUAGES[name];
102
+ if (byName)
103
+ return byName;
104
+ return EXTENSION_LANGUAGES[extname(name)];
105
+ }
106
+ export function syntaxHighlightLanguageForMarkdownFence(info) {
107
+ const token = info.trim().split(/\s+/, 1)[0]?.toLowerCase().replace(/^[{.]+|[}.]+$/g, "") ?? "";
108
+ if (!token)
109
+ return undefined;
110
+ return MARKDOWN_FENCE_LANGUAGES[token];
111
+ }
112
+ export function syntaxHighlightSegmentsForLine(text, highlight, colors) {
113
+ const start = Math.max(0, Math.min(text.length, highlight.start));
114
+ if (start >= text.length)
115
+ return [];
116
+ const segments = localSyntaxSegments(text.slice(start), highlight.language, colors);
117
+ return segments.map((segment) => ({ ...segment, start: segment.start + start, end: segment.end + start }));
118
+ }
119
+ function localSyntaxSegments(code, language, colors) {
120
+ switch (language) {
121
+ case "css":
122
+ return cssSegments(code, colors);
123
+ case "html":
124
+ return htmlSegments(code, colors);
125
+ case "json":
126
+ return jsonSegments(code, colors);
127
+ case "markdown":
128
+ return markdownSegments(code, colors);
129
+ case "yaml":
130
+ return yamlSegments(code, colors);
131
+ default:
132
+ return codeSegments(code, CODE_LANGUAGE_SPECS[language], colors);
133
+ }
134
+ }
135
+ function codeSegments(code, spec, colors) {
136
+ const segments = [];
137
+ let index = 0;
138
+ while (index < code.length) {
139
+ const char = code[index] ?? "";
140
+ if (spec.lineComment && code.startsWith(spec.lineComment, index) && isLineCommentStart(code, index, spec.lineComment)) {
141
+ addSegment(segments, index, code.length, "comment", colors);
142
+ break;
143
+ }
144
+ if (spec.blockComment && code.startsWith(spec.blockComment[0], index)) {
145
+ const end = code.indexOf(spec.blockComment[1], index + spec.blockComment[0].length);
146
+ const commentEnd = end === -1 ? code.length : end + spec.blockComment[1].length;
147
+ addSegment(segments, index, commentEnd, "comment", colors);
148
+ index = commentEnd;
149
+ continue;
150
+ }
151
+ if (isQuote(char)) {
152
+ const end = consumeQuoted(code, index, char);
153
+ addSegment(segments, index, end, "string", colors);
154
+ index = end;
155
+ continue;
156
+ }
157
+ if (isNumberStart(code, index)) {
158
+ const end = consumeNumber(code, index);
159
+ addSegment(segments, index, end, "number", colors);
160
+ index = end;
161
+ continue;
162
+ }
163
+ if (isIdentifierStart(char)) {
164
+ const end = consumeIdentifier(code, index);
165
+ const word = code.slice(index, end);
166
+ if (spec.keywords.has(word))
167
+ addSegment(segments, index, end, "keyword", colors);
168
+ else if (spec.types?.has(word))
169
+ addSegment(segments, index, end, "type", colors);
170
+ else if (spec.constants?.has(word))
171
+ addSegment(segments, index, end, "constant", colors);
172
+ index = end;
173
+ continue;
174
+ }
175
+ index += 1;
176
+ }
177
+ return segments;
178
+ }
179
+ function jsonSegments(code, colors) {
180
+ const segments = [];
181
+ let index = 0;
182
+ while (index < code.length) {
183
+ if (code.startsWith("//", index)) {
184
+ addSegment(segments, index, code.length, "comment", colors);
185
+ break;
186
+ }
187
+ const char = code[index] ?? "";
188
+ if (char === '"') {
189
+ const end = consumeQuoted(code, index, char);
190
+ addSegment(segments, index, end, isJsonProperty(code, end) ? "property" : "string", colors);
191
+ index = end;
192
+ continue;
193
+ }
194
+ if (isNumberStart(code, index)) {
195
+ const end = consumeNumber(code, index);
196
+ addSegment(segments, index, end, "number", colors);
197
+ index = end;
198
+ continue;
199
+ }
200
+ if (isIdentifierStart(char)) {
201
+ const end = consumeIdentifier(code, index);
202
+ const word = code.slice(index, end);
203
+ if (word === "true" || word === "false" || word === "null")
204
+ addSegment(segments, index, end, "constant", colors);
205
+ index = end;
206
+ continue;
207
+ }
208
+ index += 1;
209
+ }
210
+ return segments;
211
+ }
212
+ function yamlSegments(code, colors) {
213
+ const commentStart = unquotedIndexOf(code, "#");
214
+ const body = commentStart === -1 ? code : code.slice(0, commentStart);
215
+ const segments = jsonLikeValueSegments(body, colors);
216
+ const keyMatch = /^(\s*-?\s*)([A-Za-z0-9_.-]+)(\s*:)/.exec(body);
217
+ const yamlKey = keyMatch?.[2];
218
+ if (yamlKey) {
219
+ const start = (keyMatch[1] ?? "").length;
220
+ addSegment(segments, start, start + yamlKey.length, "property", colors);
221
+ }
222
+ if (commentStart !== -1)
223
+ addSegment(segments, commentStart, code.length, "comment", colors);
224
+ return sortedSegments(segments);
225
+ }
226
+ function markdownSegments(code, colors) {
227
+ const segments = [];
228
+ const heading = /^(\s{0,3}#{1,6}\s+)(.*)$/.exec(code);
229
+ if (heading) {
230
+ addSegment(segments, 0, code.length, "tag", colors, true);
231
+ return segments;
232
+ }
233
+ const fence = /^\s*`{3,}/.exec(code);
234
+ if (fence) {
235
+ addSegment(segments, fence.index, code.length, "keyword", colors);
236
+ return segments;
237
+ }
238
+ const list = /^(\s*)(?:[-*+] |\d+\. )/.exec(code);
239
+ if (list)
240
+ addSegment(segments, (list[1] ?? "").length, list[0].length, "keyword", colors);
241
+ for (const match of code.matchAll(/`[^`]+`/g))
242
+ addSegment(segments, match.index, match.index + match[0].length, "string", colors);
243
+ for (const match of code.matchAll(/\[[^\]]+\]\([^)]+\)/g))
244
+ addSegment(segments, match.index, match.index + match[0].length, "tag", colors);
245
+ for (const match of code.matchAll(/\*\*[^*\n]+?\*\*|__[^_\n]+?__/g))
246
+ addMarkdownSegment(segments, match.index, match.index + match[0].length, "emphasis", colors, true);
247
+ for (const range of singleAsteriskEmphasisRanges(code))
248
+ addMarkdownSegment(segments, range.start, range.end, "emphasis", colors);
249
+ return sortedSegments(segments);
250
+ }
251
+ function singleAsteriskEmphasisRanges(code) {
252
+ const ranges = [];
253
+ let index = 0;
254
+ while (index < code.length) {
255
+ if (code[index] !== "*" || !isSingleAsteriskEmphasisOpen(code, index)) {
256
+ index += 1;
257
+ continue;
258
+ }
259
+ const end = findSingleAsteriskEmphasisEnd(code, index + 1);
260
+ if (end === -1) {
261
+ index += 1;
262
+ continue;
263
+ }
264
+ ranges.push({ start: index, end: end + 1 });
265
+ index = end + 1;
266
+ }
267
+ return ranges;
268
+ }
269
+ function findSingleAsteriskEmphasisEnd(code, start) {
270
+ for (let index = start; index < code.length; index += 1) {
271
+ if (code[index] === "*" && isSingleAsteriskEmphasisClose(code, index))
272
+ return index;
273
+ }
274
+ return -1;
275
+ }
276
+ function isSingleAsteriskEmphasisOpen(code, index) {
277
+ if (code[index - 1] === "*" || code[index + 1] === "*" || isEscapedMarkdownMarker(code, index))
278
+ return false;
279
+ const previous = code[index - 1] ?? "";
280
+ const next = code[index + 1] ?? "";
281
+ return next !== "" && !/\s/.test(next) && !isMarkdownClosingPunctuation(next) && (previous === "" || /\s/.test(previous) || isMarkdownOpeningPunctuation(previous));
282
+ }
283
+ function isSingleAsteriskEmphasisClose(code, index) {
284
+ if (code[index - 1] === "*" || code[index + 1] === "*" || isEscapedMarkdownMarker(code, index))
285
+ return false;
286
+ const previous = code[index - 1] ?? "";
287
+ const next = code[index + 1] ?? "";
288
+ return previous !== "" && !/\s/.test(previous) && !isMarkdownOpeningPunctuation(previous) && (next === "" || /\s/.test(next) || isMarkdownClosingPunctuation(next));
289
+ }
290
+ function isEscapedMarkdownMarker(code, index) {
291
+ let backslashes = 0;
292
+ for (let cursor = index - 1; cursor >= 0 && code[cursor] === "\\"; cursor -= 1)
293
+ backslashes += 1;
294
+ return backslashes % 2 === 1;
295
+ }
296
+ function isMarkdownOpeningPunctuation(char) {
297
+ return "([{<\"'“‘".includes(char);
298
+ }
299
+ function isMarkdownClosingPunctuation(char) {
300
+ return ")]}>,.!?;:\"'”’".includes(char);
301
+ }
302
+ function htmlSegments(code, colors) {
303
+ const segments = [];
304
+ let index = 0;
305
+ while (index < code.length) {
306
+ if (code.startsWith("<!--", index)) {
307
+ const end = code.indexOf("-->", index + 4);
308
+ const commentEnd = end === -1 ? code.length : end + 3;
309
+ addSegment(segments, index, commentEnd, "comment", colors);
310
+ index = commentEnd;
311
+ continue;
312
+ }
313
+ if (code[index] === "<") {
314
+ const end = code.indexOf(">", index + 1);
315
+ const tagEnd = end === -1 ? code.length : end + 1;
316
+ htmlTagSegments(code.slice(index, tagEnd), index, segments, colors);
317
+ index = tagEnd;
318
+ continue;
319
+ }
320
+ index += 1;
321
+ }
322
+ return sortedSegments(segments);
323
+ }
324
+ function cssSegments(code, colors) {
325
+ const segments = [];
326
+ let index = 0;
327
+ while (index < code.length) {
328
+ if (code.startsWith("/*", index)) {
329
+ const end = code.indexOf("*/", index + 2);
330
+ const commentEnd = end === -1 ? code.length : end + 2;
331
+ addSegment(segments, index, commentEnd, "comment", colors);
332
+ index = commentEnd;
333
+ continue;
334
+ }
335
+ const char = code[index] ?? "";
336
+ if (isQuote(char)) {
337
+ const end = consumeQuoted(code, index, char);
338
+ addSegment(segments, index, end, "string", colors);
339
+ index = end;
340
+ continue;
341
+ }
342
+ if (char === "@") {
343
+ const end = consumeIdentifier(code, index + 1);
344
+ addSegment(segments, index, end, "keyword", colors);
345
+ index = end;
346
+ continue;
347
+ }
348
+ if (isNumberStart(code, index)) {
349
+ const end = consumeCssNumber(code, index);
350
+ addSegment(segments, index, end, "number", colors);
351
+ index = end;
352
+ continue;
353
+ }
354
+ if (isCssPropertyStart(code, index)) {
355
+ const end = consumeCssProperty(code, index);
356
+ addSegment(segments, index, end, "property", colors);
357
+ index = end;
358
+ continue;
359
+ }
360
+ index += 1;
361
+ }
362
+ return sortedSegments(segments);
363
+ }
364
+ function jsonLikeValueSegments(code, colors) {
365
+ const segments = [];
366
+ let index = 0;
367
+ while (index < code.length) {
368
+ const char = code[index] ?? "";
369
+ if (isQuote(char)) {
370
+ const end = consumeQuoted(code, index, char);
371
+ addSegment(segments, index, end, "string", colors);
372
+ index = end;
373
+ continue;
374
+ }
375
+ if (isNumberStart(code, index)) {
376
+ const end = consumeNumber(code, index);
377
+ addSegment(segments, index, end, "number", colors);
378
+ index = end;
379
+ continue;
380
+ }
381
+ if (isIdentifierStart(char)) {
382
+ const end = consumeIdentifier(code, index);
383
+ const word = code.slice(index, end);
384
+ if (word === "true" || word === "false" || word === "null")
385
+ addSegment(segments, index, end, "constant", colors);
386
+ index = end;
387
+ continue;
388
+ }
389
+ index += 1;
390
+ }
391
+ return segments;
392
+ }
393
+ function htmlTagSegments(tagText, offset, segments, colors) {
394
+ const tagName = /^<\/?\s*([A-Za-z][\w:-]*)/.exec(tagText);
395
+ if (tagName?.[1]) {
396
+ const start = tagText.indexOf(tagName[1]);
397
+ addSegment(segments, offset + start, offset + start + tagName[1].length, "tag", colors, true);
398
+ }
399
+ for (const match of tagText.matchAll(/\s([A-Za-z_:][\w:.-]*)(?=\s*=)/g)) {
400
+ const attribute = match[1];
401
+ if (attribute)
402
+ addSegment(segments, offset + match.index + 1, offset + match.index + 1 + attribute.length, "property", colors);
403
+ }
404
+ for (const match of tagText.matchAll(/(["'])[^"']*\1/g)) {
405
+ addSegment(segments, offset + match.index, offset + match.index + match[0].length, "string", colors);
406
+ }
407
+ }
408
+ function isJsonProperty(code, end) {
409
+ let index = end;
410
+ while (index < code.length && /\s/.test(code[index] ?? ""))
411
+ index += 1;
412
+ return code[index] === ":";
413
+ }
414
+ function isLineCommentStart(code, index, marker) {
415
+ if (marker !== "#")
416
+ return true;
417
+ return index === 0 || /\s/.test(code[index - 1] ?? "");
418
+ }
419
+ function unquotedIndexOf(code, needle) {
420
+ let index = 0;
421
+ while (index < code.length) {
422
+ const char = code[index] ?? "";
423
+ if (isQuote(char)) {
424
+ index = consumeQuoted(code, index, char);
425
+ continue;
426
+ }
427
+ if (code.startsWith(needle, index))
428
+ return index;
429
+ index += 1;
430
+ }
431
+ return -1;
432
+ }
433
+ function addSegment(segments, start, end, style, colors, bold = false) {
434
+ if (start === undefined || end <= start)
435
+ return;
436
+ const segment = { start, end, foreground: tokenColor(style, colors) };
437
+ if (bold || style === "keyword" || style === "tag")
438
+ segment.bold = true;
439
+ segments.push(segment);
440
+ }
441
+ function addMarkdownSegment(segments, start, end, style, colors, bold = false) {
442
+ if (start === undefined || segments.some((segment) => start < segment.end && end > segment.start))
443
+ return;
444
+ addSegment(segments, start, end, style, colors, bold);
445
+ }
446
+ function tokenColor(style, colors) {
447
+ switch (style) {
448
+ case "comment":
449
+ return colors.muted;
450
+ case "emphasis":
451
+ return colors.accent;
452
+ case "constant":
453
+ case "number":
454
+ return colors.warning;
455
+ case "keyword":
456
+ case "tag":
457
+ return colors.accent;
458
+ case "property":
459
+ case "type":
460
+ return colors.info;
461
+ case "string":
462
+ return colors.success;
463
+ }
464
+ }
465
+ function sortedSegments(segments) {
466
+ return segments.sort((left, right) => left.start - right.start || left.end - right.end);
467
+ }
468
+ function consumeQuoted(text, start, quote) {
469
+ let index = start + 1;
470
+ while (index < text.length) {
471
+ const char = text[index] ?? "";
472
+ if (char === "\\") {
473
+ index += 2;
474
+ continue;
475
+ }
476
+ index += 1;
477
+ if (char === quote)
478
+ break;
479
+ }
480
+ return Math.min(index, text.length);
481
+ }
482
+ function consumeNumber(text, start) {
483
+ let index = start;
484
+ while (index < text.length && /[\w.+-]/.test(text[index] ?? ""))
485
+ index += 1;
486
+ return index;
487
+ }
488
+ function consumeCssNumber(text, start) {
489
+ let index = start;
490
+ while (index < text.length && /[\w.%-]/.test(text[index] ?? ""))
491
+ index += 1;
492
+ return index;
493
+ }
494
+ function consumeIdentifier(text, start) {
495
+ let index = start;
496
+ while (index < text.length && /[A-Za-z0-9_$-]/.test(text[index] ?? ""))
497
+ index += 1;
498
+ return index;
499
+ }
500
+ function consumeCssProperty(text, start) {
501
+ let index = start;
502
+ while (index < text.length && /[A-Za-z-]/.test(text[index] ?? ""))
503
+ index += 1;
504
+ return index;
505
+ }
506
+ function isCssPropertyStart(text, index) {
507
+ if (!/[A-Za-z-]/.test(text[index] ?? ""))
508
+ return false;
509
+ const end = consumeCssProperty(text, index);
510
+ let cursor = end;
511
+ while (cursor < text.length && /\s/.test(text[cursor] ?? ""))
512
+ cursor += 1;
513
+ return text[cursor] === ":";
514
+ }
515
+ function isNumberStart(text, index) {
516
+ const char = text[index] ?? "";
517
+ const prev = text[index - 1] ?? "";
518
+ return /\d/.test(char) && !/[A-Za-z_$]/.test(prev);
519
+ }
520
+ function isIdentifierStart(char) {
521
+ return /[A-Za-z_$]/.test(char);
522
+ }
523
+ function isQuote(char) {
524
+ return char === '"' || char === "'" || char === "`";
525
+ }
526
+ function words(value) {
527
+ return new Set(value.split(/\s+/).filter(Boolean));
528
+ }
@@ -0,0 +1,6 @@
1
+ export declare function expandTabs(text: string, tabWidth?: number): string;
2
+ export declare function stringDisplayWidth(text: string): number;
3
+ export declare function sliceByDisplayWidth(text: string, width: number): string;
4
+ export declare function padOrTrimDisplay(text: string, width: number): string;
5
+ export declare function wrapDisplayLine(text: string, width: number): string[];
6
+ export declare function wrapDisplayLineByWords(text: string, width: number): string[];