@code-yeongyu/senpi 2026.5.19 → 2026.5.20-3

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 (589) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/cli.js.map +1 -1
  4. package/dist/cli/args.d.ts +1 -1
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +2 -2
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js.map +1 -1
  10. package/dist/cli/file-processor.d.ts.map +1 -1
  11. package/dist/cli/file-processor.js.map +1 -1
  12. package/dist/cli/initial-message.d.ts +1 -1
  13. package/dist/cli/initial-message.d.ts.map +1 -1
  14. package/dist/cli/initial-message.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +1 -1
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js.map +1 -1
  18. package/dist/cli/session-picker.d.ts +1 -1
  19. package/dist/cli/session-picker.d.ts.map +1 -1
  20. package/dist/cli/session-picker.js.map +1 -1
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js.map +1 -1
  25. package/dist/core/agent-session-runtime.d.ts +9 -9
  26. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  27. package/dist/core/agent-session-runtime.js +2 -2
  28. package/dist/core/agent-session-runtime.js.map +1 -1
  29. package/dist/core/agent-session-services.d.ts +8 -8
  30. package/dist/core/agent-session-services.d.ts.map +1 -1
  31. package/dist/core/agent-session-services.js.map +1 -1
  32. package/dist/core/agent-session.d.ts +23 -14
  33. package/dist/core/agent-session.d.ts.map +1 -1
  34. package/dist/core/agent-session.js +36 -6
  35. package/dist/core/agent-session.js.map +1 -1
  36. package/dist/core/auth-guidance.d.ts.map +1 -1
  37. package/dist/core/auth-guidance.js.map +1 -1
  38. package/dist/core/auth-storage.d.ts +1 -1
  39. package/dist/core/auth-storage.d.ts.map +1 -1
  40. package/dist/core/auth-storage.js +1 -1
  41. package/dist/core/auth-storage.js.map +1 -1
  42. package/dist/core/bash-executor.d.ts +1 -1
  43. package/dist/core/bash-executor.d.ts.map +1 -1
  44. package/dist/core/bash-executor.js.map +1 -1
  45. package/dist/core/compaction/branch-summarization.d.ts +4 -4
  46. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  47. package/dist/core/compaction/branch-summarization.js.map +1 -1
  48. package/dist/core/compaction/compaction.d.ts +2 -2
  49. package/dist/core/compaction/compaction.d.ts.map +1 -1
  50. package/dist/core/compaction/compaction.js.map +1 -1
  51. package/dist/core/compaction/index.d.ts +3 -3
  52. package/dist/core/compaction/index.d.ts.map +1 -1
  53. package/dist/core/compaction/index.js.map +1 -1
  54. package/dist/core/compaction/utils.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.js.map +1 -1
  56. package/dist/core/dynamic-prompt/build.d.ts +1 -1
  57. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  58. package/dist/core/dynamic-prompt/build.js.map +1 -1
  59. package/dist/core/dynamic-prompt/index.d.ts +12 -12
  60. package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
  61. package/dist/core/dynamic-prompt/index.js.map +1 -1
  62. package/dist/core/dynamic-prompt/intent-gate.d.ts +1 -1
  63. package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
  64. package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
  65. package/dist/core/dynamic-prompt/tool-categorization.d.ts +1 -1
  66. package/dist/core/dynamic-prompt/tool-categorization.d.ts.map +1 -1
  67. package/dist/core/dynamic-prompt/tool-categorization.js.map +1 -1
  68. package/dist/core/dynamic-prompt/tool-section.d.ts +1 -1
  69. package/dist/core/dynamic-prompt/tool-section.d.ts.map +1 -1
  70. package/dist/core/dynamic-prompt/tool-section.js.map +1 -1
  71. package/dist/core/exec.d.ts.map +1 -1
  72. package/dist/core/exec.js.map +1 -1
  73. package/dist/core/export-html/index.d.ts +1 -1
  74. package/dist/core/export-html/index.d.ts.map +1 -1
  75. package/dist/core/export-html/index.js.map +1 -1
  76. package/dist/core/export-html/template.css +1108 -0
  77. package/dist/core/export-html/template.html +55 -0
  78. package/dist/core/export-html/template.js +1871 -0
  79. package/dist/core/export-html/tool-renderer.d.ts +2 -2
  80. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  81. package/dist/core/export-html/tool-renderer.js.map +1 -1
  82. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  83. package/dist/core/export-html/vendor/marked.min.js +6 -0
  84. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts +1 -1
  85. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
  86. package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
  87. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts +1 -1
  88. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  89. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  90. package/dist/core/extensions/builtin/bash-timeout/index.d.ts +3 -3
  91. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  92. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  93. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts +1 -1
  94. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts.map +1 -1
  95. package/dist/core/extensions/builtin/compaction/checkpoint-state.js.map +1 -1
  96. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts +2 -2
  97. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  99. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  100. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  102. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +4 -3
  103. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/compaction/openai-remote.js +88 -17
  105. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  106. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts +2 -2
  107. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  109. package/dist/core/extensions/builtin/compaction/policy.d.ts +2 -2
  110. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  111. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  112. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts +1 -1
  113. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/compaction/restoration-tracker.js.map +1 -1
  115. package/dist/core/extensions/builtin/compaction/speculative.d.ts +5 -5
  116. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/state.d.ts +1 -1
  119. package/dist/core/extensions/builtin/compaction/state.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/compaction/state.js.map +1 -1
  121. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +2 -2
  122. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  124. package/dist/core/extensions/builtin/diff.d.ts +1 -1
  125. package/dist/core/extensions/builtin/diff.d.ts.map +1 -1
  126. package/dist/core/extensions/builtin/diff.js.map +1 -1
  127. package/dist/core/extensions/builtin/files.d.ts +1 -1
  128. package/dist/core/extensions/builtin/files.d.ts.map +1 -1
  129. package/dist/core/extensions/builtin/files.js.map +1 -1
  130. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts +1 -1
  131. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  133. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts +1 -1
  134. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js.map +1 -1
  136. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts +1 -1
  137. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  139. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts +11 -11
  140. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  141. package/dist/core/extensions/builtin/gpt-apply-patch/index.js.map +1 -1
  142. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts +1 -1
  143. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts.map +1 -1
  144. package/dist/core/extensions/builtin/gpt-apply-patch/params.js.map +1 -1
  145. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts +1 -1
  146. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts.map +1 -1
  147. package/dist/core/extensions/builtin/gpt-apply-patch/parser.js.map +1 -1
  148. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts +1 -1
  149. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.js.map +1 -1
  151. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts +1 -1
  152. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  154. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts +1 -1
  155. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
  156. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  157. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts +1 -1
  158. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  159. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js.map +1 -1
  160. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts +1 -1
  161. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts.map +1 -1
  162. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +2 -2
  167. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  168. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  169. package/dist/core/extensions/builtin/index.d.ts +5 -5
  170. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/index.js +2 -0
  172. package/dist/core/extensions/builtin/index.js.map +1 -1
  173. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts +3 -0
  174. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +1 -0
  175. package/dist/core/extensions/builtin/kimi-web-search/index.js +208 -0
  176. package/dist/core/extensions/builtin/kimi-web-search/index.js.map +1 -0
  177. package/dist/core/extensions/builtin/openai-web-search/index.d.ts +1 -1
  178. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  179. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  180. package/dist/core/extensions/builtin/permission-system/arity.d.ts +3 -3
  181. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  182. package/dist/core/extensions/builtin/permission-system/arity.js +155 -158
  183. package/dist/core/extensions/builtin/permission-system/arity.js.map +1 -1
  184. package/dist/core/extensions/builtin/permission-system/cli.d.ts +2 -2
  185. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  186. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  187. package/dist/core/extensions/builtin/permission-system/config.d.ts +1 -1
  188. package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
  189. package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
  190. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts +1 -1
  191. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts.map +1 -1
  192. package/dist/core/extensions/builtin/permission-system/evaluate.js.map +1 -1
  193. package/dist/core/extensions/builtin/permission-system/events.d.ts +2 -2
  194. package/dist/core/extensions/builtin/permission-system/events.d.ts.map +1 -1
  195. package/dist/core/extensions/builtin/permission-system/events.js.map +1 -1
  196. package/dist/core/extensions/builtin/permission-system/index.d.ts +1 -1
  197. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  198. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  199. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts +1 -1
  200. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts.map +1 -1
  201. package/dist/core/extensions/builtin/permission-system/non-interactive.js.map +1 -1
  202. package/dist/core/extensions/builtin/permission-system/parsers.d.ts +1 -1
  203. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  204. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  205. package/dist/core/extensions/builtin/permission-system/prompt.d.ts +2 -2
  206. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  207. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  208. package/dist/core/extensions/builtin/permission-system/service.d.ts +2 -2
  209. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  210. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  211. package/dist/core/extensions/builtin/permission-system/settings.d.ts +2 -2
  212. package/dist/core/extensions/builtin/permission-system/settings.d.ts.map +1 -1
  213. package/dist/core/extensions/builtin/permission-system/settings.js.map +1 -1
  214. package/dist/core/extensions/builtin/permission-system/storage.d.ts +1 -1
  215. package/dist/core/extensions/builtin/permission-system/storage.d.ts.map +1 -1
  216. package/dist/core/extensions/builtin/permission-system/storage.js.map +1 -1
  217. package/dist/core/extensions/builtin/permission-system/types.d.ts +2 -2
  218. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  219. package/dist/core/extensions/builtin/permission-system/types.js +4 -4
  220. package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
  221. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts +3 -3
  222. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/permission-system/wildcard.js +4 -7
  224. package/dist/core/extensions/builtin/permission-system/wildcard.js.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  228. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts +1 -1
  229. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  231. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts +1 -1
  232. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  233. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  234. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts +1 -1
  235. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
  236. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
  237. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts +1 -1
  238. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
  240. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts +1 -1
  241. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
  242. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
  243. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts +1 -1
  244. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  246. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts +1 -1
  247. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
  248. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
  249. package/dist/core/extensions/builtin/prompt-preset/index.d.ts +1 -1
  250. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  251. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  252. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts +1 -1
  253. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
  254. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  255. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts +3 -3
  256. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  257. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  258. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  259. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  260. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  261. package/dist/core/extensions/builtin/prompt-url-widget.d.ts +1 -1
  262. package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
  263. package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
  264. package/dist/core/extensions/builtin/redraws.d.ts +1 -1
  265. package/dist/core/extensions/builtin/redraws.d.ts.map +1 -1
  266. package/dist/core/extensions/builtin/redraws.js.map +1 -1
  267. package/dist/core/extensions/builtin/service-tier.d.ts +1 -1
  268. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  269. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  270. package/dist/core/extensions/builtin/system-messages.d.ts +2 -2
  271. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  272. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  273. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts +1 -1
  274. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +1 -1
  275. package/dist/core/extensions/builtin/todotools/continuation/index.js.map +1 -1
  276. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +1 -1
  277. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  278. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  279. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts +2 -2
  280. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
  281. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/index.d.ts +3 -3
  283. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  285. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  286. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  287. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +1 -1
  288. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  289. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  290. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts +2 -2
  291. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  292. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  293. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts +2 -2
  294. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  295. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  296. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts +1 -1
  297. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
  298. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  299. package/dist/core/extensions/builtin/tps.d.ts +1 -1
  300. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  301. package/dist/core/extensions/builtin/tps.js.map +1 -1
  302. package/dist/core/extensions/index.d.ts +8 -8
  303. package/dist/core/extensions/index.d.ts.map +1 -1
  304. package/dist/core/extensions/index.js.map +1 -1
  305. package/dist/core/extensions/loader.d.ts +2 -2
  306. package/dist/core/extensions/loader.d.ts.map +1 -1
  307. package/dist/core/extensions/loader.js.map +1 -1
  308. package/dist/core/extensions/runner.d.ts +32 -6
  309. package/dist/core/extensions/runner.d.ts.map +1 -1
  310. package/dist/core/extensions/runner.js +109 -5
  311. package/dist/core/extensions/runner.js.map +1 -1
  312. package/dist/core/extensions/types.d.ts +19 -19
  313. package/dist/core/extensions/types.d.ts.map +1 -1
  314. package/dist/core/extensions/types.js.map +1 -1
  315. package/dist/core/extensions/wrapper.d.ts +2 -2
  316. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  317. package/dist/core/extensions/wrapper.js.map +1 -1
  318. package/dist/core/footer-data-provider.d.ts.map +1 -1
  319. package/dist/core/footer-data-provider.js.map +1 -1
  320. package/dist/core/index.d.ts +8 -8
  321. package/dist/core/index.d.ts.map +1 -1
  322. package/dist/core/index.js.map +1 -1
  323. package/dist/core/keybindings.d.ts.map +1 -1
  324. package/dist/core/keybindings.js.map +1 -1
  325. package/dist/core/model-registry.d.ts +4 -4
  326. package/dist/core/model-registry.d.ts.map +1 -1
  327. package/dist/core/model-registry.js +2 -2
  328. package/dist/core/model-registry.js.map +1 -1
  329. package/dist/core/model-resolver.d.ts +2 -2
  330. package/dist/core/model-resolver.d.ts.map +1 -1
  331. package/dist/core/model-resolver.js.map +1 -1
  332. package/dist/core/package-manager.d.ts +1 -1
  333. package/dist/core/package-manager.d.ts.map +1 -1
  334. package/dist/core/package-manager.js.map +1 -1
  335. package/dist/core/prompt-templates.d.ts +1 -1
  336. package/dist/core/prompt-templates.d.ts.map +1 -1
  337. package/dist/core/prompt-templates.js.map +1 -1
  338. package/dist/core/resolve-config-value.d.ts.map +1 -1
  339. package/dist/core/resolve-config-value.js.map +1 -1
  340. package/dist/core/resource-loader.d.ts +9 -9
  341. package/dist/core/resource-loader.d.ts.map +1 -1
  342. package/dist/core/resource-loader.js.map +1 -1
  343. package/dist/core/sdk.d.ts +14 -14
  344. package/dist/core/sdk.d.ts.map +1 -1
  345. package/dist/core/sdk.js +7 -5
  346. package/dist/core/sdk.js.map +1 -1
  347. package/dist/core/session-manager.d.ts +1 -1
  348. package/dist/core/session-manager.d.ts.map +1 -1
  349. package/dist/core/session-manager.js.map +1 -1
  350. package/dist/core/settings-manager.d.ts +1 -1
  351. package/dist/core/settings-manager.d.ts.map +1 -1
  352. package/dist/core/settings-manager.js +2 -1
  353. package/dist/core/settings-manager.js.map +1 -1
  354. package/dist/core/skills.d.ts +2 -2
  355. package/dist/core/skills.d.ts.map +1 -1
  356. package/dist/core/skills.js.map +1 -1
  357. package/dist/core/slash-commands.d.ts +1 -1
  358. package/dist/core/slash-commands.d.ts.map +1 -1
  359. package/dist/core/slash-commands.js.map +1 -1
  360. package/dist/core/source-info.d.ts +1 -1
  361. package/dist/core/source-info.d.ts.map +1 -1
  362. package/dist/core/source-info.js.map +1 -1
  363. package/dist/core/system-prompt.d.ts +1 -1
  364. package/dist/core/system-prompt.d.ts.map +1 -1
  365. package/dist/core/system-prompt.js +1 -0
  366. package/dist/core/system-prompt.js.map +1 -1
  367. package/dist/core/telemetry.d.ts +1 -1
  368. package/dist/core/telemetry.d.ts.map +1 -1
  369. package/dist/core/telemetry.js.map +1 -1
  370. package/dist/core/tools/bash.d.ts +2 -2
  371. package/dist/core/tools/bash.d.ts.map +1 -1
  372. package/dist/core/tools/bash.js.map +1 -1
  373. package/dist/core/tools/diff-render.d.ts.map +1 -1
  374. package/dist/core/tools/diff-render.js.map +1 -1
  375. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  376. package/dist/core/tools/edit-diff.js.map +1 -1
  377. package/dist/core/tools/edit.d.ts +2 -2
  378. package/dist/core/tools/edit.d.ts.map +1 -1
  379. package/dist/core/tools/edit.js.map +1 -1
  380. package/dist/core/tools/find.d.ts +2 -2
  381. package/dist/core/tools/find.d.ts.map +1 -1
  382. package/dist/core/tools/find.js.map +1 -1
  383. package/dist/core/tools/grep.d.ts +2 -2
  384. package/dist/core/tools/grep.d.ts.map +1 -1
  385. package/dist/core/tools/grep.js.map +1 -1
  386. package/dist/core/tools/index.d.ts +17 -17
  387. package/dist/core/tools/index.d.ts.map +1 -1
  388. package/dist/core/tools/index.js.map +1 -1
  389. package/dist/core/tools/ls.d.ts +2 -2
  390. package/dist/core/tools/ls.d.ts.map +1 -1
  391. package/dist/core/tools/ls.js.map +1 -1
  392. package/dist/core/tools/output-accumulator.d.ts +1 -1
  393. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  394. package/dist/core/tools/output-accumulator.js.map +1 -1
  395. package/dist/core/tools/read.d.ts +2 -2
  396. package/dist/core/tools/read.d.ts.map +1 -1
  397. package/dist/core/tools/read.js.map +1 -1
  398. package/dist/core/tools/render-utils.d.ts.map +1 -1
  399. package/dist/core/tools/render-utils.js.map +1 -1
  400. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  401. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  402. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  403. package/dist/core/tools/write.d.ts +1 -1
  404. package/dist/core/tools/write.d.ts.map +1 -1
  405. package/dist/core/tools/write.js.map +1 -1
  406. package/dist/index.d.ts +28 -27
  407. package/dist/index.d.ts.map +1 -1
  408. package/dist/index.js +1 -0
  409. package/dist/index.js.map +1 -1
  410. package/dist/main.d.ts +1 -1
  411. package/dist/main.d.ts.map +1 -1
  412. package/dist/main.js +1 -0
  413. package/dist/main.js.map +1 -1
  414. package/dist/migrations.d.ts.map +1 -1
  415. package/dist/migrations.js.map +1 -1
  416. package/dist/modes/index.d.ts +5 -5
  417. package/dist/modes/index.d.ts.map +1 -1
  418. package/dist/modes/index.js.map +1 -1
  419. package/dist/modes/interactive/assets/clankolas.png +0 -0
  420. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/armin.js.map +1 -1
  422. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  424. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  425. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  426. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  427. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  428. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  430. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  431. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  432. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  433. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  434. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  436. package/dist/modes/interactive/components/config-selector.d.ts +2 -2
  437. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  439. package/dist/modes/interactive/components/countdown-timer.d.ts +2 -2
  440. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  441. package/dist/modes/interactive/components/countdown-timer.js +2 -2
  442. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  443. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  444. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  446. package/dist/modes/interactive/components/custom-message.d.ts +2 -2
  447. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  449. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  451. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  452. package/dist/modes/interactive/components/diff.js.map +1 -1
  453. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  455. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  457. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  458. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  460. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  461. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  462. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  464. package/dist/modes/interactive/components/favorite-models-selector.d.ts +1 -1
  465. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  467. package/dist/modes/interactive/components/footer.d.ts +3 -2
  468. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  469. package/dist/modes/interactive/components/footer.js +42 -42
  470. package/dist/modes/interactive/components/footer.js.map +1 -1
  471. package/dist/modes/interactive/components/index.d.ts +31 -31
  472. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  473. package/dist/modes/interactive/components/index.js.map +1 -1
  474. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  476. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  477. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  478. package/dist/modes/interactive/components/login-dialog.js +2 -2
  479. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  480. package/dist/modes/interactive/components/model-selector.d.ts +3 -3
  481. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  482. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  483. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  484. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  485. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  486. package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
  487. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  488. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  489. package/dist/modes/interactive/components/session-selector.d.ts +3 -3
  490. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  491. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  492. package/dist/modes/interactive/components/settings-selector.d.ts +1 -1
  493. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  494. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  495. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  496. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  497. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  498. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  499. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  500. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  501. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  502. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  503. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  504. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  505. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  506. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  507. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  508. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  509. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  510. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  511. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  512. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  513. package/dist/modes/interactive/components/user-message.js.map +1 -1
  514. package/dist/modes/interactive/interactive-mode.d.ts +10 -3
  515. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  516. package/dist/modes/interactive/interactive-mode.js +67 -7
  517. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  518. package/dist/modes/interactive/session-info-format.d.ts +1 -1
  519. package/dist/modes/interactive/session-info-format.d.ts.map +1 -1
  520. package/dist/modes/interactive/session-info-format.js.map +1 -1
  521. package/dist/modes/interactive/startup-tools.d.ts.map +1 -1
  522. package/dist/modes/interactive/startup-tools.js.map +1 -1
  523. package/dist/modes/interactive/theme/dark.json +86 -0
  524. package/dist/modes/interactive/theme/light.json +85 -0
  525. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  526. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  527. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  528. package/dist/modes/interactive/theme/theme.js.map +1 -1
  529. package/dist/modes/interactive/working-status.d.ts +3 -0
  530. package/dist/modes/interactive/working-status.d.ts.map +1 -1
  531. package/dist/modes/interactive/working-status.js +10 -0
  532. package/dist/modes/interactive/working-status.js.map +1 -1
  533. package/dist/modes/neo-mode.d.ts +20 -1
  534. package/dist/modes/neo-mode.d.ts.map +1 -1
  535. package/dist/modes/neo-mode.js +30 -2
  536. package/dist/modes/neo-mode.js.map +1 -1
  537. package/dist/modes/print-mode.d.ts +1 -1
  538. package/dist/modes/print-mode.d.ts.map +1 -1
  539. package/dist/modes/print-mode.js.map +1 -1
  540. package/dist/modes/rpc/rpc-client.d.ts +5 -5
  541. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  542. package/dist/modes/rpc/rpc-client.js +1 -1
  543. package/dist/modes/rpc/rpc-client.js.map +1 -1
  544. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  545. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  546. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  547. package/dist/modes/rpc/rpc-types.d.ts +4 -4
  548. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  549. package/dist/modes/rpc/rpc-types.js.map +1 -1
  550. package/dist/neo-tui-bin/senpi-neo-tui-linux-x64 +0 -0
  551. package/dist/package-manager-cli.d.ts.map +1 -1
  552. package/dist/package-manager-cli.js +40 -1
  553. package/dist/package-manager-cli.js.map +1 -1
  554. package/dist/utils/changelog.d.ts +1 -1
  555. package/dist/utils/changelog.d.ts.map +1 -1
  556. package/dist/utils/changelog.js.map +1 -1
  557. package/dist/utils/clipboard-image.d.ts.map +1 -1
  558. package/dist/utils/clipboard-image.js.map +1 -1
  559. package/dist/utils/clipboard.d.ts.map +1 -1
  560. package/dist/utils/clipboard.js.map +1 -1
  561. package/dist/utils/exif-orientation.d.ts +1 -1
  562. package/dist/utils/exif-orientation.d.ts.map +1 -1
  563. package/dist/utils/exif-orientation.js.map +1 -1
  564. package/dist/utils/image-convert.d.ts.map +1 -1
  565. package/dist/utils/image-convert.js.map +1 -1
  566. package/dist/utils/image-resize.d.ts.map +1 -1
  567. package/dist/utils/image-resize.js.map +1 -1
  568. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  569. package/dist/utils/pi-user-agent.js.map +1 -1
  570. package/dist/utils/shell.d.ts.map +1 -1
  571. package/dist/utils/shell.js.map +1 -1
  572. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  573. package/dist/utils/syntax-highlight.js.map +1 -1
  574. package/dist/utils/tools-manager.d.ts.map +1 -1
  575. package/dist/utils/tools-manager.js.map +1 -1
  576. package/dist/utils/version-check.d.ts +2 -1
  577. package/dist/utils/version-check.d.ts.map +1 -1
  578. package/dist/utils/version-check.js +5 -4
  579. package/dist/utils/version-check.js.map +1 -1
  580. package/dist/utils/windows-self-update.d.ts.map +1 -1
  581. package/dist/utils/windows-self-update.js.map +1 -1
  582. package/docs/settings.md +1 -1
  583. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  584. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  585. package/examples/extensions/doom-overlay/index.ts +3 -3
  586. package/examples/extensions/overlay-qa-tests.ts +97 -66
  587. package/examples/extensions/overlay-test.ts +7 -4
  588. package/examples/extensions/plan-mode/index.ts +1 -1
  589. package/package.json +4 -3
@@ -1,13 +1,13 @@
1
- export type { BuildDynamicSystemPromptOptions } from "./build.js";
2
- export { buildDynamicSystemPrompt } from "./build.js";
3
- export { buildExplorationSection } from "./exploration.js";
4
- export { buildIdentitySection } from "./identity.js";
5
- export { buildIntentGate } from "./intent-gate.js";
6
- export { buildParallelToolsSection } from "./parallel-tools.js";
7
- export { buildPoliciesSection } from "./policies.js";
8
- export { buildStyleSection } from "./style.js";
9
- export { categorizeTools } from "./tool-categorization.js";
10
- export { buildToolSection } from "./tool-section.js";
11
- export type { AvailableTool } from "./types.js";
12
- export { buildVerificationSection } from "./verification.js";
1
+ export type { BuildDynamicSystemPromptOptions } from "./build.ts";
2
+ export { buildDynamicSystemPrompt } from "./build.ts";
3
+ export { buildExplorationSection } from "./exploration.ts";
4
+ export { buildIdentitySection } from "./identity.ts";
5
+ export { buildIntentGate } from "./intent-gate.ts";
6
+ export { buildParallelToolsSection } from "./parallel-tools.ts";
7
+ export { buildPoliciesSection } from "./policies.ts";
8
+ export { buildStyleSection } from "./style.ts";
9
+ export { categorizeTools } from "./tool-categorization.ts";
10
+ export { buildToolSection } from "./tool-section.ts";
11
+ export type { AvailableTool } from "./types.ts";
12
+ export { buildVerificationSection } from "./verification.ts";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export type { BuildDynamicSystemPromptOptions } from \"./build.js\";\nexport { buildDynamicSystemPrompt } from \"./build.js\";\nexport { buildExplorationSection } from \"./exploration.js\";\nexport { buildIdentitySection } from \"./identity.js\";\nexport { buildIntentGate } from \"./intent-gate.js\";\nexport { buildParallelToolsSection } from \"./parallel-tools.js\";\nexport { buildPoliciesSection } from \"./policies.js\";\nexport { buildStyleSection } from \"./style.js\";\nexport { categorizeTools } from \"./tool-categorization.js\";\nexport { buildToolSection } from \"./tool-section.js\";\nexport type { AvailableTool } from \"./types.js\";\nexport { buildVerificationSection } from \"./verification.js\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export type { BuildDynamicSystemPromptOptions } from \"./build.ts\";\nexport { buildDynamicSystemPrompt } from \"./build.ts\";\nexport { buildExplorationSection } from \"./exploration.ts\";\nexport { buildIdentitySection } from \"./identity.ts\";\nexport { buildIntentGate } from \"./intent-gate.ts\";\nexport { buildParallelToolsSection } from \"./parallel-tools.ts\";\nexport { buildPoliciesSection } from \"./policies.ts\";\nexport { buildStyleSection } from \"./style.ts\";\nexport { categorizeTools } from \"./tool-categorization.ts\";\nexport { buildToolSection } from \"./tool-section.ts\";\nexport type { AvailableTool } from \"./types.ts\";\nexport { buildVerificationSection } from \"./verification.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export type { BuildDynamicSystemPromptOptions } from \"./build.js\";\nexport { buildDynamicSystemPrompt } from \"./build.js\";\nexport { buildExplorationSection } from \"./exploration.js\";\nexport { buildIdentitySection } from \"./identity.js\";\nexport { buildIntentGate } from \"./intent-gate.js\";\nexport { buildParallelToolsSection } from \"./parallel-tools.js\";\nexport { buildPoliciesSection } from \"./policies.js\";\nexport { buildStyleSection } from \"./style.js\";\nexport { categorizeTools } from \"./tool-categorization.js\";\nexport { buildToolSection } from \"./tool-section.js\";\nexport type { AvailableTool } from \"./types.js\";\nexport { buildVerificationSection } from \"./verification.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export type { BuildDynamicSystemPromptOptions } from \"./build.ts\";\nexport { buildDynamicSystemPrompt } from \"./build.ts\";\nexport { buildExplorationSection } from \"./exploration.ts\";\nexport { buildIdentitySection } from \"./identity.ts\";\nexport { buildIntentGate } from \"./intent-gate.ts\";\nexport { buildParallelToolsSection } from \"./parallel-tools.ts\";\nexport { buildPoliciesSection } from \"./policies.ts\";\nexport { buildStyleSection } from \"./style.ts\";\nexport { categorizeTools } from \"./tool-categorization.ts\";\nexport { buildToolSection } from \"./tool-section.ts\";\nexport type { AvailableTool } from \"./types.ts\";\nexport { buildVerificationSection } from \"./verification.ts\";\n"]}
@@ -1,4 +1,4 @@
1
- import type { AvailableTool } from "./types.js";
1
+ import type { AvailableTool } from "./types.ts";
2
2
  export declare function buildIntentGate(config: {
3
3
  tools: AvailableTool[];
4
4
  }): string;
@@ -1 +1 @@
1
- {"version":3,"file":"intent-gate.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/intent-gate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhD,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,MAAM,CA2C1E","sourcesContent":["import { getToolsPromptDisplay } from \"./tool-categorization.js\";\nimport type { AvailableTool } from \"./types.js\";\n\nfunction buildKeyTriggers(tools: AvailableTool[]): string {\n\tconst triggerTools = getToolsPromptDisplay(tools);\n\n\tif (!triggerTools) {\n\t\treturn \"- No specialized trigger tools are available on this turn.\";\n\t}\n\n\treturn [\n\t\t`- Specialized triggers available this turn: ${triggerTools}.`,\n\t\t\"- Use them when the user asks to locate symbols, perform structural code changes, or search the workspace.\",\n\t\t\"- Do not narrate a trigger that is unavailable in the current tool set.\",\n\t].join(\"\\n\");\n}\n\nexport function buildIntentGate(config: { tools: AvailableTool[] }): string {\n\treturn `## Intent Gate (EVERY message)\n\n### Key Triggers\n${buildKeyTriggers(config.tools)}\n\n### Routing\n\nIdentify what the user actually wants, then state your interpretation in one short line before acting:\n\n> I read this as [intent] - [plan].\n\nUse this routing map to map the surface form to the true intent:\n\n| Surface Form | True Intent | Approach |\n|---|---|---|\n| \"explain X\", \"how does Y work\" | Research | Read relevant code, then answer. |\n| \"implement X\", \"add Y\", \"create Z\" | Implementation | Assess codebase, plan, then execute. |\n| \"look into X\", \"check Y\", \"investigate\" | Investigation | Search and read, then report findings. |\n| \"what do you think about X?\" | Evaluation | Evaluate, propose, wait for confirmation. |\n| \"I'm seeing error X\" / \"Y is broken\" | Fix needed | Diagnose from error context, fix minimally. |\n| \"refactor\", \"improve\", \"clean up\" | Open-ended change | Assess codebase first, propose approach. |\n\nThe routing line is required. It anchors your decision and makes reasoning transparent. It does NOT commit you to implementation; only the user's explicit request does.\n\nDo not narrate prompt scaffolding (\"Step 0\", \"Thinking level\", XML tool-call examples) — only the routing line and any actual user-facing progress.\n\n### Request Classification\n- Trivial: answer directly when the request is self-contained.\n- Explicit: execute exactly what was asked, no extra scope.\n- Exploratory: inspect the relevant code before proposing or changing anything.\n- Open-ended: choose the smallest path that fully satisfies the goal.\n- Ambiguous: state the ambiguity briefly and resolve it from available context when possible.\n\n### Turn-Local Intent Reset\n- Re-evaluate the latest user turn from scratch.\n- Do not keep pursuing an earlier intent if the newest turn changes direction.\n- Treat queued follow-ups and steering messages as higher priority than stale plans.\n\n### Context-Completion Gate\n- Do not speculate about unread code, unseen test output, or unverified runtime behavior.\n- If the answer depends on code or artifacts, inspect them first.\n- Once enough context exists, act decisively instead of continuing to browse.`;\n}\n"]}
1
+ {"version":3,"file":"intent-gate.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/intent-gate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhD,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,MAAM,CA2C1E","sourcesContent":["import { getToolsPromptDisplay } from \"./tool-categorization.ts\";\nimport type { AvailableTool } from \"./types.ts\";\n\nfunction buildKeyTriggers(tools: AvailableTool[]): string {\n\tconst triggerTools = getToolsPromptDisplay(tools);\n\n\tif (!triggerTools) {\n\t\treturn \"- No specialized trigger tools are available on this turn.\";\n\t}\n\n\treturn [\n\t\t`- Specialized triggers available this turn: ${triggerTools}.`,\n\t\t\"- Use them when the user asks to locate symbols, perform structural code changes, or search the workspace.\",\n\t\t\"- Do not narrate a trigger that is unavailable in the current tool set.\",\n\t].join(\"\\n\");\n}\n\nexport function buildIntentGate(config: { tools: AvailableTool[] }): string {\n\treturn `## Intent Gate (EVERY message)\n\n### Key Triggers\n${buildKeyTriggers(config.tools)}\n\n### Routing\n\nIdentify what the user actually wants, then state your interpretation in one short line before acting:\n\n> I read this as [intent] - [plan].\n\nUse this routing map to map the surface form to the true intent:\n\n| Surface Form | True Intent | Approach |\n|---|---|---|\n| \"explain X\", \"how does Y work\" | Research | Read relevant code, then answer. |\n| \"implement X\", \"add Y\", \"create Z\" | Implementation | Assess codebase, plan, then execute. |\n| \"look into X\", \"check Y\", \"investigate\" | Investigation | Search and read, then report findings. |\n| \"what do you think about X?\" | Evaluation | Evaluate, propose, wait for confirmation. |\n| \"I'm seeing error X\" / \"Y is broken\" | Fix needed | Diagnose from error context, fix minimally. |\n| \"refactor\", \"improve\", \"clean up\" | Open-ended change | Assess codebase first, propose approach. |\n\nThe routing line is required. It anchors your decision and makes reasoning transparent. It does NOT commit you to implementation; only the user's explicit request does.\n\nDo not narrate prompt scaffolding (\"Step 0\", \"Thinking level\", XML tool-call examples) — only the routing line and any actual user-facing progress.\n\n### Request Classification\n- Trivial: answer directly when the request is self-contained.\n- Explicit: execute exactly what was asked, no extra scope.\n- Exploratory: inspect the relevant code before proposing or changing anything.\n- Open-ended: choose the smallest path that fully satisfies the goal.\n- Ambiguous: state the ambiguity briefly and resolve it from available context when possible.\n\n### Turn-Local Intent Reset\n- Re-evaluate the latest user turn from scratch.\n- Do not keep pursuing an earlier intent if the newest turn changes direction.\n- Treat queued follow-ups and steering messages as higher priority than stale plans.\n\n### Context-Completion Gate\n- Do not speculate about unread code, unseen test output, or unverified runtime behavior.\n- If the answer depends on code or artifacts, inspect them first.\n- Once enough context exists, act decisively instead of continuing to browse.`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"intent-gate.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/intent-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,SAAS,gBAAgB,CAAC,KAAsB,EAAU;IACzD,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,4DAA4D,CAAC;IACrE,CAAC;IAED,OAAO;QACN,+CAA+C,YAAY,GAAG;QAC9D,4GAA4G;QAC5G,yEAAyE;KACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACb;AAED,MAAM,UAAU,eAAe,CAAC,MAAkC,EAAU;IAC3E,OAAO;;;EAGN,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8EAsC8C,CAAC;AAAA,CAC9E","sourcesContent":["import { getToolsPromptDisplay } from \"./tool-categorization.js\";\nimport type { AvailableTool } from \"./types.js\";\n\nfunction buildKeyTriggers(tools: AvailableTool[]): string {\n\tconst triggerTools = getToolsPromptDisplay(tools);\n\n\tif (!triggerTools) {\n\t\treturn \"- No specialized trigger tools are available on this turn.\";\n\t}\n\n\treturn [\n\t\t`- Specialized triggers available this turn: ${triggerTools}.`,\n\t\t\"- Use them when the user asks to locate symbols, perform structural code changes, or search the workspace.\",\n\t\t\"- Do not narrate a trigger that is unavailable in the current tool set.\",\n\t].join(\"\\n\");\n}\n\nexport function buildIntentGate(config: { tools: AvailableTool[] }): string {\n\treturn `## Intent Gate (EVERY message)\n\n### Key Triggers\n${buildKeyTriggers(config.tools)}\n\n### Routing\n\nIdentify what the user actually wants, then state your interpretation in one short line before acting:\n\n> I read this as [intent] - [plan].\n\nUse this routing map to map the surface form to the true intent:\n\n| Surface Form | True Intent | Approach |\n|---|---|---|\n| \"explain X\", \"how does Y work\" | Research | Read relevant code, then answer. |\n| \"implement X\", \"add Y\", \"create Z\" | Implementation | Assess codebase, plan, then execute. |\n| \"look into X\", \"check Y\", \"investigate\" | Investigation | Search and read, then report findings. |\n| \"what do you think about X?\" | Evaluation | Evaluate, propose, wait for confirmation. |\n| \"I'm seeing error X\" / \"Y is broken\" | Fix needed | Diagnose from error context, fix minimally. |\n| \"refactor\", \"improve\", \"clean up\" | Open-ended change | Assess codebase first, propose approach. |\n\nThe routing line is required. It anchors your decision and makes reasoning transparent. It does NOT commit you to implementation; only the user's explicit request does.\n\nDo not narrate prompt scaffolding (\"Step 0\", \"Thinking level\", XML tool-call examples) — only the routing line and any actual user-facing progress.\n\n### Request Classification\n- Trivial: answer directly when the request is self-contained.\n- Explicit: execute exactly what was asked, no extra scope.\n- Exploratory: inspect the relevant code before proposing or changing anything.\n- Open-ended: choose the smallest path that fully satisfies the goal.\n- Ambiguous: state the ambiguity briefly and resolve it from available context when possible.\n\n### Turn-Local Intent Reset\n- Re-evaluate the latest user turn from scratch.\n- Do not keep pursuing an earlier intent if the newest turn changes direction.\n- Treat queued follow-ups and steering messages as higher priority than stale plans.\n\n### Context-Completion Gate\n- Do not speculate about unread code, unseen test output, or unverified runtime behavior.\n- If the answer depends on code or artifacts, inspect them first.\n- Once enough context exists, act decisively instead of continuing to browse.`;\n}\n"]}
1
+ {"version":3,"file":"intent-gate.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/intent-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,SAAS,gBAAgB,CAAC,KAAsB,EAAU;IACzD,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,4DAA4D,CAAC;IACrE,CAAC;IAED,OAAO;QACN,+CAA+C,YAAY,GAAG;QAC9D,4GAA4G;QAC5G,yEAAyE;KACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACb;AAED,MAAM,UAAU,eAAe,CAAC,MAAkC,EAAU;IAC3E,OAAO;;;EAGN,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8EAsC8C,CAAC;AAAA,CAC9E","sourcesContent":["import { getToolsPromptDisplay } from \"./tool-categorization.ts\";\nimport type { AvailableTool } from \"./types.ts\";\n\nfunction buildKeyTriggers(tools: AvailableTool[]): string {\n\tconst triggerTools = getToolsPromptDisplay(tools);\n\n\tif (!triggerTools) {\n\t\treturn \"- No specialized trigger tools are available on this turn.\";\n\t}\n\n\treturn [\n\t\t`- Specialized triggers available this turn: ${triggerTools}.`,\n\t\t\"- Use them when the user asks to locate symbols, perform structural code changes, or search the workspace.\",\n\t\t\"- Do not narrate a trigger that is unavailable in the current tool set.\",\n\t].join(\"\\n\");\n}\n\nexport function buildIntentGate(config: { tools: AvailableTool[] }): string {\n\treturn `## Intent Gate (EVERY message)\n\n### Key Triggers\n${buildKeyTriggers(config.tools)}\n\n### Routing\n\nIdentify what the user actually wants, then state your interpretation in one short line before acting:\n\n> I read this as [intent] - [plan].\n\nUse this routing map to map the surface form to the true intent:\n\n| Surface Form | True Intent | Approach |\n|---|---|---|\n| \"explain X\", \"how does Y work\" | Research | Read relevant code, then answer. |\n| \"implement X\", \"add Y\", \"create Z\" | Implementation | Assess codebase, plan, then execute. |\n| \"look into X\", \"check Y\", \"investigate\" | Investigation | Search and read, then report findings. |\n| \"what do you think about X?\" | Evaluation | Evaluate, propose, wait for confirmation. |\n| \"I'm seeing error X\" / \"Y is broken\" | Fix needed | Diagnose from error context, fix minimally. |\n| \"refactor\", \"improve\", \"clean up\" | Open-ended change | Assess codebase first, propose approach. |\n\nThe routing line is required. It anchors your decision and makes reasoning transparent. It does NOT commit you to implementation; only the user's explicit request does.\n\nDo not narrate prompt scaffolding (\"Step 0\", \"Thinking level\", XML tool-call examples) — only the routing line and any actual user-facing progress.\n\n### Request Classification\n- Trivial: answer directly when the request is self-contained.\n- Explicit: execute exactly what was asked, no extra scope.\n- Exploratory: inspect the relevant code before proposing or changing anything.\n- Open-ended: choose the smallest path that fully satisfies the goal.\n- Ambiguous: state the ambiguity briefly and resolve it from available context when possible.\n\n### Turn-Local Intent Reset\n- Re-evaluate the latest user turn from scratch.\n- Do not keep pursuing an earlier intent if the newest turn changes direction.\n- Treat queued follow-ups and steering messages as higher priority than stale plans.\n\n### Context-Completion Gate\n- Do not speculate about unread code, unseen test output, or unverified runtime behavior.\n- If the answer depends on code or artifacts, inspect them first.\n- Once enough context exists, act decisively instead of continuing to browse.`;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { AvailableTool } from "./types.js";
1
+ import type { AvailableTool } from "./types.ts";
2
2
  export declare function categorizeTools(toolNames: string[]): AvailableTool[];
3
3
  export declare function getToolsPromptDisplay(tools: AvailableTool[]): string;
4
4
  //# sourceMappingURL=tool-categorization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-categorization.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-categorization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAehD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAWpE","sourcesContent":["import type { AvailableTool } from \"./types.js\";\n\nfunction getToolCategory(name: string): AvailableTool[\"category\"] {\n\tif (name === \"grep\" || name === \"glob\") {\n\t\treturn \"search\";\n\t}\n\tif (name.startsWith(\"session_\")) {\n\t\treturn \"session\";\n\t}\n\tif (name === \"skill\") {\n\t\treturn \"command\";\n\t}\n\treturn \"other\";\n}\n\nexport function categorizeTools(toolNames: string[]): AvailableTool[] {\n\treturn toolNames.map((name) => ({ name, category: getToolCategory(name) }));\n}\n\nexport function getToolsPromptDisplay(tools: AvailableTool[]): string {\n\tconst displayNames: string[] = [];\n\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"grep\")) {\n\t\tdisplayNames.push(\"`grep`\");\n\t}\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"glob\")) {\n\t\tdisplayNames.push(\"`glob`\");\n\t}\n\n\treturn displayNames.join(\", \");\n}\n"]}
1
+ {"version":3,"file":"tool-categorization.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-categorization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAehD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAWpE","sourcesContent":["import type { AvailableTool } from \"./types.ts\";\n\nfunction getToolCategory(name: string): AvailableTool[\"category\"] {\n\tif (name === \"grep\" || name === \"glob\") {\n\t\treturn \"search\";\n\t}\n\tif (name.startsWith(\"session_\")) {\n\t\treturn \"session\";\n\t}\n\tif (name === \"skill\") {\n\t\treturn \"command\";\n\t}\n\treturn \"other\";\n}\n\nexport function categorizeTools(toolNames: string[]): AvailableTool[] {\n\treturn toolNames.map((name) => ({ name, category: getToolCategory(name) }));\n}\n\nexport function getToolsPromptDisplay(tools: AvailableTool[]): string {\n\tconst displayNames: string[] = [];\n\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"grep\")) {\n\t\tdisplayNames.push(\"`grep`\");\n\t}\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"glob\")) {\n\t\tdisplayNames.push(\"`glob`\");\n\t}\n\n\treturn displayNames.join(\", \");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-categorization.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-categorization.ts"],"names":[],"mappings":"AAEA,SAAS,eAAe,CAAC,IAAY,EAA6B;IACjE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AAAA,CACf;AAED,MAAM,UAAU,eAAe,CAAC,SAAmB,EAAmB;IACrE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,CAC5E;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAsB,EAAU;IACrE,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/B","sourcesContent":["import type { AvailableTool } from \"./types.js\";\n\nfunction getToolCategory(name: string): AvailableTool[\"category\"] {\n\tif (name === \"grep\" || name === \"glob\") {\n\t\treturn \"search\";\n\t}\n\tif (name.startsWith(\"session_\")) {\n\t\treturn \"session\";\n\t}\n\tif (name === \"skill\") {\n\t\treturn \"command\";\n\t}\n\treturn \"other\";\n}\n\nexport function categorizeTools(toolNames: string[]): AvailableTool[] {\n\treturn toolNames.map((name) => ({ name, category: getToolCategory(name) }));\n}\n\nexport function getToolsPromptDisplay(tools: AvailableTool[]): string {\n\tconst displayNames: string[] = [];\n\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"grep\")) {\n\t\tdisplayNames.push(\"`grep`\");\n\t}\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"glob\")) {\n\t\tdisplayNames.push(\"`glob`\");\n\t}\n\n\treturn displayNames.join(\", \");\n}\n"]}
1
+ {"version":3,"file":"tool-categorization.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-categorization.ts"],"names":[],"mappings":"AAEA,SAAS,eAAe,CAAC,IAAY,EAA6B;IACjE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AAAA,CACf;AAED,MAAM,UAAU,eAAe,CAAC,SAAmB,EAAmB;IACrE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,CAC5E;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAsB,EAAU;IACrE,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/B","sourcesContent":["import type { AvailableTool } from \"./types.ts\";\n\nfunction getToolCategory(name: string): AvailableTool[\"category\"] {\n\tif (name === \"grep\" || name === \"glob\") {\n\t\treturn \"search\";\n\t}\n\tif (name.startsWith(\"session_\")) {\n\t\treturn \"session\";\n\t}\n\tif (name === \"skill\") {\n\t\treturn \"command\";\n\t}\n\treturn \"other\";\n}\n\nexport function categorizeTools(toolNames: string[]): AvailableTool[] {\n\treturn toolNames.map((name) => ({ name, category: getToolCategory(name) }));\n}\n\nexport function getToolsPromptDisplay(tools: AvailableTool[]): string {\n\tconst displayNames: string[] = [];\n\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"grep\")) {\n\t\tdisplayNames.push(\"`grep`\");\n\t}\n\tif (tools.some((tool) => tool.category === \"search\" && tool.name === \"glob\")) {\n\t\tdisplayNames.push(\"`glob`\");\n\t}\n\n\treturn displayNames.join(\", \");\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { AvailableTool } from "./types.js";
1
+ import type { AvailableTool } from "./types.ts";
2
2
  export declare function buildToolSection(options: {
3
3
  tools: AvailableTool[];
4
4
  toolSnippets: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-section.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-section.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWhD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACzC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,GAAG,MAAM,CA6CT","sourcesContent":["import type { AvailableTool } from \"./types.js\";\n\nconst CATEGORY_ORDER = [\"search\", \"other\", \"session\", \"command\"] as const;\n\nconst CATEGORY_LABELS: Record<AvailableTool[\"category\"], string> = {\n\tsearch: \"Search\",\n\tother: \"Core Tools\",\n\tsession: \"Session\",\n\tcommand: \"Commands\",\n};\n\nexport function buildToolSection(options: {\n\ttools: AvailableTool[];\n\ttoolSnippets: Record<string, string>;\n\tpromptGuidelines?: string[];\n}): string {\n\tconst groupedTools = new Map<AvailableTool[\"category\"], Array<{ name: string; snippet: string }>>();\n\n\tfor (const tool of options.tools) {\n\t\tconst snippet = options.toolSnippets[tool.name]?.trim();\n\t\tif (!snippet) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingTools = groupedTools.get(tool.category) ?? [];\n\t\texistingTools.push({ name: tool.name, snippet });\n\t\tgroupedTools.set(tool.category, existingTools);\n\t}\n\n\tconst lines = [\"## Available Tools\", \"\"];\n\tlet hasVisibleTools = false;\n\n\tfor (const category of CATEGORY_ORDER) {\n\t\tconst categoryTools = groupedTools.get(category);\n\t\tif (!categoryTools || categoryTools.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\thasVisibleTools = true;\n\t\tlines.push(`### ${CATEGORY_LABELS[category]}`);\n\t\tfor (const tool of categoryTools) {\n\t\t\tlines.push(`- ${tool.name}: ${tool.snippet}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tif (!hasVisibleTools) {\n\t\tlines.push(\"(none)\", \"\");\n\t}\n\n\tconst guidelines = options.promptGuidelines?.map((guideline) => guideline.trim()).filter((guideline) => guideline);\n\tif (guidelines && guidelines.length > 0) {\n\t\tlines.push(\"## Tool Guidelines\", \"\");\n\t\tfor (const guideline of guidelines) {\n\t\t\tlines.push(`- ${guideline}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
1
+ {"version":3,"file":"tool-section.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-section.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWhD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACzC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,GAAG,MAAM,CA6CT","sourcesContent":["import type { AvailableTool } from \"./types.ts\";\n\nconst CATEGORY_ORDER = [\"search\", \"other\", \"session\", \"command\"] as const;\n\nconst CATEGORY_LABELS: Record<AvailableTool[\"category\"], string> = {\n\tsearch: \"Search\",\n\tother: \"Core Tools\",\n\tsession: \"Session\",\n\tcommand: \"Commands\",\n};\n\nexport function buildToolSection(options: {\n\ttools: AvailableTool[];\n\ttoolSnippets: Record<string, string>;\n\tpromptGuidelines?: string[];\n}): string {\n\tconst groupedTools = new Map<AvailableTool[\"category\"], Array<{ name: string; snippet: string }>>();\n\n\tfor (const tool of options.tools) {\n\t\tconst snippet = options.toolSnippets[tool.name]?.trim();\n\t\tif (!snippet) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingTools = groupedTools.get(tool.category) ?? [];\n\t\texistingTools.push({ name: tool.name, snippet });\n\t\tgroupedTools.set(tool.category, existingTools);\n\t}\n\n\tconst lines = [\"## Available Tools\", \"\"];\n\tlet hasVisibleTools = false;\n\n\tfor (const category of CATEGORY_ORDER) {\n\t\tconst categoryTools = groupedTools.get(category);\n\t\tif (!categoryTools || categoryTools.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\thasVisibleTools = true;\n\t\tlines.push(`### ${CATEGORY_LABELS[category]}`);\n\t\tfor (const tool of categoryTools) {\n\t\t\tlines.push(`- ${tool.name}: ${tool.snippet}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tif (!hasVisibleTools) {\n\t\tlines.push(\"(none)\", \"\");\n\t}\n\n\tconst guidelines = options.promptGuidelines?.map((guideline) => guideline.trim()).filter((guideline) => guideline);\n\tif (guidelines && guidelines.length > 0) {\n\t\tlines.push(\"## Tool Guidelines\", \"\");\n\t\tfor (const guideline of guidelines) {\n\t\t\tlines.push(`- ${guideline}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-section.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-section.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAE1E,MAAM,eAAe,GAA8C;IAClE,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,UAAU;CACnB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,OAIhC,EAAU;IACV,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuE,CAAC;IAEpG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,SAAS;QACV,CAAC;QAED,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,SAAS;QACV,CAAC;QAED,eAAe,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IACnH,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAAA,CAClC","sourcesContent":["import type { AvailableTool } from \"./types.js\";\n\nconst CATEGORY_ORDER = [\"search\", \"other\", \"session\", \"command\"] as const;\n\nconst CATEGORY_LABELS: Record<AvailableTool[\"category\"], string> = {\n\tsearch: \"Search\",\n\tother: \"Core Tools\",\n\tsession: \"Session\",\n\tcommand: \"Commands\",\n};\n\nexport function buildToolSection(options: {\n\ttools: AvailableTool[];\n\ttoolSnippets: Record<string, string>;\n\tpromptGuidelines?: string[];\n}): string {\n\tconst groupedTools = new Map<AvailableTool[\"category\"], Array<{ name: string; snippet: string }>>();\n\n\tfor (const tool of options.tools) {\n\t\tconst snippet = options.toolSnippets[tool.name]?.trim();\n\t\tif (!snippet) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingTools = groupedTools.get(tool.category) ?? [];\n\t\texistingTools.push({ name: tool.name, snippet });\n\t\tgroupedTools.set(tool.category, existingTools);\n\t}\n\n\tconst lines = [\"## Available Tools\", \"\"];\n\tlet hasVisibleTools = false;\n\n\tfor (const category of CATEGORY_ORDER) {\n\t\tconst categoryTools = groupedTools.get(category);\n\t\tif (!categoryTools || categoryTools.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\thasVisibleTools = true;\n\t\tlines.push(`### ${CATEGORY_LABELS[category]}`);\n\t\tfor (const tool of categoryTools) {\n\t\t\tlines.push(`- ${tool.name}: ${tool.snippet}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tif (!hasVisibleTools) {\n\t\tlines.push(\"(none)\", \"\");\n\t}\n\n\tconst guidelines = options.promptGuidelines?.map((guideline) => guideline.trim()).filter((guideline) => guideline);\n\tif (guidelines && guidelines.length > 0) {\n\t\tlines.push(\"## Tool Guidelines\", \"\");\n\t\tfor (const guideline of guidelines) {\n\t\t\tlines.push(`- ${guideline}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
1
+ {"version":3,"file":"tool-section.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/tool-section.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAE1E,MAAM,eAAe,GAA8C;IAClE,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,UAAU;CACnB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,OAIhC,EAAU;IACV,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuE,CAAC;IAEpG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,SAAS;QACV,CAAC;QAED,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,SAAS;QACV,CAAC;QAED,eAAe,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IACnH,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAAA,CAClC","sourcesContent":["import type { AvailableTool } from \"./types.ts\";\n\nconst CATEGORY_ORDER = [\"search\", \"other\", \"session\", \"command\"] as const;\n\nconst CATEGORY_LABELS: Record<AvailableTool[\"category\"], string> = {\n\tsearch: \"Search\",\n\tother: \"Core Tools\",\n\tsession: \"Session\",\n\tcommand: \"Commands\",\n};\n\nexport function buildToolSection(options: {\n\ttools: AvailableTool[];\n\ttoolSnippets: Record<string, string>;\n\tpromptGuidelines?: string[];\n}): string {\n\tconst groupedTools = new Map<AvailableTool[\"category\"], Array<{ name: string; snippet: string }>>();\n\n\tfor (const tool of options.tools) {\n\t\tconst snippet = options.toolSnippets[tool.name]?.trim();\n\t\tif (!snippet) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingTools = groupedTools.get(tool.category) ?? [];\n\t\texistingTools.push({ name: tool.name, snippet });\n\t\tgroupedTools.set(tool.category, existingTools);\n\t}\n\n\tconst lines = [\"## Available Tools\", \"\"];\n\tlet hasVisibleTools = false;\n\n\tfor (const category of CATEGORY_ORDER) {\n\t\tconst categoryTools = groupedTools.get(category);\n\t\tif (!categoryTools || categoryTools.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\thasVisibleTools = true;\n\t\tlines.push(`### ${CATEGORY_LABELS[category]}`);\n\t\tfor (const tool of categoryTools) {\n\t\t\tlines.push(`- ${tool.name}: ${tool.snippet}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tif (!hasVisibleTools) {\n\t\tlines.push(\"(none)\", \"\");\n\t}\n\n\tconst guidelines = options.promptGuidelines?.map((guideline) => guideline.trim()).filter((guideline) => guideline);\n\tif (guidelines && guidelines.length > 0) {\n\t\tlines.push(\"## Tool Guidelines\", \"\");\n\t\tfor (const guideline of guidelines) {\n\t\t\tlines.push(`- ${guideline}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,wCAAwC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAoErB","sourcesContent":["/**\n * Shared command execution utilities for extensions and custom tools.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { waitForChildProcess } from \"../utils/child-process.js\";\n\n/**\n * Options for executing shell commands.\n */\nexport interface ExecOptions {\n\t/** AbortSignal to cancel the command */\n\tsignal?: AbortSignal;\n\t/** Timeout in milliseconds */\n\ttimeout?: number;\n\t/** Working directory */\n\tcwd?: string;\n}\n\n/**\n * Result of executing a shell command.\n */\nexport interface ExecResult {\n\tstdout: string;\n\tstderr: string;\n\tcode: number;\n\tkilled: boolean;\n}\n\n/**\n * Execute a shell command and return stdout/stderr/code.\n * Supports timeout and abort signal.\n */\nexport async function execCommand(\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tshell: false,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet killed = false;\n\t\tlet timeoutId: NodeJS.Timeout | undefined;\n\n\t\tconst killProcess = () => {\n\t\t\tif (!killed) {\n\t\t\t\tkilled = true;\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\t// Force kill after 5 seconds if SIGTERM doesn't work\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!proc.killed) {\n\t\t\t\t\t\tproc.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t};\n\n\t\t// Handle abort signal\n\t\tif (options?.signal) {\n\t\t\tif (options.signal.aborted) {\n\t\t\t\tkillProcess();\n\t\t\t} else {\n\t\t\t\toptions.signal.addEventListener(\"abort\", killProcess, { once: true });\n\t\t\t}\n\t\t}\n\n\t\t// Handle timeout\n\t\tif (options?.timeout && options.timeout > 0) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tkillProcess();\n\t\t\t}, options.timeout);\n\t\t}\n\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\t// Wait for process termination without hanging on inherited stdio handles\n\t\t// held open by detached descendants.\n\t\twaitForChildProcess(proc)\n\t\t\t.then((code) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: code ?? 0, killed });\n\t\t\t})\n\t\t\t.catch((_err) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: 1, killed });\n\t\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,wCAAwC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAoErB","sourcesContent":["/**\n * Shared command execution utilities for extensions and custom tools.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { waitForChildProcess } from \"../utils/child-process.ts\";\n\n/**\n * Options for executing shell commands.\n */\nexport interface ExecOptions {\n\t/** AbortSignal to cancel the command */\n\tsignal?: AbortSignal;\n\t/** Timeout in milliseconds */\n\ttimeout?: number;\n\t/** Working directory */\n\tcwd?: string;\n}\n\n/**\n * Result of executing a shell command.\n */\nexport interface ExecResult {\n\tstdout: string;\n\tstderr: string;\n\tcode: number;\n\tkilled: boolean;\n}\n\n/**\n * Execute a shell command and return stdout/stderr/code.\n * Supports timeout and abort signal.\n */\nexport async function execCommand(\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tshell: false,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet killed = false;\n\t\tlet timeoutId: NodeJS.Timeout | undefined;\n\n\t\tconst killProcess = () => {\n\t\t\tif (!killed) {\n\t\t\t\tkilled = true;\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\t// Force kill after 5 seconds if SIGTERM doesn't work\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!proc.killed) {\n\t\t\t\t\t\tproc.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t};\n\n\t\t// Handle abort signal\n\t\tif (options?.signal) {\n\t\t\tif (options.signal.aborted) {\n\t\t\t\tkillProcess();\n\t\t\t} else {\n\t\t\t\toptions.signal.addEventListener(\"abort\", killProcess, { once: true });\n\t\t\t}\n\t\t}\n\n\t\t// Handle timeout\n\t\tif (options?.timeout && options.timeout > 0) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tkillProcess();\n\t\t\t}, options.timeout);\n\t\t}\n\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\t// Wait for process termination without hanging on inherited stdio handles\n\t\t// held open by detached descendants.\n\t\twaitForChildProcess(proc)\n\t\t\t.then((code) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: code ?? 0, killed });\n\t\t\t})\n\t\t\t.catch((_err) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: 1, killed });\n\t\t\t});\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAwBhE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,OAAe,EACf,IAAc,EACd,GAAW,EACX,OAAqB,EACC;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG;YACH,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACjC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,SAAqC,CAAC;QAE1C,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,qDAAqD;gBACrD,UAAU,CAAC,GAAG,EAAE,CAAC;oBAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;wBAClB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,CAAC;gBAAA,CACD,EAAE,IAAI,CAAC,CAAC;YACV,CAAC;QAAA,CACD,CAAC;QAEF,sBAAsB;QACtB,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5B,WAAW,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;QACF,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YAC7C,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;gBAC5B,WAAW,EAAE,CAAC;YAAA,CACd,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAA,CAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAA,CAC1B,CAAC,CAAC;QAEH,0EAA0E;QAC1E,qCAAqC;QACrC,mBAAmB,CAAC,IAAI,CAAC;aACvB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACf,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAAA,CACrD,CAAC;aACD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAAA,CAC7C,CAAC,CAAC;IAAA,CACJ,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * Shared command execution utilities for extensions and custom tools.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { waitForChildProcess } from \"../utils/child-process.js\";\n\n/**\n * Options for executing shell commands.\n */\nexport interface ExecOptions {\n\t/** AbortSignal to cancel the command */\n\tsignal?: AbortSignal;\n\t/** Timeout in milliseconds */\n\ttimeout?: number;\n\t/** Working directory */\n\tcwd?: string;\n}\n\n/**\n * Result of executing a shell command.\n */\nexport interface ExecResult {\n\tstdout: string;\n\tstderr: string;\n\tcode: number;\n\tkilled: boolean;\n}\n\n/**\n * Execute a shell command and return stdout/stderr/code.\n * Supports timeout and abort signal.\n */\nexport async function execCommand(\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tshell: false,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet killed = false;\n\t\tlet timeoutId: NodeJS.Timeout | undefined;\n\n\t\tconst killProcess = () => {\n\t\t\tif (!killed) {\n\t\t\t\tkilled = true;\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\t// Force kill after 5 seconds if SIGTERM doesn't work\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!proc.killed) {\n\t\t\t\t\t\tproc.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t};\n\n\t\t// Handle abort signal\n\t\tif (options?.signal) {\n\t\t\tif (options.signal.aborted) {\n\t\t\t\tkillProcess();\n\t\t\t} else {\n\t\t\t\toptions.signal.addEventListener(\"abort\", killProcess, { once: true });\n\t\t\t}\n\t\t}\n\n\t\t// Handle timeout\n\t\tif (options?.timeout && options.timeout > 0) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tkillProcess();\n\t\t\t}, options.timeout);\n\t\t}\n\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\t// Wait for process termination without hanging on inherited stdio handles\n\t\t// held open by detached descendants.\n\t\twaitForChildProcess(proc)\n\t\t\t.then((code) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: code ?? 0, killed });\n\t\t\t})\n\t\t\t.catch((_err) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: 1, killed });\n\t\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared command execution utilities for extensions and custom tools.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { waitForChildProcess } from \"../utils/child-process.ts\";\n\n/**\n * Options for executing shell commands.\n */\nexport interface ExecOptions {\n\t/** AbortSignal to cancel the command */\n\tsignal?: AbortSignal;\n\t/** Timeout in milliseconds */\n\ttimeout?: number;\n\t/** Working directory */\n\tcwd?: string;\n}\n\n/**\n * Result of executing a shell command.\n */\nexport interface ExecResult {\n\tstdout: string;\n\tstderr: string;\n\tcode: number;\n\tkilled: boolean;\n}\n\n/**\n * Execute a shell command and return stdout/stderr/code.\n * Supports timeout and abort signal.\n */\nexport async function execCommand(\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tshell: false,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet killed = false;\n\t\tlet timeoutId: NodeJS.Timeout | undefined;\n\n\t\tconst killProcess = () => {\n\t\t\tif (!killed) {\n\t\t\t\tkilled = true;\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\t// Force kill after 5 seconds if SIGTERM doesn't work\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!proc.killed) {\n\t\t\t\t\t\tproc.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t};\n\n\t\t// Handle abort signal\n\t\tif (options?.signal) {\n\t\t\tif (options.signal.aborted) {\n\t\t\t\tkillProcess();\n\t\t\t} else {\n\t\t\t\toptions.signal.addEventListener(\"abort\", killProcess, { once: true });\n\t\t\t}\n\t\t}\n\n\t\t// Handle timeout\n\t\tif (options?.timeout && options.timeout > 0) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tkillProcess();\n\t\t\t}, options.timeout);\n\t\t}\n\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\t// Wait for process termination without hanging on inherited stdio handles\n\t\t// held open by detached descendants.\n\t\twaitForChildProcess(proc)\n\t\t\t.then((code) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: code ?? 0, killed });\n\t\t\t})\n\t\t\t.catch((_err) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: 1, killed });\n\t\t\t});\n\t});\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { AgentState } from "@earendil-works/pi-agent-core";
2
- import { SessionManager } from "../session-manager.js";
2
+ import { SessionManager } from "../session-manager.ts";
3
3
  /**
4
4
  * Interface for rendering custom tools to HTML.
5
5
  * Used by agent-session to pre-render extension tool output.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAOhE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,oFAAoF;IACpF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACpF,4GAA4G;IAC5G,YAAY,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACd;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzD;AASD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAgMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,cAAc,EAClB,KAAK,CAAC,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BzG","sourcesContent":["import type { AgentState } from \"@earendil-works/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, expandTildePath, getExportTemplateDir } from \"../../config.js\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolDefinition } from \"../extensions/types.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\nimport { SessionManager } from \"../session-manager.js\";\n\n/**\n * Interface for rendering custom tools to HTML.\n * Used by agent-session to pre-render extension tool output.\n */\nexport interface ToolHtmlRenderer {\n\t/** Render a tool call to HTML. Returns undefined if tool has no custom renderer. */\n\trenderCall(toolCallId: string, toolName: string, args: unknown): string | undefined;\n\t/** Render a tool result to HTML. Returns collapsed/expanded or undefined if tool has no custom renderer. */\n\trenderResult(\n\t\ttoolCallId: string,\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\n\n/** Pre-rendered HTML for a custom tool call and result */\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\n\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\t/** Optional tool renderer for custom tools */\n\ttoolRenderer?: ToolHtmlRenderer;\n}\n\n/** Parse a color string to RGB values. Supports hex (#RRGGBB) and rgb(r,g,b) formats. */\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\n\n/** Calculate relative luminance of a color (0-1, higher = lighter). */\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** Adjust color brightness. Factor > 1 lightens, < 1 darkens. */\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\n\n/** Derive export background colors from a base color (e.g., userMessageBg). */\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\n\n/**\n * Generate CSS custom property declarations from theme colors.\n */\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\n\t// Use explicit theme export colors if available, otherwise derive from userMessageBg\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\n\treturn lines.join(\"\\n \");\n}\n\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: Array<Pick<ToolDefinition, \"name\" | \"description\" | \"parameters\">>;\n\t/** Pre-rendered HTML for custom tool calls/results, keyed by tool call ID */\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\n\n/**\n * Core HTML generation logic shared by both export functions.\n */\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst derivedExportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = themeExport.pageBg ?? derivedExportColors.pageBg;\n\tconst containerBg = themeExport.cardBg ?? derivedExportColors.cardBg;\n\tconst infoBg = themeExport.infoBg ?? derivedExportColors.infoBg;\n\n\t// Base64 encode session data to avoid escaping issues\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\n\t// Build the CSS with theme variables injected\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\n\n/** Tools rendered directly by the HTML template (not pre-rendered via TUI→ANSI→HTML pipeline) */\nconst TEMPLATE_RENDERED_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\"]);\n\n/**\n * Pre-render custom tools to HTML using their TUI renderers.\n */\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\n\t\t// Find tool calls in assistant messages\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !TEMPLATE_RENDERED_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.id, block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find tool results\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\t// Only render if we have a pre-rendered call OR it's not template-rendered\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !TEMPLATE_RENDERED_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(\n\t\t\t\t\tmsg.toolCallId,\n\t\t\t\t\ttoolName,\n\t\t\t\t\tmsg.content,\n\t\t\t\t\tmsg.details,\n\t\t\t\t\tmsg.isError || false,\n\t\t\t\t);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn renderedTools;\n}\n\n/**\n * Export session to HTML using SessionManager and AgentState.\n * Used by TUI's /export command.\n */\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\n\tconst entries = sm.getEntries();\n\n\t// Pre-render custom tools if a tool renderer is provided\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\t// Only include if we actually rendered something\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n\n/**\n * Export session file to HTML (standalone, without AgentState).\n * Used by CLI for exporting arbitrary session files.\n */\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tinputPath = expandTildePath(inputPath);\n\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\n\tconst sm = SessionManager.open(inputPath);\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAOhE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,oFAAoF;IACpF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACpF,4GAA4G;IAC5G,YAAY,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACd;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzD;AASD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAgMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,cAAc,EAClB,KAAK,CAAC,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BzG","sourcesContent":["import type { AgentState } from \"@earendil-works/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, expandTildePath, getExportTemplateDir } from \"../../config.ts\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SessionEntry } from \"../session-manager.ts\";\nimport { SessionManager } from \"../session-manager.ts\";\n\n/**\n * Interface for rendering custom tools to HTML.\n * Used by agent-session to pre-render extension tool output.\n */\nexport interface ToolHtmlRenderer {\n\t/** Render a tool call to HTML. Returns undefined if tool has no custom renderer. */\n\trenderCall(toolCallId: string, toolName: string, args: unknown): string | undefined;\n\t/** Render a tool result to HTML. Returns collapsed/expanded or undefined if tool has no custom renderer. */\n\trenderResult(\n\t\ttoolCallId: string,\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\n\n/** Pre-rendered HTML for a custom tool call and result */\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\n\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\t/** Optional tool renderer for custom tools */\n\ttoolRenderer?: ToolHtmlRenderer;\n}\n\n/** Parse a color string to RGB values. Supports hex (#RRGGBB) and rgb(r,g,b) formats. */\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\n\n/** Calculate relative luminance of a color (0-1, higher = lighter). */\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** Adjust color brightness. Factor > 1 lightens, < 1 darkens. */\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\n\n/** Derive export background colors from a base color (e.g., userMessageBg). */\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\n\n/**\n * Generate CSS custom property declarations from theme colors.\n */\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\n\t// Use explicit theme export colors if available, otherwise derive from userMessageBg\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\n\treturn lines.join(\"\\n \");\n}\n\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: Array<Pick<ToolDefinition, \"name\" | \"description\" | \"parameters\">>;\n\t/** Pre-rendered HTML for custom tool calls/results, keyed by tool call ID */\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\n\n/**\n * Core HTML generation logic shared by both export functions.\n */\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst derivedExportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = themeExport.pageBg ?? derivedExportColors.pageBg;\n\tconst containerBg = themeExport.cardBg ?? derivedExportColors.cardBg;\n\tconst infoBg = themeExport.infoBg ?? derivedExportColors.infoBg;\n\n\t// Base64 encode session data to avoid escaping issues\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\n\t// Build the CSS with theme variables injected\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\n\n/** Tools rendered directly by the HTML template (not pre-rendered via TUI→ANSI→HTML pipeline) */\nconst TEMPLATE_RENDERED_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\"]);\n\n/**\n * Pre-render custom tools to HTML using their TUI renderers.\n */\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\n\t\t// Find tool calls in assistant messages\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !TEMPLATE_RENDERED_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.id, block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find tool results\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\t// Only render if we have a pre-rendered call OR it's not template-rendered\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !TEMPLATE_RENDERED_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(\n\t\t\t\t\tmsg.toolCallId,\n\t\t\t\t\ttoolName,\n\t\t\t\t\tmsg.content,\n\t\t\t\t\tmsg.details,\n\t\t\t\t\tmsg.isError || false,\n\t\t\t\t);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn renderedTools;\n}\n\n/**\n * Export session to HTML using SessionManager and AgentState.\n * Used by TUI's /export command.\n */\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\n\tconst entries = sm.getEntries();\n\n\t// Pre-render custom tools if a tool renderer is provided\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\t// Only include if we actually rendered something\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n\n/**\n * Export session file to HTML (standalone, without AgentState).\n * Used by CLI for exporting arbitrary session files.\n */\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tinputPath = expandTildePath(inputPath);\n\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\n\tconst sm = SessionManager.open(inputPath);\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentState } from \"@earendil-works/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, expandTildePath, getExportTemplateDir } from \"../../config.js\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolDefinition } from \"../extensions/types.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\nimport { SessionManager } from \"../session-manager.js\";\n\n/**\n * Interface for rendering custom tools to HTML.\n * Used by agent-session to pre-render extension tool output.\n */\nexport interface ToolHtmlRenderer {\n\t/** Render a tool call to HTML. Returns undefined if tool has no custom renderer. */\n\trenderCall(toolCallId: string, toolName: string, args: unknown): string | undefined;\n\t/** Render a tool result to HTML. Returns collapsed/expanded or undefined if tool has no custom renderer. */\n\trenderResult(\n\t\ttoolCallId: string,\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\n\n/** Pre-rendered HTML for a custom tool call and result */\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\n\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\t/** Optional tool renderer for custom tools */\n\ttoolRenderer?: ToolHtmlRenderer;\n}\n\n/** Parse a color string to RGB values. Supports hex (#RRGGBB) and rgb(r,g,b) formats. */\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\n\n/** Calculate relative luminance of a color (0-1, higher = lighter). */\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** Adjust color brightness. Factor > 1 lightens, < 1 darkens. */\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\n\n/** Derive export background colors from a base color (e.g., userMessageBg). */\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\n\n/**\n * Generate CSS custom property declarations from theme colors.\n */\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\n\t// Use explicit theme export colors if available, otherwise derive from userMessageBg\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\n\treturn lines.join(\"\\n \");\n}\n\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: Array<Pick<ToolDefinition, \"name\" | \"description\" | \"parameters\">>;\n\t/** Pre-rendered HTML for custom tool calls/results, keyed by tool call ID */\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\n\n/**\n * Core HTML generation logic shared by both export functions.\n */\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst derivedExportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = themeExport.pageBg ?? derivedExportColors.pageBg;\n\tconst containerBg = themeExport.cardBg ?? derivedExportColors.cardBg;\n\tconst infoBg = themeExport.infoBg ?? derivedExportColors.infoBg;\n\n\t// Base64 encode session data to avoid escaping issues\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\n\t// Build the CSS with theme variables injected\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\n\n/** Tools rendered directly by the HTML template (not pre-rendered via TUI→ANSI→HTML pipeline) */\nconst TEMPLATE_RENDERED_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\"]);\n\n/**\n * Pre-render custom tools to HTML using their TUI renderers.\n */\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\n\t\t// Find tool calls in assistant messages\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !TEMPLATE_RENDERED_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.id, block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find tool results\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\t// Only render if we have a pre-rendered call OR it's not template-rendered\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !TEMPLATE_RENDERED_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(\n\t\t\t\t\tmsg.toolCallId,\n\t\t\t\t\ttoolName,\n\t\t\t\t\tmsg.content,\n\t\t\t\t\tmsg.details,\n\t\t\t\t\tmsg.isError || false,\n\t\t\t\t);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn renderedTools;\n}\n\n/**\n * Export session to HTML using SessionManager and AgentState.\n * Used by TUI's /export command.\n */\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\n\tconst entries = sm.getEntries();\n\n\t// Pre-render custom tools if a tool renderer is provided\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\t// Only include if we actually rendered something\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n\n/**\n * Export session file to HTML (standalone, without AgentState).\n * Used by CLI for exporting arbitrary session files.\n */\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tinputPath = expandTildePath(inputPath);\n\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\n\tconst sm = SessionManager.open(inputPath);\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentState } from \"@earendil-works/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, expandTildePath, getExportTemplateDir } from \"../../config.ts\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SessionEntry } from \"../session-manager.ts\";\nimport { SessionManager } from \"../session-manager.ts\";\n\n/**\n * Interface for rendering custom tools to HTML.\n * Used by agent-session to pre-render extension tool output.\n */\nexport interface ToolHtmlRenderer {\n\t/** Render a tool call to HTML. Returns undefined if tool has no custom renderer. */\n\trenderCall(toolCallId: string, toolName: string, args: unknown): string | undefined;\n\t/** Render a tool result to HTML. Returns collapsed/expanded or undefined if tool has no custom renderer. */\n\trenderResult(\n\t\ttoolCallId: string,\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\n\n/** Pre-rendered HTML for a custom tool call and result */\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\n\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\t/** Optional tool renderer for custom tools */\n\ttoolRenderer?: ToolHtmlRenderer;\n}\n\n/** Parse a color string to RGB values. Supports hex (#RRGGBB) and rgb(r,g,b) formats. */\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\n\n/** Calculate relative luminance of a color (0-1, higher = lighter). */\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** Adjust color brightness. Factor > 1 lightens, < 1 darkens. */\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\n\n/** Derive export background colors from a base color (e.g., userMessageBg). */\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\n\n/**\n * Generate CSS custom property declarations from theme colors.\n */\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\n\t// Use explicit theme export colors if available, otherwise derive from userMessageBg\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\n\treturn lines.join(\"\\n \");\n}\n\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: Array<Pick<ToolDefinition, \"name\" | \"description\" | \"parameters\">>;\n\t/** Pre-rendered HTML for custom tool calls/results, keyed by tool call ID */\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\n\n/**\n * Core HTML generation logic shared by both export functions.\n */\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst derivedExportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = themeExport.pageBg ?? derivedExportColors.pageBg;\n\tconst containerBg = themeExport.cardBg ?? derivedExportColors.cardBg;\n\tconst infoBg = themeExport.infoBg ?? derivedExportColors.infoBg;\n\n\t// Base64 encode session data to avoid escaping issues\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\n\t// Build the CSS with theme variables injected\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\n\n/** Tools rendered directly by the HTML template (not pre-rendered via TUI→ANSI→HTML pipeline) */\nconst TEMPLATE_RENDERED_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\"]);\n\n/**\n * Pre-render custom tools to HTML using their TUI renderers.\n */\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\n\t\t// Find tool calls in assistant messages\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !TEMPLATE_RENDERED_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.id, block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find tool results\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\t// Only render if we have a pre-rendered call OR it's not template-rendered\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !TEMPLATE_RENDERED_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(\n\t\t\t\t\tmsg.toolCallId,\n\t\t\t\t\ttoolName,\n\t\t\t\t\tmsg.content,\n\t\t\t\t\tmsg.details,\n\t\t\t\t\tmsg.isError || false,\n\t\t\t\t);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn renderedTools;\n}\n\n/**\n * Export session to HTML using SessionManager and AgentState.\n * Used by TUI's /export command.\n */\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\n\tconst entries = sm.getEntries();\n\n\t// Pre-render custom tools if a tool renderer is provided\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\t// Only include if we actually rendered something\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n\n/**\n * Export session file to HTML (standalone, without AgentState).\n * Used by CLI for exporting arbitrary session files.\n */\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tinputPath = expandTildePath(inputPath);\n\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\n\tconst sm = SessionManager.open(inputPath);\n\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\n\tconst html = generateHtml(sessionData, opts.themeName);\n\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t} else {\n\t\toutputPath = expandTildePath(outputPath);\n\t}\n\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}