@selesai/code 0.10.2 → 0.11.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 (502) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/compaction/branch-summarization.js +30 -30
  5. package/dist/core/compaction/compaction.js +81 -81
  6. package/dist/core/compaction/utils.js +2 -2
  7. package/dist/core/export-html/template.css +1066 -1066
  8. package/dist/core/export-html/template.html +55 -55
  9. package/dist/core/export-html/template.js +1864 -1864
  10. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  11. package/dist/core/export-html/vendor/marked.min.js +78 -78
  12. package/dist/core/messages.js +7 -7
  13. package/dist/defaults/settings.json +0 -3
  14. package/dist/extensions/auto-session-name.test.ts +157 -0
  15. package/dist/extensions/auto-session-name.ts +96 -0
  16. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  17. package/dist/extensions/context-compaction-reminder.ts +28 -28
  18. package/dist/extensions/cost-reconcile.test.ts +76 -0
  19. package/dist/extensions/cost-reconcile.ts +278 -0
  20. package/dist/extensions/enable-readonly-tools.test.ts +11 -0
  21. package/dist/extensions/enable-readonly-tools.ts +7 -3
  22. package/dist/extensions/package.json +3 -0
  23. package/dist/extensions/pi-intercom/LICENSE +21 -21
  24. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  25. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  26. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  27. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  28. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  29. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  30. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  31. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  32. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  33. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  34. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  35. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  36. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  37. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  38. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  39. package/dist/extensions/pi-subagents/install.mjs +0 -0
  40. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  41. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  42. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  43. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  44. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  45. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  46. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  47. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  48. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  49. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  50. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  51. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  52. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  53. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  54. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  55. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  56. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  57. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  58. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  59. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  60. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  61. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  62. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  63. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  64. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  65. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  66. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  67. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  68. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  69. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  70. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  71. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  72. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  73. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  74. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  75. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  76. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  77. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  78. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  79. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  80. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  81. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  82. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  83. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  84. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  85. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  86. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  87. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  88. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  89. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  90. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  91. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  92. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  93. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  94. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  95. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  96. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  97. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  98. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  99. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  100. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  101. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  102. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  103. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  104. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  105. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  106. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  107. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  108. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  109. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  110. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  111. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  112. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  113. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  114. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  115. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  116. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  117. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  118. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  119. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  120. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  121. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  122. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  123. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  124. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  125. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  126. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  127. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  128. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  129. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  130. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  131. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  132. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  133. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  134. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  135. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  136. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  137. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  138. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  139. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  140. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  141. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  142. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  143. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  144. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  145. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  146. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  147. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  148. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  149. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  150. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  151. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  152. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  153. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  154. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  155. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  156. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  157. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  158. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  159. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  160. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  161. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  162. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  163. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  164. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  165. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  166. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  167. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  168. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  169. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  170. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  171. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  172. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  173. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  174. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  175. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  176. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  177. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  178. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  179. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  180. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  181. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  182. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  183. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  184. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  185. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  186. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  215. package/dist/extensions/pi-tool-display/CHANGELOG.md +329 -0
  216. package/dist/extensions/pi-tool-display/LICENSE +21 -0
  217. package/dist/extensions/pi-tool-display/README.md +417 -0
  218. package/dist/extensions/pi-tool-display/config/config.example.json +40 -0
  219. package/dist/extensions/pi-tool-display/index.ts +3 -0
  220. package/dist/extensions/pi-tool-display/package-lock.json +2555 -0
  221. package/dist/extensions/pi-tool-display/package.json +86 -0
  222. package/dist/extensions/pi-tool-display/src/agent-dir.ts +35 -0
  223. package/dist/extensions/pi-tool-display/src/ansi-utils.ts +116 -0
  224. package/dist/extensions/pi-tool-display/src/bash-display.ts +213 -0
  225. package/dist/extensions/pi-tool-display/src/capabilities.ts +88 -0
  226. package/dist/extensions/pi-tool-display/src/config-modal.ts +541 -0
  227. package/dist/extensions/pi-tool-display/src/config-store.ts +304 -0
  228. package/dist/extensions/pi-tool-display/src/debug-logger.ts +150 -0
  229. package/dist/extensions/pi-tool-display/src/diff-presentation.ts +72 -0
  230. package/dist/extensions/pi-tool-display/src/diff-renderer.ts +2517 -0
  231. package/dist/extensions/pi-tool-display/src/disposable.ts +34 -0
  232. package/dist/extensions/pi-tool-display/src/extension-lifecycle.ts +14 -0
  233. package/dist/extensions/pi-tool-display/src/index.ts +109 -0
  234. package/dist/extensions/pi-tool-display/src/line-width-safety.ts +93 -0
  235. package/dist/extensions/pi-tool-display/src/modal-icons.ts +57 -0
  236. package/dist/extensions/pi-tool-display/src/pending-diff-preview.ts +370 -0
  237. package/dist/extensions/pi-tool-display/src/presets.ts +117 -0
  238. package/dist/extensions/pi-tool-display/src/render-utils.ts +186 -0
  239. package/dist/extensions/pi-tool-display/src/settings-inspector-modal.ts +475 -0
  240. package/dist/extensions/pi-tool-display/src/thinking-label.ts +343 -0
  241. package/dist/extensions/pi-tool-display/src/tool-call-box.ts +181 -0
  242. package/dist/extensions/pi-tool-display/src/tool-metadata.ts +139 -0
  243. package/dist/extensions/pi-tool-display/src/tool-overrides.ts +2168 -0
  244. package/dist/extensions/pi-tool-display/src/types.ts +109 -0
  245. package/dist/extensions/pi-tool-display/src/user-message-box-markdown.ts +64 -0
  246. package/dist/extensions/pi-tool-display/src/user-message-box-native.ts +66 -0
  247. package/dist/extensions/pi-tool-display/src/user-message-box-patch.ts +72 -0
  248. package/dist/extensions/pi-tool-display/src/user-message-box-renderer.ts +419 -0
  249. package/dist/extensions/pi-tool-display/src/user-message-box-utils.ts +106 -0
  250. package/dist/extensions/pi-tool-display/src/write-display-utils.ts +31 -0
  251. package/dist/extensions/pi-tool-display/src/zellij-modal.ts +1027 -0
  252. package/dist/extensions/pi-tool-display/tests/active-backlog-red.test.ts +65 -0
  253. package/dist/extensions/pi-tool-display/tests/ansi-utils.test.ts +345 -0
  254. package/dist/extensions/pi-tool-display/tests/bash-display.test.ts +442 -0
  255. package/dist/extensions/pi-tool-display/tests/capabilities-edge.test.ts +360 -0
  256. package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +54 -0
  257. package/dist/extensions/pi-tool-display/tests/config-modal.test.ts +360 -0
  258. package/dist/extensions/pi-tool-display/tests/config-store.test.ts +87 -0
  259. package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +415 -0
  260. package/dist/extensions/pi-tool-display/tests/debug-logger-edge.test.ts +630 -0
  261. package/dist/extensions/pi-tool-display/tests/debug-logger.test.ts +62 -0
  262. package/dist/extensions/pi-tool-display/tests/diff-renderer-ansi.test.ts +55 -0
  263. package/dist/extensions/pi-tool-display/tests/diff-renderer-edge.test.ts +886 -0
  264. package/dist/extensions/pi-tool-display/tests/diff-renderer-numbering.test.ts +135 -0
  265. package/dist/extensions/pi-tool-display/tests/diff-renderer-width.test.ts +454 -0
  266. package/dist/extensions/pi-tool-display/tests/diff-renderer-wrap.test.ts +169 -0
  267. package/dist/extensions/pi-tool-display/tests/index-integration.test.ts +354 -0
  268. package/dist/extensions/pi-tool-display/tests/pending-diff-preview.test.ts +79 -0
  269. package/dist/extensions/pi-tool-display/tests/presets-edge.test.ts +229 -0
  270. package/dist/extensions/pi-tool-display/tests/presets.test.ts +26 -0
  271. package/dist/extensions/pi-tool-display/tests/reload-behavior.test.ts +1241 -0
  272. package/dist/extensions/pi-tool-display/tests/render-utils.test.ts +710 -0
  273. package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +450 -0
  274. package/dist/extensions/pi-tool-display/tests/thinking-label-edge.test.ts +904 -0
  275. package/dist/extensions/pi-tool-display/tests/thinking-label.test.ts +72 -0
  276. package/dist/extensions/pi-tool-display/tests/tool-call-box.test.ts +105 -0
  277. package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +613 -0
  278. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +499 -0
  279. package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +315 -0
  280. package/dist/extensions/pi-tool-display/tests/tool-overrides-write-meta.test.ts +68 -0
  281. package/dist/extensions/pi-tool-display/tests/tool-ui-utils.test.ts +413 -0
  282. package/dist/extensions/pi-tool-display/tests/user-message-box-performance-red.test.ts +176 -0
  283. package/dist/extensions/pi-tool-display/tests/user-message-box.test.ts +908 -0
  284. package/dist/extensions/pi-tool-display/tests/zellij-modal.test.ts +848 -0
  285. package/dist/extensions/pi-tool-display/tool-display-api-consumer.d.ts +30 -0
  286. package/dist/extensions/pi-tool-display/tool-display-api-consumer.js +40 -0
  287. package/dist/extensions/pi-web-agent/package.json +31 -31
  288. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  289. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  290. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  291. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  292. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  293. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  294. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  295. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  296. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  297. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  298. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  299. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  300. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  301. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  302. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  303. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  304. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  305. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  306. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  307. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  308. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  309. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  310. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  311. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  312. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  313. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  314. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  315. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  316. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  317. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  318. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  319. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  320. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  321. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  322. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  323. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  324. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  325. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  326. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  327. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  328. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +46 -1
  329. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +10 -0
  330. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +1 -1
  331. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +3 -3
  332. package/dist/extensions/pi-zentui/test/format.test.ts +50 -2
  333. package/dist/extensions/ponytail/package.json +8 -8
  334. package/dist/extensions/question/constants.ts +30 -30
  335. package/dist/extensions/question/helpers.ts +58 -58
  336. package/dist/extensions/question/navigation.ts +14 -14
  337. package/dist/extensions/question/package.json +19 -19
  338. package/dist/extensions/question/selection-mode.ts +46 -46
  339. package/dist/extensions/question/shortcuts.ts +44 -44
  340. package/dist/extensions/question/types.ts +132 -132
  341. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  342. package/dist/extensions/test-resolve-hook.mjs +6 -6
  343. package/dist/extensions/web-agent-onboarding.ts +222 -222
  344. package/dist/modes/interactive/interactive-mode.js +17 -3
  345. package/dist/package-manager-cli.js +71 -71
  346. package/dist/rpc-entry.js +0 -0
  347. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  348. package/docs/compaction.md +396 -396
  349. package/docs/containerization.md +111 -111
  350. package/docs/development.md +71 -71
  351. package/docs/docs.json +164 -164
  352. package/docs/environment-variables.md +86 -86
  353. package/docs/index.md +83 -83
  354. package/docs/json.md +82 -82
  355. package/docs/models.md +502 -502
  356. package/docs/packages.md +227 -227
  357. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  358. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  359. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  360. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  361. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  362. package/docs/prompt-templates.md +95 -95
  363. package/docs/providers.md +293 -293
  364. package/docs/security.md +59 -59
  365. package/docs/session-format.md +414 -414
  366. package/docs/sessions.md +145 -145
  367. package/docs/shared-host-extensions.md +109 -109
  368. package/docs/shell-aliases.md +13 -13
  369. package/docs/skills.md +231 -231
  370. package/docs/terminal-setup.md +142 -142
  371. package/docs/termux.md +127 -127
  372. package/docs/themes.md +295 -295
  373. package/docs/tmux.md +63 -63
  374. package/docs/tui.md +927 -927
  375. package/docs/windows.md +17 -17
  376. package/examples/README.md +25 -25
  377. package/examples/extensions/README.md +211 -211
  378. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  379. package/examples/extensions/bash-spawn-hook.ts +30 -30
  380. package/examples/extensions/bookmark.ts +50 -50
  381. package/examples/extensions/border-status-editor.ts +150 -150
  382. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  383. package/examples/extensions/claude-rules.ts +86 -86
  384. package/examples/extensions/commands.ts +72 -72
  385. package/examples/extensions/confirm-destructive.ts +59 -59
  386. package/examples/extensions/custom-compaction.ts +130 -130
  387. package/examples/extensions/custom-footer.ts +64 -64
  388. package/examples/extensions/custom-header.ts +73 -73
  389. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  390. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  391. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  392. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  393. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  394. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  395. package/examples/extensions/dirty-repo-guard.ts +56 -56
  396. package/examples/extensions/doom-overlay/README.md +46 -46
  397. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  398. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  399. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  400. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  401. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  402. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  403. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  404. package/examples/extensions/doom-overlay/index.ts +74 -74
  405. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  406. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  407. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  408. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  409. package/examples/extensions/dynamic-resources/index.ts +15 -15
  410. package/examples/extensions/dynamic-tools.ts +74 -74
  411. package/examples/extensions/event-bus.ts +43 -43
  412. package/examples/extensions/file-trigger.ts +41 -41
  413. package/examples/extensions/git-checkpoint.ts +53 -53
  414. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  415. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  416. package/examples/extensions/gondolin/index.ts +531 -531
  417. package/examples/extensions/gondolin/package-lock.json +185 -185
  418. package/examples/extensions/gondolin/package.json +19 -19
  419. package/examples/extensions/handoff.ts +199 -199
  420. package/examples/extensions/hello.ts +26 -26
  421. package/examples/extensions/hidden-thinking-label.ts +53 -53
  422. package/examples/extensions/inline-bash.ts +94 -94
  423. package/examples/extensions/input-transform-streaming.ts +39 -39
  424. package/examples/extensions/input-transform.ts +43 -43
  425. package/examples/extensions/interactive-shell.ts +196 -196
  426. package/examples/extensions/mac-system-theme.ts +47 -47
  427. package/examples/extensions/message-renderer.ts +59 -59
  428. package/examples/extensions/minimal-mode.ts +426 -426
  429. package/examples/extensions/modal-editor.ts +85 -85
  430. package/examples/extensions/model-status.ts +31 -31
  431. package/examples/extensions/notify.ts +55 -55
  432. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  433. package/examples/extensions/overlay-test.ts +153 -153
  434. package/examples/extensions/permission-gate.ts +34 -34
  435. package/examples/extensions/pirate.ts +47 -47
  436. package/examples/extensions/plan-mode/README.md +66 -66
  437. package/examples/extensions/plan-mode/index.ts +390 -390
  438. package/examples/extensions/plan-mode/utils.ts +168 -168
  439. package/examples/extensions/preset.ts +436 -436
  440. package/examples/extensions/project-trust.ts +64 -64
  441. package/examples/extensions/prompt-customizer.ts +97 -97
  442. package/examples/extensions/protected-paths.ts +30 -30
  443. package/examples/extensions/provider-payload.ts +18 -18
  444. package/examples/extensions/qna.ts +122 -122
  445. package/examples/extensions/question.ts +285 -285
  446. package/examples/extensions/questionnaire.ts +448 -448
  447. package/examples/extensions/rainbow-editor.ts +88 -88
  448. package/examples/extensions/reload-runtime.ts +37 -37
  449. package/examples/extensions/rpc-demo.ts +118 -118
  450. package/examples/extensions/sandbox/index.ts +321 -321
  451. package/examples/extensions/sandbox/package-lock.json +92 -92
  452. package/examples/extensions/sandbox/package.json +19 -19
  453. package/examples/extensions/send-user-message.ts +97 -97
  454. package/examples/extensions/session-name.ts +27 -27
  455. package/examples/extensions/shutdown-command.ts +63 -63
  456. package/examples/extensions/snake.ts +343 -343
  457. package/examples/extensions/space-invaders.ts +560 -560
  458. package/examples/extensions/ssh.ts +220 -220
  459. package/examples/extensions/status-line.ts +32 -32
  460. package/examples/extensions/structured-output.ts +65 -65
  461. package/examples/extensions/subagent/README.md +175 -175
  462. package/examples/extensions/subagent/agents/planner.md +37 -37
  463. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  464. package/examples/extensions/subagent/agents/scout.md +50 -50
  465. package/examples/extensions/subagent/agents/worker.md +24 -24
  466. package/examples/extensions/subagent/agents.ts +126 -126
  467. package/examples/extensions/subagent/index.ts +1015 -1015
  468. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  469. package/examples/extensions/subagent/prompts/implement.md +10 -10
  470. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  471. package/examples/extensions/summarize.ts +209 -209
  472. package/examples/extensions/system-prompt-header.ts +17 -17
  473. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  474. package/examples/extensions/timed-confirm.ts +70 -70
  475. package/examples/extensions/titlebar-spinner.ts +58 -58
  476. package/examples/extensions/todo.ts +297 -297
  477. package/examples/extensions/tool-override.ts +144 -144
  478. package/examples/extensions/tools.ts +146 -146
  479. package/examples/extensions/trigger-compact.ts +50 -50
  480. package/examples/extensions/truncated-tool.ts +195 -195
  481. package/examples/extensions/widget-placement.ts +9 -9
  482. package/examples/extensions/with-deps/index.ts +32 -32
  483. package/examples/extensions/with-deps/package-lock.json +31 -31
  484. package/examples/extensions/with-deps/package.json +22 -22
  485. package/examples/extensions/working-indicator.ts +123 -123
  486. package/examples/extensions/working-message-test.ts +25 -25
  487. package/examples/rpc-extension-ui.ts +632 -632
  488. package/examples/sdk/01-minimal.ts +26 -26
  489. package/examples/sdk/02-custom-model.ts +53 -53
  490. package/examples/sdk/03-custom-prompt.ts +75 -75
  491. package/examples/sdk/04-skills.ts +55 -55
  492. package/examples/sdk/05-tools.ts +48 -48
  493. package/examples/sdk/06-extensions.ts +99 -99
  494. package/examples/sdk/07-context-files.ts +47 -47
  495. package/examples/sdk/08-prompt-templates.ts +51 -51
  496. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  497. package/examples/sdk/10-settings.ts +53 -53
  498. package/examples/sdk/11-sessions.ts +52 -52
  499. package/examples/sdk/12-full-control.ts +79 -79
  500. package/examples/sdk/13-session-runtime.ts +67 -67
  501. package/examples/sdk/README.md +144 -144
  502. package/package.json +3 -3
@@ -0,0 +1,413 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import test from "node:test";
6
+ import { visibleWidth } from "@earendil-works/pi-tui";
7
+ import {
8
+ countWriteContentLines,
9
+ getWriteContentSizeBytes,
10
+ shouldRenderWriteCallSummary,
11
+ } from "../src/write-display-utils.ts";
12
+ import {
13
+ extractUserMessageMarkdownState,
14
+ } from "../src/user-message-box-markdown.ts";
15
+ import {
16
+ createUserMessageMarkdownLineRenderer,
17
+ patchNativeUserMessagePrototype,
18
+ shouldBypassUserMessageMarkdownRebuild,
19
+ } from "../src/user-message-box-renderer.ts";
20
+ import {
21
+ patchUserMessageRenderPrototype,
22
+ type PatchableUserMessagePrototype,
23
+ } from "../src/user-message-box-patch.ts";
24
+ import {
25
+ addUserMessageVerticalPadding,
26
+ applyUserMessageBackground,
27
+ normalizeUserMessageContentLine,
28
+ normalizeUserMessageContentLines,
29
+ } from "../src/user-message-box-utils.ts";
30
+ import {
31
+ buildCollapsedDiffHintText,
32
+ clampRenderedLineToWidth,
33
+ } from "../src/line-width-safety.ts";
34
+ import { buildPendingEditPreviewData } from "../src/pending-diff-preview.ts";
35
+
36
+ const codePointWidthOps = {
37
+ measure: (text: string): number => [...text].length,
38
+ truncate: (text: string, maxWidth: number): string =>
39
+ [...text].slice(0, Math.max(0, maxWidth)).join(""),
40
+ };
41
+
42
+
43
+ test("pending edit preview matches LF edit input against CRLF files", () => {
44
+ const baseDir = mkdtempSync(join(tmpdir(), "pi-tool-display-preview-"));
45
+
46
+ try {
47
+ const filePath = join(baseDir, "sample.txt");
48
+ writeFileSync(filePath, "alpha\r\nbeta\r\ngamma\r\n", "utf8");
49
+
50
+ const preview = buildPendingEditPreviewData(
51
+ {
52
+ path: "sample.txt",
53
+ edits: [
54
+ {
55
+ oldText: "alpha\nbeta",
56
+ newText: "alpha\nupdated",
57
+ },
58
+ ],
59
+ },
60
+ baseDir,
61
+ );
62
+
63
+ assert.equal(preview?.notice, undefined);
64
+ assert.equal(preview?.nextContent, "alpha\r\nupdated\r\ngamma\r\n");
65
+ assert.equal(preview?.previousContent, "alpha\r\nbeta\r\ngamma\r\n");
66
+ } finally {
67
+ rmSync(baseDir, { recursive: true, force: true });
68
+ }
69
+ });
70
+
71
+ test("pending edit preview reports a concise notice for true edit mismatches", () => {
72
+ const baseDir = mkdtempSync(join(tmpdir(), "pi-tool-display-preview-miss-"));
73
+
74
+ try {
75
+ writeFileSync(join(baseDir, "sample.txt"), "alpha\nbeta\n", "utf8");
76
+
77
+ const preview = buildPendingEditPreviewData(
78
+ {
79
+ path: "sample.txt",
80
+ edits: [
81
+ {
82
+ oldText: "missing",
83
+ newText: "updated",
84
+ },
85
+ ],
86
+ },
87
+ baseDir,
88
+ );
89
+
90
+ assert.equal(preview?.nextContent, undefined);
91
+ assert.equal(preview?.notice, "Preview not shown: edit #1 did not match the current file contents.");
92
+ } finally {
93
+ rmSync(baseDir, { recursive: true, force: true });
94
+ }
95
+ });
96
+
97
+ test("write call summary moves metrics onto the first line when the result header omits them", () => {
98
+ assert.equal(
99
+ shouldRenderWriteCallSummary({
100
+ hasContent: true,
101
+ hasDetailedResultHeader: false,
102
+ }),
103
+ true,
104
+ );
105
+ assert.equal(
106
+ shouldRenderWriteCallSummary({
107
+ hasContent: true,
108
+ hasDetailedResultHeader: true,
109
+ }),
110
+ false,
111
+ );
112
+ assert.equal(
113
+ shouldRenderWriteCallSummary({
114
+ hasContent: false,
115
+ hasDetailedResultHeader: false,
116
+ }),
117
+ false,
118
+ );
119
+ });
120
+
121
+ test("write content line counting ignores trailing newlines", () => {
122
+ assert.equal(countWriteContentLines("alpha\nbeta\n"), 2);
123
+ assert.equal(countWriteContentLines("alpha\r\nbeta"), 2);
124
+ assert.equal(countWriteContentLines(""), 0);
125
+ });
126
+
127
+ test("write content size uses utf-8 bytes", () => {
128
+ assert.equal(getWriteContentSizeBytes("hello"), 5);
129
+ assert.equal(getWriteContentSizeBytes("é"), 2);
130
+ });
131
+
132
+ test("user message patch reapplies on reload when an older patch version is already present", () => {
133
+ const originalRender = (width: number): string[] => [`original:${width}`];
134
+ const prototype: PatchableUserMessagePrototype = {
135
+ render: (width: number): string[] => [`stale:${width}`],
136
+ __piUserMessageOriginalRender: originalRender,
137
+ __piUserMessageNativePatched: true,
138
+ __piUserMessagePatchVersion: 1,
139
+ };
140
+
141
+ patchUserMessageRenderPrototype(prototype, 5, (baseRender) => {
142
+ return function patched(width: number): string[] {
143
+ return [`patched:${baseRender.call(this, width).join("|")}`];
144
+ };
145
+ });
146
+
147
+ assert.deepEqual(prototype.render(14), ["patched:original:14"]);
148
+ assert.equal(prototype.__piUserMessagePatchVersion, 5);
149
+ assert.equal(prototype.__piUserMessageNativePatched, true);
150
+ });
151
+
152
+ test("user message markdown extraction removes nested background styling", () => {
153
+ const theme = { heading: () => "" };
154
+ const color = (text: string): string => text;
155
+ const extracted = extractUserMessageMarkdownState({
156
+ children: [
157
+ { lines: 1 },
158
+ {
159
+ text: "Hello **WezTerm**",
160
+ theme,
161
+ defaultTextStyle: {
162
+ color,
163
+ bgColor: (text: string): string => text,
164
+ bold: true,
165
+ },
166
+ },
167
+ ],
168
+ });
169
+
170
+ assert.equal(extracted?.text, "Hello **WezTerm**");
171
+ assert.equal(extracted?.theme, theme);
172
+ assert.equal(extracted?.defaultTextStyle?.color, color);
173
+ assert.equal(extracted?.defaultTextStyle?.bold, true);
174
+ assert.equal("bgColor" in (extracted?.defaultTextStyle ?? {}), false);
175
+ });
176
+
177
+ test("user message markdown extraction finds markdown nested inside the native box", () => {
178
+ const theme = { heading: () => "" };
179
+ const color = (text: string): string => text;
180
+ const extracted = extractUserMessageMarkdownState({
181
+ children: [
182
+ {
183
+ children: [
184
+ {
185
+ text: "Nested **markdown**",
186
+ theme,
187
+ defaultTextStyle: {
188
+ color,
189
+ bgColor: (text: string): string => text,
190
+ },
191
+ },
192
+ ],
193
+ },
194
+ ],
195
+ });
196
+
197
+ assert.equal(extracted?.text, "Nested **markdown**");
198
+ assert.equal(extracted?.theme, theme);
199
+ assert.equal(extracted?.defaultTextStyle?.color, color);
200
+ assert.equal("bgColor" in (extracted?.defaultTextStyle ?? {}), false);
201
+ });
202
+
203
+ test("user message markdown renderer reuses cached markdown renders for identical state", () => {
204
+ let rendererCreationCount = 0;
205
+ let renderCallCount = 0;
206
+ const renderMarkdown = createUserMessageMarkdownLineRenderer((state) => {
207
+ rendererCreationCount++;
208
+ return {
209
+ render(width: number): string[] {
210
+ renderCallCount++;
211
+ return [`${state.text}:${width}`];
212
+ },
213
+ };
214
+ });
215
+
216
+ const instance = {};
217
+ const theme = { heading: () => "" };
218
+
219
+ assert.deepEqual(
220
+ renderMarkdown(instance, { text: "cached", theme, defaultTextStyle: { bold: true } }, 24),
221
+ ["cached:24"],
222
+ );
223
+ assert.deepEqual(
224
+ renderMarkdown(instance, { text: "cached", theme, defaultTextStyle: { bold: true } }, 24),
225
+ ["cached:24"],
226
+ );
227
+ assert.equal(rendererCreationCount, 1);
228
+ assert.equal(renderCallCount, 1);
229
+
230
+ assert.deepEqual(
231
+ renderMarkdown(instance, { text: "cached", theme, defaultTextStyle: { bold: true } }, 48),
232
+ ["cached:48"],
233
+ );
234
+ assert.equal(rendererCreationCount, 1);
235
+ assert.equal(renderCallCount, 2);
236
+
237
+ assert.deepEqual(
238
+ renderMarkdown(instance, { text: "updated", theme, defaultTextStyle: { bold: true } }, 48),
239
+ ["updated:48"],
240
+ );
241
+ assert.equal(rendererCreationCount, 2);
242
+ assert.equal(renderCallCount, 3);
243
+ });
244
+
245
+ test("user message markdown rebuild guard bypasses oversized payloads", () => {
246
+ assert.equal(
247
+ shouldBypassUserMessageMarkdownRebuild({
248
+ text: "short message",
249
+ theme: {},
250
+ }),
251
+ false,
252
+ );
253
+ assert.equal(
254
+ shouldBypassUserMessageMarkdownRebuild({
255
+ text: `${"line\n".repeat(2000)}tail`,
256
+ theme: {},
257
+ }),
258
+ true,
259
+ );
260
+ });
261
+
262
+ test("user message renderer adds one top and bottom padding row inside the box", () => {
263
+ assert.deepEqual(addUserMessageVerticalPadding(["Ping"]), ["", "Ping", ""]);
264
+ assert.deepEqual(addUserMessageVerticalPadding(["Line 1", "Line 2"]), ["", "Line 1", "Line 2", ""]);
265
+ });
266
+
267
+ test("native user message renderer inserts one blank spacer line before the box", () => {
268
+ const prototype: PatchableUserMessagePrototype = {
269
+ render: () => ["Original user content"],
270
+ };
271
+
272
+ patchNativeUserMessagePrototype(prototype, () => undefined, () => true);
273
+
274
+ const rendered = prototype.render(24);
275
+
276
+ assert.equal(rendered[0], "");
277
+ assert.match(rendered[1] ?? "", /^╭/);
278
+ });
279
+
280
+ test("native user message renderer wraps body at the padded content width", () => {
281
+ const contentWidth = 16;
282
+ const totalWidth = contentWidth + 4;
283
+ const message = `${"X".repeat(contentWidth)}YZ`;
284
+ const requestedWidths: number[] = [];
285
+ const prototype: PatchableUserMessagePrototype = {
286
+ render: (width: number): string[] => {
287
+ requestedWidths.push(width);
288
+ const lines: string[] = [];
289
+ for (let index = 0; index < message.length; index += width) {
290
+ lines.push(message.slice(index, index + width));
291
+ }
292
+ return lines;
293
+ },
294
+ };
295
+
296
+ patchNativeUserMessagePrototype(prototype, () => undefined, () => true);
297
+
298
+ const rendered = prototype.render(totalWidth);
299
+ const borderedRows = rendered.filter((line) =>
300
+ line.startsWith("│") || line.startsWith("╭") || line.startsWith("╰"),
301
+ );
302
+
303
+ assert.equal(requestedWidths[0], contentWidth);
304
+ assert.ok(
305
+ rendered.some((line) => line.includes("YZ")),
306
+ "tail content should wrap instead of being clipped",
307
+ );
308
+ assert.ok(borderedRows.every((line) => visibleWidth(line) === totalWidth));
309
+ });
310
+
311
+ test("user message blank ansi lines are cleared before wrapping", () => {
312
+ assert.equal(normalizeUserMessageContentLine("\u001b[0m"), "");
313
+ assert.equal(normalizeUserMessageContentLine(" \u001b[31m\u001b[0m"), "");
314
+ assert.equal(normalizeUserMessageContentLine("\u001b]133;A\u0007 \u001b]133;B\u0007"), "");
315
+
316
+ const normalized = normalizeUserMessageContentLine("\u001b[31mhello\u001b[0m");
317
+ assert.match(normalized, /hello/);
318
+ assert.doesNotMatch(normalized, /\u001b\[0m/);
319
+
320
+ const withoutOsc = normalizeUserMessageContentLine("\u001b]133;A\u0007hello\u001b]133;B\u0007");
321
+ assert.equal(withoutOsc, "hello");
322
+
323
+ const hyperlink = "\u001b]8;;https://example.com\u001b\\link\u001b]8;;\u001b\\";
324
+ assert.equal(normalizeUserMessageContentLine(hyperlink), hyperlink);
325
+ });
326
+
327
+ test("user message background painting keeps trailing padding inside explicit background cells", () => {
328
+ const rendered = applyUserMessageBackground(
329
+ {
330
+ getBgAnsi: () => "\u001b[48;5;24m",
331
+ },
332
+ "\u001b[31mhello\u001b[0m ",
333
+ );
334
+
335
+ assert.ok(rendered.startsWith("\u001b[48;5;24m"));
336
+ assert.match(rendered, /hello/);
337
+ assert.equal(rendered.indexOf("\u001b[49m"), rendered.lastIndexOf("\u001b[49m"));
338
+ assert.equal(rendered.slice(rendered.lastIndexOf("\u001b[49m") - 3, rendered.lastIndexOf("\u001b[49m")), " ");
339
+ assert.doesNotMatch(rendered, /\u001b\[0m/);
340
+
341
+ const hyperlink = "\u001b]8;;https://example.com\u001b\\link\u001b]8;;\u001b\\";
342
+ const hyperlinkRendered = applyUserMessageBackground(undefined, hyperlink);
343
+ assert.equal(hyperlinkRendered, hyperlink);
344
+ });
345
+
346
+ test("user message background painting falls back to theme bg helper", () => {
347
+ const rendered = applyUserMessageBackground(
348
+ {
349
+ bg: (_color, text) => `bg(${text})`,
350
+ },
351
+ "\u001b[32mworld\u001b[49m",
352
+ );
353
+
354
+ assert.equal(rendered, "bg(\u001b[32mworld)");
355
+ });
356
+
357
+ test("user message content trims edge padding but preserves intentional interior breaks", () => {
358
+ assert.deepEqual(normalizeUserMessageContentLines(["", "hello", ""]), ["hello"]);
359
+ assert.deepEqual(normalizeUserMessageContentLines(["", "hello", "", "world", ""]), [
360
+ "hello",
361
+ "",
362
+ "world",
363
+ ]);
364
+ assert.deepEqual(normalizeUserMessageContentLines(["\u001b[0m", " "]), []);
365
+ assert.deepEqual(
366
+ normalizeUserMessageContentLines([
367
+ "\u001b]133;A\u0007 ",
368
+ "hello",
369
+ "\u001b]133;B\u0007\u001b]133;C\u0007 ",
370
+ ]),
371
+ ["hello"],
372
+ );
373
+ });
374
+
375
+ test("collapsed diff hint shrinks to fit narrow panes", () => {
376
+ const hint = buildCollapsedDiffHintText(
377
+ {
378
+ remainingLines: 3970,
379
+ hiddenHunks: 1,
380
+ },
381
+ 35,
382
+ codePointWidthOps,
383
+ );
384
+
385
+ assert.ok(codePointWidthOps.measure(hint) <= 35);
386
+ assert.match(hint, /3970/);
387
+ assert.doesNotMatch(hint, /Ctrl\+O/);
388
+ });
389
+
390
+ test("collapsed diff hint keeps full guidance when width allows", () => {
391
+ const hint = buildCollapsedDiffHintText(
392
+ {
393
+ remainingLines: 12,
394
+ hiddenHunks: 2,
395
+ },
396
+ 80,
397
+ codePointWidthOps,
398
+ );
399
+
400
+ assert.equal(hint, "… (12 more diff lines • 2 more hunks • Ctrl+O to expand)");
401
+ });
402
+
403
+ test("line width clamp never returns text wider than the requested width", () => {
404
+ const clamped = clampRenderedLineToWidth(
405
+ "… (3970 more diff lines • Ctrl+O to expand)",
406
+ 35,
407
+ codePointWidthOps,
408
+ );
409
+
410
+ assert.ok(codePointWidthOps.measure(clamped) <= 35);
411
+ assert.equal(clampRenderedLineToWidth("hello", 0, codePointWidthOps), "");
412
+ });
413
+
@@ -0,0 +1,176 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import {
4
+ patchNativeUserMessagePrototype,
5
+ type PatchableUserMessagePrototype,
6
+ type UserMessageTheme,
7
+ } from "../src/user-message-box-renderer.ts";
8
+
9
+ function createCountingTheme(label: string): UserMessageTheme & { calls: string[] } {
10
+ const calls: string[] = [];
11
+ return {
12
+ calls,
13
+ fg(color: string, text: string): string {
14
+ calls.push(`${label}:fg:${color}:${text}`);
15
+ return `[${label}:${color}]${text}`;
16
+ },
17
+ bold(text: string): string {
18
+ calls.push(`${label}:bold:${text}`);
19
+ return `[${label}:bold]${text}`;
20
+ },
21
+ };
22
+ }
23
+
24
+ function markdownUserMessageInstance(text: string, theme: object = {}): { children: unknown[] } {
25
+ return {
26
+ children: [
27
+ {
28
+ text,
29
+ theme,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+
35
+ function renderLineCount(lines: string[], needle: string): number {
36
+ return lines.filter((line) => line.includes(needle)).length;
37
+ }
38
+
39
+ // RED coverage for the reported long-session slowdown: these tests describe the
40
+ // expected production fix but intentionally do not implement it here.
41
+
42
+ test("native user message border render reuses final boxed output for identical rerenders", () => {
43
+ let originalRenderCount = 0;
44
+ const theme = createCountingTheme("stable");
45
+ const prototype: PatchableUserMessagePrototype = {
46
+ render(width: number) {
47
+ originalRenderCount++;
48
+ return [`stable body at ${width}`];
49
+ },
50
+ };
51
+ const instance = {};
52
+
53
+ patchNativeUserMessagePrototype(prototype, () => theme, () => true);
54
+
55
+ const first = prototype.render.call(instance, 42);
56
+ const themeCallsAfterFirstRender = theme.calls.length;
57
+ const second = prototype.render.call(instance, 42);
58
+
59
+ assert.equal(originalRenderCount, 1, "identical rerender should not call the original body renderer again");
60
+ assert.equal(theme.calls.length, themeCallsAfterFirstRender, "identical rerender should not recolor/rebuild border lines");
61
+ assert.equal(second, first, "identical rerender should return the cached final bordered string[]");
62
+ });
63
+
64
+ test("native user message final output cache invalidates by width and theme without rebuilding unchanged body", () => {
65
+ let originalRenderCount = 0;
66
+ let activeTheme = createCountingTheme("a");
67
+ const prototype: PatchableUserMessagePrototype = {
68
+ render(width: number) {
69
+ originalRenderCount++;
70
+ return [`body rendered for ${width}`];
71
+ },
72
+ };
73
+ const instance = {};
74
+
75
+ patchNativeUserMessagePrototype(prototype, () => activeTheme, () => true);
76
+
77
+ const width40ThemeA = prototype.render.call(instance, 40);
78
+ const width40ThemeAAgain = prototype.render.call(instance, 40);
79
+ const width50ThemeA = prototype.render.call(instance, 50);
80
+ activeTheme = createCountingTheme("b");
81
+ const width50ThemeB = prototype.render.call(instance, 50);
82
+
83
+ assert.equal(width40ThemeAAgain, width40ThemeA, "same width/theme should hit final output cache");
84
+ assert.notEqual(width50ThemeA, width40ThemeA, "different width must invalidate final output cache");
85
+ assert.notDeepEqual(width50ThemeB, width50ThemeA, "different theme must invalidate final output cache");
86
+ assert.equal(originalRenderCount, 2, "body renderer should run only once per distinct content width");
87
+ });
88
+
89
+ test("native user message final output cache does not return stale output after message state changes", () => {
90
+ const markdownTheme = {};
91
+ const instance = markdownUserMessageInstance("first message", markdownTheme);
92
+ const prototype: PatchableUserMessagePrototype = {
93
+ render() {
94
+ throw new Error("markdown child should provide body lines without falling back to original render");
95
+ },
96
+ };
97
+
98
+ patchNativeUserMessagePrototype(prototype, () => undefined, () => true);
99
+
100
+ const first = prototype.render.call(instance, 48);
101
+ instance.children = [{ text: "second message", theme: markdownTheme }];
102
+ const second = prototype.render.call(instance, 48);
103
+
104
+ assert.notEqual(second, first, "changed markdown state should invalidate the final output cache reference");
105
+ assert.ok(first.some((line) => line.includes("first message")), "first render should include the original message");
106
+ assert.ok(second.some((line) => line.includes("second message")), "second render should include the changed message");
107
+ assert.equal(second.some((line) => line.includes("first message")), false, "changed message should not reuse stale boxed output");
108
+ });
109
+
110
+ test("native user message final output cache invalidates when the enabled state changes", () => {
111
+ let enabled = true;
112
+ const originalLines = ["disabled native fallback"];
113
+ const prototype: PatchableUserMessagePrototype = {
114
+ render() {
115
+ return originalLines;
116
+ },
117
+ };
118
+ const instance = {};
119
+
120
+ patchNativeUserMessagePrototype(prototype, () => undefined, () => enabled);
121
+
122
+ const enabledRender = prototype.render.call(instance, 52);
123
+ const enabledRenderAgain = prototype.render.call(instance, 52);
124
+ enabled = false;
125
+ const disabledRender = prototype.render.call(instance, 52);
126
+
127
+ assert.equal(enabledRenderAgain, enabledRender, "same width/theme/enabled state should hit final output cache");
128
+ assert.equal(disabledRender, originalLines, "disabled native rendering must bypass any previously cached boxed output");
129
+ assert.notEqual(disabledRender, enabledRender, "enabled-state change should invalidate final output cache");
130
+ });
131
+
132
+ test("native user message skips custom boxing for markdown text over the character threshold", () => {
133
+ let originalRenderCount = 0;
134
+ const theme = createCountingTheme("huge-text");
135
+ const originalLines = ["huge body fallback"];
136
+ const instance = markdownUserMessageInstance("x".repeat(100_001));
137
+ const prototype: PatchableUserMessagePrototype = {
138
+ render(width: number) {
139
+ originalRenderCount++;
140
+ assert.equal(width, 80, "oversized messages should bypass native boxing before content-width shrinking");
141
+ return originalLines;
142
+ },
143
+ };
144
+
145
+ patchNativeUserMessagePrototype(prototype, () => theme, () => true);
146
+
147
+ const rendered = prototype.render.call(instance, 80);
148
+
149
+ assert.equal(originalRenderCount, 1);
150
+ assert.equal(rendered, originalLines, "oversized markdown text should return the original render output without custom boxing");
151
+ assert.equal(renderLineCount(rendered, "│"), 0, "oversized markdown text should avoid per-line custom box work");
152
+ assert.equal(theme.calls.length, 0, "oversized markdown text should not spend time coloring native border lines");
153
+ });
154
+
155
+ test("native user message skips custom boxing for markdown text over the line-count threshold", () => {
156
+ let originalRenderCount = 0;
157
+ const theme = createCountingTheme("huge-lines");
158
+ const originalLines = ["line-count fallback"];
159
+ const instance = markdownUserMessageInstance(`${"line\n".repeat(2000)}tail`);
160
+ const prototype: PatchableUserMessagePrototype = {
161
+ render(width: number) {
162
+ originalRenderCount++;
163
+ assert.equal(width, 72, "line-heavy messages should bypass native boxing before content-width shrinking");
164
+ return originalLines;
165
+ },
166
+ };
167
+
168
+ patchNativeUserMessagePrototype(prototype, () => theme, () => true);
169
+
170
+ const rendered = prototype.render.call(instance, 72);
171
+
172
+ assert.equal(originalRenderCount, 1);
173
+ assert.equal(rendered, originalLines, "line-heavy markdown should return the original render output without custom boxing");
174
+ assert.equal(renderLineCount(rendered, "│"), 0, "line-heavy markdown should avoid per-line custom box work");
175
+ assert.equal(theme.calls.length, 0, "line-heavy markdown should not spend time coloring native border lines");
176
+ });