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,355 @@
1
+ // Default user config written when pi-tools-suite.jsonc is missing.
2
+ export const DEFAULT_PI_TOOLS_SUITE_CONFIG_JSONC = `{
3
+ // Disable individual pi-tools-suite modules by uncommenting entries below.
4
+ // Later project config in .pi/pi-tools-suite.jsonc can re-enable modules.
5
+ "disabledModules": [
6
+ // "ast-grep",
7
+ // "async-subagents",
8
+ // "terminal-bell",
9
+ // "lsp",
10
+ // "repo-discovery",
11
+ // "antigravity-auth",
12
+ // "todo",
13
+ // "model-tools",
14
+ // "usage",
15
+ // "web-search",
16
+ // "compress"
17
+ ],
18
+
19
+ // Dynamic Context Pruning (DCP) / compress module config.
20
+ "dcp": {
21
+ "enabled": true,
22
+ "manualMode": {
23
+ "enabled": false,
24
+ "automaticStrategies": true
25
+ },
26
+ "compress": {
27
+ "minContextPercent": 0.25,
28
+ "nudgeFrequency": 1,
29
+ "iterationNudgeThreshold": 8
30
+ }
31
+ },
32
+
33
+ "asyncSubagents": {
34
+ "defaultType": "quick",
35
+ "routing": {
36
+ "enabled": true,
37
+ "model": "zai/glm-4.5-air",
38
+ "maxTaskChars": 1200,
39
+ "maxTokens": 512,
40
+ "maxRetries": 1,
41
+ "temperature": 0,
42
+ "timeoutMs": 12000,
43
+ "debug": false
44
+ },
45
+ "presets": {
46
+ "cheap": {
47
+ "description": "Use cheap GLM/Gemini Flash models for text/code roles; keep vision on the enabled GPT vision model.",
48
+ "types": {
49
+ "quick": {
50
+ "model": "zai/glm-4.5-air",
51
+ "thinking": "off"
52
+ },
53
+ "scan": {
54
+ "model": "zai/glm-4.5-air",
55
+ "thinking": "off"
56
+ },
57
+ "research": {
58
+ "model": "zai/glm-5-turbo",
59
+ "thinking": "low"
60
+ },
61
+ "docs": {
62
+ "model": "zai/glm-4.5-air",
63
+ "thinking": "low"
64
+ },
65
+ "frontend": {
66
+ "model": "antigravity/gemini-3-flash-preview",
67
+ "fallbackModels": [
68
+ "zai/glm-5.1"
69
+ ],
70
+ "thinking": "medium"
71
+ },
72
+ "tests": {
73
+ "model": "zai/glm-5-turbo",
74
+ "thinking": "medium"
75
+ },
76
+ "review": {
77
+ "model": "zai/glm-5.1",
78
+ "thinking": "high"
79
+ },
80
+ "implement": {
81
+ "model": "zai/glm-5.1",
82
+ "thinking": "high"
83
+ },
84
+ "deep": {
85
+ "model": "zai/glm-5.1",
86
+ "thinking": "high"
87
+ },
88
+ "vision": {
89
+ "model": "openai-codex/gpt-5.4-mini",
90
+ "thinking": "off"
91
+ }
92
+ }
93
+ },
94
+ "gpt": {
95
+ "description": "Prefer enabled GPT-family models: spark/mini for cheap roles, gpt-5.5 for heavy roles; fallback cross-provider on quota.",
96
+ "types": {
97
+ "quick": {
98
+ "model": "openai-codex/gpt-5.3-codex-spark",
99
+ "fallbackModels": [
100
+ "zai/glm-4.5-air"
101
+ ],
102
+ "thinking": "off"
103
+ },
104
+ "scan": {
105
+ "model": "openai-codex/gpt-5.3-codex-spark",
106
+ "fallbackModels": [
107
+ "zai/glm-4.5-air"
108
+ ],
109
+ "thinking": "off"
110
+ },
111
+ "research": {
112
+ "model": "openai-codex/gpt-5.4-mini",
113
+ "fallbackModels": [
114
+ "zai/glm-5-turbo"
115
+ ],
116
+ "thinking": "low"
117
+ },
118
+ "docs": {
119
+ "model": "openai-codex/gpt-5.3-codex-spark",
120
+ "fallbackModels": [
121
+ "zai/glm-4.5-air"
122
+ ],
123
+ "thinking": "low"
124
+ },
125
+ "frontend": {
126
+ "model": "antigravity/gemini-3-flash-preview",
127
+ "fallbackModels": [
128
+ "zai/glm-5.1"
129
+ ],
130
+ "thinking": "medium"
131
+ },
132
+ "tests": {
133
+ "model": "openai-codex/gpt-5.4-mini",
134
+ "fallbackModels": [
135
+ "zai/glm-5-turbo"
136
+ ],
137
+ "thinking": "medium"
138
+ },
139
+ "review": {
140
+ "model": "openai-codex/gpt-5.5",
141
+ "fallbackModels": [
142
+ "zai/glm-5.1"
143
+ ],
144
+ "thinking": "high"
145
+ },
146
+ "implement": {
147
+ "model": "openai-codex/gpt-5.5",
148
+ "fallbackModels": [
149
+ "zai/glm-5.1"
150
+ ],
151
+ "thinking": "high"
152
+ },
153
+ "deep": {
154
+ "model": "openai-codex/gpt-5.5",
155
+ "fallbackModels": [
156
+ "zai/glm-5.1"
157
+ ],
158
+ "thinking": "high"
159
+ },
160
+ "vision": {
161
+ "model": "openai-codex/gpt-5.4-mini",
162
+ "thinking": "off"
163
+ }
164
+ }
165
+ },
166
+ "deep": {
167
+ "description": "Use only enabled strong models, mixing GPT, Claude, and Gemini by role.",
168
+ "types": {
169
+ "quick": {
170
+ "model": "openai-codex/gpt-5.4-mini",
171
+ "fallbackModels": [
172
+ "zai/glm-4.5-air"
173
+ ],
174
+ "thinking": "low"
175
+ },
176
+ "scan": {
177
+ "model": "antigravity/gemini-3-flash-preview",
178
+ "fallbackModels": [
179
+ "openai-codex/gpt-5.3-codex-spark",
180
+ "zai/glm-4.5-air"
181
+ ],
182
+ "thinking": "off"
183
+ },
184
+ "research": {
185
+ "model": "antigravity/gemini-3.1-pro-preview",
186
+ "fallbackModels": [
187
+ "openai-codex/gpt-5.4-mini",
188
+ "zai/glm-5-turbo"
189
+ ],
190
+ "thinking": "medium"
191
+ },
192
+ "docs": {
193
+ "model": "antigravity/gemini-2.5-flash",
194
+ "fallbackModels": [
195
+ "openai-codex/gpt-5.3-codex-spark",
196
+ "zai/glm-4.5-air"
197
+ ],
198
+ "thinking": "medium"
199
+ },
200
+ "frontend": {
201
+ "model": "antigravity/gemini-3.1-pro-preview-customtools",
202
+ "fallbackModels": [
203
+ "zai/glm-5.1"
204
+ ],
205
+ "thinking": "low"
206
+ },
207
+ "tests": {
208
+ "model": "antigravity/antigravity-claude-sonnet-4-6",
209
+ "fallbackModels": [
210
+ "openai-codex/gpt-5.4-mini",
211
+ "zai/glm-5-turbo"
212
+ ],
213
+ "thinking": "high"
214
+ },
215
+ "review": {
216
+ "model": "antigravity/antigravity-claude-sonnet-4-6",
217
+ "fallbackModels": [
218
+ "openai-codex/gpt-5.5",
219
+ "zai/glm-5.1"
220
+ ],
221
+ "thinking": "high"
222
+ },
223
+ "implement": {
224
+ "model": "openai-codex/gpt-5.5",
225
+ "fallbackModels": [
226
+ "zai/glm-5.1"
227
+ ],
228
+ "thinking": "high"
229
+ },
230
+ "deep": {
231
+ "model": "antigravity/antigravity-claude-opus-4-6-thinking",
232
+ "fallbackModels": [
233
+ "openai-codex/gpt-5.5",
234
+ "zai/glm-5.1"
235
+ ],
236
+ "thinking": "high"
237
+ },
238
+ "vision": {
239
+ "model": "openai-codex/gpt-5.4-mini",
240
+ "thinking": "off"
241
+ }
242
+ }
243
+ }
244
+ },
245
+ "types": {
246
+ "quick": {
247
+ "description": "Use for tiny cheap tasks: answer a simple question, inspect one known file, or verify one fact. Not for broad repo search.",
248
+ "model": "zai/glm-5-turbo",
249
+ "thinking": "off"
250
+ },
251
+ "scan": {
252
+ "description": "Use for finding files, symbols, text, or inventory across a repo. Return paths/facts; do not judge code quality.",
253
+ "model": "zai/glm-5-turbo",
254
+ "thinking": "off",
255
+ "tools": [
256
+ "read",
257
+ "grep"
258
+ ]
259
+ },
260
+ "research": {
261
+ "description": "Use for multi-file codebase research: read several files and explain how something works. No edits.",
262
+ "model": "zai/glm-5-turbo",
263
+ "thinking": "low",
264
+ "tools": [
265
+ "read",
266
+ "grep"
267
+ ]
268
+ },
269
+ "docs": {
270
+ "description": "Use for documentation work: README/API docs review, docs gaps, changelog, migration notes, examples.",
271
+ "model": "zai/glm-5-turbo",
272
+ "thinking": "low"
273
+ },
274
+ "frontend": {
275
+ "description": "Use for frontend UI/UX visual work: styling, layout, typography, animation, responsive states, component polish, accessibility. Avoid backend/business logic unless needed for UI behavior.",
276
+ "model": "antigravity/gemini-3-flash-preview",
277
+ "fallbackModels": [
278
+ "openai-codex/gpt-5.4-mini",
279
+ "zai/glm-5.1"
280
+ ],
281
+ "thinking": "medium",
282
+ "promptAppend": [
283
+ "Act as a frontend UI/UX engineer for visual and product-facing work.",
284
+ "Prioritize layout, typography, spacing, color, motion, responsive states, accessibility, and consistency with the existing design system.",
285
+ "Before editing, inspect nearby components/styles and infer the project's design language. Avoid backend/business-logic changes unless required for UI behavior.",
286
+ "When no mockup exists, choose a clear aesthetic direction and explain it briefly. Verify with targeted build/lint/tests or screenshot-relevant checks when possible."
287
+ ]
288
+ },
289
+ "tests": {
290
+ "description": "Use for tests: locate coverage, find gaps, run/check targeted test commands, diagnose failing tests.",
291
+ "model": "zai/glm-5-turbo",
292
+ "thinking": "medium",
293
+ "tools": [
294
+ "read",
295
+ "grep",
296
+ "bash"
297
+ ]
298
+ },
299
+ "review": {
300
+ "description": "Use for review/audit of existing code or changes: correctness, security, performance, maintainability, API risks, quality. Do not implement new code.",
301
+ "model": "openai-codex/gpt-5.5",
302
+ "fallbackModels": [
303
+ "zai/glm-5.1"
304
+ ],
305
+ "thinking": "high",
306
+ "tools": [
307
+ "read",
308
+ "grep"
309
+ ]
310
+ },
311
+ "implement": {
312
+ "description": "Use when the sub-agent should make or plan code changes for a feature, bug fix, or refactor.",
313
+ "model": "openai-codex/gpt-5.5",
314
+ "fallbackModels": [
315
+ "zai/glm-5.1"
316
+ ],
317
+ "thinking": "high"
318
+ },
319
+ "deep": {
320
+ "description": "Use for broad hard reasoning: architecture, system design, cross-module impact, complex tradeoffs.",
321
+ "model": "openai-codex/gpt-5.5",
322
+ "fallbackModels": [
323
+ "zai/glm-5.1"
324
+ ],
325
+ "thinking": "high"
326
+ },
327
+ "vision": {
328
+ "description": "Use only when task has imagePaths, screenshots, or asks to inspect visible UI/image content for a text-only parent.",
329
+ "model": "openai-codex/gpt-5.4-mini",
330
+ "thinking": "off",
331
+ "promptAppend": [
332
+ "You are a vision helper for a parent model that may not be able to see images.",
333
+ "Inspect any attached images and any image paths mentioned in the task/scope. Describe concrete visible details, UI state, text, layout, errors, and uncertainties.",
334
+ "If focus instructions are provided, prioritize them, but still mention other important visible findings.",
335
+ "Do not make code changes. Return a compact visual description that the parent agent can rely on."
336
+ ]
337
+ }
338
+ }
339
+ },
340
+
341
+ // Compact tool-renderer preview policy and name colors by tool name.
342
+ // direction=head keeps the first lines; direction=tail keeps the last lines.
343
+ // color accepts a Pi theme color name or a #rrggbb RGB literal. Tool entries
344
+ // override default and can also set compactHidden.
345
+ "toolRenderer": {},
346
+
347
+ "promptCommands": {
348
+ "commands": {
349
+ "commit": {
350
+ "prompt": "Commit all changes"
351
+ }
352
+ }
353
+ }
354
+ }
355
+ `;
@@ -0,0 +1,46 @@
1
+ import { loadPiToolsSuiteConfig } from "./config";
2
+ import { publishStartupModuleList } from "./startup-section";
3
+
4
+ type ExtensionAPI = any;
5
+
6
+ type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;
7
+
8
+ type ExtensionModule = {
9
+ default: ExtensionFactory;
10
+ };
11
+
12
+ const MODULES: Array<{ name: string; load: () => Promise<ExtensionModule> }> = [
13
+ { name: "ast-grep", load: () => import("./ast-grep/index") },
14
+ { name: "async-subagents", load: () => import("./async-subagents/index") },
15
+ { name: "terminal-bell", load: () => import("./terminal-bell/index") },
16
+ { name: "lsp", load: () => import("./lsp/index") },
17
+ { name: "repo-discovery", load: () => import("./repo-discovery/index") },
18
+ { name: "antigravity-auth", load: () => import("./antigravity-auth/index") },
19
+ { name: "todo", load: () => import("./todo/index") },
20
+ { name: "model-tools", load: () => import("./model-tools/index") },
21
+ { name: "usage", load: () => import("./usage/index") },
22
+ { name: "web-search", load: () => import("./web-search/index") },
23
+ { name: "compress", load: () => import("./compress/index") },
24
+ { name: "prompt-commands", load: () => import("./prompt-commands/index") },
25
+ ];
26
+
27
+ export default async function piToolsSuite(pi: ExtensionAPI) {
28
+ const loadedModuleNames: string[] = [];
29
+ const config = loadPiToolsSuiteConfig(MODULES.map((module) => module.name));
30
+ const disabledModules = new Set(config.enabled ? config.disabledModules : MODULES.map((module) => module.name));
31
+
32
+ for (const module of MODULES) {
33
+ if (disabledModules.has(module.name)) continue;
34
+
35
+ try {
36
+ const loaded = await module.load();
37
+ await loaded.default(pi);
38
+ loadedModuleNames.push(module.name);
39
+ } catch (error) {
40
+ const message = error instanceof Error ? error.stack ?? error.message : String(error);
41
+ throw new Error(`Failed to load pi-tools-suite module ${module.name}: ${message}`);
42
+ }
43
+ }
44
+
45
+ await publishStartupModuleList(loadedModuleNames);
46
+ }
@@ -0,0 +1,62 @@
1
+ import type { AgentToolResult, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import { existsSync } from "node:fs";
3
+ import { toAbsolutePath } from "../lsp/_shared/paths.js";
4
+ import { getGlobalLspManager } from "../lsp/manager.js";
5
+ import { getEventPaths, isMutationToolResult } from "../lsp/mutation-events.js";
6
+
7
+ export type LspEnrichableToolResult<TDetails = unknown> = AgentToolResult<TDetails>;
8
+
9
+ export type LspMutationToolResultInput<TDetails = unknown> = {
10
+ toolName: string;
11
+ input: unknown;
12
+ result: LspEnrichableToolResult<TDetails>;
13
+ ctx: ExtensionContext;
14
+ isError?: boolean;
15
+ };
16
+
17
+ function textContent(text: string): AgentToolResult<unknown>["content"][number] {
18
+ return { type: "text", text };
19
+ }
20
+
21
+ function hasLspDiagnosticsContent(result: LspEnrichableToolResult): boolean {
22
+ return result.content.some((part) => typeof (part as { text?: unknown }).text === "string" && (part as { text: string }).text.includes("LSP diagnostics:"));
23
+ }
24
+
25
+ function isMissingFileError(error: unknown): boolean {
26
+ return (error as { code?: unknown })?.code === "ENOENT" || String((error as Error)?.message ?? error).includes("ENOENT");
27
+ }
28
+
29
+ export async function appendLspDiagnosticsToMutationResult<T extends LspEnrichableToolResult>(options: LspMutationToolResultInput<T["details"]> & { result: T }): Promise<T> {
30
+ if (options.isError || !isMutationToolResult({ toolName: options.toolName, input: options.input, details: options.result.details })) return options.result;
31
+ if (hasLspDiagnosticsContent(options.result)) return options.result;
32
+
33
+ try {
34
+ const files = [...new Set(getEventPaths(options.input, options.result.details).map((inputPath) => toAbsolutePath(inputPath, options.ctx.cwd)))].filter((file) => existsSync(file));
35
+ if (files.length === 0) return options.result;
36
+
37
+ const manager = getGlobalLspManager();
38
+ const summaries: string[] = [];
39
+ for (const file of files) {
40
+ const summary = await manager.updateDiagnosticsForFile(options.ctx, file);
41
+ if (summary.trim()) summaries.push(summary);
42
+ }
43
+
44
+ const summary = summaries.join("\n\n");
45
+ if (!summary.trim()) return options.result;
46
+
47
+ return {
48
+ ...options.result,
49
+ content: [...options.result.content, textContent(summary)],
50
+ };
51
+ } catch (error) {
52
+ if (isMissingFileError(error)) return options.result;
53
+ return {
54
+ ...options.result,
55
+ content: [...options.result.content, textContent(`LSP diagnostics:\n\n⚠️ lsp: ${(error as Error).message}`)],
56
+ };
57
+ }
58
+ }
59
+
60
+ export async function shutdownGlobalLspManager(): Promise<void> {
61
+ await getGlobalLspManager().shutdownAll();
62
+ }
@@ -0,0 +1,42 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import path from "node:path";
3
+
4
+ export function directoryExists(file: string): boolean {
5
+ try {
6
+ return existsSync(file) && statSync(file).isDirectory();
7
+ } catch {
8
+ return false;
9
+ }
10
+ }
11
+
12
+ export function fileExists(file: string): boolean {
13
+ try {
14
+ return existsSync(file) && statSync(file).isFile();
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ export function findProjectRoot(cwd: string): string {
21
+ let dir = path.resolve(cwd);
22
+ let packageRoot: string | undefined;
23
+
24
+ while (true) {
25
+ if (directoryExists(path.join(dir, ".indexer-cli"))) return dir;
26
+ if (directoryExists(path.join(dir, ".git"))) return dir;
27
+ if (!packageRoot && fileExists(path.join(dir, "package.json"))) packageRoot = dir;
28
+
29
+ const parent = path.dirname(dir);
30
+ if (parent === dir) return packageRoot ?? path.resolve(cwd);
31
+ dir = parent;
32
+ }
33
+ }
34
+
35
+ export function findIndexedProjectRoot(cwd: string): string | undefined {
36
+ const projectRoot = findProjectRoot(cwd);
37
+ return directoryExists(path.join(projectRoot, ".indexer-cli")) ? projectRoot : undefined;
38
+ }
39
+
40
+ export function hasIndexedProjectRoot(cwd: string = process.cwd()): boolean {
41
+ return findIndexedProjectRoot(cwd) !== undefined;
42
+ }
@@ -0,0 +1,137 @@
1
+ export type ModelProfile = "claude" | "codex";
2
+
3
+ export function detectModelProfile(model: unknown): ModelProfile {
4
+ if (typeof model === "string") return detectModelProfileFromText(model);
5
+ if (!model || typeof model !== "object") return "claude";
6
+ const record = model as Record<string, unknown>;
7
+ const values = [record.provider, record.id, record.name]
8
+ .filter((value): value is string => typeof value === "string")
9
+ .join(" ");
10
+
11
+ return detectModelProfileFromText(values);
12
+ }
13
+
14
+ function detectModelProfileFromText(value: string): ModelProfile {
15
+ const values = value.toLowerCase();
16
+
17
+ if (
18
+ values.includes("codex") ||
19
+ values.includes("gpt") ||
20
+ /\bo\d/.test(values) ||
21
+ values.includes("openai")
22
+ ) {
23
+ return "codex";
24
+ }
25
+ return "claude";
26
+ }
27
+
28
+ const CLAUDE_TOOL_ALIASES: Record<string, string | undefined> = {
29
+ read: "Read",
30
+ Read: "Read",
31
+ edit: "Edit",
32
+ Edit: "Edit",
33
+ write: "Write",
34
+ Write: "Write",
35
+ bash: "Bash",
36
+ Bash: "Bash",
37
+ shell_command: "Bash",
38
+ shell: "Bash",
39
+ grep: "Grep",
40
+ Grep: "Grep",
41
+ find: "Glob",
42
+ ls: "Glob",
43
+ LS: "Glob",
44
+ glob: "Glob",
45
+ Glob: "Glob",
46
+ };
47
+
48
+ const CODEX_TOOL_ALIASES: Record<string, string | undefined> = {
49
+ read: "read",
50
+ Read: "read",
51
+ bash: "shell",
52
+ Bash: "shell",
53
+ shell_command: "shell",
54
+ shell: "shell",
55
+ edit: "apply_patch",
56
+ Edit: "apply_patch",
57
+ write: "apply_patch",
58
+ Write: "apply_patch",
59
+ apply_patch: "apply_patch",
60
+ grep: "shell",
61
+ Grep: "shell",
62
+ find: "shell",
63
+ ls: "shell",
64
+ LS: "shell",
65
+ glob: "shell",
66
+ Glob: "shell",
67
+ };
68
+
69
+ export function selectSuitableToolsForModel(model: unknown, tools: readonly string[]): string[] {
70
+ const aliases = detectModelProfile(model) === "codex" ? CODEX_TOOL_ALIASES : CLAUDE_TOOL_ALIASES;
71
+ const selected: string[] = [];
72
+ for (const tool of tools) {
73
+ const name = typeof tool === "string" ? tool.trim() : "";
74
+ if (!name) continue;
75
+ const mapped = aliases[name];
76
+ if (mapped && !selected.includes(mapped)) selected.push(mapped);
77
+ }
78
+ return selected;
79
+ }
80
+
81
+ export function toReadArgs(input: { file_path?: string; path?: string; offset?: number; limit?: number }) {
82
+ return { path: input.file_path ?? input.path ?? "", offset: input.offset, limit: input.limit };
83
+ }
84
+
85
+ export function toEditArgs(input: {
86
+ file_path?: string;
87
+ path?: string;
88
+ old_string?: string;
89
+ new_string?: string;
90
+ replace_all?: boolean;
91
+ }) {
92
+ return {
93
+ path: input.file_path ?? input.path ?? "",
94
+ edits: [{ oldText: input.old_string ?? "", newText: input.new_string ?? "" }],
95
+ };
96
+ }
97
+
98
+ export function toWriteArgs(input: { file_path?: string; path?: string; content?: string }) {
99
+ return { path: input.file_path ?? input.path ?? "", content: input.content ?? "" };
100
+ }
101
+
102
+ export function toGrepArgs(input: {
103
+ pattern: string;
104
+ path?: string;
105
+ glob?: string;
106
+ case_sensitive?: boolean;
107
+ regex?: boolean;
108
+ before_context?: number;
109
+ after_context?: number;
110
+ context?: number;
111
+ limit?: number;
112
+ max_count?: number;
113
+ }) {
114
+ const before = input.before_context ?? 0;
115
+ const after = input.after_context ?? 0;
116
+ return {
117
+ pattern: input.pattern,
118
+ path: input.path,
119
+ glob: input.glob,
120
+ ignoreCase: input.case_sensitive === undefined ? undefined : !input.case_sensitive,
121
+ literal: input.regex === undefined ? undefined : !input.regex,
122
+ context: input.context ?? (Math.max(before, after) || undefined),
123
+ limit: input.limit ?? input.max_count,
124
+ };
125
+ }
126
+
127
+ export function toShellCommand(input: { command?: string }) {
128
+ return (input.command ?? "").trim();
129
+ }
130
+
131
+ export function prepareApplyPatchArgs(args: unknown): { input: string } {
132
+ if (typeof args === "string") return { input: args };
133
+ if (!args || typeof args !== "object") return { input: "" };
134
+ const record = args as Record<string, unknown>;
135
+ const input = record.input ?? record.patch;
136
+ return { input: typeof input === "string" ? input : "" };
137
+ }