@prometheus-ai/agent 0.5.3 → 0.5.8
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 +39 -0
- package/dist/cli.js +25110 -0
- package/dist/types/async/index.d.ts +0 -1
- package/dist/types/async/job-manager.d.ts +33 -0
- package/dist/types/autolearn/controller.d.ts +25 -0
- package/dist/types/autolearn/managed-skills.d.ts +45 -0
- package/dist/types/autoresearch/state.d.ts +1 -1
- package/dist/types/autoresearch/tools/init-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/log-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/run-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/update-notes.d.ts +1 -1
- package/dist/types/autoresearch/types.d.ts +1 -1
- package/dist/types/capability/context-file.d.ts +0 -13
- package/dist/types/capability/mcp.d.ts +1 -0
- package/dist/types/capability/rule-buckets.d.ts +1 -1
- package/dist/types/capability/rule.d.ts +6 -1
- package/dist/types/capability/types.d.ts +0 -4
- package/dist/types/cli/args.d.ts +23 -3
- package/dist/types/cli/bench-cli.d.ts +78 -0
- package/dist/types/cli/claude-trace-cli.d.ts +7 -0
- package/dist/types/cli/dry-balance-cli.d.ts +16 -2
- package/dist/types/cli/gallery-cli.d.ts +43 -0
- package/dist/types/cli/gallery-fixtures/agentic.d.ts +2 -0
- package/dist/types/cli/gallery-fixtures/codeintel.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/edit.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/fs.d.ts +2 -0
- package/dist/types/cli/gallery-fixtures/index.d.ts +4 -0
- package/dist/types/cli/gallery-fixtures/interaction.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/memory.d.ts +2 -0
- package/dist/types/cli/gallery-fixtures/misc.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/search.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/shell.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/types.d.ts +55 -0
- package/dist/types/cli/gallery-fixtures/web.d.ts +2 -0
- package/dist/types/cli/gallery-screenshot.d.ts +35 -0
- package/dist/types/cli/gateway-cli.d.ts +4 -0
- package/dist/types/cli/grievances-cli.d.ts +1 -1
- package/dist/types/cli/list-models.d.ts +6 -14
- package/dist/types/cli/models-cli.d.ts +49 -0
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -1
- package/dist/types/cli/setup-model-picker.d.ts +14 -0
- package/dist/types/cli/startup-cwd.d.ts +2 -0
- package/dist/types/cli/update-cli.d.ts +13 -40
- package/dist/types/cli/usage-cli.d.ts +81 -0
- package/dist/types/cli-commands.d.ts +12 -0
- package/dist/types/collab/crypto.d.ts +7 -0
- package/dist/types/collab/guest.d.ts +37 -0
- package/dist/types/collab/host.d.ts +29 -0
- package/dist/types/collab/protocol.d.ts +119 -0
- package/dist/types/collab/relay-client.d.ts +22 -0
- package/dist/types/commands/bench.d.ts +29 -0
- package/dist/types/commands/gallery.d.ts +47 -0
- package/dist/types/commands/gateway.d.ts +3 -0
- package/dist/types/commands/install.d.ts +1 -1
- package/dist/types/commands/join.d.ts +12 -0
- package/dist/types/commands/launch.d.ts +8 -4
- package/dist/types/commands/models.d.ts +33 -0
- package/dist/types/commands/read.d.ts +1 -1
- package/dist/types/commands/say.d.ts +24 -0
- package/dist/types/commands/token.d.ts +25 -0
- package/dist/types/commands/usage.d.ts +34 -0
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-overview.d.ts +1 -1
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +1 -1
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +1 -1
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +1 -1
- package/dist/types/commit/agentic/tools/schemas.d.ts +1 -1
- package/dist/types/commit/agentic/tools/split-commit.d.ts +1 -1
- package/dist/types/commit/analysis/conventional.d.ts +2 -2
- package/dist/types/commit/analysis/summary.d.ts +2 -2
- package/dist/types/commit/changelog/generate.d.ts +3 -3
- package/dist/types/commit/changelog/index.d.ts +2 -2
- package/dist/types/commit/map-reduce/index.d.ts +3 -3
- package/dist/types/commit/map-reduce/map-phase.d.ts +2 -2
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +2 -2
- package/dist/types/commit/model-selection.d.ts +10 -4
- package/dist/types/commit/shared-llm.d.ts +1 -1
- package/dist/types/config/api-key-resolver.d.ts +43 -0
- package/dist/types/config/append-only-context-mode.d.ts +2 -1
- package/dist/types/config/keybindings.d.ts +12 -7
- package/dist/types/config/model-discovery.d.ts +57 -0
- package/dist/types/config/model-equivalence.d.ts +1 -1
- package/dist/types/config/model-registry.d.ts +86 -222
- package/dist/types/config/model-resolver.d.ts +43 -12
- package/dist/types/config/model-roles.d.ts +29 -0
- package/dist/types/config/models-config-schema.d.ts +536 -43
- package/dist/types/config/models-config.d.ts +391 -0
- package/dist/types/config/settings-schema.d.ts +1211 -324
- package/dist/types/config/settings.d.ts +15 -3
- package/dist/types/dap/config.d.ts +14 -1
- package/dist/types/dap/types.d.ts +10 -0
- package/dist/types/debug/log-viewer.d.ts +1 -1
- package/dist/types/debug/raw-sse.d.ts +1 -1
- package/dist/types/debug/report-bundle.d.ts +3 -0
- package/dist/types/debug/terminal-info.d.ts +0 -1
- package/dist/types/discovery/at-imports.d.ts +15 -0
- package/dist/types/discovery/prometheus-extension-roots.d.ts +7 -7
- package/dist/types/edit/diff.d.ts +3 -2
- package/dist/types/edit/file-snapshot-store.d.ts +18 -0
- package/dist/types/edit/hashline/noop-loop-guard.d.ts +72 -0
- package/dist/types/edit/hashline/params.d.ts +1 -1
- package/dist/types/edit/index.d.ts +0 -1
- package/dist/types/edit/modes/apply-patch.d.ts +1 -1
- package/dist/types/edit/modes/patch.d.ts +1 -1
- package/dist/types/edit/modes/replace.d.ts +1 -1
- package/dist/types/edit/renderer.d.ts +1 -0
- package/dist/types/eval/__tests__/completion-bridge.test.d.ts +1 -0
- package/dist/types/eval/__tests__/helpers-local-roots.test.d.ts +1 -0
- package/dist/types/eval/__tests__/js-context-manager.test.d.ts +1 -0
- package/dist/types/eval/backend.d.ts +7 -2
- package/dist/types/eval/bridge-timeout.d.ts +1 -1
- package/dist/types/eval/completion-bridge.d.ts +25 -0
- package/dist/types/eval/idle-timeout.d.ts +1 -5
- package/dist/types/eval/js/context-manager.d.ts +1 -0
- package/dist/types/eval/js/executor.d.ts +2 -0
- package/dist/types/eval/js/index.d.ts +1 -1
- package/dist/types/eval/js/shared/helpers.d.ts +7 -1
- package/dist/types/eval/js/shared/rewrite-imports.d.ts +6 -6
- package/dist/types/eval/js/shared/runtime.d.ts +6 -1
- package/dist/types/eval/js/worker-protocol.d.ts +6 -0
- package/dist/types/eval/py/__tests__/prelude.test.d.ts +1 -0
- package/dist/types/eval/py/executor.d.ts +12 -0
- package/dist/types/eval/py/index.d.ts +1 -1
- package/dist/types/eval/py/kernel.d.ts +6 -1
- package/dist/types/eval/py/runtime.d.ts +9 -0
- package/dist/types/exa/index.d.ts +1 -19
- package/dist/types/exa/mcp-client.d.ts +10 -3
- package/dist/types/exa/types.d.ts +0 -83
- package/dist/types/exec/bash-executor.d.ts +7 -0
- package/dist/types/export/custom-share.d.ts +1 -2
- package/dist/types/export/html/index.d.ts +39 -0
- package/dist/types/export/html/template-js.d.ts +2 -0
- package/dist/types/export/share.d.ts +61 -0
- package/dist/types/export/ttsr.d.ts +14 -0
- package/dist/types/extensibility/custom-commands/types.d.ts +9 -4
- package/dist/types/extensibility/custom-tools/loader.d.ts +30 -4
- package/dist/types/extensibility/custom-tools/types.d.ts +16 -8
- package/dist/types/extensibility/extensions/index.d.ts +1 -1
- package/dist/types/extensibility/extensions/loader.d.ts +20 -1
- package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
- package/dist/types/extensibility/extensions/runner.d.ts +5 -2
- package/dist/types/extensibility/extensions/types.d.ts +72 -11
- package/dist/types/extensibility/hooks/index.d.ts +2 -1
- package/dist/types/extensibility/hooks/loader.d.ts +1 -1
- package/dist/types/extensibility/hooks/types.d.ts +11 -5
- package/dist/types/extensibility/{legacy-pi-ai-shim.d.ts → legacy-package-ai-shim.d.ts} +2 -2
- package/dist/types/extensibility/plugins/{legacy-pi-compat.d.ts → legacy-package-compat.d.ts} +20 -3
- package/dist/types/extensibility/plugins/loader.d.ts +11 -0
- package/dist/types/extensibility/plugins/marketplace-auto-update.d.ts +8 -0
- package/dist/types/extensibility/plugins/types.d.ts +2 -2
- package/dist/types/extensibility/shared-events.d.ts +3 -3
- package/dist/types/extensibility/skills.d.ts +10 -0
- package/dist/types/extensibility/slash-commands.d.ts +1 -11
- package/dist/types/gateway/adapters/telegram/access.d.ts +4 -1
- package/dist/types/gateway/adapters/telegram/setup-api.d.ts +1 -1
- package/dist/types/gateway/adapters/telegram/webhook.d.ts +1 -1
- package/dist/types/gateway/types.d.ts +1 -1
- package/dist/types/goals/guided-setup.d.ts +18 -0
- package/dist/types/goals/state.d.ts +1 -1
- package/dist/types/goals/tools/goal-tool.d.ts +1 -1
- package/dist/types/hindsight/mental-models.d.ts +17 -8
- package/dist/types/hindsight/transcript.d.ts +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/internal-urls/artifact-protocol.d.ts +2 -2
- package/dist/types/internal-urls/history-protocol.d.ts +14 -0
- package/dist/types/internal-urls/index.d.ts +1 -0
- package/dist/types/internal-urls/local-protocol.d.ts +14 -2
- package/dist/types/internal-urls/types.d.ts +1 -1
- package/dist/types/irc/bus.d.ts +79 -0
- package/dist/types/lib/xai-http.d.ts +1 -1
- package/dist/types/lsp/client.d.ts +10 -0
- package/dist/types/lsp/config.d.ts +2 -2
- package/dist/types/lsp/edits.d.ts +9 -0
- package/dist/types/lsp/format-options.d.ts +32 -0
- package/dist/types/lsp/index.d.ts +2 -7
- package/dist/types/lsp/types.d.ts +13 -1
- package/dist/types/lsp/utils.d.ts +6 -2
- package/dist/types/main.d.ts +23 -8
- package/dist/types/mcp/json-rpc.d.ts +5 -0
- package/dist/types/mcp/manager.d.ts +8 -0
- package/dist/types/mcp/oauth-discovery.d.ts +6 -1
- package/dist/types/mcp/oauth-flow.d.ts +13 -3
- package/dist/types/mcp/startup-events.d.ts +11 -0
- package/dist/types/mcp/tool-bridge.d.ts +2 -0
- package/dist/types/mcp/transports/stdio.d.ts +13 -0
- package/dist/types/mcp/types.d.ts +2 -0
- package/dist/types/memories/index.d.ts +7 -15
- package/dist/types/memories/storage.d.ts +0 -10
- package/dist/types/memory-backend/index.d.ts +3 -1
- package/dist/types/memory-backend/local-backend.d.ts +4 -3
- package/dist/types/memory-backend/resolve.d.ts +2 -2
- package/dist/types/memory-backend/runtime.d.ts +4 -0
- package/dist/types/memory-backend/types.d.ts +67 -2
- package/dist/types/mnemopi/config.d.ts +31 -1
- package/dist/types/mnemopi/state.d.ts +40 -2
- package/dist/types/modes/acp/acp-agent.d.ts +1 -2
- package/dist/types/modes/components/agent-dashboard.d.ts +17 -1
- package/dist/types/modes/components/agent-hub.d.ts +82 -0
- package/dist/types/modes/components/assistant-message.d.ts +5 -12
- package/dist/types/modes/components/bash-execution.d.ts +1 -1
- package/dist/types/modes/components/chat-block.d.ts +64 -0
- package/dist/types/modes/components/collab-prompt-message.d.ts +10 -0
- package/dist/types/modes/components/compaction-summary-message.d.ts +25 -5
- package/dist/types/modes/components/copy-selector.d.ts +1 -1
- package/dist/types/modes/components/custom-editor.d.ts +49 -2
- package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
- package/dist/types/modes/components/dynamic-border.d.ts +1 -1
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +1 -1
- package/dist/types/modes/components/extensions/extension-list.d.ts +1 -1
- package/dist/types/modes/components/extensions/inspector-panel.d.ts +1 -1
- package/dist/types/modes/components/footer.d.ts +1 -1
- package/dist/types/modes/components/hook-editor.d.ts +5 -0
- package/dist/types/modes/components/hook-input.d.ts +4 -0
- package/dist/types/modes/components/hook-selector.d.ts +5 -7
- package/dist/types/modes/components/index.d.ts +1 -0
- package/dist/types/modes/components/late-diagnostics-message.d.ts +20 -0
- package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
- package/dist/types/modes/components/mcp-add-wizard.d.ts +2 -1
- package/dist/types/modes/components/model-selector.d.ts +1 -1
- package/dist/types/modes/components/oauth-selector.d.ts +10 -1
- package/dist/types/modes/components/overlay-box.d.ts +17 -0
- package/dist/types/modes/components/plan-review-overlay.d.ts +61 -0
- package/dist/types/modes/components/plan-toc.d.ts +41 -0
- package/dist/types/modes/components/read-tool-group.d.ts +8 -0
- package/dist/types/modes/components/reset-usage-selector.d.ts +12 -0
- package/dist/types/modes/components/segment-track.d.ts +11 -6
- package/dist/types/modes/components/session-selector.d.ts +18 -9
- package/dist/types/modes/components/settings-defs.d.ts +9 -2
- package/dist/types/modes/components/settings-selector.d.ts +17 -4
- package/dist/types/modes/components/snapcompact-shape-preview.d.ts +31 -0
- package/dist/types/modes/components/status-line/component.d.ts +61 -0
- package/dist/types/modes/components/status-line/index.d.ts +1 -0
- package/dist/types/modes/components/status-line/types.d.ts +47 -3
- package/dist/types/modes/components/tiny-title-download-progress.d.ts +1 -1
- package/dist/types/modes/components/tool-execution.d.ts +49 -2
- package/dist/types/modes/components/transcript-container.d.ts +76 -26
- package/dist/types/modes/components/tree-selector.d.ts +2 -2
- package/dist/types/modes/components/ttsr-notification.d.ts +5 -1
- package/dist/types/modes/components/usage-row.d.ts +3 -0
- package/dist/types/modes/components/user-message-selector.d.ts +1 -1
- package/dist/types/modes/components/user-message.d.ts +2 -1
- package/dist/types/modes/components/visual-truncate.d.ts +1 -1
- package/dist/types/modes/components/welcome.d.ts +12 -2
- package/dist/types/modes/controllers/command-controller.d.ts +3 -2
- package/dist/types/modes/controllers/event-controller.d.ts +7 -1
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -1
- package/dist/types/modes/controllers/input-controller.d.ts +25 -3
- package/dist/types/modes/controllers/mcp-command-controller.d.ts +8 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +5 -2
- package/dist/types/modes/controllers/session-focus-controller.d.ts +31 -0
- package/dist/types/modes/controllers/streaming-reveal.d.ts +22 -0
- package/dist/types/modes/controllers/tan-command-controller.d.ts +6 -0
- package/dist/types/modes/controllers/tool-args-reveal.d.ts +43 -0
- package/dist/types/modes/gradient-highlight.d.ts +9 -4
- package/dist/types/modes/image-references.d.ts +14 -3
- package/dist/types/modes/index.d.ts +8 -7
- package/dist/types/modes/interactive-mode.d.ts +92 -16
- package/dist/types/modes/magic-keywords.d.ts +14 -2
- package/dist/types/modes/markdown-prose.d.ts +1 -1
- package/dist/types/modes/oauth-manual-input.d.ts +7 -0
- package/dist/types/modes/rpc/rpc-client.d.ts +48 -2
- package/dist/types/modes/rpc/rpc-mode.d.ts +67 -2
- package/dist/types/modes/rpc/rpc-subagents.d.ts +24 -0
- package/dist/types/modes/rpc/rpc-types.d.ts +113 -1
- package/dist/types/modes/runtime-init.d.ts +4 -0
- package/dist/types/modes/session-observer-registry.d.ts +9 -0
- package/dist/types/modes/setup-version.d.ts +11 -0
- package/dist/types/modes/setup-wizard/index.d.ts +7 -2
- package/dist/types/modes/setup-wizard/lazy.d.ts +2 -0
- package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +4 -1
- package/dist/types/modes/setup-wizard/scenes/types.d.ts +11 -2
- package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +6 -2
- package/dist/types/modes/setup-wizard/wizard-overlay.d.ts +1 -1
- package/dist/types/modes/theme/theme.d.ts +42 -7
- package/dist/types/modes/types.d.ts +62 -13
- package/dist/types/modes/utils/context-usage.d.ts +6 -1
- package/dist/types/modes/utils/copy-targets.d.ts +21 -1
- package/dist/types/modes/utils/ui-helpers.d.ts +4 -4
- package/dist/types/modes/workflow.d.ts +3 -3
- package/dist/types/plan-mode/approved-plan.d.ts +27 -8
- package/dist/types/plan-mode/plan-protection.d.ts +4 -4
- package/dist/types/registry/agent-lifecycle.d.ts +51 -0
- package/dist/types/registry/agent-registry.d.ts +33 -5
- package/dist/types/sdk.d.ts +46 -4
- package/dist/types/secrets/index.d.ts +1 -1
- package/dist/types/secrets/obfuscator.d.ts +9 -3
- package/dist/types/session/agent-session.d.ts +136 -66
- package/dist/types/session/agent-storage.d.ts +2 -1
- package/dist/types/session/auth-broker-config.d.ts +4 -0
- package/dist/types/session/auth-storage.d.ts +1 -1
- package/dist/types/session/codex-auto-reset.d.ts +111 -0
- package/dist/types/session/indexed-session-storage.d.ts +3 -3
- package/dist/types/session/messages.d.ts +26 -15
- package/dist/types/session/session-context.d.ts +39 -0
- package/dist/types/session/session-entries.d.ts +159 -0
- package/dist/types/session/session-history-format.d.ts +12 -0
- package/dist/types/session/session-listing.d.ts +69 -0
- package/dist/types/session/session-loader.d.ts +16 -0
- package/dist/types/session/session-manager.d.ts +107 -440
- package/dist/types/session/session-migrations.d.ts +12 -0
- package/dist/types/session/session-paths.d.ts +25 -0
- package/dist/types/session/session-persistence.d.ts +8 -0
- package/dist/types/session/session-storage.d.ts +11 -7
- package/dist/types/session/snapcompact-inline.d.ts +145 -0
- package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
- package/dist/types/session/streaming-output.d.ts +46 -0
- package/dist/types/session/tool-choice-queue.d.ts +6 -6
- package/dist/types/session/yield-queue.d.ts +10 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +16 -0
- package/dist/types/slash-commands/available-commands.d.ts +34 -0
- package/dist/types/slash-commands/builtin-registry.d.ts +10 -0
- package/dist/types/slash-commands/helpers/active-oauth-account.d.ts +14 -0
- package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
- package/dist/types/slash-commands/helpers/reset-usage.d.ts +27 -0
- package/dist/types/slash-commands/helpers/stats-dashboard.d.ts +13 -0
- package/dist/types/slash-commands/types.d.ts +5 -9
- package/dist/types/ssh/connection-manager.d.ts +8 -0
- package/dist/types/stt/asr-client.d.ts +90 -0
- package/dist/types/stt/asr-protocol.d.ts +97 -0
- package/dist/types/stt/asr-worker.d.ts +2 -0
- package/dist/types/stt/downloader.d.ts +38 -0
- package/dist/types/stt/endpointer.d.ts +59 -0
- package/dist/types/stt/index.d.ts +5 -1
- package/dist/types/stt/models.d.ts +120 -0
- package/dist/types/stt/recorder.d.ts +17 -0
- package/dist/types/stt/stt-controller.d.ts +6 -0
- package/dist/types/stt/transcriber.d.ts +5 -7
- package/dist/types/stt/wav.d.ts +29 -0
- package/dist/types/system-prompt.d.ts +9 -1
- package/dist/types/task/commands.d.ts +1 -1
- package/dist/types/task/discovery.d.ts +1 -2
- package/dist/types/task/executor.d.ts +61 -2
- package/dist/types/task/index.d.ts +37 -6
- package/dist/types/task/output-manager.d.ts +0 -7
- package/dist/types/task/parallel.d.ts +2 -2
- package/dist/types/task/prometheus-command.d.ts +2 -2
- package/dist/types/task/render.d.ts +20 -7
- package/dist/types/task/repair-args.d.ts +8 -7
- package/dist/types/task/types.d.ts +109 -52
- package/dist/types/task/worktree.d.ts +2 -0
- package/dist/types/telemetry-export.d.ts +2 -2
- package/dist/types/thinking.d.ts +4 -0
- package/dist/types/tiny/models.d.ts +1 -1
- package/dist/types/tiny/title-client.d.ts +12 -1
- package/dist/types/tiny/title-protocol.d.ts +1 -0
- package/dist/types/tools/archive-reader.d.ts +5 -0
- package/dist/types/tools/ask.d.ts +6 -1
- package/dist/types/tools/ast-edit.d.ts +4 -1
- package/dist/types/tools/ast-grep.d.ts +4 -1
- package/dist/types/tools/bash.d.ts +5 -2
- package/dist/types/tools/browser/attach.d.ts +4 -4
- package/dist/types/tools/browser/cmux/cmux-tab.d.ts +202 -0
- package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
- package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
- package/dist/types/tools/browser/registry.d.ts +17 -3
- package/dist/types/tools/browser/render.d.ts +2 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +2 -0
- package/dist/types/tools/browser/tab-supervisor.d.ts +16 -4
- package/dist/types/tools/browser/tab-worker.d.ts +18 -1
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/checkpoint.d.ts +1 -1
- package/dist/types/tools/conflict-detect.d.ts +16 -0
- package/dist/types/tools/debug.d.ts +1 -1
- package/dist/types/tools/eval-render.d.ts +1 -8
- package/dist/types/tools/eval.d.ts +9 -1
- package/dist/types/tools/fetch.d.ts +17 -8
- package/dist/types/tools/find.d.ts +1 -8
- package/dist/types/tools/gh-cache-invalidation.d.ts +6 -0
- package/dist/types/tools/gh.d.ts +4 -1
- package/dist/types/tools/github-cache.d.ts +19 -0
- package/dist/types/tools/grouped-file-output.d.ts +46 -12
- package/dist/types/tools/image-gen.d.ts +1 -1
- package/dist/types/tools/index.d.ts +89 -8
- package/dist/types/tools/inspect-image.d.ts +1 -1
- package/dist/types/tools/irc.d.ts +79 -39
- package/dist/types/tools/job.d.ts +8 -2
- package/dist/types/tools/learn.d.ts +51 -0
- package/dist/types/tools/manage-skill.d.ts +40 -0
- package/dist/types/tools/memory-edit.d.ts +2 -2
- package/dist/types/tools/memory-recall.d.ts +1 -1
- package/dist/types/tools/memory-reflect.d.ts +1 -1
- package/dist/types/tools/memory-render.d.ts +4 -1
- package/dist/types/tools/memory-retain.d.ts +1 -1
- package/dist/types/tools/path-utils.d.ts +17 -5
- package/dist/types/tools/plan-mode-guard.d.ts +18 -9
- package/dist/types/tools/read.d.ts +3 -2
- package/dist/types/tools/render-mermaid.d.ts +1 -1
- package/dist/types/tools/render-utils.d.ts +47 -27
- package/dist/types/tools/renderers.d.ts +10 -2
- package/dist/types/tools/report-tool-issue.d.ts +6 -1
- package/dist/types/tools/resolve.d.ts +1 -1
- package/dist/types/tools/review.d.ts +1 -1
- package/dist/types/tools/search-tool-bm25.d.ts +1 -1
- package/dist/types/tools/search.d.ts +7 -3
- package/dist/types/tools/sqlite-reader.d.ts +4 -0
- package/dist/types/tools/ssh.d.ts +2 -1
- package/dist/types/tools/todo.d.ts +7 -15
- package/dist/types/tools/tool-result.d.ts +2 -0
- package/dist/types/tools/tool-timeouts.d.ts +1 -1
- package/dist/types/tools/tts.d.ts +26 -1
- package/dist/types/tools/write.d.ts +6 -3
- package/dist/types/tools/yield.d.ts +8 -0
- package/dist/types/tts/downloader.d.ts +20 -0
- package/dist/types/tts/index.d.ts +8 -0
- package/dist/types/tts/models.d.ts +82 -0
- package/dist/types/tts/player.d.ts +32 -0
- package/dist/types/tts/runtime.d.ts +6 -0
- package/dist/types/tts/streaming-player.d.ts +41 -0
- package/dist/types/tts/tts-client.d.ts +93 -0
- package/dist/types/tts/tts-protocol.d.ts +95 -0
- package/dist/types/tts/tts-worker.d.ts +2 -0
- package/dist/types/tts/vocalizer.d.ts +41 -0
- package/dist/types/tts/wav.d.ts +8 -0
- package/dist/types/tui/code-cell.d.ts +0 -2
- package/dist/types/tui/hyperlink.d.ts +13 -7
- package/dist/types/tui/output-block.d.ts +16 -22
- package/dist/types/tui/status-line.d.ts +3 -0
- package/dist/types/utils/block-context.d.ts +35 -0
- package/dist/types/utils/changelog.d.ts +8 -0
- package/dist/types/utils/clipboard.d.ts +4 -3
- package/dist/types/utils/enhanced-paste.d.ts +20 -0
- package/dist/types/utils/file-mentions.d.ts +7 -0
- package/dist/types/utils/git.d.ts +22 -3
- package/dist/types/utils/image-loading.d.ts +30 -1
- package/dist/types/utils/session-color.d.ts +15 -3
- package/dist/types/utils/thinking-display.d.ts +17 -0
- package/dist/types/utils/title-generator.d.ts +3 -2
- package/dist/types/utils/tool-choice.d.ts +8 -0
- package/dist/types/utils/tools-manager.d.ts +2 -1
- package/dist/types/web/kagi.d.ts +2 -2
- package/dist/types/web/parallel.d.ts +3 -0
- package/dist/types/web/scrapers/github.d.ts +22 -0
- package/dist/types/web/scrapers/readthedocs.d.ts +3 -0
- package/dist/types/web/scrapers/types.d.ts +12 -0
- package/dist/types/web/search/index.d.ts +1 -1
- package/dist/types/web/search/providers/anthropic.d.ts +2 -1
- package/dist/types/web/search/providers/base.d.ts +2 -1
- package/dist/types/web/search/providers/brave.d.ts +2 -1
- package/dist/types/web/search/providers/codex.d.ts +2 -1
- package/dist/types/web/search/providers/exa.d.ts +2 -1
- package/dist/types/web/search/providers/gemini.d.ts +10 -6
- package/dist/types/web/search/providers/jina.d.ts +7 -2
- package/dist/types/web/search/providers/kagi.d.ts +7 -2
- package/dist/types/web/search/providers/kimi.d.ts +7 -2
- package/dist/types/web/search/providers/parallel.d.ts +2 -1
- package/dist/types/web/search/providers/perplexity.d.ts +10 -2
- package/dist/types/web/search/providers/searxng.d.ts +2 -1
- package/dist/types/web/search/providers/synthetic.d.ts +7 -3
- package/dist/types/web/search/providers/tavily.d.ts +2 -1
- package/dist/types/web/search/providers/zai.d.ts +2 -1
- package/dist/types/web/search/types.d.ts +1 -1
- package/examples/extensions/api-demo.ts +2 -2
- package/package.json +41 -15
- package/scripts/bench-guard.ts +71 -0
- package/scripts/build-binary.ts +24 -25
- package/scripts/bundle-dist.ts +97 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/prometheus +42 -0
- package/scripts/prometheus.ts +20 -0
- package/src/async/index.ts +0 -1
- package/src/async/job-manager.ts +106 -3
- package/src/auto-thinking/classifier.ts +2 -1
- package/src/autolearn/controller.ts +139 -0
- package/src/autolearn/managed-skills.ts +257 -0
- package/src/autoresearch/dashboard.ts +1 -1
- package/src/autoresearch/prompt-setup.md +6 -6
- package/src/autoresearch/prompt.md +6 -6
- package/src/autoresearch/state.ts +1 -1
- package/src/autoresearch/storage.ts +2 -1
- package/src/autoresearch/tools/init-experiment.ts +1 -1
- package/src/autoresearch/tools/log-experiment.ts +1 -1
- package/src/autoresearch/tools/run-experiment.ts +1 -1
- package/src/autoresearch/tools/update-notes.ts +1 -1
- package/src/autoresearch/types.ts +1 -1
- package/src/capability/context-file.ts +0 -14
- package/src/capability/fs.ts +10 -0
- package/src/capability/index.ts +1 -6
- package/src/capability/mcp.ts +1 -0
- package/src/capability/rule-buckets.ts +4 -2
- package/src/capability/rule.ts +10 -1
- package/src/capability/types.ts +0 -4
- package/src/cli/args.ts +66 -13
- package/src/cli/auth-broker-cli.ts +6 -7
- package/src/cli/auth-gateway-cli.ts +8 -9
- package/src/cli/bench-cli.ts +437 -0
- package/src/cli/claude-trace-cli.ts +28 -50
- package/src/cli/completion-gen.ts +28 -28
- package/src/cli/dry-balance-cli.ts +56 -23
- package/src/cli/gallery-cli.ts +231 -0
- package/src/cli/gallery-fixtures/agentic.ts +407 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +194 -0
- package/src/cli/gallery-fixtures/fs.ts +220 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +49 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +250 -0
- package/src/cli/gallery-fixtures/search.ts +213 -0
- package/src/cli/gallery-fixtures/shell.ts +167 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/gateway-cli.ts +32 -2
- package/src/cli/grievances-cli.ts +1 -1
- package/src/cli/list-models.ts +16 -174
- package/src/cli/models-cli.ts +429 -0
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +148 -47
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/startup-cwd.ts +68 -0
- package/src/cli/update-cli.ts +144 -272
- package/src/cli/usage-cli.ts +774 -0
- package/src/cli-commands.ts +36 -0
- package/src/cli.ts +141 -32
- package/src/collab/crypto.ts +63 -0
- package/src/collab/guest.ts +451 -0
- package/src/collab/host.ts +565 -0
- package/src/collab/protocol.ts +241 -0
- package/src/collab/relay-client.ts +216 -0
- package/src/commands/bench.ts +42 -0
- package/src/commands/complete.ts +1 -1
- package/src/commands/gallery.ts +52 -0
- package/src/commands/gateway.ts +4 -0
- package/src/commands/install.ts +1 -1
- package/src/commands/join.ts +39 -0
- package/src/commands/launch.ts +8 -4
- package/src/commands/models.ts +61 -0
- package/src/commands/read.ts +6 -3
- package/src/commands/say.ts +102 -0
- package/src/commands/setup.ts +1 -1
- package/src/commands/token.ts +89 -0
- package/src/commands/usage.ts +43 -0
- package/src/commit/agentic/agent.ts +2 -1
- package/src/commit/agentic/tools/analyze-file.ts +42 -20
- package/src/commit/agentic/tools/git-file-diff.ts +1 -1
- package/src/commit/agentic/tools/git-hunk.ts +1 -1
- package/src/commit/agentic/tools/git-overview.ts +1 -1
- package/src/commit/agentic/tools/propose-changelog.ts +1 -1
- package/src/commit/agentic/tools/propose-commit.ts +1 -1
- package/src/commit/agentic/tools/recent-commits.ts +1 -1
- package/src/commit/agentic/tools/schemas.ts +1 -1
- package/src/commit/agentic/tools/split-commit.ts +9 -2
- package/src/commit/analysis/conventional.ts +2 -2
- package/src/commit/analysis/summary.ts +3 -3
- package/src/commit/changelog/generate.ts +3 -3
- package/src/commit/changelog/index.ts +2 -2
- package/src/commit/map-reduce/index.ts +3 -3
- package/src/commit/map-reduce/map-phase.ts +2 -2
- package/src/commit/map-reduce/reduce-phase.ts +2 -2
- package/src/commit/model-selection.ts +35 -12
- package/src/commit/pipeline.ts +4 -4
- package/src/commit/shared-llm.ts +1 -1
- package/src/config/api-key-resolver.ts +67 -0
- package/src/config/append-only-context-mode.ts +6 -12
- package/src/config/keybindings.ts +9 -4
- package/src/config/mcp-schema.json +4 -0
- package/src/config/model-discovery.ts +574 -0
- package/src/config/model-equivalence.ts +5 -4
- package/src/config/model-registry.ts +659 -1093
- package/src/config/model-resolver.ts +374 -174
- package/src/config/model-roles.ts +88 -0
- package/src/config/models-config-schema.ts +61 -9
- package/src/config/models-config.ts +130 -0
- package/src/config/settings-schema.ts +1445 -382
- package/src/config/settings.ts +261 -69
- package/src/dap/client.ts +138 -53
- package/src/dap/config.ts +41 -2
- package/src/dap/defaults.json +1 -0
- package/src/dap/session.ts +263 -161
- package/src/dap/types.ts +10 -0
- package/src/debug/index.ts +50 -60
- package/src/debug/log-viewer.ts +1 -1
- package/src/debug/protocol-probe.ts +1 -1
- package/src/debug/raw-sse-buffer.ts +7 -4
- package/src/debug/raw-sse.ts +1 -1
- package/src/debug/report-bundle.ts +9 -0
- package/src/debug/terminal-info.ts +0 -3
- package/src/discovery/agents-md.ts +25 -21
- package/src/discovery/agents.ts +9 -15
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-rules/index.ts +4 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin.ts +45 -23
- package/src/discovery/claude-plugins.ts +44 -5
- package/src/discovery/helpers.ts +50 -9
- package/src/discovery/prometheus-extension-roots.ts +10 -10
- package/src/discovery/prometheus-plugins.ts +10 -10
- package/src/edit/diff.ts +191 -4
- package/src/edit/file-snapshot-store.ts +34 -1
- package/src/edit/hashline/block-resolver.ts +20 -1
- package/src/edit/hashline/diff.ts +123 -2
- package/src/edit/hashline/execute.ts +60 -4
- package/src/edit/hashline/filesystem.ts +2 -1
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +1 -1
- package/src/edit/index.ts +47 -18
- package/src/edit/modes/apply-patch.ts +1 -1
- package/src/edit/modes/patch.ts +59 -3
- package/src/edit/modes/replace.ts +58 -24
- package/src/edit/notebook.ts +22 -2
- package/src/edit/renderer.ts +315 -151
- package/src/eval/__tests__/agent-bridge.test.ts +105 -39
- package/src/eval/__tests__/budget-bridge.test.ts +1 -1
- package/src/eval/__tests__/completion-bridge.test.ts +412 -0
- package/src/eval/__tests__/helpers-local-roots.test.ts +58 -0
- package/src/eval/__tests__/js-context-manager.test.ts +241 -0
- package/src/eval/__tests__/llm-bridge.test.ts +6 -4
- package/src/eval/__tests__/shared-executors.test.ts +34 -92
- package/src/eval/agent-bridge.ts +39 -23
- package/src/eval/backend.ts +15 -2
- package/src/eval/bridge-timeout.ts +1 -1
- package/src/eval/completion-bridge.ts +203 -0
- package/src/eval/idle-timeout.ts +3 -10
- package/src/eval/js/context-manager.ts +108 -31
- package/src/eval/js/executor.ts +9 -2
- package/src/eval/js/index.ts +7 -3
- package/src/eval/js/shared/helpers.ts +59 -13
- package/src/eval/js/shared/local-module-loader.ts +2 -2
- package/src/eval/js/shared/prelude.txt +167 -30
- package/src/eval/js/shared/rewrite-imports.ts +58 -34
- package/src/eval/js/shared/runtime.ts +24 -16
- package/src/eval/js/tool-bridge.ts +4 -0
- package/src/eval/js/worker-core.ts +1 -0
- package/src/eval/js/worker-entry.ts +6 -0
- package/src/eval/js/worker-protocol.ts +6 -0
- package/src/eval/llm-bridge.ts +2 -1
- package/src/eval/py/__tests__/prelude.test.ts +19 -0
- package/src/eval/py/executor.ts +70 -26
- package/src/eval/py/index.ts +13 -4
- package/src/eval/py/kernel.ts +48 -9
- package/src/eval/py/prelude.py +73 -24
- package/src/eval/py/runner.py +133 -28
- package/src/eval/py/runtime.ts +38 -1
- package/src/exa/index.ts +1 -26
- package/src/exa/mcp-client.ts +10 -10
- package/src/exa/types.ts +0 -97
- package/src/exec/bash-executor.ts +104 -7
- package/src/export/custom-share.ts +1 -1
- package/src/export/html/index.ts +119 -17
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template-js.ts +6 -0
- package/src/export/html/template.css +745 -459
- package/src/export/html/template.css.d.ts +2 -0
- package/src/export/html/template.html +6 -3
- package/src/export/html/template.js +277 -891
- package/src/export/html/tool-views.generated.d.ts +2 -0
- package/src/export/html/tool-views.generated.js +38 -0
- package/src/export/share.ts +269 -0
- package/src/export/ttsr.ts +122 -1
- package/src/extensibility/custom-commands/loader.ts +7 -4
- package/src/extensibility/custom-commands/types.ts +9 -4
- package/src/extensibility/custom-tools/loader.ts +51 -23
- package/src/extensibility/custom-tools/types.ts +16 -8
- package/src/extensibility/extensions/get-commands-handler.ts +2 -1
- package/src/extensibility/extensions/index.ts +1 -0
- package/src/extensibility/extensions/loader.ts +70 -20
- package/src/extensibility/extensions/model-api.ts +41 -0
- package/src/extensibility/extensions/runner.ts +12 -2
- package/src/extensibility/extensions/types.ts +83 -11
- package/src/extensibility/extensions/wrapper.ts +41 -5
- package/src/extensibility/hooks/index.ts +2 -1
- package/src/extensibility/hooks/loader.ts +6 -3
- package/src/extensibility/hooks/types.ts +11 -5
- package/src/extensibility/{legacy-pi-ai-shim.ts → legacy-package-ai-shim.ts} +2 -2
- package/src/extensibility/plugins/doctor.ts +1 -2
- package/src/extensibility/plugins/installer.ts +2 -2
- package/src/extensibility/plugins/{legacy-pi-compat.ts → legacy-package-compat.ts} +165 -77
- package/src/extensibility/plugins/loader.ts +34 -23
- package/src/extensibility/plugins/manager.ts +226 -95
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/types.ts +3 -3
- package/src/extensibility/shared-events.ts +3 -3
- package/src/extensibility/skills.ts +113 -9
- package/src/extensibility/slash-commands.ts +1 -97
- package/src/gateway/adapters/telegram/access.ts +39 -4
- package/src/gateway/adapters/telegram/normalize.ts +16 -1
- package/src/gateway/adapters/telegram/setup-api.ts +7 -1
- package/src/gateway/adapters/telegram/webhook.ts +26 -5
- package/src/gateway/context.ts +9 -1
- package/src/gateway/types.ts +1 -1
- package/src/goals/guided-setup.ts +133 -0
- package/src/goals/state.ts +1 -1
- package/src/goals/tools/goal-tool.ts +38 -28
- package/src/hindsight/bank.ts +17 -2
- package/src/hindsight/client.ts +27 -2
- package/src/hindsight/mental-models.ts +59 -12
- package/src/hindsight/state.ts +12 -3
- package/src/hindsight/transcript.ts +1 -1
- package/src/index.ts +5 -0
- package/src/internal-urls/artifact-protocol.ts +11 -2
- package/src/internal-urls/docs-index.generated.ts +11 -9
- package/src/internal-urls/history-protocol.ts +113 -0
- package/src/internal-urls/index.ts +1 -0
- package/src/internal-urls/issue-pr-protocol.ts +22 -9
- package/src/internal-urls/local-protocol.ts +42 -7
- package/src/internal-urls/memory-protocol.ts +4 -31
- package/src/internal-urls/router.ts +3 -1
- package/src/internal-urls/types.ts +1 -1
- package/src/irc/bus.ts +303 -0
- package/src/lib/xai-http.ts +3 -3
- package/src/lsp/client.ts +245 -104
- package/src/lsp/clients/biome-client.ts +101 -39
- package/src/lsp/clients/lsp-linter-client.ts +2 -10
- package/src/lsp/config.ts +15 -5
- package/src/lsp/defaults.json +6 -0
- package/src/lsp/edits.ts +143 -95
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +233 -93
- package/src/lsp/render.ts +11 -35
- package/src/lsp/types.ts +13 -1
- package/src/lsp/utils.ts +31 -12
- package/src/main.ts +396 -216
- package/src/mcp/config-writer.ts +7 -3
- package/src/mcp/json-rpc.ts +35 -5
- package/src/mcp/manager.ts +31 -16
- package/src/mcp/oauth-discovery.ts +34 -4
- package/src/mcp/oauth-flow.ts +61 -8
- package/src/mcp/render.ts +7 -1
- package/src/mcp/startup-events.ts +21 -0
- package/src/mcp/tool-bridge.ts +2 -0
- package/src/mcp/transports/stdio.ts +224 -4
- package/src/mcp/types.ts +2 -0
- package/src/memories/index.ts +174 -1128
- package/src/memories/storage.ts +2 -41
- package/src/memory-backend/index.ts +14 -1
- package/src/memory-backend/local-backend.ts +18 -3
- package/src/memory-backend/off-backend.ts +9 -0
- package/src/memory-backend/resolve.ts +4 -6
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/types.ts +82 -2
- package/src/mnemopi/backend.ts +220 -28
- package/src/mnemopi/config.ts +138 -33
- package/src/mnemopi/state.ts +91 -11
- package/src/modes/acp/acp-agent.ts +149 -142
- package/src/modes/acp/acp-event-mapper.ts +5 -1
- package/src/modes/components/agent-dashboard.ts +17 -11
- package/src/modes/components/agent-hub.ts +1346 -0
- package/src/modes/components/assistant-message.ts +190 -80
- package/src/modes/components/bash-execution.ts +1 -1
- package/src/modes/components/btw-panel.ts +5 -1
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/collab-prompt-message.ts +30 -0
- package/src/modes/components/compaction-summary-message.ts +168 -33
- package/src/modes/components/copy-selector.ts +2 -45
- package/src/modes/components/custom-editor.test.ts +96 -0
- package/src/modes/components/custom-editor.ts +405 -118
- package/src/modes/components/custom-message.ts +1 -3
- package/src/modes/components/diff.ts +13 -2
- package/src/modes/components/dynamic-border.ts +12 -3
- package/src/modes/components/execution-shared.ts +1 -2
- package/src/modes/components/extensions/extension-dashboard.ts +8 -5
- package/src/modes/components/extensions/extension-list.ts +1 -1
- package/src/modes/components/extensions/inspector-panel.ts +7 -3
- package/src/modes/components/extensions/state-manager.ts +36 -41
- package/src/modes/components/footer.ts +4 -2
- package/src/modes/components/history-search.ts +1 -1
- package/src/modes/components/hook-editor.ts +8 -0
- package/src/modes/components/hook-input.ts +8 -0
- package/src/modes/components/hook-message.ts +1 -3
- package/src/modes/components/hook-selector.ts +6 -7
- package/src/modes/components/index.ts +1 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +1 -1
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +14 -1
- package/src/modes/components/model-selector.ts +177 -75
- package/src/modes/components/oauth-selector.ts +102 -16
- package/src/modes/components/overlay-box.ts +108 -0
- package/src/modes/components/plan-review-overlay.ts +845 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-settings.ts +22 -5
- package/src/modes/components/read-tool-group.ts +442 -39
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +44 -7
- package/src/modes/components/session-selector.ts +97 -37
- package/src/modes/components/settings-defs.ts +28 -6
- package/src/modes/components/settings-selector.ts +541 -93
- package/src/modes/components/skill-message.ts +0 -1
- package/src/modes/components/snapcompact-shape-preview-doc.md +11 -0
- package/src/modes/components/snapcompact-shape-preview.ts +193 -0
- package/src/modes/components/{status-line.ts → status-line/component.ts} +205 -168
- package/src/modes/components/status-line/index.ts +1 -0
- package/src/modes/components/status-line/presets.ts +3 -3
- package/src/modes/components/status-line/segments.ts +26 -7
- package/src/modes/components/status-line/types.ts +40 -9
- package/src/modes/components/tiny-title-download-progress.ts +1 -1
- package/src/modes/components/tips.txt +7 -3
- package/src/modes/components/todo-reminder.ts +0 -2
- package/src/modes/components/tool-execution.ts +236 -103
- package/src/modes/components/transcript-container.ts +724 -99
- package/src/modes/components/tree-selector.ts +19 -4
- package/src/modes/components/ttsr-notification.ts +72 -30
- package/src/modes/components/usage-row.ts +18 -0
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +28 -12
- package/src/modes/components/visual-truncate.ts +1 -1
- package/src/modes/components/welcome.ts +80 -22
- package/src/modes/controllers/command-controller-shared.ts +7 -6
- package/src/modes/controllers/command-controller.ts +210 -180
- package/src/modes/controllers/event-controller.ts +352 -142
- package/src/modes/controllers/extension-ui-controller.ts +167 -208
- package/src/modes/controllers/input-controller.ts +778 -162
- package/src/modes/controllers/mcp-command-controller.ts +232 -80
- package/src/modes/controllers/selector-controller.ts +284 -145
- package/src/modes/controllers/session-focus-controller.ts +112 -0
- package/src/modes/controllers/ssh-command-controller.ts +2 -2
- package/src/modes/controllers/streaming-reveal.ts +295 -0
- package/src/modes/controllers/tan-command-controller.ts +173 -0
- package/src/modes/controllers/tool-args-reveal.ts +174 -0
- package/src/modes/gradient-highlight.ts +21 -9
- package/src/modes/image-references.ts +33 -7
- package/src/modes/index.ts +8 -25
- package/src/modes/interactive-mode.ts +840 -186
- package/src/modes/magic-keywords.ts +28 -6
- package/src/modes/markdown-prose.ts +1 -1
- package/src/modes/oauth-manual-input.ts +30 -3
- package/src/modes/rpc/rpc-client.ts +186 -3
- package/src/modes/rpc/rpc-mode.ts +318 -24
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +111 -2
- package/src/modes/runtime-init.ts +28 -3
- package/src/modes/session-observer-registry.ts +72 -3
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +16 -4
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +25 -7
- package/src/modes/setup-wizard/scenes/providers.ts +45 -12
- package/src/modes/setup-wizard/scenes/sign-in.ts +14 -13
- package/src/modes/setup-wizard/scenes/splash.ts +1 -1
- package/src/modes/setup-wizard/scenes/telegram.ts +77 -22
- package/src/modes/setup-wizard/scenes/theme.ts +29 -2
- package/src/modes/setup-wizard/scenes/types.ts +11 -2
- package/src/modes/setup-wizard/scenes/web-search.ts +26 -9
- package/src/modes/setup-wizard/wizard-overlay.ts +40 -3
- package/src/modes/shared.ts +2 -0
- package/src/modes/theme/defaults/dark-poimandres.json +1 -1
- package/src/modes/theme/defaults/light-poimandres.json +1 -1
- package/src/modes/theme/shimmer.ts +20 -9
- package/src/modes/theme/theme-schema.json +1 -1
- package/src/modes/theme/theme.ts +342 -82
- package/src/modes/types.ts +60 -18
- package/src/modes/utils/context-usage.ts +88 -8
- package/src/modes/utils/copy-targets.ts +133 -27
- package/src/modes/utils/hotkeys-markdown.ts +3 -2
- package/src/modes/utils/ui-helpers.ts +191 -110
- package/src/modes/workflow.ts +10 -10
- package/src/plan-mode/approved-plan.ts +66 -43
- package/src/plan-mode/plan-protection.ts +4 -4
- package/src/priority.json +5 -1
- package/src/prompts/agents/designer.md +1 -1
- package/src/prompts/agents/explore.md +3 -3
- package/src/prompts/agents/librarian.md +2 -3
- package/src/prompts/agents/oracle.md +2 -2
- package/src/prompts/agents/plan.md +6 -6
- package/src/prompts/agents/reviewer.md +1 -1
- package/src/prompts/agents/task.md +6 -5
- package/src/prompts/bench.md +12 -0
- package/src/prompts/ci-green-request.md +5 -7
- package/src/prompts/goals/goal-budget-limit.md +2 -2
- package/src/prompts/goals/goal-continuation.md +4 -4
- package/src/prompts/goals/goal-mode-active.md +1 -1
- package/src/prompts/goals/guided-goal-interview.md +8 -0
- package/src/prompts/goals/guided-goal-system.md +12 -0
- package/src/prompts/memories/consolidation.md +2 -7
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/identity_review.md +2 -2
- package/src/prompts/memories/read-path.md +11 -10
- package/src/prompts/memories/stage_one_system.md +2 -2
- package/src/prompts/review-custom-request.md +1 -1
- package/src/prompts/system/agent-creation-architect.md +2 -2
- package/src/prompts/system/auto-continue.md +1 -1
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge.md +3 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +2 -2
- package/src/prompts/system/commit-message-system.md +13 -1
- package/src/prompts/system/custom-system-prompt.md +1 -1
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +11 -6
- package/src/prompts/system/empty-stop-retry.md +4 -6
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +3 -4
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/omfg-user.md +3 -4
- package/src/prompts/system/orchestrate-notice.md +10 -10
- package/src/prompts/system/personalities/default.md +26 -0
- package/src/prompts/system/personalities/friendly.md +17 -0
- package/src/prompts/system/personalities/pragmatic.md +15 -0
- package/src/prompts/system/plan-mode-active.md +70 -77
- package/src/prompts/system/plan-mode-approved.md +1 -1
- package/src/prompts/system/plan-mode-subagent.md +4 -5
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +1 -1
- package/src/prompts/system/project-prompt.md +2 -2
- package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-context-stub.md +1 -0
- package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-system-stub.md +1 -0
- package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
- package/src/prompts/system/subagent-system-prompt.md +7 -8
- package/src/prompts/system/system-prompt.md +28 -57
- package/src/prompts/system/tiny-title-system.md +1 -1
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system-marker.md +16 -0
- package/src/prompts/system/title-system.md +16 -3
- package/src/prompts/system/ttsr-tool-reminder.md +1 -1
- package/src/prompts/system/workflow-notice.md +4 -4
- package/src/prompts/tools/ast-edit.md +1 -1
- package/src/prompts/tools/ast-grep.md +2 -2
- package/src/prompts/tools/bash.md +16 -8
- package/src/prompts/tools/browser.md +33 -43
- package/src/prompts/tools/debug.md +1 -1
- package/src/prompts/tools/eval.md +31 -51
- package/src/prompts/tools/find.md +0 -1
- package/src/prompts/tools/github.md +8 -7
- package/src/prompts/tools/goal.md +1 -1
- package/src/prompts/tools/image-gen.md +1 -1
- package/src/prompts/tools/inspect-image-system.md +1 -1
- package/src/prompts/tools/irc.md +39 -31
- package/src/prompts/tools/job.md +2 -1
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +2 -2
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +1 -1
- package/src/prompts/tools/patch.md +2 -2
- package/src/prompts/tools/read.md +31 -39
- package/src/prompts/tools/recall.md +1 -1
- package/src/prompts/tools/reflect.md +1 -1
- package/src/prompts/tools/render-mermaid.md +2 -2
- package/src/prompts/tools/replace.md +4 -10
- package/src/prompts/tools/rewind.md +2 -2
- package/src/prompts/tools/search-tool-bm25.md +1 -9
- package/src/prompts/tools/search.md +0 -1
- package/src/prompts/tools/ssh.md +0 -4
- package/src/prompts/tools/task-summary.md +5 -16
- package/src/prompts/tools/task.md +47 -31
- package/src/prompts/tools/todo.md +6 -3
- package/src/registry/agent-lifecycle.ts +218 -0
- package/src/registry/agent-registry.ts +46 -5
- package/src/sdk.ts +692 -219
- package/src/secrets/index.ts +8 -1
- package/src/secrets/obfuscator.ts +40 -19
- package/src/session/agent-session.ts +1577 -806
- package/src/session/agent-storage.ts +18 -9
- package/src/session/auth-broker-config.ts +30 -1
- package/src/session/auth-storage.ts +6 -0
- package/src/session/codex-auto-reset.ts +202 -0
- package/src/session/history-storage.ts +3 -2
- package/src/session/indexed-session-storage.ts +7 -10
- package/src/session/messages.ts +59 -95
- package/src/session/session-context.ts +352 -0
- package/src/session/session-dump-format.ts +12 -3
- package/src/session/session-entries.ts +194 -0
- package/src/session/session-history-format.ts +246 -0
- package/src/session/session-listing.ts +588 -0
- package/src/session/session-loader.ts +106 -0
- package/src/session/session-manager.ts +1003 -2920
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +193 -0
- package/src/session/session-persistence.ts +131 -0
- package/src/session/session-storage.ts +91 -30
- package/src/session/snapcompact-inline.ts +542 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/streaming-output.ts +248 -11
- package/src/session/tool-choice-queue.ts +23 -11
- package/src/session/yield-queue.ts +20 -2
- package/src/slash-commands/acp-builtins.ts +25 -1
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +575 -49
- package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
- package/src/slash-commands/helpers/context-report.ts +28 -1
- package/src/slash-commands/helpers/logout.ts +88 -0
- package/src/slash-commands/helpers/reset-usage.ts +66 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
- package/src/slash-commands/helpers/usage-report.ts +38 -3
- package/src/slash-commands/types.ts +5 -9
- package/src/ssh/connection-manager.ts +27 -0
- package/src/ssh/ssh-executor.ts +60 -4
- package/src/stt/asr-client.ts +520 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +790 -0
- package/src/stt/downloader.ts +107 -47
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +5 -1
- package/src/stt/models.ts +150 -0
- package/src/stt/recorder.ts +254 -67
- package/src/stt/stt-controller.ts +201 -22
- package/src/stt/transcriber.ts +37 -68
- package/src/stt/wav.ts +173 -0
- package/src/system-prompt.ts +52 -10
- package/src/task/agents.ts +3 -4
- package/src/task/commands.ts +3 -2
- package/src/task/discovery.ts +17 -24
- package/src/task/executor.ts +1054 -529
- package/src/task/index.ts +862 -757
- package/src/task/output-manager.ts +0 -11
- package/src/task/parallel.ts +3 -3
- package/src/task/prometheus-command.ts +2 -2
- package/src/task/render.ts +529 -182
- package/src/task/repair-args.ts +21 -9
- package/src/task/types.ts +144 -66
- package/src/task/worktree.ts +64 -56
- package/src/telemetry-export.ts +27 -9
- package/src/thinking.ts +9 -7
- package/src/tiny/models.ts +2 -2
- package/src/tiny/text.ts +5 -1
- package/src/tiny/title-client.ts +72 -20
- package/src/tiny/title-protocol.ts +1 -1
- package/src/tiny/worker.ts +23 -99
- package/src/tool-discovery/tool-index.ts +2 -0
- package/src/tools/archive-reader.ts +94 -2
- package/src/tools/ask.ts +234 -177
- package/src/tools/ast-edit.ts +136 -80
- package/src/tools/ast-grep.ts +41 -45
- package/src/tools/auto-generated-guard.ts +20 -3
- package/src/tools/bash-interactive.ts +28 -8
- package/src/tools/bash.ts +198 -35
- package/src/tools/browser/attach.ts +26 -7
- package/src/tools/browser/cmux/cmux-tab.ts +1264 -0
- package/src/tools/browser/cmux/rpc.ts +156 -0
- package/src/tools/browser/cmux/socket-client.ts +309 -0
- package/src/tools/browser/launch.ts +11 -2
- package/src/tools/browser/readable.ts +19 -2
- package/src/tools/browser/registry.ts +52 -5
- package/src/tools/browser/render.ts +13 -5
- package/src/tools/browser/tab-protocol.ts +2 -0
- package/src/tools/browser/tab-supervisor.ts +256 -34
- package/src/tools/browser/tab-worker.ts +259 -91
- package/src/tools/browser.ts +44 -2
- package/src/tools/checkpoint.ts +1 -1
- package/src/tools/conflict-detect.ts +50 -4
- package/src/tools/debug.ts +27 -12
- package/src/tools/eval-render.ts +32 -35
- package/src/tools/eval.ts +26 -12
- package/src/tools/fetch.ts +450 -99
- package/src/tools/find.ts +182 -142
- package/src/tools/gh-cache-invalidation.ts +255 -0
- package/src/tools/gh-renderer.ts +104 -51
- package/src/tools/gh.ts +232 -37
- package/src/tools/github-cache.ts +97 -7
- package/src/tools/grouped-file-output.ts +159 -52
- package/src/tools/image-gen.ts +237 -132
- package/src/tools/index.ts +147 -26
- package/src/tools/inspect-image-renderer.ts +74 -45
- package/src/tools/inspect-image.ts +12 -6
- package/src/tools/irc.ts +626 -173
- package/src/tools/job.ts +106 -29
- package/src/tools/learn.ts +144 -0
- package/src/tools/manage-skill.ts +104 -0
- package/src/tools/memory-edit.ts +4 -4
- package/src/tools/memory-recall.ts +7 -9
- package/src/tools/memory-reflect.ts +5 -9
- package/src/tools/memory-render.ts +23 -6
- package/src/tools/memory-retain.ts +4 -4
- package/src/tools/path-utils.ts +102 -48
- package/src/tools/plan-mode-guard.ts +101 -40
- package/src/tools/read.ts +475 -120
- package/src/tools/render-mermaid.ts +1 -1
- package/src/tools/render-utils.ts +132 -76
- package/src/tools/renderers.ts +12 -1
- package/src/tools/report-tool-issue.ts +14 -6
- package/src/tools/resolve.ts +20 -3
- package/src/tools/review.ts +2 -2
- package/src/tools/search-tool-bm25.ts +37 -24
- package/src/tools/search.ts +233 -115
- package/src/tools/sqlite-reader.ts +26 -17
- package/src/tools/ssh.ts +20 -14
- package/src/tools/todo.ts +197 -191
- package/src/tools/tool-result.ts +8 -0
- package/src/tools/tool-timeouts.ts +1 -1
- package/src/tools/tts.ts +205 -74
- package/src/tools/write.ts +291 -155
- package/src/tools/yield.ts +10 -1
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +8 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/player.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/streaming-player.ts +266 -0
- package/src/tts/tts-client.ts +647 -0
- package/src/tts/tts-protocol.ts +60 -0
- package/src/tts/tts-worker.ts +505 -0
- package/src/tts/vocalizer.ts +162 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +2 -7
- package/src/tui/hyperlink.ts +40 -26
- package/src/tui/output-block.ts +60 -108
- package/src/tui/status-line.ts +5 -1
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +27 -1
- package/src/utils/clipboard.ts +91 -22
- package/src/utils/commit-message-generator.ts +8 -3
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/file-mentions.ts +3 -1
- package/src/utils/git.ts +315 -15
- package/src/utils/image-loading.ts +65 -4
- package/src/utils/session-color.ts +83 -9
- package/src/utils/thinking-display.ts +37 -0
- package/src/utils/title-generator.ts +73 -10
- package/src/utils/tool-choice.ts +16 -0
- package/src/utils/tools-manager.ts +19 -1
- package/src/web/kagi.ts +28 -26
- package/src/web/parallel.ts +7 -3
- package/src/web/scrapers/arxiv.ts +1 -1
- package/src/web/scrapers/github.ts +351 -3
- package/src/web/scrapers/go-pkg.ts +1 -1
- package/src/web/scrapers/iacr.ts +1 -1
- package/src/web/scrapers/readthedocs.ts +1 -1
- package/src/web/scrapers/twitter.ts +2 -1
- package/src/web/scrapers/types.ts +87 -8
- package/src/web/scrapers/wikipedia.ts +1 -1
- package/src/web/scrapers/youtube.ts +9 -3
- package/src/web/search/index.ts +15 -2
- package/src/web/search/providers/anthropic.ts +62 -21
- package/src/web/search/providers/base.ts +2 -1
- package/src/web/search/providers/brave.ts +5 -2
- package/src/web/search/providers/codex.ts +87 -51
- package/src/web/search/providers/exa.ts +101 -10
- package/src/web/search/providers/gemini.ts +49 -24
- package/src/web/search/providers/jina.ts +15 -5
- package/src/web/search/providers/kagi.ts +9 -2
- package/src/web/search/providers/kimi.ts +45 -20
- package/src/web/search/providers/parallel.ts +39 -24
- package/src/web/search/providers/perplexity.ts +226 -63
- package/src/web/search/providers/searxng.ts +19 -3
- package/src/web/search/providers/synthetic.ts +16 -11
- package/src/web/search/providers/tavily.ts +12 -9
- package/src/web/search/providers/zai.ts +22 -9
- package/src/web/search/render.ts +59 -64
- package/src/web/search/types.ts +5 -1
- package/dist/types/discovery/context-files.d.ts +0 -17
- package/dist/types/exa/factory.d.ts +0 -13
- package/dist/types/exa/render.d.ts +0 -19
- package/dist/types/exa/researcher.d.ts +0 -9
- package/dist/types/exa/search.d.ts +0 -9
- package/dist/types/exa/websets.d.ts +0 -9
- package/dist/types/export/html/template.generated.d.ts +0 -1
- package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
- package/dist/types/modes/components/status-line.d.ts +0 -77
- package/dist/types/slash-commands/headless-plan.d.ts +0 -3
- package/dist/types/stt/setup.d.ts +0 -18
- package/scripts/generate-template.ts +0 -33
- package/src/discovery/context-files.ts +0 -49
- package/src/exa/factory.ts +0 -60
- package/src/exa/render.ts +0 -244
- package/src/exa/researcher.ts +0 -36
- package/src/exa/search.ts +0 -47
- package/src/exa/websets.ts +0 -248
- package/src/export/html/template.generated.ts +0 -2
- package/src/modes/components/session-observer-overlay.ts +0 -852
- package/src/slash-commands/headless-plan.ts +0 -142
- package/src/stt/setup.ts +0 -52
- package/src/stt/transcribe.py +0 -70
- /package/dist/types/extensibility/{legacy-pi-coding-agent-shim.d.ts → legacy-package-agent-shim.d.ts} +0 -0
- /package/src/extensibility/{legacy-pi-coding-agent-shim.ts → legacy-package-agent-shim.ts} +0 -0
|
@@ -1,15 +1,49 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
type Component,
|
|
3
|
+
Container,
|
|
4
|
+
type NativeScrollbackCommittedRows,
|
|
5
|
+
type NativeScrollbackLiveRegion,
|
|
6
|
+
type RenderStablePrefix,
|
|
7
|
+
type ViewportTailProvider,
|
|
8
|
+
} from "@prometheus-ai/tui";
|
|
2
9
|
|
|
3
|
-
const kSnapshot = Symbol("transcript.
|
|
10
|
+
const kSnapshot = Symbol("transcript.liveDiffSnapshot");
|
|
4
11
|
|
|
5
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Per-block render cache: the block's previous stripped contribution plus the
|
|
14
|
+
* derived append-only state. Still-live blocks use it as input to
|
|
15
|
+
* {@link deriveLiveCommitState}; finalized blocks wholly inside already
|
|
16
|
+
* committed native scrollback can replay it without calling render().
|
|
17
|
+
*/
|
|
18
|
+
interface LiveDiffSnapshot {
|
|
6
19
|
width: number;
|
|
7
|
-
lines: string[];
|
|
20
|
+
lines: readonly string[];
|
|
8
21
|
generation: number;
|
|
22
|
+
appendOnly: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Frames remaining until a block that rewrote an interior row may re-earn
|
|
25
|
+
* append-only status. `0` means the block is not under rewrite suspicion.
|
|
26
|
+
*/
|
|
27
|
+
volatileCooldown: number;
|
|
28
|
+
/**
|
|
29
|
+
* Stable-prefix ratchet (see {@link deriveLiveCommitState}): leading rows
|
|
30
|
+
* promoted as commit-safe because they stayed visibly identical for
|
|
31
|
+
* {@link STABLE_PREFIX_COMMIT_FRAMES} consecutive frames, plus the in-flight
|
|
32
|
+
* candidate run and its age.
|
|
33
|
+
*/
|
|
34
|
+
stablePrefixLength: number;
|
|
35
|
+
candidatePrefixLength: number;
|
|
36
|
+
candidatePrefixAge: number;
|
|
37
|
+
/**
|
|
38
|
+
* Topmost row index ever observed rewritten in place (see
|
|
39
|
+
* {@link deriveLiveCommitState}): the stable-prefix ratchet never promotes
|
|
40
|
+
* rows at/after it. `Infinity` until the first rewrite.
|
|
41
|
+
*/
|
|
42
|
+
rewriteFloor: number;
|
|
9
43
|
}
|
|
10
44
|
|
|
11
45
|
interface SnapshotCarrier {
|
|
12
|
-
[kSnapshot]?:
|
|
46
|
+
[kSnapshot]?: LiveDiffSnapshot;
|
|
13
47
|
}
|
|
14
48
|
|
|
15
49
|
/**
|
|
@@ -17,16 +51,32 @@ interface SnapshotCarrier {
|
|
|
17
51
|
* result, an assistant message mid-stream) reports `false` so the container
|
|
18
52
|
* keeps it inside the live (repaintable) region instead of freezing it. Blocks
|
|
19
53
|
* without the method are treated as finalized — the default, stable behavior.
|
|
20
|
-
*
|
|
21
|
-
* `isTranscriptBlockAppendOnly` marks a still-live block whose rendered rows
|
|
22
|
-
* only grow at the bottom and never re-layout (a streaming assistant reply).
|
|
23
|
-
* Such a block's scrolled-off head is safe to commit to native scrollback even
|
|
24
|
-
* while live; blocks that omit it (tool previews that collapse to a compact
|
|
25
|
-
* result) keep their mutable rows deferred. Default is `false`.
|
|
26
54
|
*/
|
|
27
55
|
interface FinalizableBlock {
|
|
28
56
|
isTranscriptBlockFinalized?(): boolean;
|
|
29
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Monotonic content version for blocks that can still mutate *after*
|
|
59
|
+
* reporting finalized (e.g. `AssistantMessageComponent`: the inline error
|
|
60
|
+
* restored at the next turn's `agent_start`, late tool-result images). The
|
|
61
|
+
* committed-scrollback render bypass only replays a block's previous rows
|
|
62
|
+
* when the version is unchanged; without this signal a post-finalize
|
|
63
|
+
* mutation would stay invisible until a global invalidation. Blocks that
|
|
64
|
+
* never mutate post-finalize simply omit the method.
|
|
65
|
+
*/
|
|
66
|
+
getTranscriptBlockVersion?(): number;
|
|
67
|
+
/**
|
|
68
|
+
* Whether a still-live block's visually settled leading rows are durable —
|
|
69
|
+
* guaranteed to survive the block's remaining transitions (finalize,
|
|
70
|
+
* displacement) byte-stable — and may therefore be promoted as commit-safe
|
|
71
|
+
* by {@link deriveLiveCommitState}. Blocks whose pending render is
|
|
72
|
+
* provisional (a tool call's tail-window streaming preview, replaced
|
|
73
|
+
* wholesale by the result render) return `false`: committing such rows
|
|
74
|
+
* strands a stale copy in immutable terminal history the moment the real
|
|
75
|
+
* content re-lays-out the block (the engine audit recommits below it —
|
|
76
|
+
* "duplication, never loss"). Absent = `true`, the default for blocks
|
|
77
|
+
* whose live rows persist (a streaming assistant message).
|
|
78
|
+
*/
|
|
79
|
+
isTranscriptBlockCommitStable?(): boolean;
|
|
30
80
|
}
|
|
31
81
|
|
|
32
82
|
function isBlockFinalized(child: Component): boolean {
|
|
@@ -34,59 +84,382 @@ function isBlockFinalized(child: Component): boolean {
|
|
|
34
84
|
return fn ? fn.call(child) : true;
|
|
35
85
|
}
|
|
36
86
|
|
|
37
|
-
function
|
|
38
|
-
const fn = (child as Component & FinalizableBlock).
|
|
39
|
-
return fn ? fn.call(child) :
|
|
87
|
+
function getBlockVersion(child: Component): number | undefined {
|
|
88
|
+
const fn = (child as Component & FinalizableBlock).getTranscriptBlockVersion;
|
|
89
|
+
return fn ? fn.call(child) : undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function isBlockCommitStable(child: Component): boolean {
|
|
93
|
+
const fn = (child as Component & FinalizableBlock).isTranscriptBlockCommitStable;
|
|
94
|
+
return fn ? fn.call(child) : true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// A "plain blank" row is empty or whitespace-only with no ANSI bytes. It marks
|
|
98
|
+
// separation padding (a `Spacer`, or a no-background `paddingY` row) as opposed
|
|
99
|
+
// to a background-colored padding row, whose escape sequences contain `\S` and
|
|
100
|
+
// are therefore preserved as part of a block's visual design.
|
|
101
|
+
const NON_WHITESPACE = /\S/;
|
|
102
|
+
function isPlainBlank(line: string): boolean {
|
|
103
|
+
return !NON_WHITESPACE.test(line);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Strip leading/trailing plain-blank rows so each block contributes only its
|
|
107
|
+
// visible body; the container owns the gaps between blocks. Returns the input
|
|
108
|
+
// array unchanged when there is nothing to trim (no allocation on the hot path).
|
|
109
|
+
function stripPlainBlankEdges(lines: readonly string[]): readonly string[] {
|
|
110
|
+
let start = 0;
|
|
111
|
+
let end = lines.length;
|
|
112
|
+
while (start < end && isPlainBlank(lines[start]!)) start++;
|
|
113
|
+
while (end > start && isPlainBlank(lines[end - 1]!)) end--;
|
|
114
|
+
return start === 0 && end === lines.length ? lines : lines.slice(start, end);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* One block's recorded contribution to the assembled transcript: the raw array
|
|
119
|
+
* reference its render() returned, the stripped contribution derived from it,
|
|
120
|
+
* and where those rows landed. Reference-compared on the next render — per the
|
|
121
|
+
* Component render contract, an identical raw reference proves the block's
|
|
122
|
+
* rows are byte-identical, so the stripped contribution and the assembled rows
|
|
123
|
+
* can be reused without re-deriving anything.
|
|
124
|
+
*/
|
|
125
|
+
interface BlockSegment {
|
|
126
|
+
component: Component;
|
|
127
|
+
rawRef: readonly string[];
|
|
128
|
+
contribution: readonly string[];
|
|
129
|
+
width: number;
|
|
130
|
+
generation: number;
|
|
131
|
+
/** Frame row of this block's first emitted row (the separator when present). */
|
|
132
|
+
startRow: number;
|
|
133
|
+
/** Rows emitted: separator + contribution (0 for empty contributions). */
|
|
134
|
+
rowCount: number;
|
|
135
|
+
sep: number;
|
|
136
|
+
/** Whether the block reported finalized when this segment was rendered. */
|
|
137
|
+
finalized: boolean;
|
|
138
|
+
/** Block version observed when this segment was rendered (see {@link FinalizableBlock}). */
|
|
139
|
+
version: number | undefined;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const EMPTY_SEGMENTS: BlockSegment[] = [];
|
|
143
|
+
/** Shared empty result for an empty viewport-tail render (no allocation). */
|
|
144
|
+
const EMPTY_TAIL: readonly string[] = [];
|
|
145
|
+
|
|
146
|
+
interface LiveCommitState {
|
|
147
|
+
appendOnly: boolean;
|
|
148
|
+
volatileCooldown: number;
|
|
149
|
+
stablePrefixLength: number;
|
|
150
|
+
candidatePrefixLength: number;
|
|
151
|
+
candidatePrefixAge: number;
|
|
152
|
+
rewriteFloor: number;
|
|
153
|
+
safeLength: number;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Render frames a block must stay clean (static or append-shaped) after an
|
|
158
|
+
* interior rewrite before its rows become committable again. A one-off
|
|
159
|
+
* re-layout (a codespan finalizing across a wrap boundary, a paragraph
|
|
160
|
+
* re-parsed as a heading) only suspends commits briefly — the pinned emitter
|
|
161
|
+
* appends from the stalled high-water mark, so the gap backfills contiguously
|
|
162
|
+
* once the block re-earns append-only. Periodic animations (a spinner rewrites
|
|
163
|
+
* its row every few frames) keep resetting the countdown and never re-earn it,
|
|
164
|
+
* so genuinely volatile blocks stay deferred. Frames arrive at most at the
|
|
165
|
+
* TUI's 30 Hz render cadence, so 30 frames ≈ 1s of clean streaming.
|
|
166
|
+
*/
|
|
167
|
+
const VOLATILE_REARM_FRAMES = 30;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Consecutive frames a leading row run must stay visibly identical before it
|
|
171
|
+
* is promoted as commit-safe even though the block's tail keeps rewriting.
|
|
172
|
+
* Append-only detection alone is all-or-nothing per block: one perpetually
|
|
173
|
+
* ticking row (a task tool's progress tree, per-agent cost/tool counters, a
|
|
174
|
+
* log line spinner) suspends commits for the WHOLE block forever, so once the
|
|
175
|
+
* block outgrows the viewport its static head — e.g. a task's prompt/context
|
|
176
|
+
* markdown — is neither committed to native scrollback nor on screen: the
|
|
177
|
+
* transcript reads as cut off for the entire (possibly minutes-long) run.
|
|
178
|
+
* The ratchet commits the settled head while only the genuinely volatile tail
|
|
179
|
+
* stays deferred. If a promoted row is later rewritten (a collapsing
|
|
180
|
+
* preview), the engine's committed-prefix audit re-anchors and recommits —
|
|
181
|
+
* duplication, never loss — and the ratchet retreats to the divergence.
|
|
182
|
+
*/
|
|
183
|
+
const STABLE_PREFIX_COMMIT_FRAMES = 30;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Rows at a live block's tail treated as the volatile streaming edge. Real
|
|
187
|
+
* streaming is not strictly append-only at the bottom: the in-flight markdown
|
|
188
|
+
* paragraph re-wraps as words arrive (rewriting its last 1-2 visual rows), an
|
|
189
|
+
* unclosed token (`**bold`, a half-streamed link) re-renders when its closer
|
|
190
|
+
* arrives, and a wrap-shrink moves the last word onto a new row. Divergence
|
|
191
|
+
* confined to this zone is clean growth, and the zone itself is held back
|
|
192
|
+
* from the offered commit boundary — so a tolerated rewrite can never touch a
|
|
193
|
+
* row the engine may have committed. Width 4 covers the observed shapes (≤2
|
|
194
|
+
* rows) with margin for wide glyphs and multi-row token spans; the cost is
|
|
195
|
+
* only that the last 4 rows of a live block commit at finalization instead of
|
|
196
|
+
* mid-stream, which is invisible (they are on screen — the viewport is always
|
|
197
|
+
* taller than the holdback).
|
|
198
|
+
*/
|
|
199
|
+
const TAIL_VOLATILITY_ROWS = 4;
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Visible-content form of a row: SGR/OSC bytes and trailing pad spaces are
|
|
203
|
+
* write framing, not content. A styled line's closing escape moves when the
|
|
204
|
+
* line stops being the last of its span (a wrapped thinking paragraph growing
|
|
205
|
+
* by one row), and width-padded rows shift their trailing spaces as text
|
|
206
|
+
* grows; both leave the on-screen cells identical and must not count as a
|
|
207
|
+
* rewrite of a committed-candidate row. Committed scrollback rows are written
|
|
208
|
+
* with a full SGR/OSC reset terminator, so escape-placement drift between
|
|
209
|
+
* visually identical renders cannot bleed styles across rows.
|
|
210
|
+
*/
|
|
211
|
+
function normalizeRow(line: string): string {
|
|
212
|
+
return Bun.stripANSI(line).trimEnd();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function rowsVisiblyEqual(prev: string, cur: string): boolean {
|
|
216
|
+
return prev === cur || normalizeRow(prev) === normalizeRow(cur);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Whether `cur` is `prev` grown in place: the visible content of `prev` is a
|
|
221
|
+
* strict-or-equal prefix of `cur`'s (token streaming appending to the cursor
|
|
222
|
+
* row). Escape placement and pad drift are ignored, same as rowsVisiblyEqual.
|
|
223
|
+
*/
|
|
224
|
+
function rowVisiblyGrew(prev: string, cur: string): boolean {
|
|
225
|
+
return normalizeRow(cur).startsWith(normalizeRow(prev));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function hasValidSnapshot(
|
|
229
|
+
snapshot: LiveDiffSnapshot | undefined,
|
|
230
|
+
width: number,
|
|
231
|
+
generation: number,
|
|
232
|
+
): snapshot is LiveDiffSnapshot {
|
|
233
|
+
return snapshot !== undefined && snapshot.generation === generation && snapshot.width === width;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function commonPrefixLength(prev: readonly string[], cur: readonly string[]): number {
|
|
237
|
+
const limit = Math.min(prev.length, cur.length);
|
|
238
|
+
let i = 0;
|
|
239
|
+
while (i < limit && rowsVisiblyEqual(prev[i]!, cur[i]!)) i++;
|
|
240
|
+
return i;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function commonSuffixLength(prev: readonly string[], cur: readonly string[], prefixLength: number): number {
|
|
244
|
+
const limit = Math.min(prev.length - prefixLength, cur.length - prefixLength);
|
|
245
|
+
let i = 0;
|
|
246
|
+
while (i < limit && rowsVisiblyEqual(prev[prev.length - 1 - i]!, cur[cur.length - 1 - i]!)) i++;
|
|
247
|
+
return i;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function deriveLiveCommitState(
|
|
251
|
+
previous: LiveDiffSnapshot | undefined,
|
|
252
|
+
current: readonly string[],
|
|
253
|
+
width: number,
|
|
254
|
+
generation: number,
|
|
255
|
+
): LiveCommitState {
|
|
256
|
+
let appendOnly = false;
|
|
257
|
+
let volatileCooldown = 0;
|
|
258
|
+
let stablePrefixLength = 0;
|
|
259
|
+
let candidatePrefixLength = 0;
|
|
260
|
+
let candidatePrefixAge = 0;
|
|
261
|
+
let rewriteFloor = Number.POSITIVE_INFINITY;
|
|
262
|
+
let trailingRowGrowth = false;
|
|
263
|
+
if (hasValidSnapshot(previous, width, generation)) {
|
|
264
|
+
appendOnly = previous.appendOnly;
|
|
265
|
+
volatileCooldown = previous.volatileCooldown;
|
|
266
|
+
stablePrefixLength = previous.stablePrefixLength;
|
|
267
|
+
candidatePrefixLength = previous.candidatePrefixLength;
|
|
268
|
+
candidatePrefixAge = previous.candidatePrefixAge;
|
|
269
|
+
rewriteFloor = previous.rewriteFloor;
|
|
270
|
+
|
|
271
|
+
const prefixLength = commonPrefixLength(previous.lines, current);
|
|
272
|
+
const staticRender = prefixLength === previous.lines.length && prefixLength === current.length;
|
|
273
|
+
let cleanFrame = true;
|
|
274
|
+
if (!staticRender) {
|
|
275
|
+
const suffixLength = commonSuffixLength(previous.lines, current, prefixLength);
|
|
276
|
+
// Append-only growth never rewrites a row that may already have scrolled
|
|
277
|
+
// into native scrollback; it only grows the block at/near its tail. Two
|
|
278
|
+
// shapes qualify:
|
|
279
|
+
// - a pure insertion that preserves every previous row across a
|
|
280
|
+
// matching prefix + suffix (a bottom append, or an insertion above
|
|
281
|
+
// stable trailing chrome like a streaming tool's footer/border);
|
|
282
|
+
// - a rewrite whose divergence BEGINS inside the trailing
|
|
283
|
+
// TAIL_VOLATILITY_ROWS of the previous render — the streaming edge:
|
|
284
|
+
// the in-flight paragraph re-wrapping as words arrive (its last 1-2
|
|
285
|
+
// visual rows), an unclosed markdown token (`**bold`) re-rendering
|
|
286
|
+
// when its closer streams in, a wrap-shrink pushing the last word
|
|
287
|
+
// onto an appended row. That zone is held back from `safeLength`
|
|
288
|
+
// below, so a tolerated rewrite can never touch a row that was
|
|
289
|
+
// offered for commit.
|
|
290
|
+
// The anchor matters: the gap must START in the tail zone, not merely
|
|
291
|
+
// be small — a one-row ticker mid-block with stable rows beneath it
|
|
292
|
+
// would otherwise classify clean, get offered past, and rewrite
|
|
293
|
+
// committed rows on every tick. Any deeper divergent row means the
|
|
294
|
+
// block re-laid-out committed-candidate content — a rewrite, which
|
|
295
|
+
// suspends commits until the block re-earns append-only.
|
|
296
|
+
const preservedEveryRow = prefixLength + suffixLength >= previous.lines.length;
|
|
297
|
+
const tailConfined = preservedEveryRow || prefixLength >= previous.lines.length - TAIL_VOLATILITY_ROWS;
|
|
298
|
+
if (tailConfined && current.length >= previous.lines.length) {
|
|
299
|
+
// Strict trailing-row growth: every previous row except the last
|
|
300
|
+
// is visibly unchanged and the last grew in place as a visible
|
|
301
|
+
// prefix, with no rows appended — a line accumulating tokens.
|
|
302
|
+
// The sole divergent row is the block's physical last row, which
|
|
303
|
+
// the engine's window floor never commits while it stays last
|
|
304
|
+
// (chunkTo ≤ windowTop ≤ last row index), so the volatile-tail
|
|
305
|
+
// holdback below is unnecessary: the whole body is offerable and
|
|
306
|
+
// the block's scrolled-off head reaches native scrollback.
|
|
307
|
+
trailingRowGrowth =
|
|
308
|
+
current.length === previous.lines.length &&
|
|
309
|
+
prefixLength === previous.lines.length - 1 &&
|
|
310
|
+
rowVisiblyGrew(previous.lines[prefixLength]!, current[prefixLength]!);
|
|
311
|
+
if (volatileCooldown === 0) appendOnly = true;
|
|
312
|
+
// Clean growth inserts/rewrites rows at the divergence; a floor
|
|
313
|
+
// inside the preserved suffix travels down with it, a floor at or
|
|
314
|
+
// above the divergent zone stays put (conservative: a stale floor
|
|
315
|
+
// index can only point at an earlier row, never a later one).
|
|
316
|
+
const delta = current.length - previous.lines.length;
|
|
317
|
+
if (delta > 0 && Number.isFinite(rewriteFloor)) {
|
|
318
|
+
const suffixStart = Math.max(prefixLength, previous.lines.length - suffixLength);
|
|
319
|
+
if (rewriteFloor >= suffixStart) rewriteFloor += delta;
|
|
320
|
+
}
|
|
321
|
+
} else {
|
|
322
|
+
cleanFrame = false;
|
|
323
|
+
appendOnly = false;
|
|
324
|
+
volatileCooldown = VOLATILE_REARM_FRAMES;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (cleanFrame && volatileCooldown > 0) volatileCooldown--;
|
|
328
|
+
|
|
329
|
+
// Stable-prefix ratchet, independent of append-only. `prefixLength` is
|
|
330
|
+
// this frame's visibly-unchanged leading run; the candidate accumulates
|
|
331
|
+
// the MINIMUM prefix across a STABLE_PREFIX_COMMIT_FRAMES window, so
|
|
332
|
+
// promotion means every promoted row stayed identical for the whole
|
|
333
|
+
// window (row r is inside frame i's common prefix iff r < p_i, so
|
|
334
|
+
// r < min(p) holds for every frame of the window). A row settling
|
|
335
|
+
// mid-window promotes at most two windows later. The engine audit owns
|
|
336
|
+
// any promoted rows that already committed (recommit, never loss).
|
|
337
|
+
if (prefixLength < stablePrefixLength) {
|
|
338
|
+
// A divergence inside the promoted run is the ratchet's proof of
|
|
339
|
+
// over-promotion: this row was visibly stable for a full window,
|
|
340
|
+
// got promoted (and likely committed), and then mutated anyway — a
|
|
341
|
+
// slow ticker (an agent row's tool/cost counter, a growing progress
|
|
342
|
+
// tree), not settling content. It will mutate again, and every
|
|
343
|
+
// promote→mutate cycle makes the engine audit recommit, spraying a
|
|
344
|
+
// stale snapshot of the block into native scrollback. Floor the
|
|
345
|
+
// ratchet at the divergence permanently: rows above it may still
|
|
346
|
+
// promote, rows at/below it never re-promote while the block lives.
|
|
347
|
+
// One-off re-layouts before any promotion (a call→result frame
|
|
348
|
+
// transition, a codespan finalizing) never hit this branch, and the
|
|
349
|
+
// append-only re-arm path commits the full block regardless of the
|
|
350
|
+
// floor.
|
|
351
|
+
rewriteFloor = Math.min(rewriteFloor, prefixLength);
|
|
352
|
+
stablePrefixLength = prefixLength;
|
|
353
|
+
candidatePrefixLength = prefixLength;
|
|
354
|
+
candidatePrefixAge = 0;
|
|
355
|
+
} else {
|
|
356
|
+
candidatePrefixLength =
|
|
357
|
+
candidatePrefixAge === 0 ? prefixLength : Math.min(candidatePrefixLength, prefixLength);
|
|
358
|
+
candidatePrefixAge++;
|
|
359
|
+
if (candidatePrefixAge >= STABLE_PREFIX_COMMIT_FRAMES) {
|
|
360
|
+
// Cap at the volatile-tail holdback: a long static stretch would
|
|
361
|
+
// otherwise promote the streaming edge itself (min prefix == full
|
|
362
|
+
// length), and the next chunk's tail re-wrap would then rewrite
|
|
363
|
+
// offered rows.
|
|
364
|
+
stablePrefixLength = Math.min(
|
|
365
|
+
candidatePrefixLength,
|
|
366
|
+
rewriteFloor,
|
|
367
|
+
Math.max(0, current.length - TAIL_VOLATILITY_ROWS),
|
|
368
|
+
);
|
|
369
|
+
candidatePrefixLength = prefixLength;
|
|
370
|
+
candidatePrefixAge = 0;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return {
|
|
376
|
+
appendOnly,
|
|
377
|
+
volatileCooldown,
|
|
378
|
+
stablePrefixLength,
|
|
379
|
+
candidatePrefixLength,
|
|
380
|
+
candidatePrefixAge,
|
|
381
|
+
rewriteFloor,
|
|
382
|
+
// A clean-streaming block's body is committable up to the volatile-tail
|
|
383
|
+
// holdback (the streaming edge is never offered, so its tolerated
|
|
384
|
+
// rewrites can never touch committed rows); otherwise the settled head
|
|
385
|
+
// still is — only the volatile tail stays deferred. Strict in-place
|
|
386
|
+
// growth of the trailing row skips the holdback: its only mutable row
|
|
387
|
+
// is the block's last, which cannot commit while it remains last.
|
|
388
|
+
safeLength: appendOnly
|
|
389
|
+
? trailingRowGrowth
|
|
390
|
+
? current.length
|
|
391
|
+
: Math.max(stablePrefixLength, current.length - TAIL_VOLATILITY_ROWS, 0)
|
|
392
|
+
: stablePrefixLength,
|
|
393
|
+
};
|
|
40
394
|
}
|
|
41
395
|
|
|
42
396
|
/**
|
|
43
|
-
* Transcript container that
|
|
44
|
-
* the
|
|
45
|
-
*
|
|
397
|
+
* Transcript container that renders every block's current content each frame
|
|
398
|
+
* and reports the live-region seam (`NativeScrollbackLiveRegion`) that gates
|
|
399
|
+
* the engine's append-only scrollback commits.
|
|
46
400
|
*
|
|
47
|
-
*
|
|
48
|
-
* the
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
401
|
+
* The engine never rewrites committed history: rows above the seam that have
|
|
402
|
+
* entered the tape keep whatever bytes they were committed with ("let the
|
|
403
|
+
* history be"), while the visible window always repaints from each block's
|
|
404
|
+
* latest render — a late tool result, a post-finalize error pin, or an expand
|
|
405
|
+
* toggle is always reflected on screen. Blocks that are still mutating (an
|
|
406
|
+
* unfinalized tool, a streaming assistant message) stay below the seam so
|
|
407
|
+
* their rows do not enter history while they can still change; a streaming
|
|
408
|
+
* block whose render grows append-only deepens the seam through its settled
|
|
409
|
+
* head so a long reply's scrolled-off rows still reach scrollback mid-stream.
|
|
55
410
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
411
|
+
* Assembly is incremental: the returned array is persistent and mutated in
|
|
412
|
+
* place. Each block's render is still called every frame, but a block whose
|
|
413
|
+
* render returned the same array reference at an unchanged offset reuses its
|
|
414
|
+
* previously assembled rows; the array is truncated and re-pushed only from
|
|
415
|
+
* the first divergent block. The leading byte-identical row count is reported
|
|
416
|
+
* through {@link RenderStablePrefix} so the engine can skip marker scanning,
|
|
417
|
+
* line preparation, and the committed-prefix audit for those rows.
|
|
63
418
|
*/
|
|
64
|
-
export class TranscriptContainer
|
|
65
|
-
|
|
66
|
-
|
|
419
|
+
export class TranscriptContainer
|
|
420
|
+
extends Container
|
|
421
|
+
implements NativeScrollbackLiveRegion, NativeScrollbackCommittedRows, RenderStablePrefix, ViewportTailProvider
|
|
422
|
+
{
|
|
423
|
+
// Bumped to retire every block's diff snapshot at once (theme change /
|
|
424
|
+
// clear); a snapshot is only honored when its stored generation matches.
|
|
67
425
|
#generation = 0;
|
|
68
|
-
// Line index where the live (repaintable) region began on the previous
|
|
69
|
-
// render — the start of the earliest still-mutating block, or the bottom
|
|
70
|
-
// block when everything is finalized. A block leaves the live region only
|
|
71
|
-
// once it has finalized AND a finalized block sits below it; the frame it
|
|
72
|
-
// crosses out is recomputed so it freezes at its true final content, not the
|
|
73
|
-
// mid-stream snapshot it last rendered while live (TUI render coalescing can
|
|
74
|
-
// advance a block's content in the very frame it stops being live).
|
|
75
|
-
#prevLiveStartIndex = 0;
|
|
76
426
|
// Local line index where the current live region begins in the most recent
|
|
77
|
-
// render. TUI
|
|
78
|
-
//
|
|
427
|
+
// render. TUI commits rows to native scrollback only above this seam (or
|
|
428
|
+
// the deeper commit-safe end below).
|
|
79
429
|
#nativeScrollbackLiveRegionStart: number | undefined;
|
|
80
|
-
// Local line index up to which the leading run of live blocks is
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
430
|
+
// Local line index up to which the leading run of live blocks is safe to
|
|
431
|
+
// commit. Finalized blocks contribute their full body; still-live blocks
|
|
432
|
+
// contribute only while their render has been observed growing without
|
|
433
|
+
// visibly rewriting a previously rendered interior row (escape placement
|
|
434
|
+
// and pad drift are ignored). A rewrite suspends the block's contribution
|
|
435
|
+
// until it re-earns append-only via VOLATILE_REARM_FRAMES clean frames;
|
|
436
|
+
// the engine then backfills the stalled gap.
|
|
85
437
|
#nativeScrollbackCommitSafeEnd: number | undefined;
|
|
86
|
-
|
|
438
|
+
// Local line index up to which the leading run of live blocks is DURABLE: a
|
|
439
|
+
// commit-stable block's full body is permanent content even while its interior
|
|
440
|
+
// rows re-lay-out (a streaming markdown table re-aligning columns), so the
|
|
441
|
+
// engine must append their scroll-off snapshot rather than drop it. Reported
|
|
442
|
+
// separately from the byte-stable commit-safe end because these rows may still
|
|
443
|
+
// drift after commit; the engine commits them audit-exempt. Provisional
|
|
444
|
+
// (commit-unstable) blocks never extend it.
|
|
445
|
+
#nativeScrollbackSnapshotSafeEnd: number | undefined;
|
|
446
|
+
// Persistent assembled transcript rows. Rows before the stable floor are
|
|
447
|
+
// byte-identical to the previous render; rows at/after it were re-pushed.
|
|
448
|
+
#lines: string[] = [];
|
|
449
|
+
#segments: BlockSegment[] = EMPTY_SEGMENTS;
|
|
450
|
+
#renderWidth = -1;
|
|
451
|
+
// Local rows already committed to native scrollback by the previous frame.
|
|
452
|
+
// Finalized blocks wholly before this boundary are immutable on-screen history;
|
|
453
|
+
// their previous contribution can be replayed without calling render().
|
|
454
|
+
#committedRows = 0;
|
|
455
|
+
// Stable-prefix floor accumulated across renders since the last
|
|
456
|
+
// getRenderStablePrefixRows() read (see RenderStablePrefix: reading
|
|
457
|
+
// consumes the report and re-bases the baseline). Out-of-band renders
|
|
458
|
+
// between engine frames lower it; they can never inflate it.
|
|
459
|
+
#stableRowsFloor = 0;
|
|
87
460
|
override invalidate(): void {
|
|
88
|
-
//
|
|
89
|
-
//
|
|
461
|
+
// Theme/global invalidation: retire every diff snapshot so stale styling
|
|
462
|
+
// is not diffed against the recolored render.
|
|
90
463
|
this.#generation++;
|
|
91
464
|
super.invalidate();
|
|
92
465
|
}
|
|
@@ -96,6 +469,16 @@ export class TranscriptContainer extends Container implements NativeScrollbackLi
|
|
|
96
469
|
super.clear();
|
|
97
470
|
}
|
|
98
471
|
|
|
472
|
+
setNativeScrollbackCommittedRows(rows: number): void {
|
|
473
|
+
this.#committedRows = Number.isFinite(rows) ? Math.max(0, Math.trunc(rows)) : 0;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
getRenderStablePrefixRows(): number {
|
|
477
|
+
const value = Math.min(this.#stableRowsFloor, this.#lines.length);
|
|
478
|
+
this.#stableRowsFloor = this.#lines.length;
|
|
479
|
+
return value;
|
|
480
|
+
}
|
|
481
|
+
|
|
99
482
|
getNativeScrollbackLiveRegionStart(): number | undefined {
|
|
100
483
|
return this.#nativeScrollbackLiveRegionStart;
|
|
101
484
|
}
|
|
@@ -104,28 +487,111 @@ export class TranscriptContainer extends Container implements NativeScrollbackLi
|
|
|
104
487
|
return this.#nativeScrollbackCommitSafeEnd;
|
|
105
488
|
}
|
|
106
489
|
|
|
490
|
+
getNativeScrollbackSnapshotSafeEnd(): number | undefined {
|
|
491
|
+
return this.#nativeScrollbackSnapshotSafeEnd;
|
|
492
|
+
}
|
|
493
|
+
|
|
107
494
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
495
|
+
* Whether `component` sits below a still-mutating block — i.e. inside the
|
|
496
|
+
* live region, where its rows cannot have been committed to native
|
|
497
|
+
* scrollback yet (commits are prefix-only and stop at the first
|
|
498
|
+
* still-live block). Callers that retract ephemeral blocks (IRC cards)
|
|
499
|
+
* must check this: removing a block whose rows may already be in history
|
|
500
|
+
* is an interior deletion of the committed prefix, which the engine can
|
|
501
|
+
* only repair by recommitting everything below it — duplication.
|
|
112
502
|
*/
|
|
113
|
-
|
|
114
|
-
this
|
|
503
|
+
isWithinLiveRegion(component: Component): boolean {
|
|
504
|
+
const index = this.children.indexOf(component);
|
|
505
|
+
if (index < 0) return false;
|
|
506
|
+
for (let i = 0; i < index; i++) {
|
|
507
|
+
if (!isBlockFinalized(this.children[i]!)) return true;
|
|
508
|
+
}
|
|
509
|
+
return false;
|
|
115
510
|
}
|
|
116
511
|
|
|
117
|
-
|
|
512
|
+
/**
|
|
513
|
+
* Whether `component` is inside the live (repaintable) region exactly as
|
|
514
|
+
* {@link render} computes it: at/after the first still-mutating block, or
|
|
515
|
+
* the transcript tail when every block has finalized. Unlike
|
|
516
|
+
* {@link isWithinLiveRegion} (strictly below a still-mutating block, i.e.
|
|
517
|
+
* guaranteed-uncommitted), this also counts the trailing block that anchors
|
|
518
|
+
* the live region. Self-animating finalized blocks (a detached task's
|
|
519
|
+
* shimmering progress rows) poll this to stop animating — and settle on
|
|
520
|
+
* static bytes — the moment they sit above the seam, where their rows
|
|
521
|
+
* become commit-eligible native-scrollback history.
|
|
522
|
+
*/
|
|
523
|
+
isBlockInLiveRegion(component: Component): boolean {
|
|
524
|
+
const children = this.children;
|
|
525
|
+
const index = children.indexOf(component);
|
|
526
|
+
if (index < 0) return false;
|
|
527
|
+
for (let i = 0; i <= index; i++) {
|
|
528
|
+
if (!isBlockFinalized(children[i]!)) return true;
|
|
529
|
+
}
|
|
530
|
+
// Every block at/before `index` finalized: the live region starts at the
|
|
531
|
+
// first unfinalized block below it, or at the last child when none exists.
|
|
532
|
+
for (let i = index + 1; i < children.length; i++) {
|
|
533
|
+
if (!isBlockFinalized(children[i]!)) return false;
|
|
534
|
+
}
|
|
535
|
+
return index === children.length - 1;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Render only the bottom `maxRows` rows of the transcript at `width`, walking
|
|
540
|
+
* blocks from the last toward the first and stopping the instant enough rows
|
|
541
|
+
* are collected — blocks above the fold are never rendered. The engine's
|
|
542
|
+
* resize viewport fast path uses this so a drag (a SIGWINCH burst, each event
|
|
543
|
+
* a fresh width that misses every per-width cache) re-lays-out only the
|
|
544
|
+
* handful of visible blocks instead of the whole history every event.
|
|
545
|
+
*
|
|
546
|
+
* State-isolated by contract: touches none of the persistent full-compose
|
|
547
|
+
* fields (#lines, #segments, the per-block diff snapshots, the commit/stable
|
|
548
|
+
* bookkeeping), so the authoritative full render on settle reconciles exactly
|
|
549
|
+
* as if this never ran. Calling each block's render() still warms its own
|
|
550
|
+
* per-width cache, which that settle render then reuses for free.
|
|
551
|
+
*
|
|
552
|
+
* Consecutive visible blocks are joined by exactly one blank separator, the
|
|
553
|
+
* same rule render() applies, so the result equals the bottom of a full
|
|
554
|
+
* render except for an at-most-one-row separator on the topmost included
|
|
555
|
+
* block — a transient discrepancy the settle paint overwrites.
|
|
556
|
+
*/
|
|
557
|
+
renderViewportTail(width: number, maxRows: number): readonly string[] {
|
|
558
|
+
width = Math.max(1, width);
|
|
559
|
+
if (maxRows <= 0) return EMPTY_TAIL;
|
|
560
|
+
const collected: (readonly string[])[] = [];
|
|
561
|
+
let total = 0;
|
|
562
|
+
for (let i = this.children.length - 1; i >= 0 && total < maxRows; i--) {
|
|
563
|
+
const contribution = stripPlainBlankEdges(this.children[i]!.render(width));
|
|
564
|
+
if (contribution.length === 0) continue;
|
|
565
|
+
// One blank separator sits between this block and the (already
|
|
566
|
+
// collected) visible block below it.
|
|
567
|
+
if (collected.length > 0) total += 1;
|
|
568
|
+
collected.push(contribution);
|
|
569
|
+
total += contribution.length;
|
|
570
|
+
}
|
|
571
|
+
if (collected.length === 0) return EMPTY_TAIL;
|
|
572
|
+
const rows: string[] = [];
|
|
573
|
+
for (let k = collected.length - 1; k >= 0; k--) {
|
|
574
|
+
if (rows.length > 0) rows.push("");
|
|
575
|
+
const body = collected[k]!;
|
|
576
|
+
for (let j = 0; j < body.length; j++) rows.push(body[j]!);
|
|
577
|
+
}
|
|
578
|
+
return rows.length > maxRows ? rows.slice(rows.length - maxRows) : rows;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
override render(width: number): readonly string[] {
|
|
118
582
|
width = Math.max(1, width);
|
|
119
583
|
this.#nativeScrollbackLiveRegionStart = undefined;
|
|
120
584
|
this.#nativeScrollbackCommitSafeEnd = undefined;
|
|
121
|
-
|
|
585
|
+
this.#nativeScrollbackSnapshotSafeEnd = undefined;
|
|
122
586
|
|
|
123
587
|
const count = this.children.length;
|
|
588
|
+
|
|
124
589
|
// The live region spans from the earliest still-mutating block through the
|
|
125
|
-
// bottom. A block that has not finalized must stay
|
|
126
|
-
// inserts (TTSR/todo cards) can append a finalized block *below* a
|
|
127
|
-
// is still awaiting its result, and
|
|
128
|
-
//
|
|
590
|
+
// bottom. A block that has not finalized must stay below the seam: out-of-
|
|
591
|
+
// band inserts (TTSR/todo cards) can append a finalized block *below* a
|
|
592
|
+
// tool that is still awaiting its result, and committing the tool there
|
|
593
|
+
// would strand its history rows on the mid-stream preview the late result
|
|
594
|
+
// never reaches.
|
|
129
595
|
let liveStartIndex = count - 1;
|
|
130
596
|
for (let i = 0; i < count; i++) {
|
|
131
597
|
if (!isBlockFinalized(this.children[i]!)) {
|
|
@@ -133,49 +599,208 @@ export class TranscriptContainer extends Container implements NativeScrollbackLi
|
|
|
133
599
|
break;
|
|
134
600
|
}
|
|
135
601
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
602
|
+
|
|
603
|
+
const lines = this.#lines;
|
|
604
|
+
const previousSegments = this.#segments;
|
|
605
|
+
const segments: BlockSegment[] = new Array(count);
|
|
606
|
+
// Poisoned until the walk completes: a block render throwing mid-walk
|
|
607
|
+
// leaves the persistent array half-rebuilt, and the next render must
|
|
608
|
+
// not trust stale segments against it. Restored at the end.
|
|
609
|
+
this.#segments = EMPTY_SEGMENTS;
|
|
610
|
+
const stableFloorBefore = this.#stableRowsFloor;
|
|
611
|
+
this.#stableRowsFloor = 0;
|
|
612
|
+
// Stability requires the same width and, per segment, the same block at
|
|
613
|
+
// the same offset returning the same array reference. The first
|
|
614
|
+
// divergence truncates the persistent array there; everything after
|
|
615
|
+
// re-pushes.
|
|
616
|
+
let chainStable = this.#renderWidth === width;
|
|
617
|
+
this.#renderWidth = width;
|
|
618
|
+
// Entry-unstable (width change): the divergence truncation inside the
|
|
619
|
+
// loop only fires on a stable→unstable transition, so reset the
|
|
620
|
+
// persistent array here to keep the `!chainStable ⇒ lines.length === row`
|
|
621
|
+
// invariant — otherwise re-pushed rows land after the stale frame.
|
|
622
|
+
if (!chainStable) lines.length = 0;
|
|
623
|
+
|
|
624
|
+
// Tracks whether we are still inside the leading run of commit-safe live
|
|
625
|
+
// blocks. The first still-live volatile block closes it, but rendering
|
|
626
|
+
// continues so lower blocks remain visible.
|
|
146
627
|
let commitSafeOpen = true;
|
|
628
|
+
// The live-region start is recorded at the first visible row at/after
|
|
629
|
+
// liveStartIndex; empty leading blocks (or a separator) must not claim it
|
|
630
|
+
// early.
|
|
631
|
+
let liveRecorded = false;
|
|
632
|
+
// Frame row cursor: rows emitted (reused or pushed) so far.
|
|
633
|
+
let row = 0;
|
|
634
|
+
let stableRows = 0;
|
|
147
635
|
for (let i = 0; i < count; i++) {
|
|
148
636
|
const child = this.children[i]! as Component & SnapshotCarrier;
|
|
149
|
-
|
|
150
|
-
|
|
637
|
+
|
|
638
|
+
// This child's contribution: its current render with plain-blank
|
|
639
|
+
// top/bottom edges stripped (the container owns inter-block gaps).
|
|
640
|
+
// Finalized blocks wholly inside committed native scrollback can reuse
|
|
641
|
+
// their previous contribution without calling render(): those rows are
|
|
642
|
+
// immutable terminal history for the current width/generation. Blocks
|
|
643
|
+
// outside committed history still render normally so late results,
|
|
644
|
+
// post-finalize re-layouts, and expand toggles remain visible.
|
|
645
|
+
const previousSnapshot = child[kSnapshot];
|
|
646
|
+
const previous = previousSegments[i];
|
|
647
|
+
const finalized = isBlockFinalized(child);
|
|
648
|
+
const version = getBlockVersion(child);
|
|
649
|
+
const committedReusable =
|
|
650
|
+
previous !== undefined &&
|
|
651
|
+
previous.component === child &&
|
|
652
|
+
previous.width === width &&
|
|
653
|
+
previous.generation === this.#generation &&
|
|
654
|
+
previous.startRow === row &&
|
|
655
|
+
previous.startRow + previous.rowCount <= this.#committedRows &&
|
|
656
|
+
finalized &&
|
|
657
|
+
// Only replay bytes that were themselves produced by a finalized
|
|
658
|
+
// render: a block finalizing between frames may have changed content
|
|
659
|
+
// while its rows were already committed via the append-only live
|
|
660
|
+
// path, so the first post-transition frame must render. Defense in
|
|
661
|
+
// depth on the transcript side — the TUI commit policy should keep
|
|
662
|
+
// that window closed, but the safety must not live there alone.
|
|
663
|
+
previous.finalized &&
|
|
664
|
+
// Post-finalize mutations (inline error restore, late tool images)
|
|
665
|
+
// bump the block version; a mismatch forces a real render so the
|
|
666
|
+
// committed-prefix audit can observe and re-anchor the change.
|
|
667
|
+
previous.version === version;
|
|
668
|
+
const raw = committedReusable ? previous.rawRef : child.render(width);
|
|
669
|
+
const reusable =
|
|
670
|
+
committedReusable ||
|
|
671
|
+
(previous !== undefined &&
|
|
672
|
+
previous.component === child &&
|
|
673
|
+
previous.rawRef === raw &&
|
|
674
|
+
previous.width === width &&
|
|
675
|
+
previous.generation === this.#generation);
|
|
676
|
+
const contribution = reusable ? previous.contribution : stripPlainBlankEdges(raw);
|
|
677
|
+
let liveCommitState: LiveCommitState | undefined;
|
|
678
|
+
// Provisional live renders (commit-unstable blocks) never feed the
|
|
679
|
+
// promotion machinery: their settled-looking rows are replaced
|
|
680
|
+
// wholesale on finalize, so offering them would commit a stale
|
|
681
|
+
// preview the result render can only duplicate, never erase.
|
|
682
|
+
if (i >= liveStartIndex && !finalized && isBlockCommitStable(child)) {
|
|
683
|
+
liveCommitState = deriveLiveCommitState(previousSnapshot, contribution, width, this.#generation);
|
|
684
|
+
}
|
|
685
|
+
// Cache the latest contribution as the next frame's diff input.
|
|
686
|
+
child[kSnapshot] = {
|
|
687
|
+
width,
|
|
688
|
+
lines: contribution,
|
|
689
|
+
generation: this.#generation,
|
|
690
|
+
appendOnly: liveCommitState?.appendOnly ?? false,
|
|
691
|
+
volatileCooldown: liveCommitState?.volatileCooldown ?? 0,
|
|
692
|
+
stablePrefixLength: liveCommitState?.stablePrefixLength ?? 0,
|
|
693
|
+
candidatePrefixLength: liveCommitState?.candidatePrefixLength ?? 0,
|
|
694
|
+
candidatePrefixAge: liveCommitState?.candidatePrefixAge ?? 0,
|
|
695
|
+
rewriteFloor: liveCommitState?.rewriteFloor ?? Number.POSITIVE_INFINITY,
|
|
696
|
+
};
|
|
697
|
+
|
|
698
|
+
// Empty (or stripped-to-nothing) children contribute nothing and never
|
|
699
|
+
// affect spacing or the live-region offsets. An empty still-live child
|
|
700
|
+
// still closes the commit-safe run: if it later gains rows, it pushes
|
|
701
|
+
// everything below it.
|
|
702
|
+
if (contribution.length === 0) {
|
|
703
|
+
if (i >= liveStartIndex && commitSafeOpen && !finalized) commitSafeOpen = false;
|
|
704
|
+
if (chainStable && !(reusable && previous.rowCount === 0 && previous.startRow === row)) {
|
|
705
|
+
chainStable = false;
|
|
706
|
+
lines.length = row;
|
|
707
|
+
}
|
|
708
|
+
if (chainStable) stableRows = row;
|
|
709
|
+
segments[i] = {
|
|
710
|
+
component: child,
|
|
711
|
+
rawRef: raw,
|
|
712
|
+
contribution,
|
|
713
|
+
width,
|
|
714
|
+
generation: this.#generation,
|
|
715
|
+
startRow: row,
|
|
716
|
+
rowCount: 0,
|
|
717
|
+
sep: 0,
|
|
718
|
+
finalized,
|
|
719
|
+
version,
|
|
720
|
+
};
|
|
721
|
+
continue;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// Every block is separated from preceding visible content by exactly one
|
|
725
|
+
// blank row — skipped when it opens the transcript or the prior row is
|
|
726
|
+
// already a plain blank (a fragment's own trailing pad), never doubling.
|
|
727
|
+
// `lines[row - 1]` is valid in both modes: reused rows are still present
|
|
728
|
+
// in the persistent array, re-pushed rows were just written.
|
|
729
|
+
const sep = row > 0 && !isPlainBlank(lines[row - 1]!) ? 1 : 0;
|
|
730
|
+
|
|
731
|
+
// The separator before the first live block stays in the committed
|
|
732
|
+
// prefix (it is deterministic once the prior block's body is settled),
|
|
733
|
+
// so the live region begins at the block's first content row.
|
|
734
|
+
if (!liveRecorded && i >= liveStartIndex) {
|
|
735
|
+
this.#nativeScrollbackLiveRegionStart = row + sep;
|
|
736
|
+
liveRecorded = true;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
const rowCount = sep + contribution.length;
|
|
740
|
+
const stable = chainStable && reusable && previous.startRow === row && previous.sep === sep;
|
|
741
|
+
if (stable) {
|
|
742
|
+
stableRows = row + rowCount;
|
|
151
743
|
} else {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
// instead, as does a block that was still live last frame (i >= cutoff).
|
|
156
|
-
if (i < replayCutoff && snapshot && snapshot.generation === this.#generation && snapshot.width === width) {
|
|
157
|
-
lines.push(...snapshot.lines);
|
|
158
|
-
continue;
|
|
744
|
+
if (chainStable) {
|
|
745
|
+
chainStable = false;
|
|
746
|
+
lines.length = row;
|
|
159
747
|
}
|
|
748
|
+
if (sep) lines.push("");
|
|
749
|
+
for (let j = 0; j < contribution.length; j++) lines.push(contribution[j]!);
|
|
160
750
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
// block. `lines.length` here is this block's start offset; the boundary
|
|
164
|
-
// runs to the end of its rendered rows. The first volatile live block
|
|
165
|
-
// closes the run so its mutable rows stay deferred.
|
|
751
|
+
|
|
752
|
+
const blockStart = row + sep;
|
|
166
753
|
if (i >= liveStartIndex && commitSafeOpen) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
754
|
+
const safeLength = finalized ? contribution.length : (liveCommitState?.safeLength ?? 0);
|
|
755
|
+
if (safeLength > 0) {
|
|
756
|
+
this.#nativeScrollbackCommitSafeEnd = blockStart + safeLength;
|
|
757
|
+
}
|
|
758
|
+
// Durable snapshot end: a commit-stable block's whole body is durable
|
|
759
|
+
// content — its scrolled-off rows are permanent even while interior
|
|
760
|
+
// rows re-lay-out (a streaming table re-aligning columns), so the
|
|
761
|
+
// engine must commit their snapshot on scroll-off rather than drop it.
|
|
762
|
+
// Finalized blocks are wholly durable; provisional (commit-unstable)
|
|
763
|
+
// blocks offer nothing beyond their byte-stable safe length.
|
|
764
|
+
const snapshotLength = finalized || isBlockCommitStable(child) ? contribution.length : safeLength;
|
|
765
|
+
if (snapshotLength > 0) {
|
|
766
|
+
this.#nativeScrollbackSnapshotSafeEnd = blockStart + snapshotLength;
|
|
171
767
|
}
|
|
768
|
+
// A finalized, fully safe block may let the contiguous safe run extend
|
|
769
|
+
// into blocks rendered below it. A still-live block keeps pushing lower
|
|
770
|
+
// rows around as it grows, so the run closes there.
|
|
771
|
+
if (!(finalized && safeLength >= contribution.length)) commitSafeOpen = false;
|
|
172
772
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
773
|
+
|
|
774
|
+
segments[i] = {
|
|
775
|
+
component: child,
|
|
776
|
+
rawRef: raw,
|
|
777
|
+
contribution,
|
|
778
|
+
width,
|
|
779
|
+
generation: this.#generation,
|
|
780
|
+
startRow: row,
|
|
781
|
+
rowCount,
|
|
782
|
+
sep,
|
|
783
|
+
finalized,
|
|
784
|
+
version,
|
|
785
|
+
};
|
|
786
|
+
row += rowCount;
|
|
178
787
|
}
|
|
788
|
+
// Trailing shrink: blocks removed from the tail leave stale rows behind
|
|
789
|
+
// when every surviving segment was reused.
|
|
790
|
+
if (lines.length !== row) lines.length = row;
|
|
791
|
+
this.#segments = segments;
|
|
792
|
+
this.#stableRowsFloor = Math.min(stableFloorBefore, stableRows, row);
|
|
179
793
|
return lines;
|
|
180
794
|
}
|
|
181
795
|
}
|
|
796
|
+
|
|
797
|
+
/**
|
|
798
|
+
* Groups a run of sibling rows (an IRC card's header + body, a file-mention
|
|
799
|
+
* list, a bordered command/version panel) into a single transcript child so the
|
|
800
|
+
* container spaces it as one block — one blank line above, none injected between
|
|
801
|
+
* its rows. Without this wrapper the rows would be top-level children and the
|
|
802
|
+
* container would put a blank line between each (and inside any border box).
|
|
803
|
+
* It is a plain {@link Container}; the named subclass documents intent and makes
|
|
804
|
+
* every manual block grouping greppable.
|
|
805
|
+
*/
|
|
806
|
+
export class TranscriptBlock extends Container {}
|