@selesai/code 0.10.2 → 0.12.0

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 (531) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli/startup-ui.js +2 -1
  4. package/dist/cli.js +0 -0
  5. package/dist/core/agent-session.d.ts +12 -1
  6. package/dist/core/agent-session.js +77 -9
  7. package/dist/core/compaction/branch-summarization.js +34 -33
  8. package/dist/core/compaction/compaction.d.ts +5 -0
  9. package/dist/core/compaction/compaction.js +100 -85
  10. package/dist/core/compaction/utils.js +2 -2
  11. package/dist/core/export-html/template.css +1066 -1066
  12. package/dist/core/export-html/template.html +55 -55
  13. package/dist/core/export-html/template.js +1864 -1864
  14. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  15. package/dist/core/export-html/vendor/marked.min.js +78 -78
  16. package/dist/core/extensions/index.d.ts +1 -1
  17. package/dist/core/extensions/runner.d.ts +5 -0
  18. package/dist/core/extensions/runner.js +48 -1
  19. package/dist/core/extensions/types.d.ts +18 -1
  20. package/dist/core/llama/client.d.ts +6 -0
  21. package/dist/core/llama/client.js +7 -0
  22. package/dist/core/llama/provider.d.ts +3 -1
  23. package/dist/core/llama/provider.js +28 -6
  24. package/dist/core/messages.js +7 -7
  25. package/dist/core/session-manager.js +4 -2
  26. package/dist/core/settings-manager.d.ts +8 -1
  27. package/dist/core/settings-manager.js +17 -0
  28. package/dist/defaults/models.json +32 -9
  29. package/dist/defaults/settings.json +0 -3
  30. package/dist/extensions/auto-session-name.test.ts +157 -0
  31. package/dist/extensions/auto-session-name.ts +96 -0
  32. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  33. package/dist/extensions/context-compaction-reminder.ts +28 -28
  34. package/dist/extensions/cost-reconcile.test.ts +76 -0
  35. package/dist/extensions/cost-reconcile.ts +278 -0
  36. package/dist/extensions/enable-readonly-tools.test.ts +11 -0
  37. package/dist/extensions/enable-readonly-tools.ts +7 -3
  38. package/dist/extensions/package.json +3 -0
  39. package/dist/extensions/pi-intercom/LICENSE +21 -21
  40. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  41. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  42. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  43. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  44. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  45. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  46. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  47. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  48. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  49. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  50. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  51. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  52. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  53. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  54. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  55. package/dist/extensions/pi-subagents/install.mjs +0 -0
  56. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  57. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  58. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  59. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  60. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  61. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  62. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  63. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  64. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  65. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  66. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  67. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  68. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  69. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  70. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  71. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  72. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  73. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  74. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  75. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  76. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  77. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  78. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  79. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  80. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  81. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  82. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  83. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  84. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  85. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  86. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  87. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  88. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  89. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  90. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  91. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  92. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  93. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  94. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  95. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  96. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  97. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  98. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  99. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  100. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  101. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  102. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  103. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  104. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  105. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  106. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  107. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  108. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  109. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  110. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  111. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  112. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  113. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  114. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  115. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  116. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  117. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  118. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  119. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  120. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  121. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  122. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  123. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  124. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  125. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  126. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  127. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  128. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  129. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  130. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  131. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  132. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  133. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  134. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  135. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  136. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  137. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  138. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  139. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  140. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  141. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  142. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  143. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  144. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  145. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  146. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  147. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  148. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  149. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  150. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  151. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  152. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  153. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  154. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  155. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  156. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  157. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  158. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  159. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  160. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  161. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  162. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  163. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  164. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  165. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  166. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  167. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  168. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  169. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  170. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  171. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  172. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  173. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  174. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  175. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  176. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  177. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  178. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  179. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  180. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  181. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  182. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  183. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  184. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  185. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  186. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  231. package/dist/extensions/pi-tool-display/CHANGELOG.md +329 -0
  232. package/dist/extensions/pi-tool-display/LICENSE +21 -0
  233. package/dist/extensions/pi-tool-display/README.md +417 -0
  234. package/dist/extensions/pi-tool-display/config/config.example.json +40 -0
  235. package/dist/extensions/pi-tool-display/index.ts +3 -0
  236. package/dist/extensions/pi-tool-display/package-lock.json +2555 -0
  237. package/dist/extensions/pi-tool-display/package.json +86 -0
  238. package/dist/extensions/pi-tool-display/src/agent-dir.ts +35 -0
  239. package/dist/extensions/pi-tool-display/src/ansi-utils.ts +116 -0
  240. package/dist/extensions/pi-tool-display/src/bash-display.ts +213 -0
  241. package/dist/extensions/pi-tool-display/src/capabilities.ts +88 -0
  242. package/dist/extensions/pi-tool-display/src/config-modal.ts +541 -0
  243. package/dist/extensions/pi-tool-display/src/config-store.ts +304 -0
  244. package/dist/extensions/pi-tool-display/src/debug-logger.ts +150 -0
  245. package/dist/extensions/pi-tool-display/src/diff-presentation.ts +72 -0
  246. package/dist/extensions/pi-tool-display/src/diff-renderer.ts +2517 -0
  247. package/dist/extensions/pi-tool-display/src/disposable.ts +34 -0
  248. package/dist/extensions/pi-tool-display/src/extension-lifecycle.ts +14 -0
  249. package/dist/extensions/pi-tool-display/src/index.ts +109 -0
  250. package/dist/extensions/pi-tool-display/src/line-width-safety.ts +93 -0
  251. package/dist/extensions/pi-tool-display/src/modal-icons.ts +57 -0
  252. package/dist/extensions/pi-tool-display/src/pending-diff-preview.ts +370 -0
  253. package/dist/extensions/pi-tool-display/src/presets.ts +117 -0
  254. package/dist/extensions/pi-tool-display/src/render-utils.ts +186 -0
  255. package/dist/extensions/pi-tool-display/src/settings-inspector-modal.ts +475 -0
  256. package/dist/extensions/pi-tool-display/src/thinking-label.ts +343 -0
  257. package/dist/extensions/pi-tool-display/src/tool-call-box.ts +181 -0
  258. package/dist/extensions/pi-tool-display/src/tool-metadata.ts +139 -0
  259. package/dist/extensions/pi-tool-display/src/tool-overrides.ts +2168 -0
  260. package/dist/extensions/pi-tool-display/src/types.ts +109 -0
  261. package/dist/extensions/pi-tool-display/src/user-message-box-markdown.ts +64 -0
  262. package/dist/extensions/pi-tool-display/src/user-message-box-native.ts +66 -0
  263. package/dist/extensions/pi-tool-display/src/user-message-box-patch.ts +72 -0
  264. package/dist/extensions/pi-tool-display/src/user-message-box-renderer.ts +419 -0
  265. package/dist/extensions/pi-tool-display/src/user-message-box-utils.ts +106 -0
  266. package/dist/extensions/pi-tool-display/src/write-display-utils.ts +31 -0
  267. package/dist/extensions/pi-tool-display/src/zellij-modal.ts +1027 -0
  268. package/dist/extensions/pi-tool-display/tests/active-backlog-red.test.ts +65 -0
  269. package/dist/extensions/pi-tool-display/tests/ansi-utils.test.ts +345 -0
  270. package/dist/extensions/pi-tool-display/tests/bash-display.test.ts +442 -0
  271. package/dist/extensions/pi-tool-display/tests/capabilities-edge.test.ts +360 -0
  272. package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +54 -0
  273. package/dist/extensions/pi-tool-display/tests/config-modal.test.ts +360 -0
  274. package/dist/extensions/pi-tool-display/tests/config-store.test.ts +87 -0
  275. package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +415 -0
  276. package/dist/extensions/pi-tool-display/tests/debug-logger-edge.test.ts +630 -0
  277. package/dist/extensions/pi-tool-display/tests/debug-logger.test.ts +62 -0
  278. package/dist/extensions/pi-tool-display/tests/diff-renderer-ansi.test.ts +55 -0
  279. package/dist/extensions/pi-tool-display/tests/diff-renderer-edge.test.ts +886 -0
  280. package/dist/extensions/pi-tool-display/tests/diff-renderer-numbering.test.ts +135 -0
  281. package/dist/extensions/pi-tool-display/tests/diff-renderer-width.test.ts +454 -0
  282. package/dist/extensions/pi-tool-display/tests/diff-renderer-wrap.test.ts +169 -0
  283. package/dist/extensions/pi-tool-display/tests/index-integration.test.ts +354 -0
  284. package/dist/extensions/pi-tool-display/tests/pending-diff-preview.test.ts +79 -0
  285. package/dist/extensions/pi-tool-display/tests/presets-edge.test.ts +229 -0
  286. package/dist/extensions/pi-tool-display/tests/presets.test.ts +26 -0
  287. package/dist/extensions/pi-tool-display/tests/reload-behavior.test.ts +1241 -0
  288. package/dist/extensions/pi-tool-display/tests/render-utils.test.ts +710 -0
  289. package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +450 -0
  290. package/dist/extensions/pi-tool-display/tests/thinking-label-edge.test.ts +904 -0
  291. package/dist/extensions/pi-tool-display/tests/thinking-label.test.ts +72 -0
  292. package/dist/extensions/pi-tool-display/tests/tool-call-box.test.ts +105 -0
  293. package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +613 -0
  294. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +499 -0
  295. package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +315 -0
  296. package/dist/extensions/pi-tool-display/tests/tool-overrides-write-meta.test.ts +68 -0
  297. package/dist/extensions/pi-tool-display/tests/tool-ui-utils.test.ts +413 -0
  298. package/dist/extensions/pi-tool-display/tests/user-message-box-performance-red.test.ts +176 -0
  299. package/dist/extensions/pi-tool-display/tests/user-message-box.test.ts +908 -0
  300. package/dist/extensions/pi-tool-display/tests/zellij-modal.test.ts +848 -0
  301. package/dist/extensions/pi-tool-display/tool-display-api-consumer.d.ts +30 -0
  302. package/dist/extensions/pi-tool-display/tool-display-api-consumer.js +40 -0
  303. package/dist/extensions/pi-web-agent/package.json +31 -31
  304. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  305. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  306. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  307. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  308. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  309. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  310. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  311. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  312. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  313. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  314. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  315. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  316. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  317. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  318. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  319. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  320. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  321. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  322. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  323. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  324. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  325. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  326. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  327. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  328. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  329. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  330. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  331. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  332. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  333. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  334. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  335. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  336. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  337. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  338. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  339. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  340. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  341. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  342. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  343. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  344. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +46 -1
  345. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +10 -0
  346. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +1 -1
  347. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +3 -3
  348. package/dist/extensions/pi-zentui/test/format.test.ts +50 -2
  349. package/dist/extensions/ponytail/package.json +8 -8
  350. package/dist/extensions/question/constants.ts +30 -30
  351. package/dist/extensions/question/helpers.ts +58 -58
  352. package/dist/extensions/question/navigation.ts +14 -14
  353. package/dist/extensions/question/package.json +19 -19
  354. package/dist/extensions/question/selection-mode.ts +46 -46
  355. package/dist/extensions/question/shortcuts.ts +44 -44
  356. package/dist/extensions/question/types.ts +132 -132
  357. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  358. package/dist/extensions/test-resolve-hook.mjs +6 -6
  359. package/dist/extensions/tokenin-onboarding.ts +112 -2
  360. package/dist/extensions/web-agent-onboarding.ts +222 -222
  361. package/dist/index.d.ts +2 -1
  362. package/dist/index.js +1 -0
  363. package/dist/main.js +2 -0
  364. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  365. package/dist/modes/interactive/components/settings-selector.js +10 -0
  366. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  367. package/dist/modes/interactive/interactive-mode.js +72 -42
  368. package/dist/modes/rpc/rpc-client.d.ts +7 -0
  369. package/dist/modes/rpc/rpc-client.js +7 -0
  370. package/dist/modes/rpc/rpc-mode.js +3 -0
  371. package/dist/modes/rpc/rpc-types.d.ts +12 -0
  372. package/dist/package-manager-cli.js +71 -71
  373. package/dist/rpc-entry.js +0 -0
  374. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  375. package/dist/utils/shell.js +6 -4
  376. package/docs/compaction.md +396 -396
  377. package/docs/containerization.md +111 -111
  378. package/docs/development.md +71 -71
  379. package/docs/docs.json +164 -164
  380. package/docs/environment-variables.md +86 -86
  381. package/docs/index.md +83 -83
  382. package/docs/json.md +82 -82
  383. package/docs/models.md +502 -502
  384. package/docs/packages.md +227 -227
  385. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  386. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  387. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  388. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  389. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  390. package/docs/prompt-templates.md +95 -95
  391. package/docs/providers.md +293 -293
  392. package/docs/security.md +59 -59
  393. package/docs/session-format.md +414 -414
  394. package/docs/sessions.md +145 -145
  395. package/docs/settings.md +4 -0
  396. package/docs/shared-host-extensions.md +109 -109
  397. package/docs/shell-aliases.md +13 -13
  398. package/docs/skills.md +231 -231
  399. package/docs/terminal-setup.md +142 -142
  400. package/docs/termux.md +127 -127
  401. package/docs/themes.md +295 -295
  402. package/docs/tmux.md +63 -63
  403. package/docs/tui.md +927 -927
  404. package/docs/windows.md +17 -17
  405. package/examples/README.md +25 -25
  406. package/examples/extensions/README.md +211 -211
  407. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  408. package/examples/extensions/bash-spawn-hook.ts +30 -30
  409. package/examples/extensions/bookmark.ts +50 -50
  410. package/examples/extensions/border-status-editor.ts +150 -150
  411. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  412. package/examples/extensions/claude-rules.ts +86 -86
  413. package/examples/extensions/commands.ts +72 -72
  414. package/examples/extensions/confirm-destructive.ts +59 -59
  415. package/examples/extensions/custom-compaction.ts +130 -130
  416. package/examples/extensions/custom-footer.ts +64 -64
  417. package/examples/extensions/custom-header.ts +73 -73
  418. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  419. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  420. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  421. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  422. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  423. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  424. package/examples/extensions/dirty-repo-guard.ts +56 -56
  425. package/examples/extensions/doom-overlay/README.md +46 -46
  426. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  427. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  428. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  429. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  430. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  431. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  432. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  433. package/examples/extensions/doom-overlay/index.ts +74 -74
  434. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  435. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  436. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  437. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  438. package/examples/extensions/dynamic-resources/index.ts +15 -15
  439. package/examples/extensions/dynamic-tools.ts +74 -74
  440. package/examples/extensions/event-bus.ts +43 -43
  441. package/examples/extensions/file-trigger.ts +41 -41
  442. package/examples/extensions/git-checkpoint.ts +53 -53
  443. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  444. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  445. package/examples/extensions/gondolin/index.ts +531 -531
  446. package/examples/extensions/gondolin/package-lock.json +185 -185
  447. package/examples/extensions/gondolin/package.json +19 -19
  448. package/examples/extensions/handoff.ts +199 -199
  449. package/examples/extensions/hello.ts +26 -26
  450. package/examples/extensions/hidden-thinking-label.ts +53 -53
  451. package/examples/extensions/inline-bash.ts +94 -94
  452. package/examples/extensions/input-transform-streaming.ts +39 -39
  453. package/examples/extensions/input-transform.ts +43 -43
  454. package/examples/extensions/interactive-shell.ts +196 -196
  455. package/examples/extensions/mac-system-theme.ts +47 -47
  456. package/examples/extensions/message-renderer.ts +59 -59
  457. package/examples/extensions/minimal-mode.ts +426 -426
  458. package/examples/extensions/modal-editor.ts +85 -85
  459. package/examples/extensions/model-status.ts +31 -31
  460. package/examples/extensions/notify.ts +55 -55
  461. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  462. package/examples/extensions/overlay-test.ts +153 -153
  463. package/examples/extensions/permission-gate.ts +34 -34
  464. package/examples/extensions/pirate.ts +47 -47
  465. package/examples/extensions/plan-mode/README.md +66 -66
  466. package/examples/extensions/plan-mode/index.ts +390 -390
  467. package/examples/extensions/plan-mode/utils.ts +168 -168
  468. package/examples/extensions/preset.ts +436 -436
  469. package/examples/extensions/project-trust.ts +64 -64
  470. package/examples/extensions/prompt-customizer.ts +97 -97
  471. package/examples/extensions/protected-paths.ts +30 -30
  472. package/examples/extensions/provider-payload.ts +18 -18
  473. package/examples/extensions/qna.ts +122 -122
  474. package/examples/extensions/question.ts +285 -285
  475. package/examples/extensions/questionnaire.ts +448 -448
  476. package/examples/extensions/rainbow-editor.ts +88 -88
  477. package/examples/extensions/reload-runtime.ts +37 -37
  478. package/examples/extensions/rpc-demo.ts +118 -118
  479. package/examples/extensions/sandbox/index.ts +321 -321
  480. package/examples/extensions/sandbox/package-lock.json +92 -92
  481. package/examples/extensions/sandbox/package.json +19 -19
  482. package/examples/extensions/send-user-message.ts +97 -97
  483. package/examples/extensions/session-name.ts +27 -27
  484. package/examples/extensions/shutdown-command.ts +63 -63
  485. package/examples/extensions/snake.ts +343 -343
  486. package/examples/extensions/space-invaders.ts +560 -560
  487. package/examples/extensions/ssh.ts +220 -220
  488. package/examples/extensions/status-line.ts +32 -32
  489. package/examples/extensions/structured-output.ts +65 -65
  490. package/examples/extensions/subagent/README.md +175 -175
  491. package/examples/extensions/subagent/agents/planner.md +37 -37
  492. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  493. package/examples/extensions/subagent/agents/scout.md +50 -50
  494. package/examples/extensions/subagent/agents/worker.md +24 -24
  495. package/examples/extensions/subagent/agents.ts +126 -126
  496. package/examples/extensions/subagent/index.ts +1015 -1015
  497. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  498. package/examples/extensions/subagent/prompts/implement.md +10 -10
  499. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  500. package/examples/extensions/summarize.ts +209 -209
  501. package/examples/extensions/system-prompt-header.ts +17 -17
  502. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  503. package/examples/extensions/timed-confirm.ts +70 -70
  504. package/examples/extensions/titlebar-spinner.ts +58 -58
  505. package/examples/extensions/todo.ts +297 -297
  506. package/examples/extensions/tool-override.ts +144 -144
  507. package/examples/extensions/tools.ts +146 -146
  508. package/examples/extensions/trigger-compact.ts +50 -50
  509. package/examples/extensions/truncated-tool.ts +195 -195
  510. package/examples/extensions/widget-placement.ts +9 -9
  511. package/examples/extensions/with-deps/index.ts +32 -32
  512. package/examples/extensions/with-deps/package-lock.json +31 -31
  513. package/examples/extensions/with-deps/package.json +22 -22
  514. package/examples/extensions/working-indicator.ts +123 -123
  515. package/examples/extensions/working-message-test.ts +25 -25
  516. package/examples/rpc-extension-ui.ts +632 -632
  517. package/examples/sdk/01-minimal.ts +26 -26
  518. package/examples/sdk/02-custom-model.ts +53 -53
  519. package/examples/sdk/03-custom-prompt.ts +75 -75
  520. package/examples/sdk/04-skills.ts +55 -55
  521. package/examples/sdk/05-tools.ts +48 -48
  522. package/examples/sdk/06-extensions.ts +99 -99
  523. package/examples/sdk/07-context-files.ts +47 -47
  524. package/examples/sdk/08-prompt-templates.ts +51 -51
  525. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  526. package/examples/sdk/10-settings.ts +53 -53
  527. package/examples/sdk/11-sessions.ts +52 -52
  528. package/examples/sdk/12-full-control.ts +79 -79
  529. package/examples/sdk/13-session-runtime.ts +67 -67
  530. package/examples/sdk/README.md +144 -144
  531. package/package.json +6 -6
@@ -0,0 +1,343 @@
1
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import { isRecord } from "./tool-metadata.js";
3
+ import { onReloadShutdown } from "./extension-lifecycle.js";
4
+
5
+ interface ThemeLike {
6
+ fg(color: string, text: string): string;
7
+ }
8
+
9
+ interface AssistantMessageLike {
10
+ role?: unknown;
11
+ api?: unknown;
12
+ content?: unknown;
13
+ }
14
+
15
+ const THINKING_CHAT_PREFIX = "Thinking: ";
16
+ const THINKING_LABEL_PREFIX_PATTERN = /^(?:thinking:\s*)+/i;
17
+ const LEADING_ANSI_FRAGMENT_PATTERN = /^(?:\s*;?\d{1,3}(?:;\d{1,3})*m)+\s*/;
18
+ const MAX_THINKING_CONTENT_DEPTH = 16;
19
+
20
+ const registeredThinkingApis = new WeakSet<ExtensionAPI>();
21
+
22
+ const OPENAI_REASONING_APIS = new Set([
23
+ "openai-completions",
24
+ "openai-responses",
25
+ "openai-codex-responses",
26
+ ]);
27
+
28
+ const ANTHROPIC_REASONING_APIS = new Set([
29
+ "anthropic-messages",
30
+ "anthropic-responses",
31
+ "anthropic-completions",
32
+ ]);
33
+
34
+ function normalizeApiName(api: unknown): string | undefined {
35
+ if (typeof api !== "string") {
36
+ return undefined;
37
+ }
38
+
39
+ const normalized = api.trim().toLowerCase();
40
+ return normalized.length > 0 ? normalized : undefined;
41
+ }
42
+
43
+ function shouldPrefixThinkingForApi(api: unknown): boolean {
44
+ const normalizedApi = normalizeApiName(api);
45
+ if (!normalizedApi) {
46
+ return true;
47
+ }
48
+
49
+ if (OPENAI_REASONING_APIS.has(normalizedApi)) {
50
+ return true;
51
+ }
52
+
53
+ if (ANTHROPIC_REASONING_APIS.has(normalizedApi)) {
54
+ return true;
55
+ }
56
+
57
+ if (normalizedApi.startsWith("anthropic-")) {
58
+ return true;
59
+ }
60
+
61
+ // Keep OpenAI handling explicit to avoid applying this formatter to
62
+ // unrelated OpenAI transport APIs that may not emit thinking blocks.
63
+ if (normalizedApi.startsWith("openai-")) {
64
+ return false;
65
+ }
66
+
67
+ // For non-OpenAI providers, apply the prefix when thinking blocks exist.
68
+ return true;
69
+ }
70
+
71
+ function stripAnsi(text: string): string {
72
+ return text.replace(/\x1b\[[0-9;]*m/g, "");
73
+ }
74
+
75
+ function stripLeadingAnsiFragments(text: string): string {
76
+ let current = text;
77
+ while (true) {
78
+ const next = current.replace(LEADING_ANSI_FRAGMENT_PATTERN, "");
79
+ if (next === current) {
80
+ return current;
81
+ }
82
+ current = next;
83
+ }
84
+ }
85
+
86
+ function stripThinkingPresentationArtifacts(text: string): string {
87
+ let current = stripAnsi(text);
88
+ let removedThinkingLabel = false;
89
+
90
+ while (true) {
91
+ const withoutLabel = current
92
+ .replace(THINKING_LABEL_PREFIX_PATTERN, "")
93
+ .trimStart();
94
+ if (withoutLabel !== current) {
95
+ current = withoutLabel;
96
+ removedThinkingLabel = true;
97
+ continue;
98
+ }
99
+
100
+ const withoutAnsiFragments = stripLeadingAnsiFragments(current).trimStart();
101
+ if (withoutAnsiFragments !== current) {
102
+ const fragmentExposedAnotherLabel =
103
+ withoutAnsiFragments.replace(THINKING_LABEL_PREFIX_PATTERN, "").trimStart() !==
104
+ withoutAnsiFragments;
105
+
106
+ if (removedThinkingLabel || fragmentExposedAnotherLabel) {
107
+ current = withoutAnsiFragments;
108
+ continue;
109
+ }
110
+ }
111
+
112
+ return current;
113
+ }
114
+ }
115
+
116
+ function formatThinkingLabel(theme: ThemeLike | undefined, thinkingText: string): string {
117
+ if (!theme) {
118
+ return `${THINKING_CHAT_PREFIX}${thinkingText}`;
119
+ }
120
+
121
+ const label = theme.fg("accent", THINKING_CHAT_PREFIX.trimEnd());
122
+ const body = theme.fg("thinkingText", thinkingText);
123
+ return `${label} ${body}`;
124
+ }
125
+
126
+ function prefixThinkingLine(text: string, theme: ThemeLike | undefined): string {
127
+ const normalizedThinking = stripThinkingPresentationArtifacts(text).trim();
128
+ if (!normalizedThinking) {
129
+ return text;
130
+ }
131
+
132
+ return formatThinkingLabel(theme, normalizedThinking);
133
+ }
134
+
135
+ function normalizeThinkingLineForContext(text: string): string {
136
+ return stripThinkingPresentationArtifacts(text);
137
+ }
138
+
139
+ function isThinkingBlock(value: unknown): value is Record<string, unknown> & {
140
+ type: "thinking";
141
+ thinking: string;
142
+ } {
143
+ if (!isRecord(value)) {
144
+ return false;
145
+ }
146
+
147
+ return value.type === "thinking" && typeof value.thinking === "string";
148
+ }
149
+
150
+ function mapThinkingContentArray(
151
+ content: unknown[],
152
+ mapThinkingText: (text: string) => string,
153
+ depth = 0,
154
+ seen: WeakSet<object> = new WeakSet<object>(),
155
+ ): { content: unknown[]; changed: boolean } {
156
+ if (depth > MAX_THINKING_CONTENT_DEPTH || seen.has(content)) {
157
+ return { content, changed: false };
158
+ }
159
+
160
+ seen.add(content);
161
+ let changed = false;
162
+ const nextContent = content.map((block) => {
163
+ if (Array.isArray(block)) {
164
+ const nested = mapThinkingContentArray(
165
+ block,
166
+ mapThinkingText,
167
+ depth + 1,
168
+ seen,
169
+ );
170
+ if (nested.changed) {
171
+ changed = true;
172
+ return nested.content;
173
+ }
174
+ return block as unknown[];
175
+ }
176
+
177
+ if (!isThinkingBlock(block)) {
178
+ return block;
179
+ }
180
+
181
+ const nextThinking = mapThinkingText(block.thinking);
182
+ if (nextThinking === block.thinking) {
183
+ return block;
184
+ }
185
+
186
+ changed = true;
187
+ return { ...block, thinking: nextThinking };
188
+ });
189
+
190
+ return { content: changed ? nextContent : content, changed };
191
+ }
192
+
193
+ function withThinkingLabelsForDisplay(
194
+ content: unknown,
195
+ theme: ThemeLike | undefined,
196
+ ): unknown {
197
+ if (!Array.isArray(content)) {
198
+ return content;
199
+ }
200
+
201
+ const mapped = mapThinkingContentArray(content, (thinking) =>
202
+ prefixThinkingLine(thinking, theme),
203
+ );
204
+
205
+ return mapped.changed ? mapped.content : content;
206
+ }
207
+
208
+ function sanitizeThinkingBlocksForContext(message: AssistantMessageLike): AssistantMessageLike {
209
+ if (!Array.isArray(message.content)) {
210
+ return message;
211
+ }
212
+
213
+ const mapped = mapThinkingContentArray(
214
+ message.content,
215
+ normalizeThinkingLineForContext,
216
+ );
217
+
218
+ return mapped.changed ? { ...message, content: mapped.content } : message;
219
+ }
220
+
221
+ function sanitizeContextMessages(messages: unknown): unknown {
222
+ if (!Array.isArray(messages)) {
223
+ return messages;
224
+ }
225
+
226
+ const messageList = messages as unknown[];
227
+ let changed = false;
228
+ const nextMessages = messageList.map((message) => {
229
+ if (!isRecord(message) || message.role !== "assistant") {
230
+ return message;
231
+ }
232
+
233
+ const sanitized = sanitizeThinkingBlocksForContext(message as AssistantMessageLike);
234
+ if (sanitized !== message) {
235
+ changed = true;
236
+ return sanitized;
237
+ }
238
+
239
+ return message;
240
+ });
241
+
242
+ return changed ? nextMessages : messageList;
243
+ }
244
+
245
+ function prefixThinkingBlocksForDisplay(
246
+ message: AssistantMessageLike,
247
+ theme: ThemeLike | undefined,
248
+ ): void {
249
+ if (!shouldPrefixThinkingForApi(message.api)) {
250
+ return;
251
+ }
252
+
253
+ const displayContent = withThinkingLabelsForDisplay(message.content, theme);
254
+ if (displayContent !== message.content) {
255
+ message.content = displayContent;
256
+ }
257
+ }
258
+
259
+ function extractAssistantMessage(event: unknown): AssistantMessageLike | undefined {
260
+ if (!isRecord(event)) {
261
+ return undefined;
262
+ }
263
+
264
+ const maybeMessage = event.message;
265
+ if (!isRecord(maybeMessage)) {
266
+ return undefined;
267
+ }
268
+
269
+ if (maybeMessage.role !== "assistant") {
270
+ return undefined;
271
+ }
272
+
273
+ return maybeMessage as AssistantMessageLike;
274
+ }
275
+
276
+ function processThinkingEvent(
277
+ event: unknown,
278
+ ctx: ExtensionContext | undefined,
279
+ notifyPrefix: string,
280
+ ): void {
281
+ try {
282
+ const message = extractAssistantMessage(event);
283
+ if (!message) {
284
+ return;
285
+ }
286
+ prefixThinkingBlocksForDisplay(message, ctx?.ui?.theme);
287
+ } catch (error) {
288
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
289
+ ctx?.ui?.notify(`${notifyPrefix}: ${errorMessage}`, "warning");
290
+ }
291
+ }
292
+
293
+ function handleThinkingMessageUpdateEvent(event: unknown, ctx: ExtensionContext | undefined): void {
294
+ // Render-only labeling: update the transient message_update payload while
295
+ // leaving canonical session/LLM context content untouched.
296
+ processThinkingEvent(event, ctx, "Thinking label formatting failed");
297
+ }
298
+
299
+ function handleThinkingMessageEndEvent(event: unknown, ctx: ExtensionContext | undefined): void {
300
+ // Persist themed labels on final assistant messages so the label remains
301
+ // visible after streaming ends and across session reloads.
302
+ // Context sanitization strips these presentation artifacts before each LLM call.
303
+ processThinkingEvent(event, ctx, "Thinking label finalization failed");
304
+ }
305
+
306
+ function handleThinkingContextEvent(event: unknown, ctx: ExtensionContext | undefined): void {
307
+ try {
308
+ if (!isRecord(event) || !Array.isArray(event.messages)) {
309
+ return;
310
+ }
311
+
312
+ const sanitizedMessages = sanitizeContextMessages(event.messages);
313
+ if (sanitizedMessages !== event.messages && Array.isArray(sanitizedMessages)) {
314
+ event.messages.splice(0, event.messages.length, ...(sanitizedMessages as unknown[]));
315
+ }
316
+ } catch (error) {
317
+ const message = error instanceof Error ? error.message : "Unknown error";
318
+ ctx?.ui?.notify(`Thinking context sanitization failed: ${message}`, "warning");
319
+ }
320
+ }
321
+
322
+ export function registerThinkingLabeling(pi: ExtensionAPI): void {
323
+ if (registeredThinkingApis.has(pi)) {
324
+ return;
325
+ }
326
+ registeredThinkingApis.add(pi);
327
+
328
+ onReloadShutdown(pi, () => {
329
+ registeredThinkingApis.delete(pi);
330
+ });
331
+
332
+ pi.on("message_update", async (event, ctx) => {
333
+ handleThinkingMessageUpdateEvent(event, ctx);
334
+ });
335
+
336
+ pi.on("message_end", async (event, ctx) => {
337
+ handleThinkingMessageEndEvent(event, ctx);
338
+ });
339
+
340
+ pi.on("context", async (event, ctx) => {
341
+ handleThinkingContextEvent(event, ctx);
342
+ });
343
+ }
@@ -0,0 +1,181 @@
1
+ import { truncateToWidth, visibleWidth, type Component } from "@earendil-works/pi-tui";
2
+
3
+ interface ToolCallBoxTheme {
4
+ fg(color: string, text: string): string;
5
+ bold(text: string): string;
6
+ }
7
+
8
+ const MIN_BOX_WIDTH = 8;
9
+ const TITLE = "Tools";
10
+
11
+ function border(theme: ToolCallBoxTheme, text: string): string {
12
+ return theme.fg("border", text);
13
+ }
14
+
15
+ function contentLine(line: string, width: number, theme: ToolCallBoxTheme): string {
16
+ const contentWidth = Math.max(1, width - 4);
17
+ const content = truncateToWidth(line, contentWidth, "", true);
18
+ const padding = " ".repeat(Math.max(0, contentWidth - visibleWidth(content)));
19
+ return `${border(theme, "│")} ${content}${padding} ${border(theme, "│")}`;
20
+ }
21
+
22
+ function topBorder(width: number, theme: ToolCallBoxTheme): string {
23
+ const innerWidth = Math.max(0, width - 2);
24
+ const label = theme.fg("toolTitle", theme.bold(TITLE));
25
+ const prefix = "─ ";
26
+ const suffix = " ";
27
+ const gap = Math.max(0, innerWidth - visibleWidth(prefix + TITLE + suffix));
28
+ return `${border(theme, "╭" + prefix)}${label}${border(theme, suffix + "─".repeat(gap) + "╮")}`;
29
+ }
30
+
31
+ function bottomBorder(width: number, theme: ToolCallBoxTheme): string {
32
+ return `${border(theme, "╰" + "─".repeat(Math.max(0, width - 2)) + "╯")}`;
33
+ }
34
+
35
+ function boxedLines(component: Component, width: number, theme: ToolCallBoxTheme): string[] {
36
+ return component.render(Math.max(1, width - 4)).map((line) => contentLine(line, width, theme));
37
+ }
38
+
39
+ /**
40
+ * Wrap a tool renderer's component so it renders inside an ASCII frame while
41
+ * remaining a transparent stand-in for the wrapped component.
42
+ *
43
+ * The frame (or the raw fallback for narrow widths) is cached by width:
44
+ * TuiMainScreen re-renders the whole transcript on every frame, and without
45
+ * this cache every finalized tool would re-run its inner renderer + border
46
+ * construction per frame (measured ~24 ms for 1000 boxed tools).
47
+ *
48
+ * A Proxy is required, not a plain object wrapper: Pi's built-in renderers
49
+ * (bash, grep, ...) reuse the previous component through `lastComponent` and
50
+ * mutate it in place (`setText`, `clear`, `addChild`, `state`). A Proxy
51
+ * forwards all of those to the real component, and bumps a mutation counter so
52
+ * the frame cache is dropped exactly when the wrapped content changes.
53
+ */
54
+ function framedBox(
55
+ component: Component,
56
+ getTheme: () => ToolCallBoxTheme,
57
+ frame: (width: number, lines: string[], theme: ToolCallBoxTheme) => string[],
58
+ ): Component {
59
+ let cacheWidth = -1;
60
+ let cacheLines: string[] | undefined;
61
+ let cacheIsFramed = false;
62
+
63
+ const target = component as unknown as Record<string | symbol, unknown>;
64
+
65
+ return new Proxy(target, {
66
+ get(_t, prop) {
67
+ if (prop === "render") {
68
+ return (width: number): string[] => {
69
+ if (cacheWidth === width && cacheLines !== undefined && cacheIsFramed) {
70
+ return cacheLines;
71
+ }
72
+ if (width < MIN_BOX_WIDTH) {
73
+ return component.render(width);
74
+ }
75
+ const lines = frame(width, component.render(Math.max(1, width - 4)), getTheme());
76
+ cacheWidth = width;
77
+ cacheLines = lines;
78
+ cacheIsFramed = true;
79
+ return lines;
80
+ };
81
+ }
82
+ if (prop === "invalidate") {
83
+ return () => {
84
+ cacheWidth = -1;
85
+ cacheLines = undefined;
86
+ cacheIsFramed = false;
87
+ component.invalidate?.();
88
+ };
89
+ }
90
+ const value = Reflect.get(target, prop, target);
91
+ if (typeof value === "function") {
92
+ // Renderers mutate the reused component through these entry points;
93
+ // any such mutation makes the cached frame stale.
94
+ if (prop === "setText" || prop === "clear" || prop === "addChild" || prop === "removeChild") {
95
+ return (...args: unknown[]) => {
96
+ const result = (value as (...a: unknown[]) => unknown).apply(target, args);
97
+ cacheWidth = -1;
98
+ cacheLines = undefined;
99
+ cacheIsFramed = false;
100
+ return result;
101
+ };
102
+ }
103
+ return (value as (...a: unknown[]) => unknown).bind(target);
104
+ }
105
+ return value;
106
+ },
107
+ }) as unknown as Component;
108
+ }
109
+
110
+ /**
111
+ * Pi's renderers hand the previous component back through `lastComponent`, so a
112
+ * component can be wrapped on every updateDisplay. Idempotent wrapping (one
113
+ * framed proxy per wrapped component and role) prevents frames from stacking;
114
+ * the theme cell is refreshed on each wrap so a theme change rebuilds frames
115
+ * with the new colors instead of the first-wrap palette.
116
+ */
117
+ const framedWrappers = new WeakMap<object, { theme: ToolCallBoxTheme; call?: Component; result?: Component }>();
118
+
119
+ function wrapFramed(
120
+ component: Component,
121
+ theme: ToolCallBoxTheme,
122
+ enabled: boolean,
123
+ role: "call" | "result",
124
+ ): Component {
125
+ if (!enabled) {
126
+ return component;
127
+ }
128
+ const target = component as object;
129
+ let entry = framedWrappers.get(target);
130
+ if (!entry) {
131
+ entry = { theme };
132
+ framedWrappers.set(target, entry);
133
+ } else {
134
+ entry.theme = theme;
135
+ }
136
+ const existing = role === "call" ? entry.call : entry.result;
137
+ if (existing) {
138
+ // updateDisplay always accompanies content/state changes. Re-wrapping means
139
+ // the renderer is about to rebuild content, so drop any cached frame now;
140
+ // the hot path (spinner ticks, input, terminal events) re-renders without
141
+ // updateDisplay and still hits the width-keyed cache.
142
+ existing.invalidate?.();
143
+ return existing;
144
+ }
145
+ const getTheme = (): ToolCallBoxTheme => entry.theme;
146
+ const frame =
147
+ role === "call"
148
+ ? (width: number, lines: string[], currentTheme: ToolCallBoxTheme) => [
149
+ topBorder(width, currentTheme),
150
+ ...lines.map((line) => contentLine(line, width, currentTheme)),
151
+ ]
152
+ : (width: number, lines: string[], currentTheme: ToolCallBoxTheme) => [
153
+ ...lines.map((line) => contentLine(line, width, currentTheme)),
154
+ bottomBorder(width, currentTheme),
155
+ ];
156
+ const proxy = framedBox(component, getTheme, frame);
157
+ if (role === "call") {
158
+ entry.call = proxy;
159
+ } else {
160
+ entry.result = proxy;
161
+ }
162
+ // Register the proxy itself so renderers handing the wrapped component back
163
+ // through lastComponent re-wrap to the same proxy instead of stacking frames.
164
+ framedWrappers.set(proxy, entry);
165
+ return proxy;
166
+ }
167
+
168
+ /**
169
+ * Split framing lets Pi keep its normal call/result renderers while presenting
170
+ * the two adjacent components as one bordered tool transaction. The call half
171
+ * renders the top border + content; the result half renders content + bottom
172
+ * border. Under renderShell "self" the host stacks the two halves adjacently,
173
+ * so the pair forms one contiguous ASCII box.
174
+ */
175
+ export function boxToolCall(component: Component, theme: ToolCallBoxTheme, enabled: boolean): Component {
176
+ return wrapFramed(component, theme, enabled, "call");
177
+ }
178
+
179
+ export function boxToolResult(component: Component, theme: ToolCallBoxTheme, enabled: boolean): Component {
180
+ return wrapFramed(component, theme, enabled, "result");
181
+ }
@@ -0,0 +1,139 @@
1
+ export interface PromptMetadata {
2
+ promptSnippet?: string;
3
+ promptGuidelines?: string[];
4
+ }
5
+
6
+ const MCP_DESCRIPTION_PATTERN = /\bmcp\b/i;
7
+ const MCP_ADAPTER_SOURCE_PATTERN = /(?:^|[/\\@_-])(?:pi-)?mcp(?:[/\\@_-]|$)|pi-mcp-adapter|mcp-adapter/i;
8
+ const MAX_PROMPT_SNIPPET_LENGTH = 120;
9
+
10
+ export const MCP_PROXY_PROMPT_SNIPPET = "Discover, inspect, and call MCP tools across configured servers";
11
+ export const MCP_PROXY_PROMPT_GUIDELINES = [
12
+ "Use mcp for MCP discovery first: search by capability, describe one exact tool, then call it.",
13
+ ] as const;
14
+
15
+ export function isRecord(value: unknown): value is Record<string, unknown> {
16
+ return typeof value === "object" && value !== null && !Array.isArray(value);
17
+ }
18
+
19
+ export function toRecord(value: unknown): Record<string, unknown> {
20
+ if (!isRecord(value)) {
21
+ return {};
22
+ }
23
+
24
+ return value;
25
+ }
26
+
27
+ export function getTextField(value: unknown, field: string): string | undefined {
28
+ const record = toRecord(value);
29
+ const raw = record[field];
30
+ return typeof raw === "string" && raw.trim().length > 0 ? raw.trim() : undefined;
31
+ }
32
+
33
+ function normalizeInlineText(value: string): string {
34
+ return value.trim().replace(/\s+/g, " ");
35
+ }
36
+
37
+ function trimPromptSnippet(value: string): string {
38
+ if (value.length <= MAX_PROMPT_SNIPPET_LENGTH) {
39
+ return value;
40
+ }
41
+
42
+ const truncated = value.slice(0, MAX_PROMPT_SNIPPET_LENGTH).trimEnd();
43
+ return `${truncated.replace(/[\s.,;:!?-]+$/u, "")}…`;
44
+ }
45
+
46
+ export function buildPromptSnippetFromDescription(description: string | undefined, fallback: string): string {
47
+ const normalizedDescription = normalizeInlineText(description || "");
48
+ const normalizedFallback = normalizeInlineText(fallback);
49
+ const base = normalizedDescription || normalizedFallback;
50
+ const firstSentence = base.split(/(?<=[.!?])\s+/u, 1)[0] ?? base;
51
+ const withoutSentencePunctuation = firstSentence.replace(/[.!?]+$/u, "").trim();
52
+ return trimPromptSnippet(withoutSentencePunctuation || base);
53
+ }
54
+
55
+ export function extractPromptMetadata(tool: unknown): PromptMetadata {
56
+ const source = toRecord(tool);
57
+ const promptSnippet =
58
+ typeof source.promptSnippet === "string" && source.promptSnippet.trim().length > 0
59
+ ? source.promptSnippet
60
+ : undefined;
61
+ const promptGuidelines = Array.isArray(source.promptGuidelines)
62
+ ? source.promptGuidelines.filter(
63
+ (guideline): guideline is string =>
64
+ typeof guideline === "string" && guideline.trim().length > 0,
65
+ )
66
+ : undefined;
67
+
68
+ return {
69
+ promptSnippet,
70
+ promptGuidelines:
71
+ promptGuidelines && promptGuidelines.length > 0
72
+ ? [...promptGuidelines]
73
+ : undefined,
74
+ };
75
+ }
76
+
77
+ function hasMcpSourceInfo(value: unknown): boolean {
78
+ const sourceInfo = toRecord(value);
79
+ for (const [key, raw] of Object.entries(sourceInfo)) {
80
+ if (typeof raw !== "string" || raw.trim().length === 0) {
81
+ continue;
82
+ }
83
+
84
+ const normalizedKey = key.toLowerCase();
85
+ const normalizedValue = raw.trim();
86
+ if (["source", "type", "kind", "origin"].includes(normalizedKey) && normalizedValue.toLowerCase() === "mcp") {
87
+ return true;
88
+ }
89
+ if (MCP_ADAPTER_SOURCE_PATTERN.test(normalizedValue)) {
90
+ return true;
91
+ }
92
+ }
93
+
94
+ return false;
95
+ }
96
+
97
+ export function isMcpToolCandidate(tool: unknown): boolean {
98
+ if (!tool || typeof tool !== "object") {
99
+ return false;
100
+ }
101
+
102
+ const record = tool as Record<string, unknown>;
103
+ const name = typeof record.name === "string" ? record.name : "";
104
+ const description = typeof record.description === "string" ? record.description : "";
105
+ const label = typeof record.label === "string" ? record.label : "";
106
+
107
+ if (name === "mcp") {
108
+ return true;
109
+ }
110
+ if (MCP_DESCRIPTION_PATTERN.test(description) || MCP_DESCRIPTION_PATTERN.test(label)) {
111
+ return true;
112
+ }
113
+ if (hasMcpSourceInfo(record.sourceInfo)) {
114
+ return true;
115
+ }
116
+ if (/^mcp[_-]/i.test(name) || /_mcp$/i.test(name)) {
117
+ return true;
118
+ }
119
+ if (name.includes(":")) {
120
+ return true;
121
+ }
122
+ if (/^ctx_/i.test(name)) {
123
+ return true;
124
+ }
125
+
126
+ const params = record.parameters;
127
+ if (params && typeof params === "object") {
128
+ const parameterRecord = params as Record<string, unknown>;
129
+ if (
130
+ "mcpServer" in parameterRecord ||
131
+ "serverUrl" in parameterRecord ||
132
+ "server_name" in parameterRecord
133
+ ) {
134
+ return true;
135
+ }
136
+ }
137
+
138
+ return false;
139
+ }