@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,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
+ });