pi-usereq 0.49.0 → 0.50.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 (938) hide show
  1. package/README.md +1 -1
  2. package/package.json +5 -1
  3. package/scripts/lib/extension-debug-harness.ts +443 -0
  4. package/scripts/lib/recording-extension-api.ts +855 -0
  5. package/scripts/lib/sdk-smoke.ts +503 -0
  6. package/.g.conf +0 -16
  7. package/.github/workflows/release-npm.yml +0 -134
  8. package/.gitignore +0 -274
  9. package/CHANGELOG.md +0 -706
  10. package/TODO.md +0 -20
  11. package/docs/pi.dev/agent-document-manifest.json +0 -6399
  12. package/docs/pi.dev/coding-agent-docs/compaction.md +0 -394
  13. package/docs/pi.dev/coding-agent-docs/custom-provider.md +0 -637
  14. package/docs/pi.dev/coding-agent-docs/development.md +0 -71
  15. package/docs/pi.dev/coding-agent-docs/extensions.md +0 -2536
  16. package/docs/pi.dev/coding-agent-docs/images/doom-extension.png +0 -0
  17. package/docs/pi.dev/coding-agent-docs/images/exy.png +0 -0
  18. package/docs/pi.dev/coding-agent-docs/images/interactive-mode.png +0 -0
  19. package/docs/pi.dev/coding-agent-docs/images/tree-view.png +0 -0
  20. package/docs/pi.dev/coding-agent-docs/json.md +0 -82
  21. package/docs/pi.dev/coding-agent-docs/keybindings.md +0 -197
  22. package/docs/pi.dev/coding-agent-docs/models.md +0 -395
  23. package/docs/pi.dev/coding-agent-docs/packages.md +0 -218
  24. package/docs/pi.dev/coding-agent-docs/prompt-templates.md +0 -88
  25. package/docs/pi.dev/coding-agent-docs/providers.md +0 -196
  26. package/docs/pi.dev/coding-agent-docs/rpc.md +0 -1407
  27. package/docs/pi.dev/coding-agent-docs/sdk.md +0 -1149
  28. package/docs/pi.dev/coding-agent-docs/session.md +0 -412
  29. package/docs/pi.dev/coding-agent-docs/settings.md +0 -248
  30. package/docs/pi.dev/coding-agent-docs/shell-aliases.md +0 -13
  31. package/docs/pi.dev/coding-agent-docs/skills.md +0 -232
  32. package/docs/pi.dev/coding-agent-docs/terminal-setup.md +0 -106
  33. package/docs/pi.dev/coding-agent-docs/termux.md +0 -127
  34. package/docs/pi.dev/coding-agent-docs/themes.md +0 -295
  35. package/docs/pi.dev/coding-agent-docs/tmux.md +0 -61
  36. package/docs/pi.dev/coding-agent-docs/tree.md +0 -233
  37. package/docs/pi.dev/coding-agent-docs/tui.md +0 -918
  38. package/docs/pi.dev/coding-agent-docs/windows.md +0 -17
  39. package/docs/pi.dev/mom-docs/artifacts-server.md +0 -475
  40. package/docs/pi.dev/mom-docs/events.md +0 -307
  41. package/docs/pi.dev/mom-docs/new.md +0 -970
  42. package/docs/pi.dev/mom-docs/sandbox.md +0 -153
  43. package/docs/pi.dev/mom-docs/slack-bot-minimal-guide.md +0 -399
  44. package/docs/pi.dev/mom-docs/v86.md +0 -319
  45. package/docs/pi.dev/pods-docs/gml-4.5.md +0 -189
  46. package/docs/pi.dev/pods-docs/gpt-oss.md +0 -233
  47. package/docs/pi.dev/pods-docs/implementation-plan.md +0 -183
  48. package/docs/pi.dev/pods-docs/kimi-k2.md +0 -197
  49. package/docs/pi.dev/pods-docs/models.md +0 -116
  50. package/docs/pi.dev/pods-docs/plan.md +0 -166
  51. package/docs/pi.dev/pods-docs/qwen3-coder.md +0 -132
  52. package/images/flowchart-bw.png +0 -0
  53. package/images/flowchart-bw.svg +0 -102
  54. package/images/flowchart.md +0 -100
  55. package/images/flowchart.png +0 -0
  56. package/images/flowchart.svg +0 -3
  57. package/pi-usereq/docs/REFERENCES.md +0 -5713
  58. package/pi-usereq/docs/REQUIREMENTS.md +0 -781
  59. package/pi-usereq/docs/WORKFLOW.md +0 -1341
  60. package/pi.dev-src/pi-mono/agent/src/agent-loop.ts +0 -683
  61. package/pi.dev-src/pi-mono/agent/src/agent.ts +0 -543
  62. package/pi.dev-src/pi-mono/agent/src/index.ts +0 -8
  63. package/pi.dev-src/pi-mono/agent/src/proxy.ts +0 -367
  64. package/pi.dev-src/pi-mono/agent/src/types.ts +0 -364
  65. package/pi.dev-src/pi-mono/agent/test/agent-loop.test.ts +0 -1181
  66. package/pi.dev-src/pi-mono/agent/test/agent.test.ts +0 -463
  67. package/pi.dev-src/pi-mono/agent/test/e2e.test.ts +0 -404
  68. package/pi.dev-src/pi-mono/agent/test/utils/calculate.ts +0 -32
  69. package/pi.dev-src/pi-mono/agent/test/utils/get-current-time.ts +0 -46
  70. package/pi.dev-src/pi-mono/agent/vitest.config.ts +0 -9
  71. package/pi.dev-src/pi-mono/ai/bedrock-provider.d.ts +0 -1
  72. package/pi.dev-src/pi-mono/ai/bedrock-provider.js +0 -1
  73. package/pi.dev-src/pi-mono/ai/scripts/generate-models.ts +0 -1635
  74. package/pi.dev-src/pi-mono/ai/scripts/generate-test-image.ts +0 -34
  75. package/pi.dev-src/pi-mono/ai/src/api-registry.ts +0 -98
  76. package/pi.dev-src/pi-mono/ai/src/bedrock-provider.ts +0 -6
  77. package/pi.dev-src/pi-mono/ai/src/cli.ts +0 -133
  78. package/pi.dev-src/pi-mono/ai/src/env-api-keys.ts +0 -134
  79. package/pi.dev-src/pi-mono/ai/src/index.ts +0 -35
  80. package/pi.dev-src/pi-mono/ai/src/models.generated.ts +0 -14928
  81. package/pi.dev-src/pi-mono/ai/src/models.ts +0 -82
  82. package/pi.dev-src/pi-mono/ai/src/oauth.ts +0 -1
  83. package/pi.dev-src/pi-mono/ai/src/providers/amazon-bedrock.ts +0 -929
  84. package/pi.dev-src/pi-mono/ai/src/providers/anthropic.ts +0 -1125
  85. package/pi.dev-src/pi-mono/ai/src/providers/azure-openai-responses.ts +0 -253
  86. package/pi.dev-src/pi-mono/ai/src/providers/faux.ts +0 -499
  87. package/pi.dev-src/pi-mono/ai/src/providers/github-copilot-headers.ts +0 -37
  88. package/pi.dev-src/pi-mono/ai/src/providers/google-gemini-cli.ts +0 -996
  89. package/pi.dev-src/pi-mono/ai/src/providers/google-shared.ts +0 -354
  90. package/pi.dev-src/pi-mono/ai/src/providers/google-vertex.ts +0 -543
  91. package/pi.dev-src/pi-mono/ai/src/providers/google.ts +0 -500
  92. package/pi.dev-src/pi-mono/ai/src/providers/mistral.ts +0 -629
  93. package/pi.dev-src/pi-mono/ai/src/providers/openai-codex-responses.ts +0 -984
  94. package/pi.dev-src/pi-mono/ai/src/providers/openai-completions.ts +0 -1063
  95. package/pi.dev-src/pi-mono/ai/src/providers/openai-responses-shared.ts +0 -539
  96. package/pi.dev-src/pi-mono/ai/src/providers/openai-responses.ts +0 -264
  97. package/pi.dev-src/pi-mono/ai/src/providers/register-builtins.ts +0 -433
  98. package/pi.dev-src/pi-mono/ai/src/providers/simple-options.ts +0 -47
  99. package/pi.dev-src/pi-mono/ai/src/providers/transform-messages.ts +0 -220
  100. package/pi.dev-src/pi-mono/ai/src/stream.ts +0 -59
  101. package/pi.dev-src/pi-mono/ai/src/types.ts +0 -417
  102. package/pi.dev-src/pi-mono/ai/src/utils/event-stream.ts +0 -87
  103. package/pi.dev-src/pi-mono/ai/src/utils/hash.ts +0 -13
  104. package/pi.dev-src/pi-mono/ai/src/utils/headers.ts +0 -7
  105. package/pi.dev-src/pi-mono/ai/src/utils/json-parse.ts +0 -124
  106. package/pi.dev-src/pi-mono/ai/src/utils/overflow.ts +0 -138
  107. package/pi.dev-src/pi-mono/ai/src/utils/sanitize-unicode.ts +0 -25
  108. package/pi.dev-src/pi-mono/ai/src/utils/typebox-helpers.ts +0 -24
  109. package/pi.dev-src/pi-mono/ai/src/utils/validation.ts +0 -324
  110. package/pi.dev-src/pi-mono/ai/test/abort.test.ts +0 -260
  111. package/pi.dev-src/pi-mono/ai/test/anthropic-oauth.test.ts +0 -99
  112. package/pi.dev-src/pi-mono/ai/test/anthropic-opus-4-7-smoke.test.ts +0 -72
  113. package/pi.dev-src/pi-mono/ai/test/anthropic-sse-parsing.test.ts +0 -113
  114. package/pi.dev-src/pi-mono/ai/test/anthropic-thinking-disable.test.ts +0 -152
  115. package/pi.dev-src/pi-mono/ai/test/anthropic-tool-name-normalization.test.ts +0 -205
  116. package/pi.dev-src/pi-mono/ai/test/azure-utils.ts +0 -28
  117. package/pi.dev-src/pi-mono/ai/test/bedrock-endpoint-resolution.test.ts +0 -131
  118. package/pi.dev-src/pi-mono/ai/test/bedrock-models.test.ts +0 -66
  119. package/pi.dev-src/pi-mono/ai/test/bedrock-thinking-payload.test.ts +0 -107
  120. package/pi.dev-src/pi-mono/ai/test/bedrock-utils.ts +0 -18
  121. package/pi.dev-src/pi-mono/ai/test/cache-retention.test.ts +0 -335
  122. package/pi.dev-src/pi-mono/ai/test/context-overflow.test.ts +0 -714
  123. package/pi.dev-src/pi-mono/ai/test/cross-provider-handoff.test.ts +0 -458
  124. package/pi.dev-src/pi-mono/ai/test/data/red-circle.png +0 -0
  125. package/pi.dev-src/pi-mono/ai/test/empty.test.ts +0 -742
  126. package/pi.dev-src/pi-mono/ai/test/faux-provider.test.ts +0 -597
  127. package/pi.dev-src/pi-mono/ai/test/fireworks-models.test.ts +0 -49
  128. package/pi.dev-src/pi-mono/ai/test/github-copilot-anthropic.test.ts +0 -108
  129. package/pi.dev-src/pi-mono/ai/test/github-copilot-oauth.test.ts +0 -196
  130. package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-claude-thinking-header.test.ts +0 -103
  131. package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-empty-stream.test.ts +0 -108
  132. package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-retry-delay.test.ts +0 -53
  133. package/pi.dev-src/pi-mono/ai/test/google-shared-convert-tools.test.ts +0 -187
  134. package/pi.dev-src/pi-mono/ai/test/google-shared-gemini3-unsigned-tool-call.test.ts +0 -172
  135. package/pi.dev-src/pi-mono/ai/test/google-shared-image-tool-result-routing.test.ts +0 -124
  136. package/pi.dev-src/pi-mono/ai/test/google-thinking-disable.test.ts +0 -183
  137. package/pi.dev-src/pi-mono/ai/test/google-thinking-signature.test.ts +0 -38
  138. package/pi.dev-src/pi-mono/ai/test/google-tool-call-missing-args.test.ts +0 -105
  139. package/pi.dev-src/pi-mono/ai/test/google-vertex-api-key-resolution.test.ts +0 -144
  140. package/pi.dev-src/pi-mono/ai/test/image-tool-result.test.ts +0 -481
  141. package/pi.dev-src/pi-mono/ai/test/interleaved-thinking.test.ts +0 -145
  142. package/pi.dev-src/pi-mono/ai/test/lazy-module-load.test.ts +0 -102
  143. package/pi.dev-src/pi-mono/ai/test/mistral-reasoning-mode.test.ts +0 -66
  144. package/pi.dev-src/pi-mono/ai/test/mistral-tool-schema.test.ts +0 -61
  145. package/pi.dev-src/pi-mono/ai/test/oauth.ts +0 -89
  146. package/pi.dev-src/pi-mono/ai/test/openai-codex-cache-affinity-e2e.test.ts +0 -36
  147. package/pi.dev-src/pi-mono/ai/test/openai-codex-stream.test.ts +0 -686
  148. package/pi.dev-src/pi-mono/ai/test/openai-completions-cache-control-format.test.ts +0 -189
  149. package/pi.dev-src/pi-mono/ai/test/openai-completions-prompt-cache.test.ts +0 -198
  150. package/pi.dev-src/pi-mono/ai/test/openai-completions-thinking-as-text.test.ts +0 -214
  151. package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-choice.test.ts +0 -560
  152. package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-result-images.test.ts +0 -101
  153. package/pi.dev-src/pi-mono/ai/test/openai-responses-cache-affinity-e2e.test.ts +0 -32
  154. package/pi.dev-src/pi-mono/ai/test/openai-responses-copilot-provider.test.ts +0 -128
  155. package/pi.dev-src/pi-mono/ai/test/openai-responses-foreign-toolcall-id.test.ts +0 -66
  156. package/pi.dev-src/pi-mono/ai/test/openai-responses-partial-json-cleanup.test.ts +0 -101
  157. package/pi.dev-src/pi-mono/ai/test/openai-responses-reasoning-replay-e2e.test.ts +0 -292
  158. package/pi.dev-src/pi-mono/ai/test/openai-responses-tool-result-images.test.ts +0 -200
  159. package/pi.dev-src/pi-mono/ai/test/openrouter-cache-write-repro.test.ts +0 -78
  160. package/pi.dev-src/pi-mono/ai/test/overflow.test.ts +0 -64
  161. package/pi.dev-src/pi-mono/ai/test/responseid.test.ts +0 -145
  162. package/pi.dev-src/pi-mono/ai/test/stream.test.ts +0 -1405
  163. package/pi.dev-src/pi-mono/ai/test/supports-xhigh.test.ts +0 -34
  164. package/pi.dev-src/pi-mono/ai/test/tokens.test.ts +0 -304
  165. package/pi.dev-src/pi-mono/ai/test/tool-call-id-normalization.test.ts +0 -291
  166. package/pi.dev-src/pi-mono/ai/test/tool-call-without-result.test.ts +0 -313
  167. package/pi.dev-src/pi-mono/ai/test/total-tokens.test.ts +0 -695
  168. package/pi.dev-src/pi-mono/ai/test/transform-messages-copilot-openai-to-anthropic.test.ts +0 -191
  169. package/pi.dev-src/pi-mono/ai/test/unicode-surrogate.test.ts +0 -754
  170. package/pi.dev-src/pi-mono/ai/test/validation.test.ts +0 -116
  171. package/pi.dev-src/pi-mono/ai/test/xhigh.test.ts +0 -71
  172. package/pi.dev-src/pi-mono/ai/test/zen.test.ts +0 -25
  173. package/pi.dev-src/pi-mono/ai/vitest.config.ts +0 -9
  174. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/antigravity-image-gen.ts +0 -418
  175. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/auto-commit-on-exit.ts +0 -49
  176. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bash-spawn-hook.ts +0 -30
  177. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bookmark.ts +0 -50
  178. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/built-in-tool-renderer.ts +0 -249
  179. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/claude-rules.ts +0 -86
  180. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/commands.ts +0 -72
  181. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/confirm-destructive.ts +0 -59
  182. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-compaction.ts +0 -127
  183. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-footer.ts +0 -64
  184. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-header.ts +0 -73
  185. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/index.ts +0 -604
  186. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json +0 -24
  187. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +0 -349
  188. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts +0 -82
  189. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-qwen-cli/index.ts +0 -345
  190. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dirty-repo-guard.ts +0 -56
  191. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/build.sh +0 -152
  192. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -72
  193. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-component.ts +0 -132
  194. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-engine.ts +0 -173
  195. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-keys.ts +0 -104
  196. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/index.ts +0 -74
  197. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/wad-finder.ts +0 -51
  198. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/SKILL.md +0 -8
  199. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.json +0 -79
  200. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.md +0 -5
  201. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/index.ts +0 -15
  202. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-tools.ts +0 -74
  203. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/event-bus.ts +0 -43
  204. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/file-trigger.ts +0 -41
  205. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/git-checkpoint.ts +0 -53
  206. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/github-issue-autocomplete.ts +0 -185
  207. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/handoff.ts +0 -153
  208. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hello.ts +0 -26
  209. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hidden-thinking-label.ts +0 -53
  210. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/inline-bash.ts +0 -94
  211. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/input-transform.ts +0 -43
  212. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/interactive-shell.ts +0 -196
  213. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/mac-system-theme.ts +0 -47
  214. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/message-renderer.ts +0 -59
  215. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/minimal-mode.ts +0 -426
  216. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/modal-editor.ts +0 -85
  217. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/model-status.ts +0 -31
  218. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/notify.ts +0 -55
  219. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-qa-tests.ts +0 -1348
  220. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-test.ts +0 -150
  221. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/permission-gate.ts +0 -34
  222. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/pirate.ts +0 -47
  223. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/index.ts +0 -340
  224. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/utils.ts +0 -168
  225. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/preset.ts +0 -430
  226. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/prompt-customizer.ts +0 -97
  227. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/protected-paths.ts +0 -30
  228. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/provider-payload.ts +0 -18
  229. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/qna.ts +0 -122
  230. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/question.ts +0 -264
  231. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/questionnaire.ts +0 -427
  232. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rainbow-editor.ts +0 -88
  233. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/reload-runtime.ts +0 -37
  234. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rpc-demo.ts +0 -118
  235. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/index.ts +0 -321
  236. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/package-lock.json +0 -92
  237. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/send-user-message.ts +0 -97
  238. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/session-name.ts +0 -27
  239. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/shutdown-command.ts +0 -63
  240. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/snake.ts +0 -343
  241. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/space-invaders.ts +0 -560
  242. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/ssh.ts +0 -220
  243. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/status-line.ts +0 -32
  244. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/structured-output.ts +0 -65
  245. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/planner.md +0 -37
  246. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/reviewer.md +0 -35
  247. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/scout.md +0 -50
  248. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/worker.md +0 -24
  249. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents.ts +0 -126
  250. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/index.ts +0 -987
  251. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  252. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement.md +0 -10
  253. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
  254. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/summarize.ts +0 -206
  255. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/system-prompt-header.ts +0 -17
  256. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tic-tac-toe.ts +0 -1008
  257. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/timed-confirm.ts +0 -70
  258. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/titlebar-spinner.ts +0 -58
  259. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/todo.ts +0 -297
  260. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tool-override.ts +0 -144
  261. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tools.ts +0 -141
  262. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/trigger-compact.ts +0 -50
  263. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/truncated-tool.ts +0 -195
  264. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/widget-placement.ts +0 -9
  265. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/index.ts +0 -32
  266. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/package-lock.json +0 -31
  267. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-indicator.ts +0 -123
  268. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-message-test.ts +0 -25
  269. package/pi.dev-src/pi-mono/coding-agent/examples/rpc-extension-ui.ts +0 -632
  270. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/01-minimal.ts +0 -22
  271. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/02-custom-model.ts +0 -49
  272. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/03-custom-prompt.ts +0 -62
  273. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/04-skills.ts +0 -55
  274. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/05-tools.ts +0 -44
  275. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/06-extensions.ts +0 -90
  276. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/07-context-files.ts +0 -42
  277. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/08-prompt-templates.ts +0 -51
  278. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/09-api-keys-and-oauth.ts +0 -48
  279. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/10-settings.ts +0 -53
  280. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/11-sessions.ts +0 -48
  281. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/12-full-control.ts +0 -73
  282. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/13-session-runtime.ts +0 -67
  283. package/pi.dev-src/pi-mono/coding-agent/scripts/migrate-sessions.sh +0 -93
  284. package/pi.dev-src/pi-mono/coding-agent/src/bun/cli.ts +0 -6
  285. package/pi.dev-src/pi-mono/coding-agent/src/bun/register-bedrock.ts +0 -4
  286. package/pi.dev-src/pi-mono/coding-agent/src/cli/args.ts +0 -335
  287. package/pi.dev-src/pi-mono/coding-agent/src/cli/config-selector.ts +0 -52
  288. package/pi.dev-src/pi-mono/coding-agent/src/cli/file-processor.ts +0 -100
  289. package/pi.dev-src/pi-mono/coding-agent/src/cli/initial-message.ts +0 -43
  290. package/pi.dev-src/pi-mono/coding-agent/src/cli/list-models.ts +0 -110
  291. package/pi.dev-src/pi-mono/coding-agent/src/cli/session-picker.ts +0 -52
  292. package/pi.dev-src/pi-mono/coding-agent/src/cli.ts +0 -17
  293. package/pi.dev-src/pi-mono/coding-agent/src/config.ts +0 -261
  294. package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-runtime.ts +0 -394
  295. package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-services.ts +0 -196
  296. package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session.ts +0 -3096
  297. package/pi.dev-src/pi-mono/coding-agent/src/core/auth-storage.ts +0 -493
  298. package/pi.dev-src/pi-mono/coding-agent/src/core/bash-executor.ts +0 -154
  299. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/branch-summarization.ts +0 -355
  300. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/compaction.ts +0 -839
  301. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/index.ts +0 -7
  302. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/utils.ts +0 -170
  303. package/pi.dev-src/pi-mono/coding-agent/src/core/defaults.ts +0 -3
  304. package/pi.dev-src/pi-mono/coding-agent/src/core/diagnostics.ts +0 -15
  305. package/pi.dev-src/pi-mono/coding-agent/src/core/event-bus.ts +0 -33
  306. package/pi.dev-src/pi-mono/coding-agent/src/core/exec.ts +0 -107
  307. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/ansi-to-html.ts +0 -258
  308. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/index.ts +0 -314
  309. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.css +0 -1017
  310. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.html +0 -55
  311. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.js +0 -1770
  312. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/tool-renderer.ts +0 -158
  313. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/highlight.min.js +0 -1213
  314. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/marked.min.js +0 -6
  315. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/index.ts +0 -171
  316. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/loader.ts +0 -606
  317. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/runner.ts +0 -1019
  318. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/types.ts +0 -1542
  319. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/wrapper.ts +0 -30
  320. package/pi.dev-src/pi-mono/coding-agent/src/core/footer-data-provider.ts +0 -354
  321. package/pi.dev-src/pi-mono/coding-agent/src/core/index.ts +0 -77
  322. package/pi.dev-src/pi-mono/coding-agent/src/core/keybindings.ts +0 -370
  323. package/pi.dev-src/pi-mono/coding-agent/src/core/messages.ts +0 -195
  324. package/pi.dev-src/pi-mono/coding-agent/src/core/model-registry.ts +0 -858
  325. package/pi.dev-src/pi-mono/coding-agent/src/core/model-resolver.ts +0 -629
  326. package/pi.dev-src/pi-mono/coding-agent/src/core/output-guard.ts +0 -74
  327. package/pi.dev-src/pi-mono/coding-agent/src/core/package-manager.ts +0 -2408
  328. package/pi.dev-src/pi-mono/coding-agent/src/core/prompt-templates.ts +0 -296
  329. package/pi.dev-src/pi-mono/coding-agent/src/core/resolve-config-value.ts +0 -142
  330. package/pi.dev-src/pi-mono/coding-agent/src/core/resource-loader.ts +0 -917
  331. package/pi.dev-src/pi-mono/coding-agent/src/core/sdk.ts +0 -380
  332. package/pi.dev-src/pi-mono/coding-agent/src/core/session-cwd.ts +0 -59
  333. package/pi.dev-src/pi-mono/coding-agent/src/core/session-manager.ts +0 -1425
  334. package/pi.dev-src/pi-mono/coding-agent/src/core/settings-manager.ts +0 -999
  335. package/pi.dev-src/pi-mono/coding-agent/src/core/skills.ts +0 -508
  336. package/pi.dev-src/pi-mono/coding-agent/src/core/slash-commands.ts +0 -39
  337. package/pi.dev-src/pi-mono/coding-agent/src/core/source-info.ts +0 -40
  338. package/pi.dev-src/pi-mono/coding-agent/src/core/system-prompt.ts +0 -172
  339. package/pi.dev-src/pi-mono/coding-agent/src/core/telemetry.ts +0 -13
  340. package/pi.dev-src/pi-mono/coding-agent/src/core/timings.ts +0 -31
  341. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/bash.ts +0 -448
  342. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit-diff.ts +0 -445
  343. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit.ts +0 -487
  344. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/file-mutation-queue.ts +0 -39
  345. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/find.ts +0 -370
  346. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/grep.ts +0 -384
  347. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/index.ts +0 -196
  348. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/ls.ts +0 -229
  349. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/path-utils.ts +0 -94
  350. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/read.ts +0 -273
  351. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/render-utils.ts +0 -64
  352. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/tool-definition-wrapper.ts +0 -45
  353. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/truncate.ts +0 -265
  354. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/write.ts +0 -281
  355. package/pi.dev-src/pi-mono/coding-agent/src/index.ts +0 -352
  356. package/pi.dev-src/pi-mono/coding-agent/src/main.ts +0 -731
  357. package/pi.dev-src/pi-mono/coding-agent/src/migrations.ts +0 -314
  358. package/pi.dev-src/pi-mono/coding-agent/src/modes/index.ts +0 -9
  359. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/assets/clankolas.png +0 -0
  360. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/armin.ts +0 -382
  361. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/assistant-message.ts +0 -147
  362. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bash-execution.ts +0 -218
  363. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bordered-loader.ts +0 -68
  364. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/branch-summary-message.ts +0 -58
  365. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/compaction-summary-message.ts +0 -59
  366. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/config-selector.ts +0 -592
  367. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/countdown-timer.ts +0 -38
  368. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-editor.ts +0 -80
  369. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-message.ts +0 -99
  370. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/daxnuts.ts +0 -164
  371. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/diff.ts +0 -147
  372. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/dynamic-border.ts +0 -25
  373. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/earendil-announcement.ts +0 -53
  374. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-editor.ts +0 -147
  375. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-input.ts +0 -87
  376. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-selector.ts +0 -107
  377. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/footer.ts +0 -220
  378. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/index.ts +0 -32
  379. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/keybinding-hints.ts +0 -24
  380. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/login-dialog.ts +0 -178
  381. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/model-selector.ts +0 -338
  382. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/oauth-selector.ts +0 -121
  383. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/scoped-models-selector.ts +0 -355
  384. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector-search.ts +0 -194
  385. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector.ts +0 -1026
  386. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/settings-selector.ts +0 -456
  387. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/show-images-selector.ts +0 -50
  388. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/skill-invocation-message.ts +0 -55
  389. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/theme-selector.ts +0 -67
  390. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/thinking-selector.ts +0 -74
  391. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tool-execution.ts +0 -352
  392. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tree-selector.ts +0 -1246
  393. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message-selector.ts +0 -155
  394. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message.ts +0 -35
  395. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/visual-truncate.ts +0 -50
  396. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/interactive-mode.ts +0 -5155
  397. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/dark.json +0 -85
  398. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/light.json +0 -84
  399. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  400. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme.ts +0 -1141
  401. package/pi.dev-src/pi-mono/coding-agent/src/modes/print-mode.ts +0 -158
  402. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/jsonl.ts +0 -58
  403. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-client.ts +0 -515
  404. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-mode.ts +0 -745
  405. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-types.ts +0 -264
  406. package/pi.dev-src/pi-mono/coding-agent/src/package-manager-cli.ts +0 -270
  407. package/pi.dev-src/pi-mono/coding-agent/src/utils/changelog.ts +0 -99
  408. package/pi.dev-src/pi-mono/coding-agent/src/utils/child-process.ts +0 -86
  409. package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-image.ts +0 -300
  410. package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-native.ts +0 -22
  411. package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard.ts +0 -81
  412. package/pi.dev-src/pi-mono/coding-agent/src/utils/exif-orientation.ts +0 -183
  413. package/pi.dev-src/pi-mono/coding-agent/src/utils/frontmatter.ts +0 -39
  414. package/pi.dev-src/pi-mono/coding-agent/src/utils/fs-watch.ts +0 -30
  415. package/pi.dev-src/pi-mono/coding-agent/src/utils/git.ts +0 -192
  416. package/pi.dev-src/pi-mono/coding-agent/src/utils/image-convert.ts +0 -41
  417. package/pi.dev-src/pi-mono/coding-agent/src/utils/image-resize.ts +0 -176
  418. package/pi.dev-src/pi-mono/coding-agent/src/utils/mime.ts +0 -30
  419. package/pi.dev-src/pi-mono/coding-agent/src/utils/paths.ts +0 -20
  420. package/pi.dev-src/pi-mono/coding-agent/src/utils/photon.ts +0 -139
  421. package/pi.dev-src/pi-mono/coding-agent/src/utils/shell.ts +0 -210
  422. package/pi.dev-src/pi-mono/coding-agent/src/utils/sleep.ts +0 -18
  423. package/pi.dev-src/pi-mono/coding-agent/src/utils/tools-manager.ts +0 -287
  424. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-auto-compaction-queue.test.ts +0 -437
  425. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-branching.test.ts +0 -156
  426. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-compaction.test.ts +0 -208
  427. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-concurrent.test.ts +0 -618
  428. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-provider.test.ts +0 -117
  429. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-tools.test.ts +0 -182
  430. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-retry.test.ts +0 -318
  431. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-runtime-events.test.ts +0 -208
  432. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-stats.test.ts +0 -143
  433. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-tree-navigation.test.ts +0 -323
  434. package/pi.dev-src/pi-mono/coding-agent/test/args.test.ts +0 -328
  435. package/pi.dev-src/pi-mono/coding-agent/test/assistant-message.test.ts +0 -57
  436. package/pi.dev-src/pi-mono/coding-agent/test/auth-storage.test.ts +0 -462
  437. package/pi.dev-src/pi-mono/coding-agent/test/bash-close-hang-windows.test.ts +0 -126
  438. package/pi.dev-src/pi-mono/coding-agent/test/bash-execution-width.test.ts +0 -80
  439. package/pi.dev-src/pi-mono/coding-agent/test/block-images.test.ts +0 -120
  440. package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image-bmp-conversion.test.ts +0 -88
  441. package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image.test.ts +0 -136
  442. package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions-example.test.ts +0 -66
  443. package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions.test.ts +0 -415
  444. package/pi.dev-src/pi-mono/coding-agent/test/compaction-serialization.test.ts +0 -79
  445. package/pi.dev-src/pi-mono/coding-agent/test/compaction-summary-reasoning.test.ts +0 -118
  446. package/pi.dev-src/pi-mono/coding-agent/test/compaction-thinking-model.test.ts +0 -223
  447. package/pi.dev-src/pi-mono/coding-agent/test/compaction.test.ts +0 -550
  448. package/pi.dev-src/pi-mono/coding-agent/test/config.test.ts +0 -30
  449. package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-legacy-input.test.ts +0 -116
  450. package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-no-full-redraw.test.ts +0 -235
  451. package/pi.dev-src/pi-mono/coding-agent/test/export-html-whitespace.test.ts +0 -12
  452. package/pi.dev-src/pi-mono/coding-agent/test/export-html-xss.test.ts +0 -28
  453. package/pi.dev-src/pi-mono/coding-agent/test/extensions-discovery.test.ts +0 -463
  454. package/pi.dev-src/pi-mono/coding-agent/test/extensions-input-event.test.ts +0 -112
  455. package/pi.dev-src/pi-mono/coding-agent/test/extensions-runner.test.ts +0 -805
  456. package/pi.dev-src/pi-mono/coding-agent/test/file-mutation-queue.test.ts +0 -163
  457. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/assistant-message-with-thinking-code.json +0 -33
  458. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/before-compaction.jsonl +0 -1003
  459. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-agent/.gitkeep +0 -0
  460. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-cwd/.gitkeep +0 -0
  461. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/large-session.jsonl +0 -1019
  462. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/consecutive-hyphens/SKILL.md +0 -8
  463. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/disable-model-invocation/SKILL.md +0 -9
  464. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-name-chars/SKILL.md +0 -8
  465. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-yaml/SKILL.md +0 -8
  466. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/long-name/SKILL.md +0 -8
  467. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/missing-description/SKILL.md +0 -7
  468. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/multiline-description/SKILL.md +0 -11
  469. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/name-mismatch/SKILL.md +0 -8
  470. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/nested/child-skill/SKILL.md +0 -8
  471. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/no-frontmatter/SKILL.md +0 -3
  472. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/SKILL.md +0 -3
  473. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/nested-child/SKILL.md +0 -3
  474. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/unknown-field/SKILL.md +0 -10
  475. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/valid-skill/SKILL.md +0 -8
  476. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/first/calendar/SKILL.md +0 -8
  477. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/second/calendar/SKILL.md +0 -8
  478. package/pi.dev-src/pi-mono/coding-agent/test/footer-data-provider.test.ts +0 -265
  479. package/pi.dev-src/pi-mono/coding-agent/test/footer-width.test.ts +0 -115
  480. package/pi.dev-src/pi-mono/coding-agent/test/frontmatter.test.ts +0 -60
  481. package/pi.dev-src/pi-mono/coding-agent/test/git-ssh-url.test.ts +0 -78
  482. package/pi.dev-src/pi-mono/coding-agent/test/git-update.test.ts +0 -411
  483. package/pi.dev-src/pi-mono/coding-agent/test/image-processing.test.ts +0 -145
  484. package/pi.dev-src/pi-mono/coding-agent/test/image-resize-callers.test.ts +0 -53
  485. package/pi.dev-src/pi-mono/coding-agent/test/initial-message.test.ts +0 -48
  486. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-anthropic-warning.test.ts +0 -73
  487. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-clone-command.test.ts +0 -77
  488. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-compaction.test.ts +0 -57
  489. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-import-command.test.ts +0 -144
  490. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-status.test.ts +0 -635
  491. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-suspend.test.ts +0 -149
  492. package/pi.dev-src/pi-mono/coding-agent/test/keybindings-migration.test.ts +0 -88
  493. package/pi.dev-src/pi-mono/coding-agent/test/model-registry.test.ts +0 -1209
  494. package/pi.dev-src/pi-mono/coding-agent/test/model-resolver.test.ts +0 -436
  495. package/pi.dev-src/pi-mono/coding-agent/test/package-command-paths.test.ts +0 -144
  496. package/pi.dev-src/pi-mono/coding-agent/test/package-manager-ssh.test.ts +0 -97
  497. package/pi.dev-src/pi-mono/coding-agent/test/package-manager.test.ts +0 -1795
  498. package/pi.dev-src/pi-mono/coding-agent/test/path-utils.test.ts +0 -162
  499. package/pi.dev-src/pi-mono/coding-agent/test/plan-mode-utils.test.ts +0 -261
  500. package/pi.dev-src/pi-mono/coding-agent/test/print-mode.test.ts +0 -140
  501. package/pi.dev-src/pi-mono/coding-agent/test/prompt-templates.test.ts +0 -515
  502. package/pi.dev-src/pi-mono/coding-agent/test/resource-loader.test.ts +0 -576
  503. package/pi.dev-src/pi-mono/coding-agent/test/rpc-client-clone.test.ts +0 -29
  504. package/pi.dev-src/pi-mono/coding-agent/test/rpc-example.ts +0 -86
  505. package/pi.dev-src/pi-mono/coding-agent/test/rpc-jsonl.test.ts +0 -65
  506. package/pi.dev-src/pi-mono/coding-agent/test/rpc-prompt-response-semantics.test.ts +0 -285
  507. package/pi.dev-src/pi-mono/coding-agent/test/rpc.test.ts +0 -321
  508. package/pi.dev-src/pi-mono/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts +0 -364
  509. package/pi.dev-src/pi-mono/coding-agent/test/sdk-openrouter-attribution.test.ts +0 -181
  510. package/pi.dev-src/pi-mono/coding-agent/test/sdk-session-manager.test.ts +0 -95
  511. package/pi.dev-src/pi-mono/coding-agent/test/sdk-skills.test.ts +0 -109
  512. package/pi.dev-src/pi-mono/coding-agent/test/session-cwd.test.ts +0 -91
  513. package/pi.dev-src/pi-mono/coding-agent/test/session-info-modified-timestamp.test.ts +0 -83
  514. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/build-context.test.ts +0 -268
  515. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/custom-session-id.test.ts +0 -109
  516. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/file-operations.test.ts +0 -208
  517. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/labels.test.ts +0 -198
  518. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/migration.test.ts +0 -78
  519. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/save-entry.test.ts +0 -55
  520. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/tree-traversal.test.ts +0 -533
  521. package/pi.dev-src/pi-mono/coding-agent/test/session-selector-path-delete.test.ts +0 -315
  522. package/pi.dev-src/pi-mono/coding-agent/test/session-selector-rename.test.ts +0 -111
  523. package/pi.dev-src/pi-mono/coding-agent/test/session-selector-search.test.ts +0 -195
  524. package/pi.dev-src/pi-mono/coding-agent/test/settings-manager-bug.test.ts +0 -147
  525. package/pi.dev-src/pi-mono/coding-agent/test/settings-manager.test.ts +0 -319
  526. package/pi.dev-src/pi-mono/coding-agent/test/skills.test.ts +0 -432
  527. package/pi.dev-src/pi-mono/coding-agent/test/stdout-cleanliness.test.ts +0 -103
  528. package/pi.dev-src/pi-mono/coding-agent/test/streaming-render-debug.ts +0 -97
  529. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-bash-persistence.test.ts +0 -242
  530. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-compaction.test.ts +0 -343
  531. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-model-extension.test.ts +0 -325
  532. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-prompt.test.ts +0 -323
  533. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-queue.test.ts +0 -422
  534. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-retry-events.test.ts +0 -358
  535. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-runtime.test.ts +0 -553
  536. package/pi.dev-src/pi-mono/coding-agent/test/suite/harness.ts +0 -208
  537. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts +0 -80
  538. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts +0 -100
  539. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2781-skill-collision-precedence.test.ts +0 -120
  540. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts +0 -106
  541. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts +0 -94
  542. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts +0 -274
  543. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts +0 -104
  544. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts +0 -72
  545. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts +0 -83
  546. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts +0 -33
  547. package/pi.dev-src/pi-mono/coding-agent/test/system-prompt.test.ts +0 -102
  548. package/pi.dev-src/pi-mono/coding-agent/test/test-harness.test.ts +0 -321
  549. package/pi.dev-src/pi-mono/coding-agent/test/test-harness.ts +0 -446
  550. package/pi.dev-src/pi-mono/coding-agent/test/test-theme-colors.ts +0 -246
  551. package/pi.dev-src/pi-mono/coding-agent/test/theme-export.test.ts +0 -104
  552. package/pi.dev-src/pi-mono/coding-agent/test/tool-execution-component.test.ts +0 -331
  553. package/pi.dev-src/pi-mono/coding-agent/test/tools.test.ts +0 -889
  554. package/pi.dev-src/pi-mono/coding-agent/test/tree-selector.test.ts +0 -655
  555. package/pi.dev-src/pi-mono/coding-agent/test/trigger-compact-extension.test.ts +0 -57
  556. package/pi.dev-src/pi-mono/coding-agent/test/truncate-to-width.test.ts +0 -81
  557. package/pi.dev-src/pi-mono/coding-agent/test/user-message.test.ts +0 -25
  558. package/pi.dev-src/pi-mono/coding-agent/test/utilities.ts +0 -316
  559. package/pi.dev-src/pi-mono/coding-agent/tsconfig.examples.json +0 -16
  560. package/pi.dev-src/pi-mono/coding-agent/vitest.config.ts +0 -26
  561. package/pi.dev-src/pi-mono/mom/dev.sh +0 -30
  562. package/pi.dev-src/pi-mono/mom/docker.sh +0 -95
  563. package/pi.dev-src/pi-mono/mom/scripts/migrate-timestamps.ts +0 -121
  564. package/pi.dev-src/pi-mono/mom/src/agent.ts +0 -882
  565. package/pi.dev-src/pi-mono/mom/src/context.ts +0 -180
  566. package/pi.dev-src/pi-mono/mom/src/download.ts +0 -117
  567. package/pi.dev-src/pi-mono/mom/src/events.ts +0 -442
  568. package/pi.dev-src/pi-mono/mom/src/fs-watch.ts +0 -30
  569. package/pi.dev-src/pi-mono/mom/src/log.ts +0 -271
  570. package/pi.dev-src/pi-mono/mom/src/main.ts +0 -367
  571. package/pi.dev-src/pi-mono/mom/src/sandbox.ts +0 -221
  572. package/pi.dev-src/pi-mono/mom/src/slack.ts +0 -623
  573. package/pi.dev-src/pi-mono/mom/src/store.ts +0 -234
  574. package/pi.dev-src/pi-mono/mom/src/tools/attach.ts +0 -47
  575. package/pi.dev-src/pi-mono/mom/src/tools/bash.ts +0 -97
  576. package/pi.dev-src/pi-mono/mom/src/tools/edit.ts +0 -165
  577. package/pi.dev-src/pi-mono/mom/src/tools/index.ts +0 -19
  578. package/pi.dev-src/pi-mono/mom/src/tools/read.ts +0 -159
  579. package/pi.dev-src/pi-mono/mom/src/tools/truncate.ts +0 -236
  580. package/pi.dev-src/pi-mono/mom/src/tools/write.ts +0 -45
  581. package/pi.dev-src/pi-mono/mom/test/events.test.ts +0 -50
  582. package/pi.dev-src/pi-mono/pods/scripts/model_run.sh +0 -83
  583. package/pi.dev-src/pi-mono/pods/scripts/pod_setup.sh +0 -336
  584. package/pi.dev-src/pi-mono/pods/src/cli.ts +0 -360
  585. package/pi.dev-src/pi-mono/pods/src/commands/models.ts +0 -753
  586. package/pi.dev-src/pi-mono/pods/src/commands/pods.ts +0 -205
  587. package/pi.dev-src/pi-mono/pods/src/commands/prompt.ts +0 -84
  588. package/pi.dev-src/pi-mono/pods/src/config.ts +0 -80
  589. package/pi.dev-src/pi-mono/pods/src/index.ts +0 -2
  590. package/pi.dev-src/pi-mono/pods/src/model-configs.ts +0 -111
  591. package/pi.dev-src/pi-mono/pods/src/models.json +0 -295
  592. package/pi.dev-src/pi-mono/pods/src/ssh.ts +0 -151
  593. package/pi.dev-src/pi-mono/pods/src/types.ts +0 -27
  594. package/pi.dev-src/pi-mono/tui/src/autocomplete.ts +0 -783
  595. package/pi.dev-src/pi-mono/tui/src/components/box.ts +0 -137
  596. package/pi.dev-src/pi-mono/tui/src/components/cancellable-loader.ts +0 -40
  597. package/pi.dev-src/pi-mono/tui/src/components/editor.ts +0 -2280
  598. package/pi.dev-src/pi-mono/tui/src/components/image.ts +0 -104
  599. package/pi.dev-src/pi-mono/tui/src/components/input.ts +0 -503
  600. package/pi.dev-src/pi-mono/tui/src/components/loader.ts +0 -86
  601. package/pi.dev-src/pi-mono/tui/src/components/markdown.ts +0 -852
  602. package/pi.dev-src/pi-mono/tui/src/components/select-list.ts +0 -229
  603. package/pi.dev-src/pi-mono/tui/src/components/settings-list.ts +0 -250
  604. package/pi.dev-src/pi-mono/tui/src/components/spacer.ts +0 -28
  605. package/pi.dev-src/pi-mono/tui/src/components/text.ts +0 -106
  606. package/pi.dev-src/pi-mono/tui/src/components/truncated-text.ts +0 -65
  607. package/pi.dev-src/pi-mono/tui/src/editor-component.ts +0 -74
  608. package/pi.dev-src/pi-mono/tui/src/fuzzy.ts +0 -133
  609. package/pi.dev-src/pi-mono/tui/src/index.ts +0 -106
  610. package/pi.dev-src/pi-mono/tui/src/keybindings.ts +0 -244
  611. package/pi.dev-src/pi-mono/tui/src/keys.ts +0 -1400
  612. package/pi.dev-src/pi-mono/tui/src/kill-ring.ts +0 -46
  613. package/pi.dev-src/pi-mono/tui/src/stdin-buffer.ts +0 -386
  614. package/pi.dev-src/pi-mono/tui/src/terminal-image.ts +0 -414
  615. package/pi.dev-src/pi-mono/tui/src/terminal.ts +0 -373
  616. package/pi.dev-src/pi-mono/tui/src/tui.ts +0 -1243
  617. package/pi.dev-src/pi-mono/tui/src/undo-stack.ts +0 -28
  618. package/pi.dev-src/pi-mono/tui/src/utils.ts +0 -1085
  619. package/pi.dev-src/pi-mono/tui/test/autocomplete.test.ts +0 -542
  620. package/pi.dev-src/pi-mono/tui/test/bug-regression-isimageline-startswith-bug.test.ts +0 -237
  621. package/pi.dev-src/pi-mono/tui/test/chat-simple.ts +0 -129
  622. package/pi.dev-src/pi-mono/tui/test/editor.test.ts +0 -3812
  623. package/pi.dev-src/pi-mono/tui/test/fuzzy.test.ts +0 -98
  624. package/pi.dev-src/pi-mono/tui/test/image-test.ts +0 -56
  625. package/pi.dev-src/pi-mono/tui/test/input.test.ts +0 -580
  626. package/pi.dev-src/pi-mono/tui/test/key-tester.ts +0 -105
  627. package/pi.dev-src/pi-mono/tui/test/keybindings.test.ts +0 -38
  628. package/pi.dev-src/pi-mono/tui/test/keys.test.ts +0 -614
  629. package/pi.dev-src/pi-mono/tui/test/markdown.test.ts +0 -1236
  630. package/pi.dev-src/pi-mono/tui/test/overlay-non-capturing.test.ts +0 -609
  631. package/pi.dev-src/pi-mono/tui/test/overlay-options.test.ts +0 -538
  632. package/pi.dev-src/pi-mono/tui/test/overlay-short-content.test.ts +0 -56
  633. package/pi.dev-src/pi-mono/tui/test/regression-regional-indicator-width.test.ts +0 -52
  634. package/pi.dev-src/pi-mono/tui/test/select-list.test.ts +0 -116
  635. package/pi.dev-src/pi-mono/tui/test/stdin-buffer.test.ts +0 -422
  636. package/pi.dev-src/pi-mono/tui/test/terminal-image.test.ts +0 -279
  637. package/pi.dev-src/pi-mono/tui/test/test-themes.ts +0 -38
  638. package/pi.dev-src/pi-mono/tui/test/truncate-to-width.test.ts +0 -62
  639. package/pi.dev-src/pi-mono/tui/test/truncated-text.test.ts +0 -129
  640. package/pi.dev-src/pi-mono/tui/test/tui-cell-size-input.test.ts +0 -81
  641. package/pi.dev-src/pi-mono/tui/test/tui-overlay-style-leak.test.ts +0 -72
  642. package/pi.dev-src/pi-mono/tui/test/tui-render.test.ts +0 -509
  643. package/pi.dev-src/pi-mono/tui/test/viewport-overwrite-repro.ts +0 -106
  644. package/pi.dev-src/pi-mono/tui/test/virtual-terminal.ts +0 -218
  645. package/pi.dev-src/pi-mono/tui/test/wrap-ansi.test.ts +0 -207
  646. package/pi.dev-src/pi-mono/tui/vitest.config.ts +0 -7
  647. package/pi.dev-src/pi-mono/web-ui/example/index.html +0 -13
  648. package/pi.dev-src/pi-mono/web-ui/example/src/app.css +0 -1
  649. package/pi.dev-src/pi-mono/web-ui/example/src/custom-messages.ts +0 -99
  650. package/pi.dev-src/pi-mono/web-ui/example/src/main.ts +0 -421
  651. package/pi.dev-src/pi-mono/web-ui/example/tsconfig.json +0 -23
  652. package/pi.dev-src/pi-mono/web-ui/example/vite.config.ts +0 -6
  653. package/pi.dev-src/pi-mono/web-ui/scripts/count-prompt-tokens.ts +0 -88
  654. package/pi.dev-src/pi-mono/web-ui/src/ChatPanel.ts +0 -209
  655. package/pi.dev-src/pi-mono/web-ui/src/app.css +0 -68
  656. package/pi.dev-src/pi-mono/web-ui/src/components/AgentInterface.ts +0 -403
  657. package/pi.dev-src/pi-mono/web-ui/src/components/AttachmentTile.ts +0 -107
  658. package/pi.dev-src/pi-mono/web-ui/src/components/ConsoleBlock.ts +0 -72
  659. package/pi.dev-src/pi-mono/web-ui/src/components/CustomProviderCard.ts +0 -100
  660. package/pi.dev-src/pi-mono/web-ui/src/components/ExpandableSection.ts +0 -46
  661. package/pi.dev-src/pi-mono/web-ui/src/components/Input.ts +0 -113
  662. package/pi.dev-src/pi-mono/web-ui/src/components/MessageEditor.ts +0 -405
  663. package/pi.dev-src/pi-mono/web-ui/src/components/MessageList.ts +0 -98
  664. package/pi.dev-src/pi-mono/web-ui/src/components/Messages.ts +0 -383
  665. package/pi.dev-src/pi-mono/web-ui/src/components/ProviderKeyInput.ts +0 -153
  666. package/pi.dev-src/pi-mono/web-ui/src/components/SandboxedIframe.ts +0 -626
  667. package/pi.dev-src/pi-mono/web-ui/src/components/StreamingMessageContainer.ts +0 -103
  668. package/pi.dev-src/pi-mono/web-ui/src/components/ThinkingBlock.ts +0 -43
  669. package/pi.dev-src/pi-mono/web-ui/src/components/message-renderer-registry.ts +0 -28
  670. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts +0 -220
  671. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/AttachmentsRuntimeProvider.ts +0 -66
  672. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +0 -186
  673. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/FileDownloadRuntimeProvider.ts +0 -110
  674. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageBridge.ts +0 -82
  675. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageRouter.ts +0 -216
  676. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/SandboxRuntimeProvider.ts +0 -52
  677. package/pi.dev-src/pi-mono/web-ui/src/dialogs/ApiKeyPromptDialog.ts +0 -75
  678. package/pi.dev-src/pi-mono/web-ui/src/dialogs/AttachmentOverlay.ts +0 -636
  679. package/pi.dev-src/pi-mono/web-ui/src/dialogs/CustomProviderDialog.ts +0 -274
  680. package/pi.dev-src/pi-mono/web-ui/src/dialogs/ModelSelector.ts +0 -370
  681. package/pi.dev-src/pi-mono/web-ui/src/dialogs/PersistentStorageDialog.ts +0 -144
  682. package/pi.dev-src/pi-mono/web-ui/src/dialogs/ProvidersModelsTab.ts +0 -212
  683. package/pi.dev-src/pi-mono/web-ui/src/dialogs/SessionListDialog.ts +0 -150
  684. package/pi.dev-src/pi-mono/web-ui/src/dialogs/SettingsDialog.ts +0 -218
  685. package/pi.dev-src/pi-mono/web-ui/src/index.ts +0 -120
  686. package/pi.dev-src/pi-mono/web-ui/src/prompts/prompts.ts +0 -282
  687. package/pi.dev-src/pi-mono/web-ui/src/storage/app-storage.ts +0 -60
  688. package/pi.dev-src/pi-mono/web-ui/src/storage/backends/indexeddb-storage-backend.ts +0 -193
  689. package/pi.dev-src/pi-mono/web-ui/src/storage/store.ts +0 -33
  690. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/custom-providers-store.ts +0 -62
  691. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/provider-keys-store.ts +0 -33
  692. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/sessions-store.ts +0 -136
  693. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/settings-store.ts +0 -34
  694. package/pi.dev-src/pi-mono/web-ui/src/storage/types.ts +0 -206
  695. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactElement.ts +0 -14
  696. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactPill.ts +0 -26
  697. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/Console.ts +0 -93
  698. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/DocxArtifact.ts +0 -213
  699. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ExcelArtifact.ts +0 -231
  700. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/GenericArtifact.ts +0 -117
  701. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/HtmlArtifact.ts +0 -195
  702. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ImageArtifact.ts +0 -116
  703. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/MarkdownArtifact.ts +0 -82
  704. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/PdfArtifact.ts +0 -201
  705. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/SvgArtifact.ts +0 -119
  706. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/TextArtifact.ts +0 -148
  707. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts +0 -310
  708. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts.ts +0 -713
  709. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/index.ts +0 -7
  710. package/pi.dev-src/pi-mono/web-ui/src/tools/extract-document.ts +0 -275
  711. package/pi.dev-src/pi-mono/web-ui/src/tools/index.ts +0 -46
  712. package/pi.dev-src/pi-mono/web-ui/src/tools/javascript-repl.ts +0 -293
  713. package/pi.dev-src/pi-mono/web-ui/src/tools/renderer-registry.ts +0 -130
  714. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/BashRenderer.ts +0 -52
  715. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/CalculateRenderer.ts +0 -58
  716. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/DefaultRenderer.ts +0 -103
  717. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts +0 -92
  718. package/pi.dev-src/pi-mono/web-ui/src/tools/types.ts +0 -15
  719. package/pi.dev-src/pi-mono/web-ui/src/utils/attachment-utils.ts +0 -472
  720. package/pi.dev-src/pi-mono/web-ui/src/utils/auth-token.ts +0 -22
  721. package/pi.dev-src/pi-mono/web-ui/src/utils/format.ts +0 -42
  722. package/pi.dev-src/pi-mono/web-ui/src/utils/i18n.ts +0 -653
  723. package/pi.dev-src/pi-mono/web-ui/src/utils/model-discovery.ts +0 -277
  724. package/pi.dev-src/pi-mono/web-ui/src/utils/proxy-utils.ts +0 -139
  725. package/pi.dev-src/pi-mono/web-ui/src/utils/test-sessions.ts +0 -2357
  726. package/pi.dev-src/pi-mono/web-ui/tsconfig.json +0 -7
  727. package/tests/attended-results-scenarios.ts +0 -648
  728. package/tests/attended-results.test.ts +0 -39
  729. package/tests/cli-command-option-parity.test.ts +0 -798
  730. package/tests/debug-extension-harness.test.ts +0 -466
  731. package/tests/extension-registration.test.ts +0 -6785
  732. package/tests/fixtures/fixture_c.c +0 -361
  733. package/tests/fixtures/fixture_cpp.cpp +0 -407
  734. package/tests/fixtures/fixture_csharp.cs +0 -411
  735. package/tests/fixtures/fixture_elixir.ex +0 -409
  736. package/tests/fixtures/fixture_go.go +0 -341
  737. package/tests/fixtures/fixture_haskell.hs +0 -250
  738. package/tests/fixtures/fixture_java.java +0 -430
  739. package/tests/fixtures/fixture_javascript.js +0 -383
  740. package/tests/fixtures/fixture_kotlin.kt +0 -451
  741. package/tests/fixtures/fixture_lua.lua +0 -276
  742. package/tests/fixtures/fixture_perl.pl +0 -310
  743. package/tests/fixtures/fixture_php.php +0 -433
  744. package/tests/fixtures/fixture_python.py +0 -502
  745. package/tests/fixtures/fixture_ruby.rb +0 -345
  746. package/tests/fixtures/fixture_rust.rs +0 -380
  747. package/tests/fixtures/fixture_scala.scala +0 -398
  748. package/tests/fixtures/fixture_shell.sh +0 -276
  749. package/tests/fixtures/fixture_swift.swift +0 -397
  750. package/tests/fixtures/fixture_typescript.ts +0 -434
  751. package/tests/fixtures/fixture_zig.zig +0 -295
  752. package/tests/fixtures_attended_results/project/compress-line-numbers.json +0 -5
  753. package/tests/fixtures_attended_results/project/compress.json +0 -5
  754. package/tests/fixtures_attended_results/project/enable-static-check-invalid-command.json +0 -5
  755. package/tests/fixtures_attended_results/project/enable-static-check-valid.json +0 -5
  756. package/tests/fixtures_attended_results/project/files-static-check.json +0 -5
  757. package/tests/fixtures_attended_results/project/find-line-numbers.json +0 -5
  758. package/tests/fixtures_attended_results/project/find.json +0 -5
  759. package/tests/fixtures_attended_results/project/get-base-path.json +0 -5
  760. package/tests/fixtures_attended_results/project/git-check-clean.json +0 -5
  761. package/tests/fixtures_attended_results/project/git-check-dirty.json +0 -5
  762. package/tests/fixtures_attended_results/project/git-path.json +0 -5
  763. package/tests/fixtures_attended_results/project/git-wt-create-invalid.json +0 -5
  764. package/tests/fixtures_attended_results/project/git-wt-create-valid.json +0 -5
  765. package/tests/fixtures_attended_results/project/git-wt-delete-nonexistent.json +0 -5
  766. package/tests/fixtures_attended_results/project/git-wt-delete-valid.json +0 -5
  767. package/tests/fixtures_attended_results/project/git-wt-name.json +0 -5
  768. package/tests/fixtures_attended_results/project/static-check.json +0 -5
  769. package/tests/fixtures_attended_results/project/summarize.json +0 -5
  770. package/tests/fixtures_attended_results/project/tokens.json +0 -5
  771. package/tests/fixtures_attended_results/standalone/files-compress/fixture_c.c.json +0 -5
  772. package/tests/fixtures_attended_results/standalone/files-compress/fixture_cpp.cpp.json +0 -5
  773. package/tests/fixtures_attended_results/standalone/files-compress/fixture_csharp.cs.json +0 -5
  774. package/tests/fixtures_attended_results/standalone/files-compress/fixture_elixir.ex.json +0 -5
  775. package/tests/fixtures_attended_results/standalone/files-compress/fixture_go.go.json +0 -5
  776. package/tests/fixtures_attended_results/standalone/files-compress/fixture_haskell.hs.json +0 -5
  777. package/tests/fixtures_attended_results/standalone/files-compress/fixture_java.java.json +0 -5
  778. package/tests/fixtures_attended_results/standalone/files-compress/fixture_javascript.js.json +0 -5
  779. package/tests/fixtures_attended_results/standalone/files-compress/fixture_kotlin.kt.json +0 -5
  780. package/tests/fixtures_attended_results/standalone/files-compress/fixture_lua.lua.json +0 -5
  781. package/tests/fixtures_attended_results/standalone/files-compress/fixture_perl.pl.json +0 -5
  782. package/tests/fixtures_attended_results/standalone/files-compress/fixture_php.php.json +0 -5
  783. package/tests/fixtures_attended_results/standalone/files-compress/fixture_python.py.json +0 -5
  784. package/tests/fixtures_attended_results/standalone/files-compress/fixture_ruby.rb.json +0 -5
  785. package/tests/fixtures_attended_results/standalone/files-compress/fixture_rust.rs.json +0 -5
  786. package/tests/fixtures_attended_results/standalone/files-compress/fixture_scala.scala.json +0 -5
  787. package/tests/fixtures_attended_results/standalone/files-compress/fixture_shell.sh.json +0 -5
  788. package/tests/fixtures_attended_results/standalone/files-compress/fixture_swift.swift.json +0 -5
  789. package/tests/fixtures_attended_results/standalone/files-compress/fixture_typescript.ts.json +0 -5
  790. package/tests/fixtures_attended_results/standalone/files-compress/fixture_zig.zig.json +0 -5
  791. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_c.c.json +0 -5
  792. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_cpp.cpp.json +0 -5
  793. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_csharp.cs.json +0 -5
  794. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_elixir.ex.json +0 -5
  795. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_go.go.json +0 -5
  796. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_haskell.hs.json +0 -5
  797. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_java.java.json +0 -5
  798. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_javascript.js.json +0 -5
  799. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_kotlin.kt.json +0 -5
  800. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_lua.lua.json +0 -5
  801. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_perl.pl.json +0 -5
  802. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_php.php.json +0 -5
  803. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_python.py.json +0 -5
  804. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_ruby.rb.json +0 -5
  805. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_rust.rs.json +0 -5
  806. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_scala.scala.json +0 -5
  807. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_shell.sh.json +0 -5
  808. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_swift.swift.json +0 -5
  809. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_typescript.ts.json +0 -5
  810. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_zig.zig.json +0 -5
  811. package/tests/fixtures_attended_results/standalone/files-find/fixture_c.c.json +0 -5
  812. package/tests/fixtures_attended_results/standalone/files-find/fixture_cpp.cpp.json +0 -5
  813. package/tests/fixtures_attended_results/standalone/files-find/fixture_csharp.cs.json +0 -5
  814. package/tests/fixtures_attended_results/standalone/files-find/fixture_elixir.ex.json +0 -5
  815. package/tests/fixtures_attended_results/standalone/files-find/fixture_go.go.json +0 -5
  816. package/tests/fixtures_attended_results/standalone/files-find/fixture_haskell.hs.json +0 -5
  817. package/tests/fixtures_attended_results/standalone/files-find/fixture_java.java.json +0 -5
  818. package/tests/fixtures_attended_results/standalone/files-find/fixture_javascript.js.json +0 -5
  819. package/tests/fixtures_attended_results/standalone/files-find/fixture_kotlin.kt.json +0 -5
  820. package/tests/fixtures_attended_results/standalone/files-find/fixture_lua.lua.json +0 -5
  821. package/tests/fixtures_attended_results/standalone/files-find/fixture_perl.pl.json +0 -5
  822. package/tests/fixtures_attended_results/standalone/files-find/fixture_php.php.json +0 -5
  823. package/tests/fixtures_attended_results/standalone/files-find/fixture_python.py.json +0 -5
  824. package/tests/fixtures_attended_results/standalone/files-find/fixture_ruby.rb.json +0 -5
  825. package/tests/fixtures_attended_results/standalone/files-find/fixture_rust.rs.json +0 -5
  826. package/tests/fixtures_attended_results/standalone/files-find/fixture_scala.scala.json +0 -5
  827. package/tests/fixtures_attended_results/standalone/files-find/fixture_shell.sh.json +0 -5
  828. package/tests/fixtures_attended_results/standalone/files-find/fixture_swift.swift.json +0 -5
  829. package/tests/fixtures_attended_results/standalone/files-find/fixture_typescript.ts.json +0 -5
  830. package/tests/fixtures_attended_results/standalone/files-find/fixture_zig.zig.json +0 -5
  831. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_c.c.json +0 -5
  832. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_cpp.cpp.json +0 -5
  833. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_csharp.cs.json +0 -5
  834. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_elixir.ex.json +0 -5
  835. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_go.go.json +0 -5
  836. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_haskell.hs.json +0 -5
  837. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_java.java.json +0 -5
  838. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_javascript.js.json +0 -5
  839. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_kotlin.kt.json +0 -5
  840. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_lua.lua.json +0 -5
  841. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_perl.pl.json +0 -5
  842. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_php.php.json +0 -5
  843. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_python.py.json +0 -5
  844. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_ruby.rb.json +0 -5
  845. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_rust.rs.json +0 -5
  846. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_scala.scala.json +0 -5
  847. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_shell.sh.json +0 -5
  848. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_swift.swift.json +0 -5
  849. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_typescript.ts.json +0 -5
  850. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_zig.zig.json +0 -5
  851. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_c.c.json +0 -5
  852. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_cpp.cpp.json +0 -5
  853. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_csharp.cs.json +0 -5
  854. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_elixir.ex.json +0 -5
  855. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_go.go.json +0 -5
  856. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_haskell.hs.json +0 -5
  857. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_java.java.json +0 -5
  858. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_javascript.js.json +0 -5
  859. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_kotlin.kt.json +0 -5
  860. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_lua.lua.json +0 -5
  861. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_perl.pl.json +0 -5
  862. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_php.php.json +0 -5
  863. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_python.py.json +0 -5
  864. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_ruby.rb.json +0 -5
  865. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_rust.rs.json +0 -5
  866. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_scala.scala.json +0 -5
  867. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_shell.sh.json +0 -5
  868. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_swift.swift.json +0 -5
  869. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_typescript.ts.json +0 -5
  870. package/tests/fixtures_attended_results/standalone/files-summarize/fixture_zig.zig.json +0 -5
  871. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_c.c.json +0 -5
  872. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_cpp.cpp.json +0 -5
  873. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_csharp.cs.json +0 -5
  874. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_elixir.ex.json +0 -5
  875. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_go.go.json +0 -5
  876. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_haskell.hs.json +0 -5
  877. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_java.java.json +0 -5
  878. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_javascript.js.json +0 -5
  879. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_kotlin.kt.json +0 -5
  880. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_lua.lua.json +0 -5
  881. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_perl.pl.json +0 -5
  882. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_php.php.json +0 -5
  883. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_python.py.json +0 -5
  884. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_ruby.rb.json +0 -5
  885. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_rust.rs.json +0 -5
  886. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_scala.scala.json +0 -5
  887. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_shell.sh.json +0 -5
  888. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_swift.swift.json +0 -5
  889. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_typescript.ts.json +0 -5
  890. package/tests/fixtures_attended_results/standalone/files-tokens/fixture_zig.zig.json +0 -5
  891. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_c.c.json +0 -5
  892. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_cpp.cpp.json +0 -5
  893. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_csharp.cs.json +0 -5
  894. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_elixir.ex.json +0 -5
  895. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_go.go.json +0 -5
  896. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_haskell.hs.json +0 -5
  897. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_java.java.json +0 -5
  898. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_javascript.js.json +0 -5
  899. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_kotlin.kt.json +0 -5
  900. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_lua.lua.json +0 -5
  901. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_perl.pl.json +0 -5
  902. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_php.php.json +0 -5
  903. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_python.py.json +0 -5
  904. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_ruby.rb.json +0 -5
  905. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_rust.rs.json +0 -5
  906. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_scala.scala.json +0 -5
  907. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_shell.sh.json +0 -5
  908. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_swift.swift.json +0 -5
  909. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_typescript.ts.json +0 -5
  910. package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_zig.zig.json +0 -5
  911. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_c.c.json +0 -5
  912. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_cpp.cpp.json +0 -5
  913. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_csharp.cs.json +0 -5
  914. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_elixir.ex.json +0 -5
  915. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_go.go.json +0 -5
  916. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_haskell.hs.json +0 -5
  917. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_java.java.json +0 -5
  918. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_javascript.js.json +0 -5
  919. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_kotlin.kt.json +0 -5
  920. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_lua.lua.json +0 -5
  921. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_perl.pl.json +0 -5
  922. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_php.php.json +0 -5
  923. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_python.py.json +0 -5
  924. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_ruby.rb.json +0 -5
  925. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_rust.rs.json +0 -5
  926. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_scala.scala.json +0 -5
  927. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_shell.sh.json +0 -5
  928. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_swift.swift.json +0 -5
  929. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_typescript.ts.json +0 -5
  930. package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_zig.zig.json +0 -5
  931. package/tests/helpers.ts +0 -236
  932. package/tests/oracle-project.test.ts +0 -67
  933. package/tests/oracle-standalone.test.ts +0 -68
  934. package/tests/prompt-command-summary.test.ts +0 -36
  935. package/tests/prompt-rendering.test.ts +0 -103
  936. package/tests/python_oracle_stubs/tiktoken.py +0 -76
  937. package/tests/release-workflow.test.ts +0 -195
  938. package/tests/static-check-bundled.test.ts +0 -332
@@ -1,1236 +0,0 @@
1
- import assert from "node:assert";
2
- import { afterEach, describe, it } from "node:test";
3
- import type { Terminal as XtermTerminalType } from "@xterm/headless";
4
- import { Chalk } from "chalk";
5
- import { Markdown } from "../src/components/markdown.js";
6
- import { resetCapabilitiesCache, setCapabilities } from "../src/terminal-image.js";
7
- import { type Component, TUI } from "../src/tui.js";
8
- import { defaultMarkdownTheme } from "./test-themes.js";
9
- import { VirtualTerminal } from "./virtual-terminal.js";
10
-
11
- // Force full color in CI so ANSI assertions are deterministic
12
- const chalk = new Chalk({ level: 3 });
13
-
14
- function getCellItalic(terminal: VirtualTerminal, row: number, col: number): number {
15
- const xterm = (terminal as unknown as { xterm: XtermTerminalType }).xterm;
16
- const buffer = xterm.buffer.active;
17
- const line = buffer.getLine(buffer.viewportY + row);
18
- assert.ok(line, `Missing buffer line at row ${row}`);
19
- const cell = line.getCell(col);
20
- assert.ok(cell, `Missing cell at row ${row} col ${col}`);
21
- return cell.isItalic();
22
- }
23
-
24
- function getCellUnderline(terminal: VirtualTerminal, row: number, col: number): number {
25
- const xterm = (terminal as unknown as { xterm: XtermTerminalType }).xterm;
26
- const buffer = xterm.buffer.active;
27
- const line = buffer.getLine(buffer.viewportY + row);
28
- assert.ok(line, `Missing buffer line at row ${row}`);
29
- const cell = line.getCell(col);
30
- assert.ok(cell, `Missing cell at row ${row} col ${col}`);
31
- return cell.isUnderline();
32
- }
33
-
34
- describe("Markdown component", () => {
35
- describe("Nested lists", () => {
36
- it("should render simple nested list", () => {
37
- const markdown = new Markdown(
38
- `- Item 1
39
- - Nested 1.1
40
- - Nested 1.2
41
- - Item 2`,
42
- 0,
43
- 0,
44
- defaultMarkdownTheme,
45
- );
46
-
47
- const lines = markdown.render(80);
48
-
49
- // Check that we have content
50
- assert.ok(lines.length > 0);
51
-
52
- // Strip ANSI codes for checking
53
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
54
-
55
- // Check structure
56
- assert.ok(plainLines.some((line) => line.includes("- Item 1")));
57
- assert.ok(plainLines.some((line) => line.includes(" - Nested 1.1")));
58
- assert.ok(plainLines.some((line) => line.includes(" - Nested 1.2")));
59
- assert.ok(plainLines.some((line) => line.includes("- Item 2")));
60
- });
61
-
62
- it("should render deeply nested list", () => {
63
- const markdown = new Markdown(
64
- `- Level 1
65
- - Level 2
66
- - Level 3
67
- - Level 4`,
68
- 0,
69
- 0,
70
- defaultMarkdownTheme,
71
- );
72
-
73
- const lines = markdown.render(80);
74
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
75
-
76
- // Check proper indentation
77
- assert.ok(plainLines.some((line) => line.includes("- Level 1")));
78
- assert.ok(plainLines.some((line) => line.includes(" - Level 2")));
79
- assert.ok(plainLines.some((line) => line.includes(" - Level 3")));
80
- assert.ok(plainLines.some((line) => line.includes(" - Level 4")));
81
- });
82
-
83
- it("should render ordered nested list", () => {
84
- const markdown = new Markdown(
85
- `1. First
86
- 1. Nested first
87
- 2. Nested second
88
- 2. Second`,
89
- 0,
90
- 0,
91
- defaultMarkdownTheme,
92
- );
93
-
94
- const lines = markdown.render(80);
95
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
96
-
97
- assert.ok(plainLines.some((line) => line.includes("1. First")));
98
- assert.ok(plainLines.some((line) => line.includes(" 1. Nested first")));
99
- assert.ok(plainLines.some((line) => line.includes(" 2. Nested second")));
100
- assert.ok(plainLines.some((line) => line.includes("2. Second")));
101
- });
102
-
103
- it("should render mixed ordered and unordered nested lists", () => {
104
- const markdown = new Markdown(
105
- `1. Ordered item
106
- - Unordered nested
107
- - Another nested
108
- 2. Second ordered
109
- - More nested`,
110
- 0,
111
- 0,
112
- defaultMarkdownTheme,
113
- );
114
-
115
- const lines = markdown.render(80);
116
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
117
-
118
- assert.ok(plainLines.some((line) => line.includes("1. Ordered item")));
119
- assert.ok(plainLines.some((line) => line.includes(" - Unordered nested")));
120
- assert.ok(plainLines.some((line) => line.includes("2. Second ordered")));
121
- });
122
-
123
- it("should maintain numbering when code blocks are not indented (LLM output)", () => {
124
- // When code blocks aren't indented, marked parses each item as a separate list.
125
- // We use token.start to preserve the original numbering.
126
- const markdown = new Markdown(
127
- `1. First item
128
-
129
- \`\`\`typescript
130
- // code block
131
- \`\`\`
132
-
133
- 2. Second item
134
-
135
- \`\`\`typescript
136
- // another code block
137
- \`\`\`
138
-
139
- 3. Third item`,
140
- 0,
141
- 0,
142
- defaultMarkdownTheme,
143
- );
144
-
145
- const lines = markdown.render(80);
146
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trim());
147
-
148
- // Find all lines that start with a number and period
149
- const numberedLines = plainLines.filter((line) => /^\d+\./.test(line));
150
-
151
- // Should have 3 numbered items
152
- assert.strictEqual(numberedLines.length, 3, `Expected 3 numbered items, got: ${numberedLines.join(", ")}`);
153
-
154
- // Check the actual numbers
155
- assert.ok(numberedLines[0].startsWith("1."), `First item should be "1.", got: ${numberedLines[0]}`);
156
- assert.ok(numberedLines[1].startsWith("2."), `Second item should be "2.", got: ${numberedLines[1]}`);
157
- assert.ok(numberedLines[2].startsWith("3."), `Third item should be "3.", got: ${numberedLines[2]}`);
158
- });
159
- });
160
-
161
- describe("Tables", () => {
162
- it("should render simple table", () => {
163
- const markdown = new Markdown(
164
- `| Name | Age |
165
- | --- | --- |
166
- | Alice | 30 |
167
- | Bob | 25 |`,
168
- 0,
169
- 0,
170
- defaultMarkdownTheme,
171
- );
172
-
173
- const lines = markdown.render(80);
174
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
175
-
176
- // Check table structure
177
- assert.ok(plainLines.some((line) => line.includes("Name")));
178
- assert.ok(plainLines.some((line) => line.includes("Age")));
179
- assert.ok(plainLines.some((line) => line.includes("Alice")));
180
- assert.ok(plainLines.some((line) => line.includes("Bob")));
181
- // Check for table borders
182
- assert.ok(plainLines.some((line) => line.includes("│")));
183
- assert.ok(plainLines.some((line) => line.includes("─")));
184
- });
185
-
186
- it("should render row dividers between data rows", () => {
187
- const markdown = new Markdown(
188
- `| Name | Age |
189
- | --- | --- |
190
- | Alice | 30 |
191
- | Bob | 25 |`,
192
- 0,
193
- 0,
194
- defaultMarkdownTheme,
195
- );
196
-
197
- const lines = markdown.render(80);
198
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
199
- const dividerLines = plainLines.filter((line) => line.includes("┼"));
200
-
201
- assert.strictEqual(dividerLines.length, 2, "Expected header + row divider");
202
- });
203
-
204
- it("should keep column width at least the longest word", () => {
205
- const longestWord = "superlongword";
206
- const markdown = new Markdown(
207
- `| Column One | Column Two |
208
- | --- | --- |
209
- | ${longestWord} short | otherword |
210
- | small | tiny |`,
211
- 0,
212
- 0,
213
- defaultMarkdownTheme,
214
- );
215
-
216
- const lines = markdown.render(32);
217
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
218
- const dataLine = plainLines.find((line) => line.includes(longestWord));
219
- assert.ok(dataLine, "Expected data row containing longest word");
220
-
221
- const segments = dataLine.split("│").slice(1, -1);
222
- const [firstSegment] = segments;
223
- assert.ok(firstSegment, "Expected first column segment");
224
- const firstColumnWidth = firstSegment.length - 2;
225
-
226
- assert.ok(
227
- firstColumnWidth >= longestWord.length,
228
- `Expected first column width >= ${longestWord.length}, got ${firstColumnWidth}`,
229
- );
230
- });
231
-
232
- it("should render table with alignment", () => {
233
- const markdown = new Markdown(
234
- `| Left | Center | Right |
235
- | :--- | :---: | ---: |
236
- | A | B | C |
237
- | Long text | Middle | End |`,
238
- 0,
239
- 0,
240
- defaultMarkdownTheme,
241
- );
242
-
243
- const lines = markdown.render(80);
244
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
245
-
246
- // Check headers
247
- assert.ok(plainLines.some((line) => line.includes("Left")));
248
- assert.ok(plainLines.some((line) => line.includes("Center")));
249
- assert.ok(plainLines.some((line) => line.includes("Right")));
250
- // Check content
251
- assert.ok(plainLines.some((line) => line.includes("Long text")));
252
- });
253
-
254
- it("should handle tables with varying column widths", () => {
255
- const markdown = new Markdown(
256
- `| Short | Very long column header |
257
- | --- | --- |
258
- | A | This is a much longer cell content |
259
- | B | Short |`,
260
- 0,
261
- 0,
262
- defaultMarkdownTheme,
263
- );
264
-
265
- const lines = markdown.render(80);
266
-
267
- // Should render without errors
268
- assert.ok(lines.length > 0);
269
-
270
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
271
- assert.ok(plainLines.some((line) => line.includes("Very long column header")));
272
- assert.ok(plainLines.some((line) => line.includes("This is a much longer cell content")));
273
- });
274
-
275
- it("should wrap table cells when table exceeds available width", () => {
276
- const markdown = new Markdown(
277
- `| Command | Description | Example |
278
- | --- | --- | --- |
279
- | npm install | Install all dependencies | npm install |
280
- | npm run build | Build the project | npm run build |`,
281
- 0,
282
- 0,
283
- defaultMarkdownTheme,
284
- );
285
-
286
- // Render at narrow width that forces wrapping
287
- const lines = markdown.render(50);
288
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
289
-
290
- // All lines should fit within width
291
- for (const line of plainLines) {
292
- assert.ok(line.length <= 50, `Line exceeds width 50: "${line}" (length: ${line.length})`);
293
- }
294
-
295
- // Content should still be present (possibly wrapped across lines)
296
- const allText = plainLines.join(" ");
297
- assert.ok(allText.includes("Command"), "Should contain 'Command'");
298
- assert.ok(allText.includes("Description"), "Should contain 'Description'");
299
- assert.ok(allText.includes("npm install"), "Should contain 'npm install'");
300
- assert.ok(allText.includes("Install"), "Should contain 'Install'");
301
- });
302
-
303
- it("should wrap long cell content to multiple lines", () => {
304
- const markdown = new Markdown(
305
- `| Header |
306
- | --- |
307
- | This is a very long cell content that should wrap |`,
308
- 0,
309
- 0,
310
- defaultMarkdownTheme,
311
- );
312
-
313
- // Render at width that forces the cell to wrap
314
- const lines = markdown.render(25);
315
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
316
-
317
- // Should have multiple data rows due to wrapping
318
- const dataRows = plainLines.filter((line) => line.startsWith("│") && !line.includes("─"));
319
- assert.ok(dataRows.length > 2, `Expected wrapped rows, got ${dataRows.length} rows`);
320
-
321
- // All content should be preserved (may be split across lines)
322
- const allText = plainLines.join(" ");
323
- assert.ok(allText.includes("very long"), "Should preserve 'very long'");
324
- assert.ok(allText.includes("cell content"), "Should preserve 'cell content'");
325
- assert.ok(allText.includes("should wrap"), "Should preserve 'should wrap'");
326
- });
327
-
328
- it("should wrap long unbroken tokens inside table cells (not only at line start)", () => {
329
- // Pin to no-hyperlinks so width checks work on plain text without OSC 8 sequences.
330
- setCapabilities({ images: null, trueColor: false, hyperlinks: false });
331
- const url = "https://example.com/this/is/a/very/long/url/that/should/wrap";
332
- const markdown = new Markdown(
333
- `| Value |
334
- | --- |
335
- | prefix ${url} |`,
336
- 0,
337
- 0,
338
- defaultMarkdownTheme,
339
- );
340
-
341
- const width = 30;
342
- const lines = markdown.render(width);
343
- resetCapabilitiesCache();
344
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
345
-
346
- for (const line of plainLines) {
347
- assert.ok(line.length <= width, `Line exceeds width ${width}: "${line}" (length: ${line.length})`);
348
- }
349
-
350
- // Borders should stay intact (exactly 2 vertical borders for a 1-col table)
351
- const tableLines = plainLines.filter((line) => line.startsWith("│"));
352
- assert.ok(tableLines.length > 0, "Expected table rows to render");
353
- for (const line of tableLines) {
354
- const borderCount = line.split("│").length - 1;
355
- assert.strictEqual(borderCount, 2, `Expected 2 borders, got ${borderCount}: "${line}"`);
356
- }
357
-
358
- // Strip box drawing characters + whitespace so we can assert the URL is preserved
359
- // even if it was split across multiple wrapped lines.
360
- const extracted = plainLines.join("").replace(/[│├┤─\s]/g, "");
361
- assert.ok(extracted.includes("prefix"), "Should preserve 'prefix'");
362
- assert.ok(extracted.includes(url), "Should preserve URL");
363
- });
364
-
365
- it("should wrap styled inline code inside table cells without breaking borders", () => {
366
- const markdown = new Markdown(
367
- `| Code |
368
- | --- |
369
- | \`averyveryveryverylongidentifier\` |`,
370
- 0,
371
- 0,
372
- defaultMarkdownTheme,
373
- );
374
-
375
- const width = 20;
376
- const lines = markdown.render(width);
377
- const joinedOutput = lines.join("\n");
378
- assert.ok(joinedOutput.includes("\x1b[33m"), "Inline code should be styled (yellow)");
379
-
380
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
381
- for (const line of plainLines) {
382
- assert.ok(line.length <= width, `Line exceeds width ${width}: "${line}" (length: ${line.length})`);
383
- }
384
-
385
- const tableLines = plainLines.filter((line) => line.startsWith("│"));
386
- for (const line of tableLines) {
387
- const borderCount = line.split("│").length - 1;
388
- assert.strictEqual(borderCount, 2, `Expected 2 borders, got ${borderCount}: "${line}"`);
389
- }
390
- });
391
-
392
- it("should handle extremely narrow width gracefully", () => {
393
- const markdown = new Markdown(
394
- `| A | B | C |
395
- | --- | --- | --- |
396
- | 1 | 2 | 3 |`,
397
- 0,
398
- 0,
399
- defaultMarkdownTheme,
400
- );
401
-
402
- // Very narrow width
403
- const lines = markdown.render(15);
404
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
405
-
406
- // Should not crash and should produce output
407
- assert.ok(lines.length > 0, "Should produce output");
408
-
409
- // Lines should not exceed width
410
- for (const line of plainLines) {
411
- assert.ok(line.length <= 15, `Line exceeds width 15: "${line}" (length: ${line.length})`);
412
- }
413
- });
414
-
415
- it("should render table correctly when it fits naturally", () => {
416
- const markdown = new Markdown(
417
- `| A | B |
418
- | --- | --- |
419
- | 1 | 2 |`,
420
- 0,
421
- 0,
422
- defaultMarkdownTheme,
423
- );
424
-
425
- // Wide width where table fits naturally
426
- const lines = markdown.render(80);
427
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
428
-
429
- // Should have proper table structure
430
- const headerLine = plainLines.find((line) => line.includes("A") && line.includes("B"));
431
- assert.ok(headerLine, "Should have header row");
432
- assert.ok(headerLine?.includes("│"), "Header should have borders");
433
-
434
- const separatorLine = plainLines.find((line) => line.includes("├") && line.includes("┼"));
435
- assert.ok(separatorLine, "Should have separator row");
436
-
437
- const dataLine = plainLines.find((line) => line.includes("1") && line.includes("2"));
438
- assert.ok(dataLine, "Should have data row");
439
- });
440
-
441
- it("should respect paddingX when calculating table width", () => {
442
- const markdown = new Markdown(
443
- `| Column One | Column Two |
444
- | --- | --- |
445
- | Data 1 | Data 2 |`,
446
- 2, // paddingX = 2
447
- 0,
448
- defaultMarkdownTheme,
449
- );
450
-
451
- // Width 40 with paddingX=2 means contentWidth=36
452
- const lines = markdown.render(40);
453
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
454
-
455
- // All lines should respect width
456
- for (const line of plainLines) {
457
- assert.ok(line.length <= 40, `Line exceeds width 40: "${line}" (length: ${line.length})`);
458
- }
459
-
460
- // Table rows should have left padding
461
- const tableRow = plainLines.find((line) => line.includes("│"));
462
- assert.ok(tableRow?.startsWith(" "), "Table should have left padding");
463
- });
464
-
465
- it("should not add a trailing blank line when table is the last rendered block", () => {
466
- const markdown = new Markdown(
467
- `| Name |
468
- | --- |
469
- | Alice |`,
470
- 0,
471
- 0,
472
- defaultMarkdownTheme,
473
- );
474
-
475
- const lines = markdown.render(80);
476
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
477
-
478
- assert.notStrictEqual(
479
- plainLines.at(-1),
480
- "",
481
- `Expected table to end without a blank line: ${JSON.stringify(plainLines)}`,
482
- );
483
- });
484
- });
485
-
486
- describe("Combined features", () => {
487
- it("should render lists and tables together", () => {
488
- const markdown = new Markdown(
489
- `# Test Document
490
-
491
- - Item 1
492
- - Nested item
493
- - Item 2
494
-
495
- | Col1 | Col2 |
496
- | --- | --- |
497
- | A | B |`,
498
- 0,
499
- 0,
500
- defaultMarkdownTheme,
501
- );
502
-
503
- const lines = markdown.render(80);
504
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
505
-
506
- // Check heading
507
- assert.ok(plainLines.some((line) => line.includes("Test Document")));
508
- // Check list
509
- assert.ok(plainLines.some((line) => line.includes("- Item 1")));
510
- assert.ok(plainLines.some((line) => line.includes(" - Nested item")));
511
- // Check table
512
- assert.ok(plainLines.some((line) => line.includes("Col1")));
513
- assert.ok(plainLines.some((line) => line.includes("│")));
514
- });
515
- });
516
-
517
- describe("Pre-styled text (thinking traces)", () => {
518
- it("should preserve gray italic styling after inline code", () => {
519
- // This replicates how thinking content is rendered in assistant-message.ts
520
- const markdown = new Markdown(
521
- "This is thinking with `inline code` and more text after",
522
- 1,
523
- 0,
524
- defaultMarkdownTheme,
525
- {
526
- color: (text) => chalk.gray(text),
527
- italic: true,
528
- },
529
- );
530
-
531
- const lines = markdown.render(80);
532
- const joinedOutput = lines.join("\n");
533
-
534
- // Should contain the inline code block
535
- assert.ok(joinedOutput.includes("inline code"));
536
-
537
- // The output should have ANSI codes for gray (90) and italic (3)
538
- assert.ok(joinedOutput.includes("\x1b[90m"), "Should have gray color code");
539
- assert.ok(joinedOutput.includes("\x1b[3m"), "Should have italic code");
540
-
541
- // Verify that inline code is styled (theme uses yellow)
542
- const hasCodeColor = joinedOutput.includes("\x1b[33m");
543
- assert.ok(hasCodeColor, "Should style inline code");
544
- });
545
-
546
- it("should preserve gray italic styling after bold text", () => {
547
- const markdown = new Markdown(
548
- "This is thinking with **bold text** and more after",
549
- 1,
550
- 0,
551
- defaultMarkdownTheme,
552
- {
553
- color: (text) => chalk.gray(text),
554
- italic: true,
555
- },
556
- );
557
-
558
- const lines = markdown.render(80);
559
- const joinedOutput = lines.join("\n");
560
-
561
- // Should contain bold text
562
- assert.ok(joinedOutput.includes("bold text"));
563
-
564
- // The output should have ANSI codes for gray (90) and italic (3)
565
- assert.ok(joinedOutput.includes("\x1b[90m"), "Should have gray color code");
566
- assert.ok(joinedOutput.includes("\x1b[3m"), "Should have italic code");
567
-
568
- // Should have bold codes (1 or 22 for bold on/off)
569
- assert.ok(joinedOutput.includes("\x1b[1m"), "Should have bold code");
570
- });
571
-
572
- it("should not leak styles into following lines when rendered in TUI", async () => {
573
- class MarkdownWithInput implements Component {
574
- public markdownLineCount = 0;
575
-
576
- constructor(private readonly markdown: Markdown) {}
577
-
578
- render(width: number): string[] {
579
- const lines = this.markdown.render(width);
580
- this.markdownLineCount = lines.length;
581
- return [...lines, "INPUT"];
582
- }
583
-
584
- invalidate(): void {
585
- this.markdown.invalidate();
586
- }
587
- }
588
-
589
- const markdown = new Markdown("This is thinking with `inline code`", 1, 0, defaultMarkdownTheme, {
590
- color: (text) => chalk.gray(text),
591
- italic: true,
592
- });
593
-
594
- const terminal = new VirtualTerminal(80, 6);
595
- const tui = new TUI(terminal);
596
- const component = new MarkdownWithInput(markdown);
597
- tui.addChild(component);
598
- tui.start();
599
- await terminal.waitForRender();
600
-
601
- assert.ok(component.markdownLineCount > 0);
602
- const inputRow = component.markdownLineCount;
603
- assert.strictEqual(getCellItalic(terminal, inputRow, 0), 0);
604
- tui.stop();
605
- });
606
- });
607
-
608
- describe("Spacing after code blocks", () => {
609
- it("should have only one blank line between code block and following paragraph", () => {
610
- const markdown = new Markdown(
611
- `hello world
612
-
613
- \`\`\`js
614
- const hello = "world";
615
- \`\`\`
616
-
617
- again, hello world`,
618
- 0,
619
- 0,
620
- defaultMarkdownTheme,
621
- );
622
-
623
- const lines = markdown.render(80);
624
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
625
-
626
- const closingBackticksIndex = plainLines.indexOf("```");
627
- assert.ok(closingBackticksIndex !== -1, "Should have closing backticks");
628
-
629
- const afterBackticks = plainLines.slice(closingBackticksIndex + 1);
630
- const emptyLineCount = afterBackticks.findIndex((line) => line !== "");
631
-
632
- assert.strictEqual(
633
- emptyLineCount,
634
- 1,
635
- `Expected 1 empty line after code block, but found ${emptyLineCount}. Lines after backticks: ${JSON.stringify(afterBackticks.slice(0, 5))}`,
636
- );
637
- });
638
-
639
- it("should normalize paragraph and code block spacing to one blank line", () => {
640
- const cases = [
641
- `hello this is text
642
- \`\`\`
643
- code block
644
- \`\`\`
645
- more text`,
646
- `hello this is text
647
-
648
- \`\`\`
649
- code block
650
- \`\`\`
651
-
652
- more text`,
653
- ];
654
- const expectedLines = ["hello this is text", "", "```", " code block", "```", "", "more text"];
655
-
656
- for (const text of cases) {
657
- const markdown = new Markdown(text, 0, 0, defaultMarkdownTheme);
658
- const lines = markdown.render(80);
659
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
660
-
661
- assert.deepStrictEqual(
662
- plainLines,
663
- expectedLines,
664
- `Unexpected spacing for markdown: ${JSON.stringify(text)}`,
665
- );
666
- }
667
- });
668
-
669
- it("should not add a trailing blank line when code block is the last rendered block", () => {
670
- const cases = ["```js\nconst hello = 'world';\n```", "hello world\n\n```js\nconst hello = 'world';\n```"];
671
-
672
- for (const text of cases) {
673
- const markdown = new Markdown(text, 0, 0, defaultMarkdownTheme);
674
- const lines = markdown.render(80);
675
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
676
-
677
- assert.notStrictEqual(
678
- plainLines.at(-1),
679
- "",
680
- `Expected code block to end without a blank line: ${JSON.stringify(plainLines)}`,
681
- );
682
- }
683
- });
684
- });
685
-
686
- describe("Spacing after dividers", () => {
687
- it("should have only one blank line between divider and following paragraph", () => {
688
- const markdown = new Markdown(
689
- `hello world
690
-
691
- ---
692
-
693
- again, hello world`,
694
- 0,
695
- 0,
696
- defaultMarkdownTheme,
697
- );
698
-
699
- const lines = markdown.render(80);
700
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
701
-
702
- const dividerIndex = plainLines.findIndex((line) => line.includes("─"));
703
- assert.ok(dividerIndex !== -1, "Should have divider");
704
-
705
- const afterDivider = plainLines.slice(dividerIndex + 1);
706
- const emptyLineCount = afterDivider.findIndex((line) => line !== "");
707
-
708
- assert.strictEqual(
709
- emptyLineCount,
710
- 1,
711
- `Expected 1 empty line after divider, but found ${emptyLineCount}. Lines after divider: ${JSON.stringify(afterDivider.slice(0, 5))}`,
712
- );
713
- });
714
-
715
- it("should not add a trailing blank line when divider is the last rendered block", () => {
716
- const markdown = new Markdown("---", 0, 0, defaultMarkdownTheme);
717
- const lines = markdown.render(80);
718
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
719
-
720
- assert.notStrictEqual(
721
- plainLines.at(-1),
722
- "",
723
- `Expected divider to end without a blank line: ${JSON.stringify(plainLines)}`,
724
- );
725
- });
726
- });
727
-
728
- describe("Spacing after headings", () => {
729
- it("should have only one blank line between heading and following paragraph", () => {
730
- const markdown = new Markdown(
731
- `# Hello
732
-
733
- This is a paragraph`,
734
- 0,
735
- 0,
736
- defaultMarkdownTheme,
737
- );
738
-
739
- const lines = markdown.render(80);
740
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
741
-
742
- const headingIndex = plainLines.findIndex((line) => line.includes("Hello"));
743
- assert.ok(headingIndex !== -1, "Should have heading");
744
-
745
- const afterHeading = plainLines.slice(headingIndex + 1);
746
- const emptyLineCount = afterHeading.findIndex((line) => line !== "");
747
-
748
- assert.strictEqual(
749
- emptyLineCount,
750
- 1,
751
- `Expected 1 empty line after heading, but found ${emptyLineCount}. Lines after heading: ${JSON.stringify(afterHeading.slice(0, 5))}`,
752
- );
753
- });
754
-
755
- it("should not add a trailing blank line when heading is the last rendered block", () => {
756
- const markdown = new Markdown("# Hello", 0, 0, defaultMarkdownTheme);
757
- const lines = markdown.render(80);
758
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
759
-
760
- assert.notStrictEqual(
761
- plainLines.at(-1),
762
- "",
763
- `Expected heading to end without a blank line: ${JSON.stringify(plainLines)}`,
764
- );
765
- });
766
- });
767
-
768
- describe("Spacing after blockquotes", () => {
769
- it("should have only one blank line between blockquote and following paragraph", () => {
770
- const markdown = new Markdown(
771
- `hello world
772
-
773
- > This is a quote
774
-
775
- again, hello world`,
776
- 0,
777
- 0,
778
- defaultMarkdownTheme,
779
- );
780
-
781
- const lines = markdown.render(80);
782
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
783
-
784
- const quoteIndex = plainLines.findIndex((line) => line.includes("This is a quote"));
785
- assert.ok(quoteIndex !== -1, "Should have blockquote");
786
-
787
- const afterQuote = plainLines.slice(quoteIndex + 1);
788
- const emptyLineCount = afterQuote.findIndex((line) => line !== "");
789
-
790
- assert.strictEqual(
791
- emptyLineCount,
792
- 1,
793
- `Expected 1 empty line after blockquote, but found ${emptyLineCount}. Lines after quote: ${JSON.stringify(afterQuote.slice(0, 5))}`,
794
- );
795
- });
796
-
797
- it("should not add a trailing blank line when blockquote is the last rendered block", () => {
798
- const markdown = new Markdown("> This is a quote", 0, 0, defaultMarkdownTheme);
799
- const lines = markdown.render(80);
800
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
801
-
802
- assert.notStrictEqual(
803
- plainLines.at(-1),
804
- "",
805
- `Expected blockquote to end without a blank line: ${JSON.stringify(plainLines)}`,
806
- );
807
- });
808
- });
809
-
810
- describe("Blockquotes with multiline content", () => {
811
- it("should apply consistent styling to all lines in lazy continuation blockquote", () => {
812
- // Markdown "lazy continuation" - second line without > is still part of the quote
813
- const markdown = new Markdown(
814
- `>Foo
815
- bar`,
816
- 0,
817
- 0,
818
- defaultMarkdownTheme,
819
- {
820
- color: (text) => chalk.magenta(text), // This should NOT be applied to blockquotes
821
- },
822
- );
823
-
824
- const lines = markdown.render(80);
825
-
826
- // Both lines should have the quote border
827
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
828
- const quotedLines = plainLines.filter((line) => line.startsWith("│ "));
829
- assert.strictEqual(quotedLines.length, 2, `Expected 2 quoted lines, got: ${JSON.stringify(plainLines)}`);
830
-
831
- // Both lines should have italic (from theme.quote styling)
832
- const fooLine = lines.find((line) => line.includes("Foo"));
833
- const barLine = lines.find((line) => line.includes("bar"));
834
- assert.ok(fooLine, "Should have Foo line");
835
- assert.ok(barLine, "Should have bar line");
836
-
837
- // Check that both have italic (\x1b[3m) - blockquotes use theme styling, not default message color
838
- assert.ok(fooLine?.includes("\x1b[3m"), `Foo line should have italic: ${fooLine}`);
839
- assert.ok(barLine?.includes("\x1b[3m"), `bar line should have italic: ${barLine}`);
840
-
841
- // Blockquotes should NOT have the default message color (magenta)
842
- assert.ok(!fooLine?.includes("\x1b[35m"), `Foo line should NOT have magenta color: ${fooLine}`);
843
- assert.ok(!barLine?.includes("\x1b[35m"), `bar line should NOT have magenta color: ${barLine}`);
844
- });
845
-
846
- it("should apply consistent styling to explicit multiline blockquote", () => {
847
- const markdown = new Markdown(
848
- `>Foo
849
- >bar`,
850
- 0,
851
- 0,
852
- defaultMarkdownTheme,
853
- {
854
- color: (text) => chalk.cyan(text), // This should NOT be applied to blockquotes
855
- },
856
- );
857
-
858
- const lines = markdown.render(80);
859
-
860
- // Both lines should have the quote border
861
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
862
- const quotedLines = plainLines.filter((line) => line.startsWith("│ "));
863
- assert.strictEqual(quotedLines.length, 2, `Expected 2 quoted lines, got: ${JSON.stringify(plainLines)}`);
864
-
865
- // Both lines should have italic (from theme.quote styling)
866
- const fooLine = lines.find((line) => line.includes("Foo"));
867
- const barLine = lines.find((line) => line.includes("bar"));
868
- assert.ok(fooLine?.includes("\x1b[3m"), `Foo line should have italic: ${fooLine}`);
869
- assert.ok(barLine?.includes("\x1b[3m"), `bar line should have italic: ${barLine}`);
870
-
871
- // Blockquotes should NOT have the default message color (cyan)
872
- assert.ok(!fooLine?.includes("\x1b[36m"), `Foo line should NOT have cyan color: ${fooLine}`);
873
- assert.ok(!barLine?.includes("\x1b[36m"), `bar line should NOT have cyan color: ${barLine}`);
874
- });
875
-
876
- it("should render list content inside blockquotes", () => {
877
- const markdown = new Markdown(
878
- `> 1. bla bla
879
- > - nested bullet`,
880
- 0,
881
- 0,
882
- defaultMarkdownTheme,
883
- );
884
-
885
- const lines = markdown.render(80);
886
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
887
- const quotedLines = plainLines.filter((line) => line.startsWith("│ "));
888
-
889
- assert.ok(
890
- quotedLines.some((line) => line.includes("1. bla bla")),
891
- `Missing ordered list item: ${JSON.stringify(quotedLines)}`,
892
- );
893
- assert.ok(
894
- quotedLines.some((line) => line.includes("- nested bullet")),
895
- `Missing unordered list item: ${JSON.stringify(quotedLines)}`,
896
- );
897
- });
898
-
899
- it("should wrap long blockquote lines and add border to each wrapped line", () => {
900
- const longText = "This is a very long blockquote line that should wrap to multiple lines when rendered";
901
- const markdown = new Markdown(`> ${longText}`, 0, 0, defaultMarkdownTheme);
902
-
903
- // Render at narrow width to force wrapping
904
- const lines = markdown.render(30);
905
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
906
-
907
- // Filter to non-empty lines (exclude trailing blank line after blockquote)
908
- const contentLines = plainLines.filter((line) => line.length > 0);
909
-
910
- // Should have multiple lines due to wrapping
911
- assert.ok(contentLines.length > 1, `Expected multiple wrapped lines, got: ${JSON.stringify(contentLines)}`);
912
-
913
- // Every content line should start with the quote border
914
- for (const line of contentLines) {
915
- assert.ok(line.startsWith("│ "), `Wrapped line should have quote border: "${line}"`);
916
- }
917
-
918
- // All content should be preserved
919
- const allText = contentLines.join(" ");
920
- assert.ok(allText.includes("very long"), "Should preserve 'very long'");
921
- assert.ok(allText.includes("blockquote"), "Should preserve 'blockquote'");
922
- assert.ok(allText.includes("multiple"), "Should preserve 'multiple'");
923
- });
924
-
925
- it("should properly indent wrapped blockquote lines with styling", () => {
926
- const markdown = new Markdown(
927
- "> This is styled text that is long enough to wrap",
928
- 0,
929
- 0,
930
- defaultMarkdownTheme,
931
- {
932
- color: (text) => chalk.yellow(text), // This should NOT be applied to blockquotes
933
- italic: true,
934
- },
935
- );
936
-
937
- const lines = markdown.render(25);
938
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
939
-
940
- // Filter to non-empty lines
941
- const contentLines = plainLines.filter((line) => line.length > 0);
942
-
943
- // All lines should have the quote border
944
- for (const line of contentLines) {
945
- assert.ok(line.startsWith("│ "), `Line should have quote border: "${line}"`);
946
- }
947
-
948
- // Check that italic is applied (from theme.quote)
949
- const allOutput = lines.join("\n");
950
- assert.ok(allOutput.includes("\x1b[3m"), "Should have italic");
951
-
952
- // Blockquotes should NOT have the default message color (yellow)
953
- assert.ok(!allOutput.includes("\x1b[33m"), "Should NOT have yellow color from default style");
954
- });
955
-
956
- it("should render inline formatting inside blockquotes and reapply quote styling after", () => {
957
- const markdown = new Markdown("> Quote with **bold** and `code`", 0, 0, defaultMarkdownTheme);
958
-
959
- const lines = markdown.render(80);
960
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
961
-
962
- // Should have the quote border
963
- assert.ok(
964
- plainLines.some((line) => line.startsWith("│ ")),
965
- "Should have quote border",
966
- );
967
-
968
- // Content should be preserved
969
- const allPlain = plainLines.join(" ");
970
- assert.ok(allPlain.includes("Quote with"), "Should preserve 'Quote with'");
971
- assert.ok(allPlain.includes("bold"), "Should preserve 'bold'");
972
- assert.ok(allPlain.includes("code"), "Should preserve 'code'");
973
-
974
- const allOutput = lines.join("\n");
975
-
976
- // Should have bold styling (\x1b[1m)
977
- assert.ok(allOutput.includes("\x1b[1m"), "Should have bold styling");
978
-
979
- // Should have code styling (yellow = \x1b[33m from defaultMarkdownTheme)
980
- assert.ok(allOutput.includes("\x1b[33m"), "Should have code styling (yellow)");
981
-
982
- // Should have italic from quote styling (\x1b[3m)
983
- assert.ok(allOutput.includes("\x1b[3m"), "Should have italic from quote styling");
984
- });
985
- });
986
-
987
- describe("Heading with inline code", () => {
988
- it("should preserve heading styling after inline code", () => {
989
- const markdown = new Markdown("### Why `sourceInfo` should not be optional", 0, 0, defaultMarkdownTheme);
990
-
991
- const lines = markdown.render(80);
992
- const joinedOutput = lines.join("\n");
993
-
994
- // The heading theme is bold+cyan. After the yellow inline code, the heading
995
- // styling (bold+cyan) must be restored so subsequent text is styled correctly.
996
- // bold = \x1b[1m, cyan = \x1b[36m, yellow = \x1b[33m
997
- assert.ok(joinedOutput.includes("\x1b[33m"), "Should have yellow for inline code");
998
-
999
- // Find the position of "should not be optional" in the raw output.
1000
- // It must be preceded by heading style codes (bold+cyan), not appear unstyled.
1001
- const afterCodeIndex = joinedOutput.indexOf("should not be optional");
1002
- assert.ok(afterCodeIndex > 0, "Should contain text after inline code");
1003
-
1004
- // Look at the ANSI codes between the code span end and "should not be optional".
1005
- // There should be bold (\x1b[1m) and cyan (\x1b[36m) re-applied.
1006
- const precedingChunk = joinedOutput.slice(Math.max(0, afterCodeIndex - 40), afterCodeIndex);
1007
- assert.ok(
1008
- precedingChunk.includes("\x1b[1m"),
1009
- `Should re-apply bold before text after code: ${precedingChunk}`,
1010
- );
1011
- assert.ok(
1012
- precedingChunk.includes("\x1b[36m"),
1013
- `Should re-apply cyan before text after code: ${precedingChunk}`,
1014
- );
1015
- });
1016
-
1017
- it("should preserve heading styling after inline code for h1", () => {
1018
- const markdown = new Markdown("# Title with `code` inside", 0, 0, defaultMarkdownTheme);
1019
-
1020
- const lines = markdown.render(80);
1021
- const joinedOutput = lines.join("\n");
1022
-
1023
- const afterCodeIndex = joinedOutput.indexOf("inside");
1024
- assert.ok(afterCodeIndex > 0, "Should contain text after inline code");
1025
-
1026
- const precedingChunk = joinedOutput.slice(Math.max(0, afterCodeIndex - 40), afterCodeIndex);
1027
- // H1 uses heading + bold + underline
1028
- assert.ok(precedingChunk.includes("\x1b[1m"), `Should re-apply bold for h1: ${precedingChunk}`);
1029
- assert.ok(precedingChunk.includes("\x1b[36m"), `Should re-apply cyan for h1: ${precedingChunk}`);
1030
- assert.ok(precedingChunk.includes("\x1b[4m"), `Should re-apply underline for h1: ${precedingChunk}`);
1031
- });
1032
-
1033
- it("should not leak h1 underline into padding when inline code is the last token", async () => {
1034
- const markdown = new Markdown("# Important distinction from `open()`", 0, 0, defaultMarkdownTheme);
1035
- const terminal = new VirtualTerminal(80, 4);
1036
- const tui = new TUI(terminal);
1037
- tui.addChild(markdown);
1038
- tui.start();
1039
- await terminal.waitForRender();
1040
-
1041
- const renderedLine = markdown.render(80)[0];
1042
- assert.ok(renderedLine, "Should render heading line");
1043
- const contentWidth = renderedLine.replace(/\x1b\[[0-9;]*m/g, "").trimEnd().length;
1044
- assert.ok(contentWidth > 0, "Should have visible heading content");
1045
-
1046
- for (let col = contentWidth; col < 80; col++) {
1047
- assert.strictEqual(getCellUnderline(terminal, 0, col), 0, `Expected no underline in padding at col ${col}`);
1048
- }
1049
-
1050
- tui.stop();
1051
- });
1052
-
1053
- it("should preserve heading styling after bold text", () => {
1054
- const markdown = new Markdown("## Heading with **bold** and more", 0, 0, defaultMarkdownTheme);
1055
-
1056
- const lines = markdown.render(80);
1057
- const joinedOutput = lines.join("\n");
1058
-
1059
- const afterBoldIndex = joinedOutput.indexOf("and more");
1060
- assert.ok(afterBoldIndex > 0, "Should contain text after bold");
1061
-
1062
- const precedingChunk = joinedOutput.slice(Math.max(0, afterBoldIndex - 40), afterBoldIndex);
1063
- assert.ok(precedingChunk.includes("\x1b[1m"), `Should re-apply bold for h2: ${precedingChunk}`);
1064
- assert.ok(precedingChunk.includes("\x1b[36m"), `Should re-apply cyan for h2: ${precedingChunk}`);
1065
- });
1066
- });
1067
-
1068
- describe("Strikethrough syntax", () => {
1069
- it("should render ~~text~~ as strikethrough", () => {
1070
- const markdown = new Markdown("Use ~~strikethrough~~ here", 0, 0, defaultMarkdownTheme);
1071
-
1072
- const lines = markdown.render(80);
1073
- const joinedOutput = lines.join("\n");
1074
- const joinedPlain = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "")).join(" ");
1075
-
1076
- assert.ok(joinedOutput.includes("\x1b[9m"), "Should apply strikethrough styling");
1077
- assert.ok(joinedPlain.includes("strikethrough"), "Should include struck text content");
1078
- assert.ok(!joinedPlain.includes("~~strikethrough~~"), "Should not render delimiters as text");
1079
- });
1080
-
1081
- it("should keep ~text~ as plain text", () => {
1082
- const markdown = new Markdown("Use ~strikethrough~ literally", 0, 0, defaultMarkdownTheme);
1083
-
1084
- const lines = markdown.render(80);
1085
- const joinedOutput = lines.join("\n");
1086
- const joinedPlain = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "")).join(" ");
1087
-
1088
- assert.ok(joinedPlain.includes("~strikethrough~"), "Single-tilde delimiters should remain visible");
1089
- assert.ok(!joinedOutput.includes("\x1b[9m"), "Single-tilde text should not use strikethrough styling");
1090
- });
1091
- });
1092
-
1093
- describe("Links", () => {
1094
- afterEach(() => {
1095
- resetCapabilitiesCache();
1096
- });
1097
-
1098
- it("should not duplicate URL for autolinked emails", () => {
1099
- // Hyperlinks capability does not affect the mailto: display check.
1100
- setCapabilities({ images: null, trueColor: false, hyperlinks: false });
1101
- const markdown = new Markdown("Contact user@example.com for help", 0, 0, defaultMarkdownTheme);
1102
-
1103
- const lines = markdown.render(80);
1104
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
1105
- const joinedPlain = plainLines.join(" ");
1106
-
1107
- // Should contain the email once, not duplicated with mailto:
1108
- assert.ok(joinedPlain.includes("user@example.com"), "Should contain email");
1109
- assert.ok(!joinedPlain.includes("mailto:"), "Should not show mailto: prefix for autolinked emails");
1110
- });
1111
-
1112
- it("should not duplicate URL for bare URLs", () => {
1113
- setCapabilities({ images: null, trueColor: false, hyperlinks: false });
1114
- const markdown = new Markdown("Visit https://example.com for more", 0, 0, defaultMarkdownTheme);
1115
-
1116
- const lines = markdown.render(80);
1117
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
1118
- const joinedPlain = plainLines.join(" ");
1119
-
1120
- // URL should appear only once
1121
- const urlCount = (joinedPlain.match(/https:\/\/example\.com/g) || []).length;
1122
- assert.strictEqual(urlCount, 1, "URL should appear exactly once");
1123
- });
1124
-
1125
- it("should show URL in parentheses when hyperlinks are not supported", () => {
1126
- setCapabilities({ images: null, trueColor: false, hyperlinks: false });
1127
- const markdown = new Markdown("[click here](https://example.com)", 0, 0, defaultMarkdownTheme);
1128
-
1129
- const lines = markdown.render(80);
1130
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
1131
- const joinedPlain = plainLines.join(" ");
1132
-
1133
- assert.ok(joinedPlain.includes("click here"), "Should contain link text");
1134
- assert.ok(joinedPlain.includes("(https://example.com)"), "Should show URL in parentheses");
1135
- });
1136
-
1137
- it("should show mailto URL in parentheses when hyperlinks are not supported", () => {
1138
- setCapabilities({ images: null, trueColor: false, hyperlinks: false });
1139
- const markdown = new Markdown("[Email me](mailto:test@example.com)", 0, 0, defaultMarkdownTheme);
1140
-
1141
- const lines = markdown.render(80);
1142
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
1143
- const joinedPlain = plainLines.join(" ");
1144
-
1145
- assert.ok(joinedPlain.includes("Email me"), "Should contain link text");
1146
- assert.ok(joinedPlain.includes("(mailto:test@example.com)"), "Should show mailto URL in parentheses");
1147
- });
1148
-
1149
- it("should emit OSC 8 hyperlink sequence when terminal supports hyperlinks", () => {
1150
- setCapabilities({ images: null, trueColor: false, hyperlinks: true });
1151
- const markdown = new Markdown("[click here](https://example.com)", 0, 0, defaultMarkdownTheme);
1152
-
1153
- const lines = markdown.render(80);
1154
- const joined = lines.join("");
1155
-
1156
- // OSC 8 open: ESC ] 8 ; ; <url> ESC \
1157
- assert.ok(joined.includes("\x1b]8;;https://example.com\x1b\\"), "Should contain OSC 8 open sequence");
1158
- // OSC 8 close: ESC ] 8 ; ; ESC \
1159
- assert.ok(joined.includes("\x1b]8;;\x1b\\"), "Should contain OSC 8 close sequence");
1160
- // Visible text is present
1161
- const plainLines = lines.map((line) => line.replace(/\x1b[^a-zA-Z]*[a-zA-Z]|\x1b\].*?\x1b\\/g, ""));
1162
- assert.ok(plainLines.join("").includes("click here"), "Should contain link text");
1163
- // URL is NOT printed inline as plain text
1164
- const rawPlain = lines.map((line) =>
1165
- line.replace(/\x1b\]8;;[^\x1b]*\x1b\\/g, "").replace(/\x1b\[[0-9;]*m/g, ""),
1166
- );
1167
- assert.ok(!rawPlain.join("").includes("(https://example.com)"), "URL should not appear inline in parentheses");
1168
- });
1169
-
1170
- it("should use OSC 8 for mailto links when terminal supports hyperlinks", () => {
1171
- setCapabilities({ images: null, trueColor: false, hyperlinks: true });
1172
- const markdown = new Markdown("[Email me](mailto:test@example.com)", 0, 0, defaultMarkdownTheme);
1173
-
1174
- const lines = markdown.render(80);
1175
- const joined = lines.join("");
1176
-
1177
- assert.ok(
1178
- joined.includes("\x1b]8;;mailto:test@example.com\x1b\\"),
1179
- "Should contain OSC 8 open with mailto URL",
1180
- );
1181
- assert.ok(joined.includes("\x1b]8;;\x1b\\"), "Should contain OSC 8 close sequence");
1182
- });
1183
-
1184
- it("should use OSC 8 for bare URLs when terminal supports hyperlinks", () => {
1185
- setCapabilities({ images: null, trueColor: false, hyperlinks: true });
1186
- const markdown = new Markdown("Visit https://example.com for more", 0, 0, defaultMarkdownTheme);
1187
-
1188
- const lines = markdown.render(80);
1189
- const joined = lines.join("");
1190
-
1191
- assert.ok(joined.includes("\x1b]8;;https://example.com\x1b\\"), "Should contain OSC 8 hyperlink");
1192
- // URL should not also appear as raw parenthetical text
1193
- const rawPlain = lines.map((line) =>
1194
- line.replace(/\x1b\]8;;[^\x1b]*\x1b\\/g, "").replace(/\x1b\[[0-9;]*m/g, ""),
1195
- );
1196
- assert.ok(!rawPlain.join("").includes("(https://example.com)"), "URL should not appear twice");
1197
- });
1198
- });
1199
-
1200
- describe("HTML-like tags in text", () => {
1201
- it("should render content with HTML-like tags as text", () => {
1202
- // When the model emits something like <thinking>content</thinking> in regular text,
1203
- // marked might treat it as HTML and hide the content
1204
- const markdown = new Markdown(
1205
- "This is text with <thinking>hidden content</thinking> that should be visible",
1206
- 0,
1207
- 0,
1208
- defaultMarkdownTheme,
1209
- );
1210
-
1211
- const lines = markdown.render(80);
1212
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
1213
- const joinedPlain = plainLines.join(" ");
1214
-
1215
- // The content inside the tags should be visible
1216
- assert.ok(
1217
- joinedPlain.includes("hidden content") || joinedPlain.includes("<thinking>"),
1218
- "Should render HTML-like tags or their content as text, not hide them",
1219
- );
1220
- });
1221
-
1222
- it("should render HTML tags in code blocks correctly", () => {
1223
- const markdown = new Markdown("```html\n<div>Some HTML</div>\n```", 0, 0, defaultMarkdownTheme);
1224
-
1225
- const lines = markdown.render(80);
1226
- const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, ""));
1227
- const joinedPlain = plainLines.join("\n");
1228
-
1229
- // HTML in code blocks should be visible
1230
- assert.ok(
1231
- joinedPlain.includes("<div>") && joinedPlain.includes("</div>"),
1232
- "Should render HTML in code blocks",
1233
- );
1234
- });
1235
- });
1236
- });