@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.
- package/CHANGELOG.md +4448 -0
- package/README.md +665 -0
- package/dist/bun/cli.d.ts +2 -0
- package/dist/bun/cli.js +2 -0
- package/dist/bun/register-bedrock.d.ts +1 -0
- package/dist/bun/register-bedrock.js +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +12 -0
- package/dist/bun/restore-sandbox-env.js +1 -0
- package/dist/cli/args.d.ts +55 -0
- package/dist/cli/args.js +167 -0
- package/dist/cli/config-selector.d.ts +13 -0
- package/dist/cli/config-selector.js +1 -0
- package/dist/cli/file-processor.d.ts +14 -0
- package/dist/cli/file-processor.js +7 -0
- package/dist/cli/import-sessions.d.ts +34 -0
- package/dist/cli/import-sessions.js +6 -0
- package/dist/cli/initial-message.d.ts +17 -0
- package/dist/cli/initial-message.js +1 -0
- package/dist/cli/list-models.d.ts +8 -0
- package/dist/cli/list-models.js +2 -0
- package/dist/cli/openadapter-setup.d.ts +29 -0
- package/dist/cli/openadapter-setup.js +3 -0
- package/dist/cli/session-picker.d.ts +8 -0
- package/dist/cli/session-picker.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2 -0
- package/dist/config.d.ts +92 -0
- package/dist/config.js +1 -0
- package/dist/core/agent-session-runtime.d.ts +116 -0
- package/dist/core/agent-session-runtime.js +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session.d.ts +747 -0
- package/dist/core/agent-session.js +32 -0
- package/dist/core/auth-guidance.d.ts +4 -0
- package/dist/core/auth-guidance.js +8 -0
- package/dist/core/auth-storage.d.ts +140 -0
- package/dist/core/auth-storage.js +1 -0
- package/dist/core/bash-executor.d.ts +31 -0
- package/dist/core/bash-executor.js +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +89 -0
- package/dist/core/compaction/branch-summarization.js +38 -0
- package/dist/core/compaction/compaction.d.ts +120 -0
- package/dist/core/compaction/compaction.js +104 -0
- package/dist/core/compaction/index.d.ts +6 -0
- package/dist/core/compaction/index.js +1 -0
- package/dist/core/compaction/utils.d.ts +37 -0
- package/dist/core/compaction/utils.js +19 -0
- package/dist/core/defaults.d.ts +2 -0
- package/dist/core/defaults.js +1 -0
- package/dist/core/diagnostics.d.ts +14 -0
- package/dist/core/diagnostics.js +0 -0
- package/dist/core/event-bus.d.ts +8 -0
- package/dist/core/event-bus.js +1 -0
- package/dist/core/exec.d.ts +28 -0
- package/dist/core/exec.js +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +21 -0
- package/dist/core/export-html/ansi-to-html.js +1 -0
- package/dist/core/export-html/index.d.ts +36 -0
- package/dist/core/export-html/index.js +2 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +72 -0
- package/dist/core/export-html/tool-renderer.d.ts +33 -0
- package/dist/core/export-html/tool-renderer.js +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +8 -0
- package/dist/core/export-html/vendor/marked.min.js +56 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.js +1 -0
- package/dist/core/extensions/loader.d.ts +23 -0
- package/dist/core/extensions/loader.js +1 -0
- package/dist/core/extensions/runner.d.ts +160 -0
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/types.d.ts +1180 -0
- package/dist/core/extensions/types.js +1 -0
- package/dist/core/extensions/wrapper.d.ts +19 -0
- package/dist/core/extensions/wrapper.js +1 -0
- package/dist/core/footer-data-provider.d.ts +53 -0
- package/dist/core/footer-data-provider.js +1 -0
- package/dist/core/http-dispatcher.d.ts +20 -0
- package/dist/core/http-dispatcher.js +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.js +1 -0
- package/dist/core/keybindings.d.ts +352 -0
- package/dist/core/keybindings.js +1 -0
- package/dist/core/messages.d.ts +76 -0
- package/dist/core/messages.js +17 -0
- package/dist/core/model-registry.d.ts +149 -0
- package/dist/core/model-registry.js +9 -0
- package/dist/core/model-resolver.d.ts +109 -0
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.js +1 -0
- package/dist/core/package-manager.d.ts +203 -0
- package/dist/core/package-manager.js +3 -0
- package/dist/core/prompt-templates.d.ts +51 -0
- package/dist/core/prompt-templates.js +2 -0
- package/dist/core/provider-attribution.d.ts +3 -0
- package/dist/core/provider-attribution.js +1 -0
- package/dist/core/provider-display-names.d.ts +1 -0
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/core/resolve-config-value.js +1 -0
- package/dist/core/resource-loader.d.ts +193 -0
- package/dist/core/resource-loader.js +1 -0
- package/dist/core/sdk.d.ts +108 -0
- package/dist/core/sdk.js +1 -0
- package/dist/core/session-cwd.d.ts +18 -0
- package/dist/core/session-cwd.js +7 -0
- package/dist/core/session-manager.d.ts +331 -0
- package/dist/core/session-manager.js +11 -0
- package/dist/core/settings-manager.d.ts +265 -0
- package/dist/core/settings-manager.js +1 -0
- package/dist/core/skills.d.ts +59 -0
- package/dist/core/skills.js +4 -0
- package/dist/core/slash-commands.d.ts +13 -0
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/source-info.d.ts +17 -0
- package/dist/core/source-info.js +1 -0
- package/dist/core/system-prompt.d.ts +27 -0
- package/dist/core/system-prompt.js +52 -0
- package/dist/core/telemetry.d.ts +2 -0
- package/dist/core/telemetry.js +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.js +3 -0
- package/dist/core/tools/bash.d.ts +67 -0
- package/dist/core/tools/bash.js +18 -0
- package/dist/core/tools/edit-diff.d.ts +86 -0
- package/dist/core/tools/edit-diff.js +16 -0
- package/dist/core/tools/edit.d.ts +50 -0
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/file-mutation-queue.d.ts +5 -0
- package/dist/core/tools/file-mutation-queue.js +1 -0
- package/dist/core/tools/find.d.ts +34 -0
- package/dist/core/tools/find.js +13 -0
- package/dist/core/tools/grep.d.ts +36 -0
- package/dist/core/tools/grep.js +13 -0
- package/dist/core/tools/index.d.ts +39 -0
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/ls.d.ts +36 -0
- package/dist/core/tools/ls.js +9 -0
- package/dist/core/tools/output-accumulator.d.ts +51 -0
- package/dist/core/tools/output-accumulator.js +4 -0
- package/dist/core/tools/path-utils.d.ts +9 -0
- package/dist/core/tools/path-utils.js +1 -0
- package/dist/core/tools/read.d.ts +34 -0
- package/dist/core/tools/read.js +22 -0
- package/dist/core/tools/render-utils.d.ts +23 -0
- package/dist/core/tools/render-utils.js +4 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +13 -0
- package/dist/core/tools/tool-definition-wrapper.js +1 -0
- package/dist/core/tools/truncate.d.ts +69 -0
- package/dist/core/tools/truncate.js +5 -0
- package/dist/core/tools/write.d.ts +25 -0
- package/dist/core/tools/write.js +13 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +1 -0
- package/dist/main.d.ts +11 -0
- package/dist/main.js +1 -0
- package/dist/migrations.d.ts +32 -0
- package/dist/migrations.js +8 -0
- package/dist/modes/index.d.ts +8 -0
- package/dist/modes/index.js +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/armin.d.ts +33 -0
- package/dist/modes/interactive/components/armin.js +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +19 -0
- package/dist/modes/interactive/components/assistant-message.js +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +33 -0
- package/dist/modes/interactive/components/bash-execution.js +13 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
- package/dist/modes/interactive/components/bordered-loader.js +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/branch-summary-message.js +3 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +3 -0
- package/dist/modes/interactive/components/config-selector.d.ts +70 -0
- package/dist/modes/interactive/components/config-selector.js +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +13 -0
- package/dist/modes/interactive/components/countdown-timer.js +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +20 -0
- package/dist/modes/interactive/components/custom-editor.js +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +19 -0
- package/dist/modes/interactive/components/custom-message.js +2 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +22 -0
- package/dist/modes/interactive/components/daxnuts.js +1 -0
- package/dist/modes/interactive/components/diff.d.ts +11 -0
- package/dist/modes/interactive/components/diff.js +3 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +14 -0
- package/dist/modes/interactive/components/dynamic-border.js +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +4 -0
- package/dist/modes/interactive/components/earendil-announcement.js +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +19 -0
- package/dist/modes/interactive/components/extension-editor.js +3 -0
- package/dist/modes/interactive/components/extension-input.d.ts +22 -0
- package/dist/modes/interactive/components/extension-input.js +2 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +25 -0
- package/dist/modes/interactive/components/extension-selector.js +2 -0
- package/dist/modes/interactive/components/footer.d.ts +27 -0
- package/dist/modes/interactive/components/footer.js +1 -0
- package/dist/modes/interactive/components/index.d.ts +31 -0
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +12 -0
- package/dist/modes/interactive/components/keybinding-hints.js +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +51 -0
- package/dist/modes/interactive/components/login-dialog.js +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +46 -0
- package/dist/modes/interactive/components/model-selector.js +2 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +30 -0
- package/dist/modes/interactive/components/oauth-selector.js +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +41 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
- package/dist/modes/interactive/components/session-selector-search.js +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.js +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +68 -0
- package/dist/modes/interactive/components/settings-selector.js +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +9 -0
- package/dist/modes/interactive/components/show-images-selector.js +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +16 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +3 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +10 -0
- package/dist/modes/interactive/components/theme-selector.js +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +10 -0
- package/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
- package/dist/modes/interactive/components/tool-execution.js +4 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +88 -0
- package/dist/modes/interactive/components/tree-selector.js +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +29 -0
- package/dist/modes/interactive/components/user-message-selector.js +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +9 -0
- package/dist/modes/interactive/components/user-message.js +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +23 -0
- package/dist/modes/interactive/components/visual-truncate.js +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +417 -0
- package/dist/modes/interactive/interactive-mode.js +116 -0
- package/dist/modes/interactive/theme/dark.json +86 -0
- package/dist/modes/interactive/theme/light.json +85 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +101 -0
- package/dist/modes/interactive/theme/theme.js +18 -0
- package/dist/modes/print-mode.d.ts +27 -0
- package/dist/modes/print-mode.js +4 -0
- package/dist/modes/rpc/jsonl.d.ts +16 -0
- package/dist/modes/rpc/jsonl.js +3 -0
- package/dist/modes/rpc/rpc-client.d.ts +226 -0
- package/dist/modes/rpc/rpc-client.js +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +19 -0
- package/dist/modes/rpc/rpc-mode.js +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +419 -0
- package/dist/modes/rpc/rpc-types.js +0 -0
- package/dist/package-manager-cli.d.ts +3 -0
- package/dist/package-manager-cli.js +49 -0
- package/dist/utils/ansi.d.ts +1 -0
- package/dist/utils/ansi.js +1 -0
- package/dist/utils/auto-update.d.ts +13 -0
- package/dist/utils/auto-update.js +1 -0
- package/dist/utils/changelog.d.ts +20 -0
- package/dist/utils/changelog.js +4 -0
- package/dist/utils/child-process.d.ts +14 -0
- package/dist/utils/child-process.js +1 -0
- package/dist/utils/clipboard-image.d.ts +10 -0
- package/dist/utils/clipboard-image.js +1 -0
- package/dist/utils/clipboard-native.d.ts +9 -0
- package/dist/utils/clipboard-native.js +1 -0
- package/dist/utils/clipboard.d.ts +1 -0
- package/dist/utils/clipboard.js +1 -0
- package/dist/utils/deprecation.d.ts +3 -0
- package/dist/utils/deprecation.js +1 -0
- package/dist/utils/exif-orientation.d.ts +4 -0
- package/dist/utils/exif-orientation.js +1 -0
- package/dist/utils/frontmatter.d.ts +7 -0
- package/dist/utils/frontmatter.js +4 -0
- package/dist/utils/fs-watch.d.ts +4 -0
- package/dist/utils/fs-watch.js +1 -0
- package/dist/utils/git.d.ts +25 -0
- package/dist/utils/git.js +1 -0
- package/dist/utils/html.d.ts +6 -0
- package/dist/utils/html.js +1 -0
- package/dist/utils/image-convert.d.ts +8 -0
- package/dist/utils/image-convert.js +1 -0
- package/dist/utils/image-resize-core.d.ts +29 -0
- package/dist/utils/image-resize-core.js +1 -0
- package/dist/utils/image-resize-worker.d.ts +1 -0
- package/dist/utils/image-resize-worker.js +1 -0
- package/dist/utils/image-resize.d.ts +15 -0
- package/dist/utils/image-resize.js +1 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.js +1 -0
- package/dist/utils/koda-user-agent.d.ts +1 -0
- package/dist/utils/koda-user-agent.js +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.js +1 -0
- package/dist/utils/paths.d.ts +30 -0
- package/dist/utils/paths.js +1 -0
- package/dist/utils/photon.d.ts +20 -0
- package/dist/utils/photon.js +1 -0
- package/dist/utils/shell.d.ts +29 -0
- package/dist/utils/shell.js +8 -0
- package/dist/utils/sleep.d.ts +4 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/syntax-highlight.d.ts +11 -0
- package/dist/utils/syntax-highlight.js +2 -0
- package/dist/utils/tools-manager.d.ts +2 -0
- package/dist/utils/tools-manager.js +1 -0
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.js +1 -0
- package/dist/utils/windows-self-update.d.ts +2 -0
- package/dist/utils/windows-self-update.js +1 -0
- package/docs/compaction.md +394 -0
- package/docs/custom-provider.md +736 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/extensions.md +2626 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +80 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +197 -0
- package/docs/models.md +493 -0
- package/docs/packages.md +226 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +253 -0
- package/docs/quickstart.md +165 -0
- package/docs/rpc.md +1408 -0
- package/docs/sdk.md +1137 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +145 -0
- package/docs/settings.md +281 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +114 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +927 -0
- package/docs/usage.md +288 -0
- package/docs/windows.md +17 -0
- package/npm-shrinkwrap.json +1792 -0
- package/openadapter/extensions/koda-ask.js +12 -0
- package/openadapter/extensions/koda-bg.js +14 -0
- package/openadapter/extensions/koda-commands.mjs +15 -0
- package/openadapter/extensions/koda-help.js +8 -0
- package/openadapter/extensions/koda-memory.js +16 -0
- package/openadapter/extensions/koda-status.js +1 -0
- package/openadapter/extensions/koda-todo.js +4 -0
- package/openadapter/extensions/koda-vision.js +4 -0
- package/openadapter/extensions/koda-web.js +7 -0
- package/openadapter/setup.mjs +173 -0
- package/openadapter/skills/code-review/SKILL.md +22 -0
- package/openadapter/skills/debugging/SKILL.md +28 -0
- package/openadapter/skills/frontend/SKILL.md +38 -0
- 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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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};
|