@openadapter/koda 1.0.0-beta.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 (357) hide show
  1. package/CHANGELOG.md +4448 -0
  2. package/README.md +665 -0
  3. package/dist/bun/cli.d.ts +2 -0
  4. package/dist/bun/cli.js +2 -0
  5. package/dist/bun/register-bedrock.d.ts +1 -0
  6. package/dist/bun/register-bedrock.js +1 -0
  7. package/dist/bun/restore-sandbox-env.d.ts +12 -0
  8. package/dist/bun/restore-sandbox-env.js +1 -0
  9. package/dist/cli/args.d.ts +55 -0
  10. package/dist/cli/args.js +167 -0
  11. package/dist/cli/config-selector.d.ts +13 -0
  12. package/dist/cli/config-selector.js +1 -0
  13. package/dist/cli/file-processor.d.ts +14 -0
  14. package/dist/cli/file-processor.js +7 -0
  15. package/dist/cli/import-sessions.d.ts +34 -0
  16. package/dist/cli/import-sessions.js +6 -0
  17. package/dist/cli/initial-message.d.ts +17 -0
  18. package/dist/cli/initial-message.js +1 -0
  19. package/dist/cli/list-models.d.ts +8 -0
  20. package/dist/cli/list-models.js +2 -0
  21. package/dist/cli/openadapter-setup.d.ts +29 -0
  22. package/dist/cli/openadapter-setup.js +3 -0
  23. package/dist/cli/session-picker.d.ts +8 -0
  24. package/dist/cli/session-picker.js +1 -0
  25. package/dist/cli.d.ts +2 -0
  26. package/dist/cli.js +2 -0
  27. package/dist/config.d.ts +92 -0
  28. package/dist/config.js +1 -0
  29. package/dist/core/agent-session-runtime.d.ts +116 -0
  30. package/dist/core/agent-session-runtime.js +1 -0
  31. package/dist/core/agent-session-services.d.ts +86 -0
  32. package/dist/core/agent-session-services.js +1 -0
  33. package/dist/core/agent-session.d.ts +747 -0
  34. package/dist/core/agent-session.js +32 -0
  35. package/dist/core/auth-guidance.d.ts +4 -0
  36. package/dist/core/auth-guidance.js +8 -0
  37. package/dist/core/auth-storage.d.ts +140 -0
  38. package/dist/core/auth-storage.js +1 -0
  39. package/dist/core/bash-executor.d.ts +31 -0
  40. package/dist/core/bash-executor.js +1 -0
  41. package/dist/core/compaction/branch-summarization.d.ts +89 -0
  42. package/dist/core/compaction/branch-summarization.js +38 -0
  43. package/dist/core/compaction/compaction.d.ts +120 -0
  44. package/dist/core/compaction/compaction.js +104 -0
  45. package/dist/core/compaction/index.d.ts +6 -0
  46. package/dist/core/compaction/index.js +1 -0
  47. package/dist/core/compaction/utils.d.ts +37 -0
  48. package/dist/core/compaction/utils.js +19 -0
  49. package/dist/core/defaults.d.ts +2 -0
  50. package/dist/core/defaults.js +1 -0
  51. package/dist/core/diagnostics.d.ts +14 -0
  52. package/dist/core/diagnostics.js +0 -0
  53. package/dist/core/event-bus.d.ts +8 -0
  54. package/dist/core/event-bus.js +1 -0
  55. package/dist/core/exec.d.ts +28 -0
  56. package/dist/core/exec.js +1 -0
  57. package/dist/core/export-html/ansi-to-html.d.ts +21 -0
  58. package/dist/core/export-html/ansi-to-html.js +1 -0
  59. package/dist/core/export-html/index.d.ts +36 -0
  60. package/dist/core/export-html/index.js +2 -0
  61. package/dist/core/export-html/template.css +1066 -0
  62. package/dist/core/export-html/template.html +55 -0
  63. package/dist/core/export-html/template.js +72 -0
  64. package/dist/core/export-html/tool-renderer.d.ts +33 -0
  65. package/dist/core/export-html/tool-renderer.js +1 -0
  66. package/dist/core/export-html/vendor/highlight.min.js +8 -0
  67. package/dist/core/export-html/vendor/marked.min.js +56 -0
  68. package/dist/core/extensions/index.d.ts +11 -0
  69. package/dist/core/extensions/index.js +1 -0
  70. package/dist/core/extensions/loader.d.ts +23 -0
  71. package/dist/core/extensions/loader.js +1 -0
  72. package/dist/core/extensions/runner.d.ts +160 -0
  73. package/dist/core/extensions/runner.js +1 -0
  74. package/dist/core/extensions/types.d.ts +1180 -0
  75. package/dist/core/extensions/types.js +1 -0
  76. package/dist/core/extensions/wrapper.d.ts +19 -0
  77. package/dist/core/extensions/wrapper.js +1 -0
  78. package/dist/core/footer-data-provider.d.ts +53 -0
  79. package/dist/core/footer-data-provider.js +1 -0
  80. package/dist/core/http-dispatcher.d.ts +20 -0
  81. package/dist/core/http-dispatcher.js +1 -0
  82. package/dist/core/index.d.ts +11 -0
  83. package/dist/core/index.js +1 -0
  84. package/dist/core/keybindings.d.ts +352 -0
  85. package/dist/core/keybindings.js +1 -0
  86. package/dist/core/messages.d.ts +76 -0
  87. package/dist/core/messages.js +17 -0
  88. package/dist/core/model-registry.d.ts +149 -0
  89. package/dist/core/model-registry.js +9 -0
  90. package/dist/core/model-resolver.d.ts +109 -0
  91. package/dist/core/model-resolver.js +1 -0
  92. package/dist/core/output-guard.d.ts +6 -0
  93. package/dist/core/output-guard.js +1 -0
  94. package/dist/core/package-manager.d.ts +203 -0
  95. package/dist/core/package-manager.js +3 -0
  96. package/dist/core/prompt-templates.d.ts +51 -0
  97. package/dist/core/prompt-templates.js +2 -0
  98. package/dist/core/provider-attribution.d.ts +3 -0
  99. package/dist/core/provider-attribution.js +1 -0
  100. package/dist/core/provider-display-names.d.ts +1 -0
  101. package/dist/core/provider-display-names.js +1 -0
  102. package/dist/core/resolve-config-value.d.ts +30 -0
  103. package/dist/core/resolve-config-value.js +1 -0
  104. package/dist/core/resource-loader.d.ts +193 -0
  105. package/dist/core/resource-loader.js +1 -0
  106. package/dist/core/sdk.d.ts +108 -0
  107. package/dist/core/sdk.js +1 -0
  108. package/dist/core/session-cwd.d.ts +18 -0
  109. package/dist/core/session-cwd.js +7 -0
  110. package/dist/core/session-manager.d.ts +331 -0
  111. package/dist/core/session-manager.js +11 -0
  112. package/dist/core/settings-manager.d.ts +265 -0
  113. package/dist/core/settings-manager.js +1 -0
  114. package/dist/core/skills.d.ts +59 -0
  115. package/dist/core/skills.js +4 -0
  116. package/dist/core/slash-commands.d.ts +13 -0
  117. package/dist/core/slash-commands.js +1 -0
  118. package/dist/core/source-info.d.ts +17 -0
  119. package/dist/core/source-info.js +1 -0
  120. package/dist/core/system-prompt.d.ts +27 -0
  121. package/dist/core/system-prompt.js +52 -0
  122. package/dist/core/telemetry.d.ts +2 -0
  123. package/dist/core/telemetry.js +1 -0
  124. package/dist/core/timings.d.ts +7 -0
  125. package/dist/core/timings.js +3 -0
  126. package/dist/core/tools/bash.d.ts +67 -0
  127. package/dist/core/tools/bash.js +18 -0
  128. package/dist/core/tools/edit-diff.d.ts +86 -0
  129. package/dist/core/tools/edit-diff.js +16 -0
  130. package/dist/core/tools/edit.d.ts +50 -0
  131. package/dist/core/tools/edit.js +2 -0
  132. package/dist/core/tools/file-mutation-queue.d.ts +5 -0
  133. package/dist/core/tools/file-mutation-queue.js +1 -0
  134. package/dist/core/tools/find.d.ts +34 -0
  135. package/dist/core/tools/find.js +13 -0
  136. package/dist/core/tools/grep.d.ts +36 -0
  137. package/dist/core/tools/grep.js +13 -0
  138. package/dist/core/tools/index.d.ts +39 -0
  139. package/dist/core/tools/index.js +1 -0
  140. package/dist/core/tools/ls.d.ts +36 -0
  141. package/dist/core/tools/ls.js +9 -0
  142. package/dist/core/tools/output-accumulator.d.ts +51 -0
  143. package/dist/core/tools/output-accumulator.js +4 -0
  144. package/dist/core/tools/path-utils.d.ts +9 -0
  145. package/dist/core/tools/path-utils.js +1 -0
  146. package/dist/core/tools/read.d.ts +34 -0
  147. package/dist/core/tools/read.js +22 -0
  148. package/dist/core/tools/render-utils.d.ts +23 -0
  149. package/dist/core/tools/render-utils.js +4 -0
  150. package/dist/core/tools/tool-definition-wrapper.d.ts +13 -0
  151. package/dist/core/tools/tool-definition-wrapper.js +1 -0
  152. package/dist/core/tools/truncate.d.ts +69 -0
  153. package/dist/core/tools/truncate.js +5 -0
  154. package/dist/core/tools/write.d.ts +25 -0
  155. package/dist/core/tools/write.js +13 -0
  156. package/dist/index.d.ts +30 -0
  157. package/dist/index.js +1 -0
  158. package/dist/main.d.ts +11 -0
  159. package/dist/main.js +1 -0
  160. package/dist/migrations.d.ts +32 -0
  161. package/dist/migrations.js +8 -0
  162. package/dist/modes/index.d.ts +8 -0
  163. package/dist/modes/index.js +1 -0
  164. package/dist/modes/interactive/assets/clankolas.png +0 -0
  165. package/dist/modes/interactive/components/armin.d.ts +33 -0
  166. package/dist/modes/interactive/components/armin.js +1 -0
  167. package/dist/modes/interactive/components/assistant-message.d.ts +19 -0
  168. package/dist/modes/interactive/components/assistant-message.js +1 -0
  169. package/dist/modes/interactive/components/bash-execution.d.ts +33 -0
  170. package/dist/modes/interactive/components/bash-execution.js +13 -0
  171. package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
  172. package/dist/modes/interactive/components/bordered-loader.js +1 -0
  173. package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
  174. package/dist/modes/interactive/components/branch-summary-message.js +3 -0
  175. package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
  176. package/dist/modes/interactive/components/compaction-summary-message.js +3 -0
  177. package/dist/modes/interactive/components/config-selector.d.ts +70 -0
  178. package/dist/modes/interactive/components/config-selector.js +1 -0
  179. package/dist/modes/interactive/components/countdown-timer.d.ts +13 -0
  180. package/dist/modes/interactive/components/countdown-timer.js +1 -0
  181. package/dist/modes/interactive/components/custom-editor.d.ts +20 -0
  182. package/dist/modes/interactive/components/custom-editor.js +1 -0
  183. package/dist/modes/interactive/components/custom-message.d.ts +19 -0
  184. package/dist/modes/interactive/components/custom-message.js +2 -0
  185. package/dist/modes/interactive/components/daxnuts.d.ts +22 -0
  186. package/dist/modes/interactive/components/daxnuts.js +1 -0
  187. package/dist/modes/interactive/components/diff.d.ts +11 -0
  188. package/dist/modes/interactive/components/diff.js +3 -0
  189. package/dist/modes/interactive/components/dynamic-border.d.ts +14 -0
  190. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  191. package/dist/modes/interactive/components/earendil-announcement.d.ts +4 -0
  192. package/dist/modes/interactive/components/earendil-announcement.js +1 -0
  193. package/dist/modes/interactive/components/extension-editor.d.ts +19 -0
  194. package/dist/modes/interactive/components/extension-editor.js +3 -0
  195. package/dist/modes/interactive/components/extension-input.d.ts +22 -0
  196. package/dist/modes/interactive/components/extension-input.js +2 -0
  197. package/dist/modes/interactive/components/extension-selector.d.ts +25 -0
  198. package/dist/modes/interactive/components/extension-selector.js +2 -0
  199. package/dist/modes/interactive/components/footer.d.ts +27 -0
  200. package/dist/modes/interactive/components/footer.js +1 -0
  201. package/dist/modes/interactive/components/index.d.ts +31 -0
  202. package/dist/modes/interactive/components/index.js +1 -0
  203. package/dist/modes/interactive/components/keybinding-hints.d.ts +12 -0
  204. package/dist/modes/interactive/components/keybinding-hints.js +1 -0
  205. package/dist/modes/interactive/components/login-dialog.d.ts +51 -0
  206. package/dist/modes/interactive/components/login-dialog.js +1 -0
  207. package/dist/modes/interactive/components/model-selector.d.ts +46 -0
  208. package/dist/modes/interactive/components/model-selector.js +2 -0
  209. package/dist/modes/interactive/components/oauth-selector.d.ts +30 -0
  210. package/dist/modes/interactive/components/oauth-selector.js +1 -0
  211. package/dist/modes/interactive/components/scoped-models-selector.d.ts +41 -0
  212. package/dist/modes/interactive/components/scoped-models-selector.js +1 -0
  213. package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
  214. package/dist/modes/interactive/components/session-selector-search.js +1 -0
  215. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  216. package/dist/modes/interactive/components/session-selector.js +2 -0
  217. package/dist/modes/interactive/components/settings-selector.d.ts +68 -0
  218. package/dist/modes/interactive/components/settings-selector.js +1 -0
  219. package/dist/modes/interactive/components/show-images-selector.d.ts +9 -0
  220. package/dist/modes/interactive/components/show-images-selector.js +1 -0
  221. package/dist/modes/interactive/components/skill-invocation-message.d.ts +16 -0
  222. package/dist/modes/interactive/components/skill-invocation-message.js +3 -0
  223. package/dist/modes/interactive/components/theme-selector.d.ts +10 -0
  224. package/dist/modes/interactive/components/theme-selector.js +1 -0
  225. package/dist/modes/interactive/components/thinking-selector.d.ts +10 -0
  226. package/dist/modes/interactive/components/thinking-selector.js +1 -0
  227. package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
  228. package/dist/modes/interactive/components/tool-execution.js +4 -0
  229. package/dist/modes/interactive/components/tree-selector.d.ts +88 -0
  230. package/dist/modes/interactive/components/tree-selector.js +1 -0
  231. package/dist/modes/interactive/components/user-message-selector.d.ts +29 -0
  232. package/dist/modes/interactive/components/user-message-selector.js +1 -0
  233. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  234. package/dist/modes/interactive/components/user-message.js +1 -0
  235. package/dist/modes/interactive/components/visual-truncate.d.ts +23 -0
  236. package/dist/modes/interactive/components/visual-truncate.js +1 -0
  237. package/dist/modes/interactive/interactive-mode.d.ts +417 -0
  238. package/dist/modes/interactive/interactive-mode.js +116 -0
  239. package/dist/modes/interactive/theme/dark.json +86 -0
  240. package/dist/modes/interactive/theme/light.json +85 -0
  241. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  242. package/dist/modes/interactive/theme/theme.d.ts +101 -0
  243. package/dist/modes/interactive/theme/theme.js +18 -0
  244. package/dist/modes/print-mode.d.ts +27 -0
  245. package/dist/modes/print-mode.js +4 -0
  246. package/dist/modes/rpc/jsonl.d.ts +16 -0
  247. package/dist/modes/rpc/jsonl.js +3 -0
  248. package/dist/modes/rpc/rpc-client.d.ts +226 -0
  249. package/dist/modes/rpc/rpc-client.js +1 -0
  250. package/dist/modes/rpc/rpc-mode.d.ts +19 -0
  251. package/dist/modes/rpc/rpc-mode.js +1 -0
  252. package/dist/modes/rpc/rpc-types.d.ts +419 -0
  253. package/dist/modes/rpc/rpc-types.js +0 -0
  254. package/dist/package-manager-cli.d.ts +3 -0
  255. package/dist/package-manager-cli.js +49 -0
  256. package/dist/utils/ansi.d.ts +1 -0
  257. package/dist/utils/ansi.js +1 -0
  258. package/dist/utils/auto-update.d.ts +13 -0
  259. package/dist/utils/auto-update.js +1 -0
  260. package/dist/utils/changelog.d.ts +20 -0
  261. package/dist/utils/changelog.js +4 -0
  262. package/dist/utils/child-process.d.ts +14 -0
  263. package/dist/utils/child-process.js +1 -0
  264. package/dist/utils/clipboard-image.d.ts +10 -0
  265. package/dist/utils/clipboard-image.js +1 -0
  266. package/dist/utils/clipboard-native.d.ts +9 -0
  267. package/dist/utils/clipboard-native.js +1 -0
  268. package/dist/utils/clipboard.d.ts +1 -0
  269. package/dist/utils/clipboard.js +1 -0
  270. package/dist/utils/deprecation.d.ts +3 -0
  271. package/dist/utils/deprecation.js +1 -0
  272. package/dist/utils/exif-orientation.d.ts +4 -0
  273. package/dist/utils/exif-orientation.js +1 -0
  274. package/dist/utils/frontmatter.d.ts +7 -0
  275. package/dist/utils/frontmatter.js +4 -0
  276. package/dist/utils/fs-watch.d.ts +4 -0
  277. package/dist/utils/fs-watch.js +1 -0
  278. package/dist/utils/git.d.ts +25 -0
  279. package/dist/utils/git.js +1 -0
  280. package/dist/utils/html.d.ts +6 -0
  281. package/dist/utils/html.js +1 -0
  282. package/dist/utils/image-convert.d.ts +8 -0
  283. package/dist/utils/image-convert.js +1 -0
  284. package/dist/utils/image-resize-core.d.ts +29 -0
  285. package/dist/utils/image-resize-core.js +1 -0
  286. package/dist/utils/image-resize-worker.d.ts +1 -0
  287. package/dist/utils/image-resize-worker.js +1 -0
  288. package/dist/utils/image-resize.d.ts +15 -0
  289. package/dist/utils/image-resize.js +1 -0
  290. package/dist/utils/json.d.ts +2 -0
  291. package/dist/utils/json.js +1 -0
  292. package/dist/utils/koda-user-agent.d.ts +1 -0
  293. package/dist/utils/koda-user-agent.js +1 -0
  294. package/dist/utils/mime.d.ts +2 -0
  295. package/dist/utils/mime.js +1 -0
  296. package/dist/utils/paths.d.ts +30 -0
  297. package/dist/utils/paths.js +1 -0
  298. package/dist/utils/photon.d.ts +20 -0
  299. package/dist/utils/photon.js +1 -0
  300. package/dist/utils/shell.d.ts +29 -0
  301. package/dist/utils/shell.js +8 -0
  302. package/dist/utils/sleep.d.ts +4 -0
  303. package/dist/utils/sleep.js +1 -0
  304. package/dist/utils/syntax-highlight.d.ts +11 -0
  305. package/dist/utils/syntax-highlight.js +2 -0
  306. package/dist/utils/tools-manager.d.ts +2 -0
  307. package/dist/utils/tools-manager.js +1 -0
  308. package/dist/utils/version-check.d.ts +14 -0
  309. package/dist/utils/version-check.js +1 -0
  310. package/dist/utils/windows-self-update.d.ts +2 -0
  311. package/dist/utils/windows-self-update.js +1 -0
  312. package/docs/compaction.md +394 -0
  313. package/docs/custom-provider.md +736 -0
  314. package/docs/development.md +71 -0
  315. package/docs/docs.json +148 -0
  316. package/docs/extensions.md +2626 -0
  317. package/docs/images/doom-extension.png +0 -0
  318. package/docs/images/exy.png +0 -0
  319. package/docs/images/interactive-mode.png +0 -0
  320. package/docs/images/tree-view.png +0 -0
  321. package/docs/index.md +80 -0
  322. package/docs/json.md +82 -0
  323. package/docs/keybindings.md +197 -0
  324. package/docs/models.md +493 -0
  325. package/docs/packages.md +226 -0
  326. package/docs/prompt-templates.md +88 -0
  327. package/docs/providers.md +253 -0
  328. package/docs/quickstart.md +165 -0
  329. package/docs/rpc.md +1408 -0
  330. package/docs/sdk.md +1137 -0
  331. package/docs/session-format.md +412 -0
  332. package/docs/sessions.md +145 -0
  333. package/docs/settings.md +281 -0
  334. package/docs/shell-aliases.md +13 -0
  335. package/docs/skills.md +231 -0
  336. package/docs/terminal-setup.md +114 -0
  337. package/docs/termux.md +127 -0
  338. package/docs/themes.md +295 -0
  339. package/docs/tmux.md +61 -0
  340. package/docs/tui.md +927 -0
  341. package/docs/usage.md +288 -0
  342. package/docs/windows.md +17 -0
  343. package/npm-shrinkwrap.json +1792 -0
  344. package/openadapter/extensions/koda-ask.js +12 -0
  345. package/openadapter/extensions/koda-bg.js +14 -0
  346. package/openadapter/extensions/koda-commands.mjs +15 -0
  347. package/openadapter/extensions/koda-help.js +8 -0
  348. package/openadapter/extensions/koda-memory.js +16 -0
  349. package/openadapter/extensions/koda-status.js +1 -0
  350. package/openadapter/extensions/koda-todo.js +4 -0
  351. package/openadapter/extensions/koda-vision.js +4 -0
  352. package/openadapter/extensions/koda-web.js +7 -0
  353. package/openadapter/setup.mjs +173 -0
  354. package/openadapter/skills/code-review/SKILL.md +22 -0
  355. package/openadapter/skills/debugging/SKILL.md +28 -0
  356. package/openadapter/skills/frontend/SKILL.md +38 -0
  357. package/package.json +108 -0
@@ -0,0 +1,55 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Session Export</title>
7
+ <style>
8
+ {{CSS}}
9
+ </style>
10
+ </head>
11
+ <body>
12
+ <button id="hamburger" title="Open sidebar"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" stroke="none"><circle cx="6" cy="6" r="2.5"/><circle cx="6" cy="18" r="2.5"/><circle cx="18" cy="12" r="2.5"/><rect x="5" y="6" width="2" height="12"/><path d="M6 12h10c1 0 2 0 2-2V8"/></svg></button>
13
+ <div id="sidebar-overlay"></div>
14
+ <div id="app">
15
+ <aside id="sidebar">
16
+ <div class="sidebar-header">
17
+ <div class="sidebar-controls">
18
+ <input type="text" class="sidebar-search" id="tree-search" placeholder="Search...">
19
+ </div>
20
+ <div class="sidebar-filters">
21
+ <button class="filter-btn active" data-filter="default" title="Hide settings entries">Default</button>
22
+ <button class="filter-btn" data-filter="no-tools" title="Default minus tool results">No-tools</button>
23
+ <button class="filter-btn" data-filter="user-only" title="Only user messages">User</button>
24
+ <button class="filter-btn" data-filter="labeled-only" title="Only labeled entries">Labeled</button>
25
+ <button class="filter-btn" data-filter="all" title="Show everything">All</button>
26
+ <button class="sidebar-close" id="sidebar-close" title="Close">✕</button>
27
+ </div>
28
+ </div>
29
+ <div class="tree-container" id="tree-container"></div>
30
+ <div class="tree-status" id="tree-status"></div>
31
+ </aside>
32
+ <div id="sidebar-resizer" role="separator" aria-orientation="vertical" aria-label="Resize session tree sidebar"></div>
33
+ <main id="content">
34
+ <div id="header-container"></div>
35
+ <div id="messages"></div>
36
+ </main>
37
+ <div id="image-modal" class="image-modal">
38
+ <img id="modal-image" src="" alt="">
39
+ </div>
40
+ </div>
41
+
42
+ <script id="session-data" type="application/json">{{SESSION_DATA}}</script>
43
+
44
+ <!-- Vendored libraries -->
45
+ <script>{{MARKED_JS}}</script>
46
+
47
+ <!-- highlight.js -->
48
+ <script>{{HIGHLIGHT_JS}}</script>
49
+
50
+ <!-- Main application code -->
51
+ <script>
52
+ {{JS}}
53
+ </script>
54
+ </body>
55
+ </html>
@@ -0,0 +1,72 @@
1
+ var rt=Object.defineProperty;var p=(Q,H)=>rt(Q,"name",{value:H,configurable:!0});(function(){"use strict";const Q=document.getElementById("session-data").textContent,H=atob(Q),re=new Uint8Array(H.length);for(let e=0;e<H.length;e++)re[e]=H.charCodeAt(e);const Le=JSON.parse(new TextDecoder("utf-8").decode(re)),{header:I,entries:k,leafId:Ce,systemPrompt:U,tools:Y,renderedTools:Ee}=Le,le=document.querySelector('meta[name="pi-url-params"]'),Ie=le?le.content:window.location.search.substring(1),ce=new URLSearchParams(Ie),Te=ce.get("leafId"),J=ce.get("targetId"),T=Te||Ce,L=new Map;for(const e of k)L.set(e.id,e);const de=new Map;for(const e of k)if(e.type==="message"&&e.message.role==="assistant"){const t=e.message.content;if(Array.isArray(t))for(const s of t)s.type==="toolCall"&&de.set(s.id,{name:s.name,arguments:s.arguments})}const ue=new Map;for(const e of k)e.type==="label"&&e.targetId&&e.label&&ue.set(e.targetId,e.label);function pe(){const e=new Map,t=[];for(const n of k)e.set(n.id,{entry:n,children:[],label:ue.get(n.id)});for(const n of k){const i=e.get(n.id);if(n.parentId===null||n.parentId===void 0||n.parentId===n.id)t.push(i);else{const a=e.get(n.parentId);a?a.children.push(i):t.push(i)}}function s(n){n.children.sort((i,a)=>new Date(i.entry.timestamp).getTime()-new Date(a.entry.timestamp).getTime()),n.children.forEach(s)}return p(s,"sortChildren"),t.forEach(s),t}p(pe,"buildTree");function Me(e){const t=new Set;let s=L.get(e);for(;s&&(t.add(s.id),!(!s.parentId||s.parentId===s.id));)s=L.get(s.parentId);return t}p(Me,"buildActivePathIds");function Re(e){const t=[];let s=L.get(e);for(;s&&(t.unshift(s),!(!s.parentId||s.parentId===s.id));)s=L.get(s.parentId);return t}p(Re,"getPath");let F=null;function je(e){if(!F){let i=function(a){F.set(a.entry.id,a),a.children.forEach(i)};p(i,"mapNodes"),F=new Map,pe().forEach(i)}const t=F.get(e);if(!t)return e;let s=t;for(;s.children.length>0;)s=s.children[s.children.length-1];return s.entry.id}p(je,"findNewestLeaf");function Pe(e,t){const s=[],n=e.length>1,i=new Map;function a(r){let l=t.has(r.entry.id);for(const h of r.children)a(h)&&(l=!0);return i.set(r,l),l}p(a,"markActive"),e.forEach(a);const c=[],d=[...e].sort((r,l)=>Number(i.get(l))-Number(i.get(r)));for(let r=d.length-1;r>=0;r--){const l=r===d.length-1;c.push([d[r],n?1:0,n,n,l,[],n])}for(;c.length>0;){const[r,l,h,m,o,f,g]=c.pop();s.push({node:r,indent:l,showConnector:m,isLast:o,gutters:f,isVirtualRootChild:g,multipleRoots:n});const y=r.children,b=y.length>1,w=[...y].sort((S,O)=>Number(i.get(O))-Number(i.get(S)));let $;b||h&&l>0?$=l+1:$=l;const j=m&&!g,D=n?Math.max(0,l-1):l,P=Math.max(0,D-1),ae=j?[...f,{position:P,show:!o}]:f;for(let S=w.length-1;S>=0;S--){const O=S===w.length-1;c.push([w[S],$,b,b,O,ae,!1])}}return s}p(Pe,"flattenTree");function He(e){const{indent:t,showConnector:s,isLast:n,gutters:i,isVirtualRootChild:a,multipleRoots:c}=e,d=c?Math.max(0,t-1):t,r=s&&!a?n?"\u2514\u2500 ":"\u251C\u2500 ":"",l=r?d-1:-1,h=d*3,m=[];for(let o=0;o<h;o++){const f=Math.floor(o/3),g=o%3,y=i.find(b=>b.position===f);y?m.push(g===0&&y.show?"\u2502":" "):r&&f===l?g===0?m.push(n?"\u2514":"\u251C"):g===1?m.push("\u2500"):m.push(" "):m.push(" ")}return m.join("")}p(He,"buildTreePrefix");let me="default",Z="";function Ne(e){if(typeof e=="string")return e.trim().length>0;if(Array.isArray(e)){for(const t of e)if(t.type==="text"&&t.text&&t.text.trim().length>0)return!0}return!1}p(Ne,"hasTextContent");function N(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(""):""}p(N,"extractContent");function fe(e){const t=e.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);return t?{name:t[1],location:t[2],content:t[3],userMessage:t[4]?.trim()||void 0}:null}p(fe,"parseSkillBlock");function Be(e,t){const s=[];switch(t&&s.push(t),e.type){case"message":{const n=e.message;s.push(n.role),n.content&&s.push(N(n.content)),n.role==="bashExecution"&&n.command&&s.push(n.command);break}case"custom_message":s.push(e.customType),s.push(typeof e.content=="string"?e.content:N(e.content));break;case"compaction":s.push("compaction");break;case"branch_summary":s.push("branch summary",e.summary);break;case"model_change":s.push("model",e.modelId);break;case"thinking_level_change":s.push("thinking",e.thinkingLevel);break}return s.join(" ").toLowerCase()}p(Be,"getSearchableText");function Ae(e,t){const s=Z.toLowerCase().split(/\s+/).filter(Boolean),n=e.filter(i=>{const a=i.node.entry,c=i.node.label;if(a.id===t)return!0;if(a.type==="message"&&a.message.role==="assistant"){const h=a.message,m=Ne(h.content),o=h.stopReason&&h.stopReason!=="stop"&&h.stopReason!=="toolUse";if(!m&&!o)return!1}const r=["label","custom","model_change","thinking_level_change"].includes(a.type);let l=!0;switch(me){case"user-only":l=a.type==="message"&&a.message.role==="user";break;case"no-tools":l=!r&&!(a.type==="message"&&a.message.role==="toolResult");break;case"labeled-only":l=c!==void 0;break;case"all":l=!0;break;default:l=!r;break}if(!l)return!1;if(s.length>0){const h=Be(a,c);if(!s.every(m=>h.includes(m)))return!1}return!0});return _e(n,e),n}p(Ae,"filterNodes");function _e(e,t){if(e.length===0)return;const s=new Set(e.map(m=>m.node.entry.id)),n=new Map;for(const m of t)n.set(m.node.entry.id,m);function i(m){let o=n.get(m)?.node.entry.parentId;for(;o!=null;){if(s.has(o))return o;o=n.get(o)?.node.entry.parentId}return null}p(i,"findVisibleAncestor");const a=new Map,c=new Map;c.set(null,[]);for(const m of e){const o=m.node.entry.id,f=i(o);a.set(o,f),c.has(f)||c.set(f,[]),c.get(f).push(o)}const d=c.get(null),r=d.length>1,l=new Map;for(const m of e)l.set(m.node.entry.id,m);const h=[];for(let m=d.length-1;m>=0;m--){const o=m===d.length-1;h.push([d[m],r?1:0,r,r,o,[],r])}for(;h.length>0;){const[m,o,f,g,y,b,w]=h.pop(),$=l.get(m);if(!$)continue;$.indent=o,$.showConnector=g,$.isLast=y,$.gutters=b,$.isVirtualRootChild=w,$.multipleRoots=r;const j=c.get(m)||[],D=j.length>1;let P;D||f&&o>0?P=o+1:P=o;const ae=g&&!w,S=r?Math.max(0,o-1):o,O=Math.max(0,S-1),it=ae?[...b,{position:O,show:!y}]:b;for(let K=j.length-1;K>=0;K--){const at=K===j.length-1;h.push([j[K],P,D,D,at,it,!1])}}}p(_e,"recalculateVisualStructure");function x(e){if(typeof e!="string")return"";if(e.startsWith("/Users/")){const t=e.split("/");if(t.length>2)return"~"+e.slice(("/Users/"+t[2]).length)}if(e.startsWith("/home/")){const t=e.split("/");if(t.length>2)return"~"+e.slice(("/home/"+t[2]).length)}return e}p(x,"shortenPath");function We(e,t){switch(e){case"read":{const s=x(String(t.path||t.file_path||"")),n=t.offset,i=t.limit;let a=s;if(n!==void 0||i!==void 0){const c=n??1,d=i!==void 0?c+i-1:"";a+=`:${c}${d?`-${d}`:""}`}return`[read: ${a}]`}case"write":return`[write: ${x(String(t.path||t.file_path||""))}]`;case"edit":return`[edit: ${x(String(t.path||t.file_path||""))}]`;case"bash":{const s=String(t.command||"");return`[bash: ${s.replace(/[\n\t]/g," ").trim().slice(0,50)}${s.length>50?"...":""}]`}case"grep":return`[grep: /${t.pattern||""}/ in ${x(String(t.path||"."))}]`;case"find":return`[find: ${t.pattern||""} in ${x(String(t.path||"."))}]`;case"ls":return`[ls: ${x(String(t.path||"."))}]`;default:{const s=JSON.stringify(t).slice(0,40);return`[${e}: ${s}${JSON.stringify(t).length>40?"...":""}]`}}}p(We,"formatToolCall");function u(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}p(u,"escapeHtml");function C(e,t=100){return e.length<=t?e:e.slice(0,t)+"..."}p(C,"truncate");function qe(e,t){const s=p(i=>i.replace(/[\n\t]/g," ").trim(),"normalize"),n=t?`<span class="tree-label">[${u(t)}]</span> `:"";switch(e.type){case"message":{const i=e.message;if(i.role==="user"){const a=N(i.content),c=fe(a);if(c){let r=n+`<span class="tree-role-skill">skill:</span> ${u(c.name)}`;return c.userMessage&&(r+=` \xB7 <span class="tree-role-user">user:</span> ${u(C(s(c.userMessage)))}`),r}const d=C(s(a));return n+`<span class="tree-role-user">user:</span> ${u(d)}`}if(i.role==="assistant"){const a=C(s(N(i.content)));return a?n+`<span class="tree-role-assistant">assistant:</span> ${u(a)}`:i.stopReason==="aborted"?n+'<span class="tree-role-assistant">assistant:</span> <span class="tree-muted">(aborted)</span>':i.errorMessage?n+`<span class="tree-role-assistant">assistant:</span> <span class="tree-error">${u(C(i.errorMessage))}</span>`:n+'<span class="tree-role-assistant">assistant:</span> <span class="tree-muted">(no text)</span>'}if(i.role==="toolResult"){const a=i.toolCallId?de.get(i.toolCallId):null;return a?n+`<span class="tree-role-tool">${u(We(a.name,a.arguments))}</span>`:n+`<span class="tree-role-tool">[${u(i.toolName||"tool")}]</span>`}if(i.role==="bashExecution"){const a=C(s(i.command||""));return n+`<span class="tree-role-tool">[bash]:</span> ${u(a)}`}return n+`<span class="tree-muted">[${u(i.role)}]</span>`}case"compaction":return n+`<span class="tree-compaction">[compaction: ${Math.round(e.tokensBefore/1e3)}k tokens]</span>`;case"branch_summary":{const i=C(s(e.summary||""));return n+`<span class="tree-branch-summary">[branch summary]:</span> ${u(i)}`}case"custom_message":{const i=typeof e.content=="string"?e.content:N(e.content);return n+`<span class="tree-custom">[${u(e.customType)}]:</span> ${u(C(s(i)))}`}case"model_change":return n+`<span class="tree-muted">[model: ${u(e.modelId)}]</span>`;case"thinking_level_change":return n+`<span class="tree-muted">[thinking: ${u(e.thinkingLevel)}]</span>`;default:return n+`<span class="tree-muted">[${u(e.type)}]</span>`}}p(qe,"getTreeNodeDisplayHtml");let V=T,ee=J||T,te=!1;function he(){const e=pe(),t=Me(V),s=Pe(e,t),n=Ae(s,V),i=document.getElementById("tree-container");if(te){const a=i.querySelectorAll(".tree-node");for(const c of a){const d=c.dataset.id,r=t.has(d),l=d===ee;c.classList.toggle("in-path",r),c.classList.toggle("active",l);const h=c.querySelector(".tree-marker");h&&(h.textContent=r?"\u2022":" ")}}else{i.innerHTML="";for(const a of n){const c=a.node.entry,d=t.has(c.id),r=c.id===ee,l=document.createElement("div");l.className="tree-node",d&&l.classList.add("in-path"),r&&l.classList.add("active"),l.dataset.id=c.id;const h=He(a),m=document.createElement("span");m.className="tree-prefix",m.textContent=h;const o=document.createElement("span");o.className="tree-marker",o.textContent=d?"\u2022":" ";const f=document.createElement("span");f.className="tree-content",f.innerHTML=qe(c,a.node.label),l.appendChild(m),l.appendChild(o),l.appendChild(f),l.addEventListener("click",()=>{if(window.getSelection().toString())return;const g=je(c.id);A(g,"target",c.id)}),i.appendChild(l)}te=!0}document.getElementById("tree-status").textContent=`${n.length} / ${s.length} entries`,setTimeout(()=>{const a=i.querySelector(".tree-node.active");a&&a.scrollIntoView({block:"nearest"})},0)}p(he,"renderTree");function ge(){te=!1,he()}p(ge,"forceTreeRerender");function z(e){return e<1e3?e.toString():e<1e4?(e/1e3).toFixed(1)+"k":e<1e6?Math.round(e/1e3)+"k":(e/1e6).toFixed(1)+"M"}p(z,"formatTokens");function De(e){return e?new Date(e).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}p(De,"formatTimestamp");function B(e){return e.replace(/\t/g," ")}p(B,"replaceTabs");function M(e){return typeof e=="string"?e:e==null?"":null}p(M,"str");function ve(e){const t=e.split(".").pop()?.toLowerCase();return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",py:"python",rb:"ruby",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",hpp:"cpp",cs:"csharp",php:"php",sh:"bash",bash:"bash",zsh:"bash",sql:"sql",html:"html",css:"css",scss:"scss",json:"json",yaml:"yaml",yml:"yaml",xml:"xml",md:"markdown",dockerfile:"dockerfile"}[t]}p(ve,"getLanguageFromPath");function Oe(e){for(const t of k)if(t.type==="message"&&t.message.role==="toolResult"&&t.message.toolCallId===e)return t.message;return null}p(Oe,"findToolResult");function E(e,t,s){e=B(e);const n=e.split(`
2
+ `),i=n.slice(0,t),a=n.length-t;if(s){let d;try{d=hljs.highlight(e,{language:s}).value}catch{d=u(e)}if(a>0){const r=i.join(`
3
+ `);let l;try{l=hljs.highlight(r,{language:s}).value}catch{l=u(r)}return`<div class="tool-output expandable" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
4
+ <div class="output-preview"><pre><code class="hljs">${l}</code></pre>
5
+ <div class="expand-hint">... (${a} more lines)</div></div>
6
+ <div class="output-full"><pre><code class="hljs">${d}</code></pre></div></div>`}return`<div class="tool-output"><pre><code class="hljs">${d}</code></pre></div>`}if(a>0){let d=`<div class="tool-output expandable" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">`;d+='<div class="output-preview">';for(const r of i)d+=`<div>${u(B(r))}</div>`;d+=`<div class="expand-hint">... (${a} more lines)</div></div>`,d+='<div class="output-full">';for(const r of n)d+=`<div>${u(B(r))}</div>`;return d+="</div></div>",d}let c='<div class="tool-output">';for(const d of i)c+=`<div>${u(B(d))}</div>`;return c+="</div>",c}p(E,"formatExpandableOutput");function Ue(e){const t=Oe(e.id),s=t?.isError||!1,n=t?s?"error":"success":"pending",i=p(()=>t?t.content.filter(f=>f.type==="text").map(f=>f.text).join(`
7
+ `):"","getResultText"),a=p(()=>t?t.content.filter(o=>o.type==="image"):[],"getResultImages"),c=p(()=>{const o=a();return o.length===0?"":'<div class="tool-images">'+o.map(f=>`<img src="data:${u(f.mimeType||"image/png")};base64,${u(f.data||"")}" class="tool-image" />`).join("")+"</div>"},"renderResultImages"),d=`tool-call-${u(e.id)}`;let r=`<div class="tool-execution ${n}" id="${d}">`;const l=e.arguments||{},h=e.name,m='<span class="tool-error">[invalid arg]</span>';switch(h){case"bash":{const o=M(l.command),f=o===null?m:u(o||"...");if(r+=`<div class="tool-command">$ ${f}</div>`,t){const g=i().trim();g&&(r+=E(g,5))}break}case"read":{const o=M(l.file_path??l.path),f=l.offset,g=l.limit;let y=o===null?m:u(x(o||""));if(o!==null&&(f!==void 0||g!==void 0)){const b=f??1,w=g!==void 0?b+g-1:"";y+=`<span class="line-numbers">:${b}${w?"-"+w:""}</span>`}if(r+=`<div class="tool-header"><span class="tool-name">read</span> <span class="tool-path">${y}</span></div>`,t){r+=c();const b=i(),w=o?ve(o):null;b&&(r+=E(b,10,w))}break}case"write":{const o=M(l.file_path??l.path),f=M(l.content);if(r+=`<div class="tool-header"><span class="tool-name">write</span> <span class="tool-path">${o===null?m:u(x(o||""))}</span>`,f!==null&&f){const g=f.split(`
8
+ `);g.length>10&&(r+=` <span class="line-count">(${g.length} lines)</span>`)}if(r+="</div>",f===null)r+='<div class="tool-error">[invalid content arg - expected string]</div>';else if(f){const g=o?ve(o):null;r+=E(f,10,g)}if(t){const g=i().trim();g&&(r+=`<div class="tool-output"><div>${u(g)}</div></div>`)}break}case"edit":{const o=M(l.file_path??l.path);if(r+=`<div class="tool-header"><span class="tool-name">edit</span> <span class="tool-path">${o===null?m:u(x(o||""))}</span></div>`,t?.details?.diff){const f=t.details.diff.split(`
9
+ `);r+='<div class="tool-diff">';for(const g of f){const y=g.match(/^\+/)?"diff-added":g.match(/^-/)?"diff-removed":"diff-context";r+=`<div class="${y}">${u(B(g))}</div>`}r+="</div>"}else if(t){const f=i().trim();f&&(r+=`<div class="tool-output"><pre>${u(f)}</pre></div>`)}break}case"ls":{const o=M(l.path),f=l.limit;let g=o===null?m:u(x(o||"."));if(f!==void 0&&(g+=` <span class="line-count">(limit ${u(String(f))})</span>`),r+=`<div class="tool-header"><span class="tool-name">ls</span> <span class="tool-path">${g}</span></div>`,t){const y=i().trim();y&&(r+=E(y,20))}break}default:{const o=Ee?.[e.id];if(o?.callHtml||o?.resultHtmlCollapsed||o?.resultHtmlExpanded){if(o.callHtml?r+=`<div class="tool-header ansi-rendered">${o.callHtml}</div>`:r+=`<div class="tool-header"><span class="tool-name">${u(h)}</span></div>`,o.resultHtmlCollapsed&&o.resultHtmlExpanded&&o.resultHtmlCollapsed!==o.resultHtmlExpanded)r+=`<div class="tool-output expandable ansi-rendered" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
10
+ <div class="output-preview">${o.resultHtmlCollapsed}</div>
11
+ <div class="output-full">${o.resultHtmlExpanded}</div>
12
+ </div>`;else if(o.resultHtmlExpanded)r+=`<div class="tool-output ansi-rendered">${o.resultHtmlExpanded}</div>`;else if(t){const f=i();f&&(r+=E(f,10))}}else if(r+=`<div class="tool-header"><span class="tool-name">${u(h)}</span></div>`,r+=`<div class="tool-output"><pre>${u(JSON.stringify(l,null,2))}</pre></div>`,t){const f=i();f&&(r+=E(f,10))}}}return r+="</div>",r}p(Ue,"renderToolCall"),window.downloadSessionJson=function(){const e=[];I&&e.push(JSON.stringify({type:"header",...I}));for(const a of k)e.push(JSON.stringify(a));const t=e.join(`
13
+ `),s=new Blob([t],{type:"application/x-ndjson"}),n=URL.createObjectURL(s),i=document.createElement("a");i.href=n,i.download=`${I?.id||"session"}.jsonl`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(n)};function Je(e){const t=document.querySelector('meta[name="pi-share-base-url"]'),s=t?t.content:window.location.href.split("?")[0],n=new URL(window.location.href),i=Array.from(n.searchParams.keys()).find(c=>!n.searchParams.get(c)),a=new URLSearchParams;return a.set("leafId",V),a.set("targetId",e),t?`${s}&${a.toString()}`:(n.search=i?`?${i}&${a.toString()}`:`?${a.toString()}`,n.toString())}p(Je,"buildShareUrl");async function Fe(e,t){let s=!1;try{navigator.clipboard&&navigator.clipboard.writeText&&(await navigator.clipboard.writeText(e),s=!0)}catch{}if(!s)try{const n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),s=document.execCommand("copy"),document.body.removeChild(n)}catch(n){console.error("Failed to copy:",n)}if(s&&t){const n=t.innerHTML;t.innerHTML="\u2713",t.classList.add("copied"),setTimeout(()=>{t.innerHTML=n,t.classList.remove("copied")},1500)}}p(Fe,"copyToClipboard");function Ve(e){return`<button class="copy-link-btn" data-entry-id="${u(e)}" title="Copy link to this message">
14
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
15
+ <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/>
16
+ <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/>
17
+ </svg>
18
+ </button>`}p(Ve,"renderCopyLinkButton");function ze(e){const t=De(e.timestamp),s=t?`<div class="message-timestamp">${t}</div>`:"",n=`entry-${u(e.id)}`,i=Ve(e.id);if(e.type==="message"){const a=e.message;if(a.role==="user"){const c=a.content,d=typeof c=="string"?c:c.filter(h=>h.type==="text").map(h=>h.text).join(`
19
+ `),r=fe(d);if(r){const h=Array.isArray(c)?c.filter(f=>f.type==="image"):[],m=r.userMessage||h.length>0;let o=`<div class="skill-user-entry" id="${n}">${i}${s}`;if(o+=`<div class="skill-invocation" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
20
+ <div class="skill-invocation-label">[skill] ${u(r.name)}</div>
21
+ <div class="skill-invocation-collapsed">${u(r.name)} (click to expand)</div>
22
+ <div class="skill-invocation-content markdown-content">${R(r.content)}</div>
23
+ </div>`,m){if(o+='<div class="user-message">',h.length>0){o+='<div class="message-images">';for(const f of h)o+=`<img src="data:${u(f.mimeType||"image/png")};base64,${u(f.data||"")}" class="message-image" />`;o+="</div>"}r.userMessage&&(o+=`<div class="markdown-content">${R(r.userMessage)}</div>`),o+="</div>"}return o+="</div>",o}let l=`<div class="user-message" id="${n}">${i}${s}`;if(Array.isArray(c)){const h=c.filter(m=>m.type==="image");if(h.length>0){l+='<div class="message-images">';for(const m of h)l+=`<img src="data:${u(m.mimeType||"image/png")};base64,${u(m.data||"")}" class="message-image" />`;l+="</div>"}}return d.trim()&&(l+=`<div class="markdown-content">${R(d)}</div>`),l+="</div>",l}if(a.role==="assistant"){let c=`<div class="assistant-message" id="${n}">${i}${s}`;for(const d of a.content)d.type==="text"&&d.text.trim()?c+=`<div class="assistant-text markdown-content">${R(d.text)}</div>`:d.type==="thinking"&&d.thinking.trim()&&(c+=`<div class="thinking-block">
24
+ <div class="thinking-text">${u(d.thinking)}</div>
25
+ <div class="thinking-collapsed">Thinking ...</div>
26
+ </div>`);for(const d of a.content)d.type==="toolCall"&&(c+=Ue(d));return a.stopReason==="aborted"?c+='<div class="error-text">Aborted</div>':a.stopReason==="error"&&(c+=`<div class="error-text">Error: ${u(a.errorMessage||"Unknown error")}</div>`),c+="</div>",c}if(a.role==="bashExecution"){let d=`<div class="tool-execution ${a.cancelled||a.exitCode!==0&&a.exitCode!==null?"error":"success"}" id="${n}">${s}`;return d+=`<div class="tool-command">$ ${u(a.command)}</div>`,a.output&&(d+=E(a.output,10)),a.cancelled?d+='<div style="color: var(--warning)">(cancelled)</div>':a.exitCode!==0&&a.exitCode!==null&&(d+=`<div style="color: var(--error)">(exit ${a.exitCode})</div>`),d+="</div>",d}if(a.role==="toolResult")return""}return e.type==="model_change"?`<div class="model-change" id="${n}">${s}Switched to model: <span class="model-name">${u(e.provider)}/${u(e.modelId)}</span></div>`:e.type==="compaction"?`<div class="compaction" id="${n}" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
27
+ <div class="compaction-label">[compaction]</div>
28
+ <div class="compaction-collapsed">Compacted from ${e.tokensBefore.toLocaleString()} tokens</div>
29
+ <div class="compaction-content"><strong>Compacted from ${e.tokensBefore.toLocaleString()} tokens</strong>
30
+
31
+ ${u(e.summary)}</div>
32
+ </div>`:e.type==="branch_summary"?`<div class="branch-summary" id="${n}">${s}
33
+ <div class="branch-summary-header">Branch Summary</div>
34
+ <div class="markdown-content">${R(e.summary)}</div>
35
+ </div>`:e.type==="custom_message"&&e.display?`<div class="hook-message" id="${n}">${s}
36
+ <div class="hook-type">[${u(e.customType)}]</div>
37
+ <div class="markdown-content">${R(typeof e.content=="string"?e.content:JSON.stringify(e.content))}</div>
38
+ </div>`:""}p(ze,"renderEntry");function Xe(e){let t=0,s=0,n=0,i=0,a=0,c=0,d=0;const r={input:0,output:0,cacheRead:0,cacheWrite:0},l={input:0,output:0,cacheRead:0,cacheWrite:0},h=new Set;for(const m of e)if(m.type==="message"){const o=m.message;o.role==="user"&&t++,o.role==="assistant"&&(s++,o.model&&h.add(o.provider?`${o.provider}/${o.model}`:o.model),o.usage&&(r.input+=o.usage.input||0,r.output+=o.usage.output||0,r.cacheRead+=o.usage.cacheRead||0,r.cacheWrite+=o.usage.cacheWrite||0,o.usage.cost&&(l.input+=o.usage.cost.input||0,l.output+=o.usage.cost.output||0,l.cacheRead+=o.usage.cost.cacheRead||0,l.cacheWrite+=o.usage.cost.cacheWrite||0)),d+=o.content.filter(f=>f.type==="toolCall").length),o.role==="toolResult"&&n++}else m.type==="compaction"?a++:m.type==="branch_summary"?c++:m.type==="custom_message"&&i++;return{userMessages:t,assistantMessages:s,toolResults:n,customMessages:i,compactions:a,branchSummaries:c,toolCalls:d,tokens:r,cost:l,models:Array.from(h)}}p(Xe,"computeStats");const v=Xe(k);function Ge(){const e=v.cost.input+v.cost.output+v.cost.cacheRead+v.cost.cacheWrite,t=[];v.tokens.input&&t.push(`\u2191${z(v.tokens.input)}`),v.tokens.output&&t.push(`\u2193${z(v.tokens.output)}`),v.tokens.cacheRead&&t.push(`R${z(v.tokens.cacheRead)}`),v.tokens.cacheWrite&&t.push(`W${z(v.tokens.cacheWrite)}`);const s=[];v.userMessages&&s.push(`${v.userMessages} user`),v.assistantMessages&&s.push(`${v.assistantMessages} assistant`),v.toolResults&&s.push(`${v.toolResults} tool results`),v.customMessages&&s.push(`${v.customMessages} custom`),v.compactions&&s.push(`${v.compactions} compactions`),v.branchSummaries&&s.push(`${v.branchSummaries} branch summaries`);let n=`
39
+ <div class="header">
40
+ <h1>Session: ${u(I?.id||"unknown")}</h1>
41
+ <div class="help-bar">
42
+ <span class="help-hint">T toggle thinking \xB7 O toggle tools</span>
43
+ <div class="help-actions">
44
+ <button type="button" class="header-toggle-btn" data-action="toggle-thinking" title="Toggle thinking (T)">Toggle thinking</button>
45
+ <button type="button" class="header-toggle-btn" data-action="toggle-tools" title="Toggle tools (O)">Toggle tools</button>
46
+ <button type="button" class="download-json-btn" onclick="downloadSessionJson()" title="Download session as JSONL">\u2193 JSONL</button>
47
+ </div>
48
+ </div>
49
+ <div class="header-info">
50
+ <div class="info-item"><span class="info-label">Date:</span><span class="info-value">${I?.timestamp?new Date(I.timestamp).toLocaleString():"unknown"}</span></div>
51
+ <div class="info-item"><span class="info-label">Models:</span><span class="info-value">${u(v.models.join(", ")||"unknown")}</span></div>
52
+ <div class="info-item"><span class="info-label">Messages:</span><span class="info-value">${s.join(", ")||"0"}</span></div>
53
+ <div class="info-item"><span class="info-label">Tool Calls:</span><span class="info-value">${v.toolCalls}</span></div>
54
+ <div class="info-item"><span class="info-label">Tokens:</span><span class="info-value">${t.join(" ")||"0"}</span></div>
55
+ <div class="info-item"><span class="info-label">Cost:</span><span class="info-value">$${e.toFixed(3)}</span></div>
56
+ </div>
57
+ </div>`;if(U){const i=U.split(`
58
+ `),a=10;if(i.length>a){const c=i.slice(0,a).join(`
59
+ `),d=i.length-a;n+=`<div class="system-prompt expandable" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
60
+ <div class="system-prompt-header">System Prompt</div>
61
+ <div class="system-prompt-preview">${u(c)}</div>
62
+ <div class="system-prompt-expand-hint">... (${d} more lines, click to expand)</div>
63
+ <div class="system-prompt-full">${u(U)}</div>
64
+ </div>`}else n+=`<div class="system-prompt">
65
+ <div class="system-prompt-header">System Prompt</div>
66
+ <div class="system-prompt-full" style="display: block">${u(U)}</div>
67
+ </div>`}return Y&&Y.length>0&&(n+=`<div class="tools-list">
68
+ <div class="tools-header">Available Tools</div>
69
+ <div class="tools-content">
70
+ ${Y.map(i=>{if(!(i.parameters&&typeof i.parameters=="object"&&i.parameters.properties&&Object.keys(i.parameters.properties).length>0))return`<div class="tool-item"><span class="tool-item-name">${u(i.name)}</span> - <span class="tool-item-desc">${u(i.description)}</span></div>`;const c=i.parameters,d=c.properties,r=c.required||[];let l="";for(const[h,m]of Object.entries(d)){const o=r.includes(h),f=m.type||"any",g=o?'<span class="tool-param-required">required</span>':'<span class="tool-param-optional">optional</span>';l+=`<div class="tool-param"><span class="tool-param-name">${u(h)}</span> <span class="tool-param-type">${u(f)}</span> ${g}`,m.description&&(l+=`<div class="tool-param-desc">${u(m.description)}</div>`),l+="</div>"}return`<div class="tool-item" onclick="if(window.getSelection().toString())return;this.classList.toggle('params-expanded')"><span class="tool-item-name">${u(i.name)}</span> - <span class="tool-item-desc">${u(i.description)}</span> <span class="tool-params-hint"></span><div class="tool-params-content">${l}</div></div>`}).join("")}
71
+ </div>
72
+ </div>`),n}p(Ge,"renderHeader");const se=new Map;function Ke(e){const t=L.get(e);return t?.type==="message"&&t.message.role==="toolResult"&&t.message.toolCallId?`tool-call-${t.message.toolCallId}`:`entry-${e}`}p(Ke,"getScrollTargetElementId");function Qe(e){if(se.has(e.id))return se.get(e.id).cloneNode(!0);const t=ze(e);if(!t)return null;const s=document.createElement("template");s.innerHTML=t;const n=s.content.firstElementChild;return n&&se.set(e.id,n.cloneNode(!0)),n}p(Qe,"renderEntryToNode");function A(e,t="target",s=null){V=e,ee=s||e;const n=Re(e);he(),document.getElementById("header-container").innerHTML=Ge(),nt();const i=document.getElementById("messages"),a=document.createDocumentFragment();for(const c of n){const d=Qe(c);d&&a.appendChild(d)}i.innerHTML="",i.appendChild(a),i.querySelectorAll(".copy-link-btn").forEach(c=>{c.addEventListener("click",d=>{d.stopPropagation();const r=c.dataset.entryId,l=Je(r);Fe(l,c)})}),setTimeout(()=>{const c=document.getElementById("content");if(t==="bottom")c.scrollTop=c.scrollHeight;else if(t==="target"){const d=s||e,r=document.getElementById(Ke(d))||document.getElementById(`entry-${d}`);r&&(r.scrollIntoView({block:"center"}),s&&(r.classList.add("highlight"),setTimeout(()=>r.classList.remove("highlight"),2e3)))}},0)}p(A,"navigateTo");const Ye=/^(~~)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/;marked.use({breaks:!0,gfm:!0,tokenizer:{html(){},tag(){},del(e){const t=Ye.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}},renderer:{link(e){const t=(e.href||"").trim();if(/^\s*(javascript|vbscript|data):/i.test(t))return this.parser.parseInline(e.tokens);let s='<a href="'+u(t)+'"';return e.title&&(s+=' title="'+u(e.title)+'"'),s+=">"+this.parser.parseInline(e.tokens)+"</a>",s},image(e){const t=(e.href||"").trim();if(/^\s*(javascript|vbscript|data):/i.test(t))return u(e.text||"");let s='<img src="'+u(t)+'" alt="'+u(e.text||"")+'"';return e.title&&(s+=' title="'+u(e.title)+'"'),s+=">",s},code(e){const t=e.text,s=e.lang;let n;if(s&&hljs.getLanguage(s))try{n=hljs.highlight(t,{language:s}).value}catch{n=u(t)}else try{n=hljs.highlightAuto(t).value}catch{n=u(t)}return`<pre><code class="hljs">${n}</code></pre>`},codespan(e){return`<code>${u(e.text)}</code>`}}});function R(e){return marked.parse(e)}p(R,"safeMarkedParse");const ye=document.getElementById("tree-search");ye.addEventListener("input",e=>{Z=e.target.value,ge()}),document.querySelectorAll(".filter-btn").forEach(e=>{e.addEventListener("click",()=>{document.querySelectorAll(".filter-btn").forEach(t=>t.classList.remove("active")),e.classList.add("active"),me=e.dataset.filter,ge()})});const _=document.getElementById("sidebar"),ne=document.getElementById("sidebar-overlay"),oe=document.getElementById("hamburger"),W=document.getElementById("sidebar-resizer"),be="pi-share:v1:sidebar-width",Ze=320;function ie(){return window.matchMedia("(max-width: 900px)").matches}p(ie,"isMobileLayout");function et(){const e=getComputedStyle(document.documentElement),t=parseFloat(e.getPropertyValue("--sidebar-min-width"))||240,s=parseFloat(e.getPropertyValue("--sidebar-max-width"))||720,n=window.innerWidth-Ze;return{minWidth:t,maxWidth:Math.max(t,Math.min(s,n))}}p(et,"getSidebarBounds");function $e(e){const{minWidth:t,maxWidth:s}=et();return Math.max(t,Math.min(s,e))}p($e,"clampSidebarWidth");function X(e){document.documentElement.style.setProperty("--sidebar-width",`${Math.round($e(e))}px`)}p(X,"applySidebarWidth");function tt(){try{const e=localStorage.getItem(be);if(e===null)return null;const t=Number(e);return Number.isFinite(t)?t:null}catch{return null}}p(tt,"loadSidebarWidth");function ke(e){try{localStorage.setItem(be,String(Math.round($e(e))))}catch{}}p(ke,"saveSidebarWidth");function st(){const e=tt();if(e!==null&&X(e),!W)return;let t=null;const s=p(n=>{t&&(t(n),t=null)},"stopDrag");W.addEventListener("pointerdown",n=>{if(ie())return;n.preventDefault();const i=n.clientX,a=_.getBoundingClientRect().width;document.body.classList.add("sidebar-resizing"),W.setPointerCapture?.(n.pointerId);const c=p(l=>{X(a+(l.clientX-i))},"onPointerMove");t=p(l=>{document.body.classList.remove("sidebar-resizing"),W.releasePointerCapture?.(l),window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",d),window.removeEventListener("pointercancel",r),ke(_.getBoundingClientRect().width)},"cleanupDrag");const d=p(l=>s(l.pointerId),"onPointerUp"),r=p(l=>s(l.pointerId),"onPointerCancel");window.addEventListener("pointermove",c),window.addEventListener("pointerup",d),window.addEventListener("pointercancel",r)}),W.addEventListener("dblclick",()=>{ie()||(X(400),ke(400))}),window.addEventListener("resize",()=>{ie()||X(_.getBoundingClientRect().width)})}p(st,"setupSidebarResize"),st(),oe.addEventListener("click",()=>{_.classList.add("open"),ne.classList.add("open"),oe.style.display="none"});const we=p(()=>{_.classList.remove("open"),ne.classList.remove("open"),oe.style.display=""},"closeSidebar");ne.addEventListener("click",we),document.getElementById("sidebar-close").addEventListener("click",we);let G=!0,q=!1;const xe=p(()=>{G=!G,document.querySelectorAll(".thinking-text").forEach(e=>{e.style.display=G?"":"none"}),document.querySelectorAll(".thinking-collapsed").forEach(e=>{e.style.display=G?"none":"block"})},"toggleThinking"),Se=p(()=>{q=!q,document.querySelectorAll(".tool-output.expandable").forEach(e=>{e.classList.toggle("expanded",q)}),document.querySelectorAll(".compaction").forEach(e=>{e.classList.toggle("expanded",q)}),document.querySelectorAll(".skill-invocation").forEach(e=>{e.classList.toggle("expanded",q)})},"toggleToolOutputs"),nt=p(()=>{document.querySelector('[data-action="toggle-thinking"]')?.addEventListener("click",xe),document.querySelector('[data-action="toggle-tools"]')?.addEventListener("click",Se)},"attachHeaderHandlers"),ot=p(e=>{if(!e)return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||t==="BUTTON"?!0:e.isContentEditable||!!e.closest?.('[contenteditable="true"]')},"isEditableTarget");document.addEventListener("keydown",e=>{if(e.key==="Escape"&&(ye.value="",Z="",A(T,"bottom")),ot(document.activeElement))return;const t=e.key.toLowerCase();t==="t"?(e.preventDefault(),xe()):t==="o"&&(e.preventDefault(),Se())}),T?J&&L.has(J)?A(T,"target",J):A(T,"none"):k.length>0&&A(k[k.length-1].id,"none")})();
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Tool HTML renderer for custom tools in HTML export.
3
+ *
4
+ * Renders custom tool calls and results to HTML by invoking their TUI renderers
5
+ * and converting the ANSI output to HTML.
6
+ */
7
+ import type { Theme } from "../../modes/interactive/theme/theme.ts";
8
+ import type { ToolDefinition } from "../extensions/types.ts";
9
+ export interface ToolHtmlRendererDeps {
10
+ /** Function to look up tool definition by name */
11
+ getToolDefinition: (name: string) => ToolDefinition | undefined;
12
+ /** Theme for styling */
13
+ theme: Theme;
14
+ /** Working directory for render context */
15
+ cwd: string;
16
+ /** Terminal width for rendering (default: 100) */
17
+ width?: number;
18
+ }
19
+ export interface ToolHtmlRenderer {
20
+ /** Render a tool call to HTML. Returns undefined if tool has no custom renderer. */
21
+ renderCall(toolCallId: string, toolName: string, args: unknown): string | undefined;
22
+ /** Render a tool result to collapsed/expanded HTML. Returns undefined if tool has no custom renderer. */
23
+ renderResult(toolCallId: string, toolName: string, result: Array<{
24
+ type: string;
25
+ text?: string;
26
+ data?: string;
27
+ mimeType?: string;
28
+ }>, details: unknown, isError: boolean): {
29
+ collapsed?: string;
30
+ expanded?: string;
31
+ } | undefined;
32
+ }
33
+ export declare function createToolHtmlRenderer(deps: ToolHtmlRendererDeps): ToolHtmlRenderer;
@@ -0,0 +1 @@
1
+ var P=Object.defineProperty;var a=(t,n)=>P(t,"name",{value:n,configurable:!0});import{ansiLinesToHtml as g}from"./ansi-to-html.js";const y=/\x1b\[[\d;]*m/g;function T(t){return t.replace(y,"").trim().length===0}a(T,"isBlankRenderedLine");function A(t){let n=0,s=t.length;for(;n<s&&T(t[n]);)n++;for(;s>n&&T(t[s-1]);)s--;return t.slice(n,s)}a(A,"trimRenderedResultLines");function _(t){const{getToolDefinition:n,theme:s,cwd:D,width:f=100}=t,l=new Map,o=new Map,R=new Map,h=new Map,L=a(e=>{let r=R.get(e);return r||(r={},R.set(e,r)),r},"getState"),p=a((e,r,c,u,d)=>({args:h.get(e),toolCallId:e,invalidate:a(()=>{},"invalidate"),lastComponent:r,state:L(e),cwd:D,executionStarted:!0,argsComplete:!0,isPartial:u,expanded:c,showImages:!1,isError:d}),"createRenderContext");return{renderCall(e,r,c){try{h.set(e,c);const u=n(r);if(!u?.renderCall)return;const d=u.renderCall(c,s,p(e,l.get(e),!1,!0,!1));l.set(e,d);const i=d.render(f);return g(i)}catch{return}},renderResult(e,r,c,u,d){try{const i=n(r);if(!i?.renderResult)return;const w={content:c,details:u,isError:d},x=i.renderResult(w,{expanded:!1,isPartial:!1},s,p(e,o.get(e),!1,!1,d));o.set(e,x);const m=g(A(x.render(f))),S=i.renderResult(w,{expanded:!0,isPartial:!1},s,p(e,o.get(e),!0,!1,d));o.set(e,S);const M=g(A(S.render(f)));return{...m&&m!==M?{collapsed:m}:{},expanded:M}}catch{return}}}}a(_,"createToolHtmlRenderer");export{_ as createToolHtmlRenderer};