@code-yeongyu/senpi 2026.6.3 → 2026.6.6-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -4
- package/README.md +21 -4
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli-main.d.ts +3 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +10 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +46 -13
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +0 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +32 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +51 -79
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +8 -11
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/dynamic-prompt/exploration.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/exploration.js.map +1 -1
- package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/identity.js.map +1 -1
- package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
- package/dist/core/dynamic-prompt/parallel-tools.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/parallel-tools.js.map +1 -1
- package/dist/core/dynamic-prompt/policies.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/policies.js.map +1 -1
- package/dist/core/dynamic-prompt/style.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/style.js.map +1 -1
- package/dist/core/dynamic-prompt/tool-categorization.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/tool-categorization.js.map +1 -1
- package/dist/core/dynamic-prompt/tool-section.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/tool-section.js.map +1 -1
- package/dist/core/dynamic-prompt/types.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/verification.js.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.js +19 -6
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/checkpoint-state.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-reduction.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-reduction.js +1 -1
- package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/degradation-monitor.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/degradation-monitor.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-detection.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-detection.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/prompts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/prompts.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/restoration-tracker.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/state.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/tool-truncation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/tool-truncation.js.map +1 -1
- package/dist/core/extensions/builtin/diff.d.ts.map +1 -1
- package/dist/core/extensions/builtin/diff.js.map +1 -1
- package/dist/core/extensions/builtin/files.d.ts.map +1 -1
- package/dist/core/extensions/builtin/files.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/constants.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/errors.js +0 -2
- package/dist/core/extensions/builtin/gpt-apply-patch/errors.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/params.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/parser.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js +7 -5
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/text.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/text.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/workspace.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/workspace.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/filter.d.ts.map +1 -1
- package/dist/core/extensions/builtin/history-search/filter.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/indexer.d.ts.map +1 -1
- package/dist/core/extensions/builtin/history-search/indexer.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
- package/dist/core/extensions/builtin/history-search/overlay.js +3 -6
- package/dist/core/extensions/builtin/history-search/overlay.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/kimi-web-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/arity.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/evaluate.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/evaluate.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/events.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/events.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/non-interactive.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +3 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/service.js +2 -5
- package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/settings.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/storage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/storage.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/types.js +3 -5
- package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/wildcard.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
- package/dist/core/extensions/builtin/redraws.d.ts.map +1 -1
- package/dist/core/extensions/builtin/redraws.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/index.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/loader.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/overlay.js +13 -18
- package/dist/core/extensions/builtin/session-observer/overlay.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/scanner.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/text.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/text.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +1 -1
- package/dist/core/extensions/builtin/session-observer/transcript.js.map +1 -1
- package/dist/core/extensions/builtin/session-observer/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
- package/dist/core/extensions/builtin/system-messages.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/config.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/config.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/settings.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js.map +1 -1
- package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tps.js.map +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +35 -43
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +17 -18
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/keybindings.d.ts +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +8 -10
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +2 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts +3 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +47 -19
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +2 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +26 -53
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +7 -11
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-work-barrier.d.ts.map +1 -1
- package/dist/core/session-work-barrier.js +5 -3
- package/dist/core/session-work-barrier.js.map +1 -1
- package/dist/core/settings-manager.d.ts +10 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +77 -46
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +9 -6
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/diff-render.d.ts.map +1 -1
- package/dist/core/tools/diff-render.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +12 -18
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts +9 -0
- package/dist/core/trust-manager.d.ts.map +1 -0
- package/dist/core/trust-manager.js +133 -0
- package/dist/core/trust-manager.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +54 -2
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +6 -10
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +2 -11
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +6 -11
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -3
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -3
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +5 -15
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +0 -5
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -8
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -6
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js +6 -8
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js +2 -2
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -6
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +2 -8
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -9
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.js +9 -15
- package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +10 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +6 -21
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-favorites.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +9 -22
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -12
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +33 -58
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +0 -4
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +0 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +0 -2
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +0 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -28
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +18 -32
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +20 -0
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/trust-selector.js +81 -0
- package/dist/modes/interactive/components/trust-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +3 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +0 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +24 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +112 -101
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-info-format.d.ts.map +1 -1
- package/dist/modes/interactive/session-info-format.js.map +1 -1
- package/dist/modes/interactive/startup-tools.d.ts.map +1 -1
- package/dist/modes/interactive/startup-tools.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +0 -6
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/working-status.d.ts.map +1 -1
- package/dist/modes/interactive/working-status.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/provider-native-rendering.d.ts.map +1 -1
- package/dist/modes/provider-native-rendering.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +7 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +56 -9
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/self-update-bootstrap.d.ts +19 -0
- package/dist/self-update-bootstrap.d.ts.map +1 -0
- package/dist/self-update-bootstrap.js +160 -0
- package/dist/self-update-bootstrap.js.map +1 -0
- package/dist/senpi +46 -13
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +54 -22
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/containerization.md +111 -0
- package/docs/docs.json +4 -0
- package/docs/extensions.md +3 -1
- package/docs/index.md +1 -0
- package/docs/packages.md +3 -1
- package/docs/prompt-templates.md +1 -1
- package/docs/providers.md +3 -0
- package/docs/settings.md +10 -0
- package/docs/skills.md +3 -3
- package/docs/themes.md +1 -1
- package/docs/usage.md +15 -3
- package/examples/extensions/README.md +1 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/index.ts +531 -0
- package/examples/extensions/gondolin/package-lock.json +185 -0
- package/examples/extensions/gondolin/package.json +19 -0
- package/examples/extensions/minimal-mode.ts +6 -6
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +7 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -27
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +7 -20
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +0 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js +0 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +0 -7
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js +3 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js +0 -5
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +0 -16
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/node.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +6 -6
- package/node_modules/@earendil-works/pi-ai/README.md +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cli.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +413 -65
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +385 -97
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +0 -7
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +26 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/session-resources.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/session-resources.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +10 -8
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +4 -4
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js +3 -7
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/hash.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/hash.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/headers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/headers.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +13 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +4 -2
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +5 -5
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +0 -3
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/box.js +1 -6
- package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js +4 -3
- package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +43 -54
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js +0 -8
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/input.js +14 -14
- package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +11 -13
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +0 -11
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +4 -9
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js +4 -12
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js +0 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/text.js +0 -8
- package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js +0 -3
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +2 -4
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js +3 -1
- package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +4 -6
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +24 -29
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +25 -27
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js +3 -1
- package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js +14 -12
- package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/node_modules/@types/node/README.md +3 -3
- package/node_modules/@types/node/assert/strict.d.ts +3 -55
- package/node_modules/@types/node/assert.d.ts +49 -177
- package/node_modules/@types/node/async_hooks.d.ts +151 -43
- package/node_modules/@types/node/buffer.buffer.d.ts +2 -8
- package/node_modules/@types/node/buffer.d.ts +43 -212
- package/node_modules/@types/node/child_process.d.ts +23 -133
- package/node_modules/@types/node/cluster.d.ts +238 -384
- package/node_modules/@types/node/compatibility/iterators.d.ts +1 -0
- package/node_modules/@types/node/console.d.ts +45 -404
- package/node_modules/@types/node/constants.d.ts +3 -10
- package/node_modules/@types/node/crypto.d.ts +640 -1127
- package/node_modules/@types/node/dgram.d.ts +14 -77
- package/node_modules/@types/node/diagnostics_channel.d.ts +3 -29
- package/node_modules/@types/node/dns/promises.d.ts +4 -10
- package/node_modules/@types/node/dns.d.ts +130 -177
- package/node_modules/@types/node/domain.d.ts +12 -32
- package/node_modules/@types/node/events.d.ts +872 -840
- package/node_modules/@types/node/fs/promises.d.ts +193 -20
- package/node_modules/@types/node/fs.d.ts +754 -435
- package/node_modules/@types/node/globals.d.ts +8 -30
- package/node_modules/@types/node/globals.typedarray.d.ts +63 -0
- package/node_modules/@types/node/http.d.ts +363 -305
- package/node_modules/@types/node/http2.d.ts +545 -781
- package/node_modules/@types/node/https.d.ts +64 -243
- package/node_modules/@types/node/index.d.ts +26 -6
- package/node_modules/@types/node/inspector/promises.d.ts +35 -0
- package/node_modules/@types/node/inspector.d.ts +68 -57
- package/node_modules/@types/node/inspector.generated.d.ts +764 -410
- package/node_modules/@types/node/module.d.ts +53 -189
- package/node_modules/@types/node/net.d.ts +101 -207
- package/node_modules/@types/node/os.d.ts +11 -19
- package/node_modules/@types/node/package.json +13 -3
- package/node_modules/@types/node/path/posix.d.ts +8 -0
- package/node_modules/@types/node/path/win32.d.ts +8 -0
- package/node_modules/@types/node/path.d.ts +119 -141
- package/node_modules/@types/node/perf_hooks.d.ts +317 -673
- package/node_modules/@types/node/process.d.ts +277 -157
- package/node_modules/@types/node/punycode.d.ts +3 -31
- package/node_modules/@types/node/querystring.d.ts +3 -16
- package/node_modules/@types/node/quic.d.ts +897 -0
- package/node_modules/@types/node/readline/promises.d.ts +3 -6
- package/node_modules/@types/node/readline.d.ts +65 -152
- package/node_modules/@types/node/repl.d.ts +101 -109
- package/node_modules/@types/node/sea.d.ts +9 -115
- package/node_modules/@types/node/sqlite.d.ts +415 -68
- package/node_modules/@types/node/stream/consumers.d.ts +91 -15
- package/node_modules/@types/node/stream/iter.d.ts +301 -0
- package/node_modules/@types/node/stream/promises.d.ts +136 -15
- package/node_modules/@types/node/stream/web.d.ts +179 -501
- package/node_modules/@types/node/stream.d.ts +577 -490
- package/node_modules/@types/node/string_decoder.d.ts +3 -43
- package/node_modules/@types/node/test/reporters.d.ts +59 -0
- package/node_modules/@types/node/test.d.ts +402 -286
- package/node_modules/@types/node/timers/promises.d.ts +3 -18
- package/node_modules/@types/node/timers.d.ts +3 -141
- package/node_modules/@types/node/tls.d.ts +115 -241
- package/node_modules/@types/node/trace_events.d.ts +3 -97
- package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +2 -8
- package/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
- package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +2 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +28 -6
- package/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
- package/node_modules/@types/node/ts5.7/index.d.ts +119 -0
- package/node_modules/@types/node/tty.d.ts +57 -40
- package/node_modules/@types/node/url.d.ts +156 -584
- package/node_modules/@types/node/util/types.d.ts +558 -0
- package/node_modules/@types/node/util.d.ts +167 -1096
- package/node_modules/@types/node/v8.d.ts +75 -15
- package/node_modules/@types/node/vm.d.ts +334 -198
- package/node_modules/@types/node/wasi.d.ts +24 -74
- package/node_modules/@types/node/web-globals/abortcontroller.d.ts +27 -2
- package/node_modules/@types/node/web-globals/blob.d.ts +23 -0
- package/node_modules/@types/node/web-globals/console.d.ts +9 -0
- package/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
- package/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
- package/node_modules/@types/node/web-globals/events.d.ts +9 -0
- package/node_modules/@types/node/web-globals/fetch.d.ts +14 -0
- package/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
- package/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
- package/node_modules/@types/node/web-globals/navigator.d.ts +3 -0
- package/node_modules/@types/node/web-globals/performance.d.ts +45 -0
- package/node_modules/@types/node/web-globals/streams.d.ts +115 -0
- package/node_modules/@types/node/web-globals/timers.d.ts +44 -0
- package/node_modules/@types/node/web-globals/url.d.ts +24 -0
- package/node_modules/@types/node/worker_threads.d.ts +280 -393
- package/node_modules/@types/node/zlib/iter.d.ts +131 -0
- package/node_modules/@types/node/zlib.d.ts +7 -165
- package/node_modules/undici-types/agent.d.ts +13 -12
- package/node_modules/undici-types/api.d.ts +26 -26
- package/node_modules/undici-types/balanced-pool.d.ts +13 -12
- package/node_modules/undici-types/cache-interceptor.d.ts +179 -0
- package/node_modules/undici-types/client-stats.d.ts +15 -0
- package/node_modules/undici-types/client.d.ts +34 -19
- package/node_modules/undici-types/connector.d.ts +4 -2
- package/node_modules/undici-types/cookies.d.ts +2 -0
- package/node_modules/undici-types/diagnostics-channel.d.ts +18 -10
- package/node_modules/undici-types/dispatcher.d.ts +127 -104
- package/node_modules/undici-types/env-http-proxy-agent.d.ts +4 -3
- package/node_modules/undici-types/errors.d.ts +82 -54
- package/node_modules/undici-types/eventsource.d.ts +9 -4
- package/node_modules/undici-types/fetch.d.ts +22 -20
- package/node_modules/undici-types/formdata.d.ts +7 -7
- package/node_modules/undici-types/global-dispatcher.d.ts +4 -4
- package/node_modules/undici-types/global-origin.d.ts +5 -5
- package/node_modules/undici-types/h2c-client.d.ts +73 -0
- package/node_modules/undici-types/handlers.d.ts +8 -8
- package/node_modules/undici-types/header.d.ts +157 -1
- package/node_modules/undici-types/index.d.ts +67 -47
- package/node_modules/undici-types/interceptors.d.ts +71 -8
- package/node_modules/undici-types/mock-agent.d.ts +36 -18
- package/node_modules/undici-types/mock-call-history.d.ts +111 -0
- package/node_modules/undici-types/mock-client.d.ts +6 -4
- package/node_modules/undici-types/mock-errors.d.ts +3 -3
- package/node_modules/undici-types/mock-interceptor.d.ts +21 -20
- package/node_modules/undici-types/mock-pool.d.ts +6 -4
- package/node_modules/undici-types/package.json +1 -1
- package/node_modules/undici-types/patch.d.ts +0 -4
- package/node_modules/undici-types/pool-stats.d.ts +8 -8
- package/node_modules/undici-types/pool.d.ts +15 -13
- package/node_modules/undici-types/proxy-agent.d.ts +5 -4
- package/node_modules/undici-types/readable.d.ts +19 -16
- package/node_modules/undici-types/retry-agent.d.ts +1 -1
- package/node_modules/undici-types/retry-handler.d.ts +19 -10
- package/node_modules/undici-types/round-robin-pool.d.ts +41 -0
- package/node_modules/undici-types/snapshot-agent.d.ts +109 -0
- package/node_modules/undici-types/socks5-proxy-agent.d.ts +25 -0
- package/node_modules/undici-types/util.d.ts +3 -3
- package/node_modules/undici-types/utility.d.ts +7 -0
- package/node_modules/undici-types/webidl.d.ts +148 -29
- package/node_modules/undici-types/websocket.d.ts +48 -10
- package/npm-shrinkwrap.json +21 -21
- package/package.json +14 -8
- package/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
- package/node_modules/@types/node/compatibility/index.d.ts +0 -9
- package/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
- package/node_modules/undici-types/file.d.ts +0 -39
- package/node_modules/undici-types/filereader.d.ts +0 -54
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoration-tracker.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/restoration-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGpF,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAE1F,QAAA,MAAM,+BAA+B,iDAAiD,CAAC;AAMvF,KAAK,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAG5C,MAAM,WAAW,mBAAmB;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,mBAAmB,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACzC,UAAU,EAAE,OAAO,oCAAoC,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE;QACR,MAAM,EAAE,OAAO,+BAA+B,CAAC;QAC/C,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,gBAAgB,CAAC;QACzB,KAAK,EAAE,eAAe,EAAE,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,cAAc,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACjD;AAED,wBAAgB,6BAA6B,IAAI,uBAAuB,CAMvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAmB/F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,4BAA4B,GAAG,IAAI,CA8BjH;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,uBAAuB,GAC5B,2BAA2B,CAAC,SAAS,CAAC,GAAG,SAAS,CAapD;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAQtF","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { estimateTokens } from \"../../../compaction/index.ts\";\nimport type { BeforeAgentStartEventResult, CompactionReason } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\n\nexport const POST_COMPACT_RESTORATION_CUSTOM_TYPE = \"compaction.post-compact-restoration\";\n\nconst POST_COMPACT_RESTORATION_SCHEMA = \"senpi.compaction.post-compact-restoration.v1\";\nconst DEFAULT_RESTORATION_MAX_ITEMS = 10;\nconst DEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM = 5000;\nconst DEFAULT_RESTORATION_MAX_TOTAL_TOKENS = 50_000;\nconst DEFAULT_RESTORATION_CONTEXT_RATIO = 0.15;\n\ntype RestorationItemType = \"file\" | \"skill\";\ntype FileOperation = \"read\" | \"write\" | \"edit\";\n\nexport interface RestorationSettings {\n\trestorationMaxItems?: number;\n\trestorationMaxTokensPerItem?: number;\n\trestorationMaxTotalTokens?: number;\n\trestorationContextRatio?: number;\n}\n\nexport interface MinimalToolCallEvent {\n\ttoolName: string;\n\tinput: Record<string, unknown>;\n}\n\nexport interface RestorationItem {\n\tcontent: string;\n\tlabel: string;\n\tpriority: number;\n\ttokens: number;\n\ttype: RestorationItemType;\n}\n\nexport interface PendingRestorationPayload {\n\tcustomType: typeof POST_COMPACT_RESTORATION_CUSTOM_TYPE;\n\tcontent: string;\n\tdisplay: false;\n\tdetails: {\n\t\tschema: typeof POST_COMPACT_RESTORATION_SCHEMA;\n\t\tbudgetTokens: number;\n\t\tcompactionEntryId: string;\n\t\treason: CompactionReason;\n\t\titems: RestorationItem[];\n\t};\n\tbudgetTokens: number;\n}\n\nexport interface PreparePendingPayloadOptions {\n\taccepted: boolean;\n\treason: CompactionReason;\n\tcompactionEntryId: string;\n\tcontextWindow: number;\n\tusageTokens: number | null;\n\treserveTokens: number;\n\tsettings?: RestorationSettings;\n\tkeptMessages?: AgentMessage[];\n}\n\nexport interface RestorationTrackerState {\n\titems: Map<string, RestorationItem>;\n\trestoredLabels: Set<string>;\n\tpendingPayload: PendingRestorationPayload | null;\n}\n\nexport function createRestorationTrackerState(): RestorationTrackerState {\n\treturn {\n\t\titems: new Map(),\n\t\trestoredLabels: new Set(),\n\t\tpendingPayload: null,\n\t};\n}\n\nexport function trackToolCall(state: RestorationTrackerState, event: MinimalToolCallEvent): void {\n\tswitch (event.toolName) {\n\t\tcase \"read\":\n\t\t\ttrackPathInput(state, event.input, \"read\");\n\t\t\treturn;\n\t\tcase \"write\":\n\t\t\ttrackPathInput(state, event.input, \"write\");\n\t\t\treturn;\n\t\tcase \"edit\":\n\t\t\ttrackPathInput(state, event.input, \"edit\");\n\t\t\treturn;\n\t\tcase \"apply_patch\":\n\t\t\ttrackApplyPatchInput(state, event.input);\n\t\t\treturn;\n\t\tcase \"skill\":\n\t\tcase \"load_skill\":\n\t\t\ttrackSkillInput(state, event.input);\n\t\t\treturn;\n\t}\n}\n\nexport function preparePendingPayload(state: RestorationTrackerState, options: PreparePendingPayloadOptions): void {\n\tif (!options.accepted) return;\n\n\tconst budgetTokens = computeRestorationBudget(options);\n\tif (budgetTokens <= 0) {\n\t\tstate.pendingPayload = null;\n\t\treturn;\n\t}\n\n\tfilterAgainstKeptMessages(state, options.keptMessages ?? []);\n\tconst selectedItems = selectRestorationItems(state, options.settings, budgetTokens);\n\tif (selectedItems.length === 0) {\n\t\tstate.pendingPayload = null;\n\t\treturn;\n\t}\n\n\tconst content = buildRestorationContent(options, selectedItems);\n\tstate.pendingPayload = {\n\t\tcustomType: POST_COMPACT_RESTORATION_CUSTOM_TYPE,\n\t\tcontent,\n\t\tdisplay: false,\n\t\tdetails: {\n\t\t\tschema: POST_COMPACT_RESTORATION_SCHEMA,\n\t\t\tbudgetTokens,\n\t\t\tcompactionEntryId: options.compactionEntryId,\n\t\t\treason: options.reason,\n\t\t\titems: selectedItems,\n\t\t},\n\t\tbudgetTokens,\n\t};\n}\n\nexport function consumePendingPayload(\n\tstate: RestorationTrackerState,\n): BeforeAgentStartEventResult[\"message\"] | undefined {\n\tconst payload = state.pendingPayload;\n\tstate.pendingPayload = null;\n\tif (!payload) return undefined;\n\tfor (const item of payload.details.items) {\n\t\tstate.restoredLabels.add(item.label);\n\t}\n\treturn {\n\t\tcustomType: payload.customType,\n\t\tcontent: payload.content,\n\t\tdisplay: payload.display,\n\t\tdetails: payload.details,\n\t};\n}\n\nexport function computeRestorationBudget(options: PreparePendingPayloadOptions): number {\n\tconst settings = resolveSettings(options.settings);\n\tconst contextWindow = Math.max(0, options.contextWindow);\n\tconst configuredBudget = settings.restorationMaxTotalTokens;\n\tconst contextRatioBudget = Math.floor(contextWindow * settings.restorationContextRatio);\n\tconst usageTokens = Math.max(0, options.usageTokens ?? 0);\n\tconst remainingBudget = Math.max(0, contextWindow - usageTokens - options.reserveTokens);\n\treturn Math.floor(Math.min(configuredBudget, contextRatioBudget, remainingBudget));\n}\n\nfunction trackPathInput(\n\tstate: RestorationTrackerState,\n\tinput: Record<string, unknown>,\n\toperation: FileOperation,\n): void {\n\tif (typeof input.path !== \"string\" || input.path.length === 0) return;\n\ttrackFile(state, input.path, operation);\n}\n\nfunction trackApplyPatchInput(state: RestorationTrackerState, input: Record<string, unknown>): void {\n\tif (typeof input.input !== \"string\") return;\n\tfor (const path of extractPatchedPaths(input.input)) {\n\t\tif (path.length > 0) trackFile(state, path, \"edit\");\n\t}\n}\n\nfunction trackSkillInput(state: RestorationTrackerState, input: Record<string, unknown>): void {\n\tconst skillName = typeof input.name === \"string\" ? input.name : input.skillName;\n\tif (typeof skillName === \"string\" && skillName.length > 0) {\n\t\tsetItem(state, {\n\t\t\tcontent: skillName,\n\t\t\tlabel: skillName,\n\t\t\tpriority: 80,\n\t\t\ttokens: estimateTextTokens(skillName),\n\t\t\ttype: \"skill\",\n\t\t});\n\t}\n}\n\nfunction trackFile(state: RestorationTrackerState, path: string, operation: FileOperation): void {\n\tconst label = path;\n\tconst existing = state.items.get(label);\n\tconst operations = new Set<FileOperation>(parseFileOperations(existing?.content));\n\toperations.add(operation);\n\tconst content = `${path} (${sortOperations(operations).join(\", \")})`;\n\tsetItem(state, {\n\t\tcontent,\n\t\tlabel,\n\t\tpriority: operation === \"read\" && operations.size === 1 ? 50 : 100,\n\t\ttokens: estimateTextTokens(content),\n\t\ttype: \"file\",\n\t});\n}\n\nfunction setItem(state: RestorationTrackerState, item: RestorationItem): void {\n\tstate.items.set(item.label, item);\n}\n\nfunction selectRestorationItems(\n\tstate: RestorationTrackerState,\n\tsettingsInput: RestorationSettings | undefined,\n\tbudgetTokens: number,\n): RestorationItem[] {\n\tconst settings = resolveSettings(settingsInput);\n\tconst candidates = Array.from(state.items.values())\n\t\t.filter((item) => !state.restoredLabels.has(item.label))\n\t\t.map((item) => truncateRestorationItem(item, settings.restorationMaxTokensPerItem))\n\t\t.sort((left, right) => {\n\t\t\tif (left.priority !== right.priority) return right.priority - left.priority;\n\t\t\tif (left.tokens !== right.tokens) return left.tokens - right.tokens;\n\t\t\treturn left.label.localeCompare(right.label);\n\t\t});\n\n\tconst selected: RestorationItem[] = [];\n\tlet totalTokens = 0;\n\tfor (const item of candidates) {\n\t\tif (selected.length >= settings.restorationMaxItems) break;\n\t\tif (totalTokens + item.tokens > budgetTokens) continue;\n\t\tselected.push(item);\n\t\ttotalTokens += item.tokens;\n\t}\n\treturn selected;\n}\n\nfunction buildRestorationContent(options: PreparePendingPayloadOptions, items: RestorationItem[]): string {\n\tconst files = items.filter((item) => item.type === \"file\");\n\tconst skills = items.filter((item) => item.type === \"skill\");\n\tconst lines = [\n\t\t\"[Restored context after compaction — files and skills from before compaction]\",\n\t\t`reason: ${options.reason}`,\n\t\t`compactionEntryId: ${options.compactionEntryId}`,\n\t\t\"\",\n\t];\n\n\tif (files.length > 0) {\n\t\tlines.push(\"<restored-files>\");\n\t\tfor (const file of files) {\n\t\t\tlines.push(`<file label=\"${escapeXmlAttribute(file.label)}\">${file.content}</file>`);\n\t\t}\n\t\tlines.push(\"</restored-files>\");\n\t\tlines.push(\"\");\n\t}\n\n\tif (skills.length > 0) {\n\t\tlines.push(\"<restored-skills>\");\n\t\tfor (const skill of skills) {\n\t\t\tlines.push(`<skill label=\"${escapeXmlAttribute(skill.label)}\">${skill.content}</skill>`);\n\t\t}\n\t\tlines.push(\"</restored-skills>\");\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction truncateRestorationItem(item: RestorationItem, maxTokens: number): RestorationItem {\n\tif (item.tokens <= maxTokens) return item;\n\tconst truncationNotice = \"[... truncated]\";\n\tconst noticeTokens = estimateTextTokens(truncationNotice);\n\tconst targetTokens = Math.max(0, maxTokens - noticeTokens - 1);\n\tconst truncatedBody = truncateToTokenLimit(item.content, targetTokens);\n\tconst content = truncatedBody.length > 0 ? `${truncatedBody}\\n${truncationNotice}` : truncationNotice;\n\treturn { ...item, content, tokens: estimateTextTokens(content) };\n}\n\nfunction filterAgainstKeptMessages(state: RestorationTrackerState, keptMessages: AgentMessage[]): void {\n\tif (keptMessages.length === 0) return;\n\tconst keptText = keptMessages.map(extractMessageText).join(\"\\n\");\n\tfor (const label of state.items.keys()) {\n\t\tif (keptText.includes(label)) {\n\t\t\tstate.items.delete(label);\n\t\t}\n\t}\n}\n\nfunction extractMessageText(message: AgentMessage): string {\n\tif (\"content\" in message) {\n\t\tif (typeof message.content === \"string\") return message.content;\n\t\tif (Array.isArray(message.content)) {\n\t\t\treturn message.content\n\t\t\t\t.filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n\t\t\t\t.map((content) => content.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\t}\n\tif (\"summary\" in message) return message.summary;\n\tif (\"command\" in message) return `${message.command}\\n${message.output}`;\n\treturn \"\";\n}\n\nfunction truncateToTokenLimit(text: string, tokenLimit: number): string {\n\tif (tokenLimit <= 0 || text.length === 0) return \"\";\n\tif (estimateTextTokens(text) <= tokenLimit) return text;\n\n\tlet low = 0;\n\tlet high = text.length;\n\twhile (low < high) {\n\t\tconst mid = Math.ceil((low + high) / 2);\n\t\tconst candidate = text.slice(0, mid);\n\t\tif (estimateTextTokens(candidate) <= tokenLimit) {\n\t\t\tlow = mid;\n\t\t\tcontinue;\n\t\t}\n\t\thigh = mid - 1;\n\t}\n\treturn text.slice(0, low).trimEnd();\n}\n\nfunction resolveSettings(settings: RestorationSettings | undefined): Required<RestorationSettings> {\n\treturn {\n\t\trestorationMaxItems: normalizeNonNegativeInteger(settings?.restorationMaxItems, DEFAULT_RESTORATION_MAX_ITEMS),\n\t\trestorationMaxTokensPerItem: normalizeNonNegativeInteger(\n\t\t\tsettings?.restorationMaxTokensPerItem,\n\t\t\tDEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM,\n\t\t),\n\t\trestorationMaxTotalTokens: normalizeNonNegativeInteger(\n\t\t\tsettings?.restorationMaxTotalTokens,\n\t\t\tDEFAULT_RESTORATION_MAX_TOTAL_TOKENS,\n\t\t),\n\t\trestorationContextRatio: normalizeNonNegativeNumber(\n\t\t\tsettings?.restorationContextRatio,\n\t\t\tDEFAULT_RESTORATION_CONTEXT_RATIO,\n\t\t),\n\t};\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;\n}\n\nfunction normalizeNonNegativeNumber(value: number | undefined, fallback: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nfunction parseFileOperations(content: string | undefined): FileOperation[] {\n\tif (!content) return [];\n\tconst open = content.lastIndexOf(\"(\");\n\tconst close = content.lastIndexOf(\")\");\n\tif (open === -1 || close === -1 || close <= open) return [];\n\treturn content\n\t\t.slice(open + 1, close)\n\t\t.split(\",\")\n\t\t.map((operation) => operation.trim())\n\t\t.filter(\n\t\t\t(operation): operation is FileOperation =>\n\t\t\t\toperation === \"read\" || operation === \"write\" || operation === \"edit\",\n\t\t);\n}\n\nfunction sortOperations(operations: Set<FileOperation>): FileOperation[] {\n\tconst order: FileOperation[] = [\"read\", \"write\", \"edit\"];\n\treturn order.filter((operation) => operations.has(operation));\n}\n\nfunction estimateTextTokens(text: string): number {\n\treturn estimateTokens({ role: \"custom\", customType: \"restoration\", content: text, display: false, timestamp: 0 });\n}\n\nfunction escapeXmlAttribute(value: string): string {\n\treturn value.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"restoration-tracker.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/restoration-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGpF,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAE1F,QAAA,MAAM,+BAA+B,iDAAiD,CAAC;AAMvF,KAAK,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAG5C,MAAM,WAAW,mBAAmB;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,mBAAmB,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACzC,UAAU,EAAE,OAAO,oCAAoC,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE;QACR,MAAM,EAAE,OAAO,+BAA+B,CAAC;QAC/C,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,gBAAgB,CAAC;QACzB,KAAK,EAAE,eAAe,EAAE,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,cAAc,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACjD;AAED,wBAAgB,6BAA6B,IAAI,uBAAuB,CAMvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAmB/F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,4BAA4B,GAAG,IAAI,CA8BjH;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,uBAAuB,GAC5B,2BAA2B,CAAC,SAAS,CAAC,GAAG,SAAS,CAapD;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAQtF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoration-tracker.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/restoration-tracker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { estimateTokens } from \"../../../compaction/index.ts\";\nimport type { BeforeAgentStartEventResult, CompactionReason } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\n\nexport const POST_COMPACT_RESTORATION_CUSTOM_TYPE = \"compaction.post-compact-restoration\";\n\nconst POST_COMPACT_RESTORATION_SCHEMA = \"senpi.compaction.post-compact-restoration.v1\";\nconst DEFAULT_RESTORATION_MAX_ITEMS = 10;\nconst DEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM = 5000;\nconst DEFAULT_RESTORATION_MAX_TOTAL_TOKENS = 50_000;\nconst DEFAULT_RESTORATION_CONTEXT_RATIO = 0.15;\n\ntype RestorationItemType = \"file\" | \"skill\";\ntype FileOperation = \"read\" | \"write\" | \"edit\";\n\nexport interface RestorationSettings {\n\trestorationMaxItems?: number;\n\trestorationMaxTokensPerItem?: number;\n\trestorationMaxTotalTokens?: number;\n\trestorationContextRatio?: number;\n}\n\nexport interface MinimalToolCallEvent {\n\ttoolName: string;\n\tinput: Record<string, unknown>;\n}\n\nexport interface RestorationItem {\n\tcontent: string;\n\tlabel: string;\n\tpriority: number;\n\ttokens: number;\n\ttype: RestorationItemType;\n}\n\nexport interface PendingRestorationPayload {\n\tcustomType: typeof POST_COMPACT_RESTORATION_CUSTOM_TYPE;\n\tcontent: string;\n\tdisplay: false;\n\tdetails: {\n\t\tschema: typeof POST_COMPACT_RESTORATION_SCHEMA;\n\t\tbudgetTokens: number;\n\t\tcompactionEntryId: string;\n\t\treason: CompactionReason;\n\t\titems: RestorationItem[];\n\t};\n\tbudgetTokens: number;\n}\n\nexport interface PreparePendingPayloadOptions {\n\taccepted: boolean;\n\treason: CompactionReason;\n\tcompactionEntryId: string;\n\tcontextWindow: number;\n\tusageTokens: number | null;\n\treserveTokens: number;\n\tsettings?: RestorationSettings;\n\tkeptMessages?: AgentMessage[];\n}\n\nexport interface RestorationTrackerState {\n\titems: Map<string, RestorationItem>;\n\trestoredLabels: Set<string>;\n\tpendingPayload: PendingRestorationPayload | null;\n}\n\nexport function createRestorationTrackerState(): RestorationTrackerState {\n\treturn {\n\t\titems: new Map(),\n\t\trestoredLabels: new Set(),\n\t\tpendingPayload: null,\n\t};\n}\n\nexport function trackToolCall(state: RestorationTrackerState, event: MinimalToolCallEvent): void {\n\tswitch (event.toolName) {\n\t\tcase \"read\":\n\t\t\ttrackPathInput(state, event.input, \"read\");\n\t\t\treturn;\n\t\tcase \"write\":\n\t\t\ttrackPathInput(state, event.input, \"write\");\n\t\t\treturn;\n\t\tcase \"edit\":\n\t\t\ttrackPathInput(state, event.input, \"edit\");\n\t\t\treturn;\n\t\tcase \"apply_patch\":\n\t\t\ttrackApplyPatchInput(state, event.input);\n\t\t\treturn;\n\t\tcase \"skill\":\n\t\tcase \"load_skill\":\n\t\t\ttrackSkillInput(state, event.input);\n\t\t\treturn;\n\t}\n}\n\nexport function preparePendingPayload(state: RestorationTrackerState, options: PreparePendingPayloadOptions): void {\n\tif (!options.accepted) return;\n\n\tconst budgetTokens = computeRestorationBudget(options);\n\tif (budgetTokens <= 0) {\n\t\tstate.pendingPayload = null;\n\t\treturn;\n\t}\n\n\tfilterAgainstKeptMessages(state, options.keptMessages ?? []);\n\tconst selectedItems = selectRestorationItems(state, options.settings, budgetTokens);\n\tif (selectedItems.length === 0) {\n\t\tstate.pendingPayload = null;\n\t\treturn;\n\t}\n\n\tconst content = buildRestorationContent(options, selectedItems);\n\tstate.pendingPayload = {\n\t\tcustomType: POST_COMPACT_RESTORATION_CUSTOM_TYPE,\n\t\tcontent,\n\t\tdisplay: false,\n\t\tdetails: {\n\t\t\tschema: POST_COMPACT_RESTORATION_SCHEMA,\n\t\t\tbudgetTokens,\n\t\t\tcompactionEntryId: options.compactionEntryId,\n\t\t\treason: options.reason,\n\t\t\titems: selectedItems,\n\t\t},\n\t\tbudgetTokens,\n\t};\n}\n\nexport function consumePendingPayload(\n\tstate: RestorationTrackerState,\n): BeforeAgentStartEventResult[\"message\"] | undefined {\n\tconst payload = state.pendingPayload;\n\tstate.pendingPayload = null;\n\tif (!payload) return undefined;\n\tfor (const item of payload.details.items) {\n\t\tstate.restoredLabels.add(item.label);\n\t}\n\treturn {\n\t\tcustomType: payload.customType,\n\t\tcontent: payload.content,\n\t\tdisplay: payload.display,\n\t\tdetails: payload.details,\n\t};\n}\n\nexport function computeRestorationBudget(options: PreparePendingPayloadOptions): number {\n\tconst settings = resolveSettings(options.settings);\n\tconst contextWindow = Math.max(0, options.contextWindow);\n\tconst configuredBudget = settings.restorationMaxTotalTokens;\n\tconst contextRatioBudget = Math.floor(contextWindow * settings.restorationContextRatio);\n\tconst usageTokens = Math.max(0, options.usageTokens ?? 0);\n\tconst remainingBudget = Math.max(0, contextWindow - usageTokens - options.reserveTokens);\n\treturn Math.floor(Math.min(configuredBudget, contextRatioBudget, remainingBudget));\n}\n\nfunction trackPathInput(\n\tstate: RestorationTrackerState,\n\tinput: Record<string, unknown>,\n\toperation: FileOperation,\n): void {\n\tif (typeof input.path !== \"string\" || input.path.length === 0) return;\n\ttrackFile(state, input.path, operation);\n}\n\nfunction trackApplyPatchInput(state: RestorationTrackerState, input: Record<string, unknown>): void {\n\tif (typeof input.input !== \"string\") return;\n\tfor (const path of extractPatchedPaths(input.input)) {\n\t\tif (path.length > 0) trackFile(state, path, \"edit\");\n\t}\n}\n\nfunction trackSkillInput(state: RestorationTrackerState, input: Record<string, unknown>): void {\n\tconst skillName = typeof input.name === \"string\" ? input.name : input.skillName;\n\tif (typeof skillName === \"string\" && skillName.length > 0) {\n\t\tsetItem(state, {\n\t\t\tcontent: skillName,\n\t\t\tlabel: skillName,\n\t\t\tpriority: 80,\n\t\t\ttokens: estimateTextTokens(skillName),\n\t\t\ttype: \"skill\",\n\t\t});\n\t}\n}\n\nfunction trackFile(state: RestorationTrackerState, path: string, operation: FileOperation): void {\n\tconst label = path;\n\tconst existing = state.items.get(label);\n\tconst operations = new Set<FileOperation>(parseFileOperations(existing?.content));\n\toperations.add(operation);\n\tconst content = `${path} (${sortOperations(operations).join(\", \")})`;\n\tsetItem(state, {\n\t\tcontent,\n\t\tlabel,\n\t\tpriority: operation === \"read\" && operations.size === 1 ? 50 : 100,\n\t\ttokens: estimateTextTokens(content),\n\t\ttype: \"file\",\n\t});\n}\n\nfunction setItem(state: RestorationTrackerState, item: RestorationItem): void {\n\tstate.items.set(item.label, item);\n}\n\nfunction selectRestorationItems(\n\tstate: RestorationTrackerState,\n\tsettingsInput: RestorationSettings | undefined,\n\tbudgetTokens: number,\n): RestorationItem[] {\n\tconst settings = resolveSettings(settingsInput);\n\tconst candidates = Array.from(state.items.values())\n\t\t.filter((item) => !state.restoredLabels.has(item.label))\n\t\t.map((item) => truncateRestorationItem(item, settings.restorationMaxTokensPerItem))\n\t\t.sort((left, right) => {\n\t\t\tif (left.priority !== right.priority) return right.priority - left.priority;\n\t\t\tif (left.tokens !== right.tokens) return left.tokens - right.tokens;\n\t\t\treturn left.label.localeCompare(right.label);\n\t\t});\n\n\tconst selected: RestorationItem[] = [];\n\tlet totalTokens = 0;\n\tfor (const item of candidates) {\n\t\tif (selected.length >= settings.restorationMaxItems) break;\n\t\tif (totalTokens + item.tokens > budgetTokens) continue;\n\t\tselected.push(item);\n\t\ttotalTokens += item.tokens;\n\t}\n\treturn selected;\n}\n\nfunction buildRestorationContent(options: PreparePendingPayloadOptions, items: RestorationItem[]): string {\n\tconst files = items.filter((item) => item.type === \"file\");\n\tconst skills = items.filter((item) => item.type === \"skill\");\n\tconst lines = [\n\t\t\"[Restored context after compaction — files and skills from before compaction]\",\n\t\t`reason: ${options.reason}`,\n\t\t`compactionEntryId: ${options.compactionEntryId}`,\n\t\t\"\",\n\t];\n\n\tif (files.length > 0) {\n\t\tlines.push(\"<restored-files>\");\n\t\tfor (const file of files) {\n\t\t\tlines.push(`<file label=\"${escapeXmlAttribute(file.label)}\">${file.content}</file>`);\n\t\t}\n\t\tlines.push(\"</restored-files>\");\n\t\tlines.push(\"\");\n\t}\n\n\tif (skills.length > 0) {\n\t\tlines.push(\"<restored-skills>\");\n\t\tfor (const skill of skills) {\n\t\t\tlines.push(`<skill label=\"${escapeXmlAttribute(skill.label)}\">${skill.content}</skill>`);\n\t\t}\n\t\tlines.push(\"</restored-skills>\");\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction truncateRestorationItem(item: RestorationItem, maxTokens: number): RestorationItem {\n\tif (item.tokens <= maxTokens) return item;\n\tconst truncationNotice = \"[... truncated]\";\n\tconst noticeTokens = estimateTextTokens(truncationNotice);\n\tconst targetTokens = Math.max(0, maxTokens - noticeTokens - 1);\n\tconst truncatedBody = truncateToTokenLimit(item.content, targetTokens);\n\tconst content = truncatedBody.length > 0 ? `${truncatedBody}\\n${truncationNotice}` : truncationNotice;\n\treturn { ...item, content, tokens: estimateTextTokens(content) };\n}\n\nfunction filterAgainstKeptMessages(state: RestorationTrackerState, keptMessages: AgentMessage[]): void {\n\tif (keptMessages.length === 0) return;\n\tconst keptText = keptMessages.map(extractMessageText).join(\"\\n\");\n\tfor (const label of state.items.keys()) {\n\t\tif (keptText.includes(label)) {\n\t\t\tstate.items.delete(label);\n\t\t}\n\t}\n}\n\nfunction extractMessageText(message: AgentMessage): string {\n\tif (\"content\" in message) {\n\t\tif (typeof message.content === \"string\") return message.content;\n\t\tif (Array.isArray(message.content)) {\n\t\t\treturn message.content\n\t\t\t\t.filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n\t\t\t\t.map((content) => content.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\t}\n\tif (\"summary\" in message) return message.summary;\n\tif (\"command\" in message) return `${message.command}\\n${message.output}`;\n\treturn \"\";\n}\n\nfunction truncateToTokenLimit(text: string, tokenLimit: number): string {\n\tif (tokenLimit <= 0 || text.length === 0) return \"\";\n\tif (estimateTextTokens(text) <= tokenLimit) return text;\n\n\tlet low = 0;\n\tlet high = text.length;\n\twhile (low < high) {\n\t\tconst mid = Math.ceil((low + high) / 2);\n\t\tconst candidate = text.slice(0, mid);\n\t\tif (estimateTextTokens(candidate) <= tokenLimit) {\n\t\t\tlow = mid;\n\t\t\tcontinue;\n\t\t}\n\t\thigh = mid - 1;\n\t}\n\treturn text.slice(0, low).trimEnd();\n}\n\nfunction resolveSettings(settings: RestorationSettings | undefined): Required<RestorationSettings> {\n\treturn {\n\t\trestorationMaxItems: normalizeNonNegativeInteger(settings?.restorationMaxItems, DEFAULT_RESTORATION_MAX_ITEMS),\n\t\trestorationMaxTokensPerItem: normalizeNonNegativeInteger(\n\t\t\tsettings?.restorationMaxTokensPerItem,\n\t\t\tDEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM,\n\t\t),\n\t\trestorationMaxTotalTokens: normalizeNonNegativeInteger(\n\t\t\tsettings?.restorationMaxTotalTokens,\n\t\t\tDEFAULT_RESTORATION_MAX_TOTAL_TOKENS,\n\t\t),\n\t\trestorationContextRatio: normalizeNonNegativeNumber(\n\t\t\tsettings?.restorationContextRatio,\n\t\t\tDEFAULT_RESTORATION_CONTEXT_RATIO,\n\t\t),\n\t};\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;\n}\n\nfunction normalizeNonNegativeNumber(value: number | undefined, fallback: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nfunction parseFileOperations(content: string | undefined): FileOperation[] {\n\tif (!content) return [];\n\tconst open = content.lastIndexOf(\"(\");\n\tconst close = content.lastIndexOf(\")\");\n\tif (open === -1 || close === -1 || close <= open) return [];\n\treturn content\n\t\t.slice(open + 1, close)\n\t\t.split(\",\")\n\t\t.map((operation) => operation.trim())\n\t\t.filter(\n\t\t\t(operation): operation is FileOperation =>\n\t\t\t\toperation === \"read\" || operation === \"write\" || operation === \"edit\",\n\t\t);\n}\n\nfunction sortOperations(operations: Set<FileOperation>): FileOperation[] {\n\tconst order: FileOperation[] = [\"read\", \"write\", \"edit\"];\n\treturn order.filter((operation) => operations.has(operation));\n}\n\nfunction estimateTextTokens(text: string): number {\n\treturn estimateTokens({ role: \"custom\", customType: \"restoration\", content: text, display: false, timestamp: 0 });\n}\n\nfunction escapeXmlAttribute(value: string): string {\n\treturn value.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"restoration-tracker.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/restoration-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,CAAC,MAAM,oCAAoC,GAAG,qCAAqC,CAAC;AAE1F,MAAM,+BAA+B,GAAG,8CAA8C,CAAC;AACvF,MAAM,6BAA6B,GAAG,EAAE,CAAC;AACzC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AACrD,MAAM,oCAAoC,GAAG,MAAM,CAAC;AACpD,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAwD/C,MAAM,UAAU,6BAA6B;IAC5C,OAAO;QACN,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,cAAc,EAAE,IAAI;KACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA8B,EAAE,KAA2B;IACxF,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,MAAM;YACV,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3C,OAAO;QACR,KAAK,OAAO;YACX,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,OAAO;QACR,KAAK,MAAM;YACV,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3C,OAAO;QACR,KAAK,aAAa;YACjB,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO;QACR,KAAK,OAAO,CAAC;QACb,KAAK,YAAY;YAChB,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO;IACT,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAA8B,EAAE,OAAqC;IAC1G,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO;IAE9B,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,OAAO;IACR,CAAC;IAED,yBAAyB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAChE,KAAK,CAAC,cAAc,GAAG;QACtB,UAAU,EAAE,oCAAoC;QAChD,OAAO;QACP,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACR,MAAM,EAAE,+BAA+B;YACvC,YAAY;YACZ,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,aAAa;SACpB;QACD,YAAY;KACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,KAA8B;IAE9B,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC;IACrC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO;QACN,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAqC;IAC7E,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,yBAAyB,CAAC;IAC5D,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,cAAc,CACtB,KAA8B,EAC9B,KAA8B,EAC9B,SAAwB;IAExB,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACtE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA8B,EAAE,KAA8B;IAC3F,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO;IAC5C,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,KAA8B,EAAE,KAA8B;IACtF,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAChF,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,KAAK,EAAE;YACd,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACrC,IAAI,EAAE,OAAO;SACb,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B,EAAE,IAAY,EAAE,SAAwB;IACxF,MAAM,KAAK,GAAG,IAAI,CAAC;IACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,cAAc,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACrE,OAAO,CAAC,KAAK,EAAE;QACd,OAAO;QACP,KAAK;QACL,QAAQ,EAAE,SAAS,KAAK,MAAM,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;QAClE,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC;QACnC,IAAI,EAAE,MAAM;KACZ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,KAA8B,EAAE,IAAqB;IACrE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,sBAAsB,CAC9B,KAA8B,EAC9B,aAA8C,EAC9C,YAAoB;IAEpB,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SACjD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAAC;SAClF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5E,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,mBAAmB;YAAE,MAAM;QAC3D,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY;YAAE,SAAS;QACvD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAqC,EAAE,KAAwB;IAC/F,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG;QACb,+EAA+E;QAC/E,WAAW,OAAO,CAAC,MAAM,EAAE;QAC3B,sBAAsB,OAAO,CAAC,iBAAiB,EAAE;QACjD,EAAE;KACF,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAqB,EAAE,SAAiB;IACxE,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC3C,MAAM,YAAY,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,KAAK,gBAAgB,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACtG,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA8B,EAAE,YAA4B;IAC9F,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAqB;IAChD,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC;QAChE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,OAAO;iBACpB,MAAM,CAAC,CAAC,OAAO,EAA6C,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;iBACvF,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;iBAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;IACF,CAAC;IACD,IAAI,SAAS,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IACjD,IAAI,SAAS,IAAI,OAAO;QAAE,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;IACzE,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,UAAkB;IAC7D,IAAI,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAExD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,kBAAkB,CAAC,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;YACjD,GAAG,GAAG,GAAG,CAAC;YACV,SAAS;QACV,CAAC;QACD,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,QAAyC;IACjE,OAAO;QACN,mBAAmB,EAAE,2BAA2B,CAAC,QAAQ,EAAE,mBAAmB,EAAE,6BAA6B,CAAC;QAC9G,2BAA2B,EAAE,2BAA2B,CACvD,QAAQ,EAAE,2BAA2B,EACrC,uCAAuC,CACvC;QACD,yBAAyB,EAAE,2BAA2B,CACrD,QAAQ,EAAE,yBAAyB,EACnC,oCAAoC,CACpC;QACD,uBAAuB,EAAE,0BAA0B,CAClD,QAAQ,EAAE,uBAAuB,EACjC,iCAAiC,CACjC;KACD,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAyB,EAAE,QAAgB;IAC/E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzG,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAyB,EAAE,QAAgB;IAC9E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7F,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA2B;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5D,OAAO,OAAO;SACZ,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;SACpC,MAAM,CACN,CAAC,SAAS,EAA8B,EAAE,CACzC,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,UAA8B;IACrD,MAAM,KAAK,GAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;AACnH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACzG,CAAC","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { estimateTokens } from \"../../../compaction/index.ts\";\nimport type { BeforeAgentStartEventResult, CompactionReason } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\n\nexport const POST_COMPACT_RESTORATION_CUSTOM_TYPE = \"compaction.post-compact-restoration\";\n\nconst POST_COMPACT_RESTORATION_SCHEMA = \"senpi.compaction.post-compact-restoration.v1\";\nconst DEFAULT_RESTORATION_MAX_ITEMS = 10;\nconst DEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM = 5000;\nconst DEFAULT_RESTORATION_MAX_TOTAL_TOKENS = 50_000;\nconst DEFAULT_RESTORATION_CONTEXT_RATIO = 0.15;\n\ntype RestorationItemType = \"file\" | \"skill\";\ntype FileOperation = \"read\" | \"write\" | \"edit\";\n\nexport interface RestorationSettings {\n\trestorationMaxItems?: number;\n\trestorationMaxTokensPerItem?: number;\n\trestorationMaxTotalTokens?: number;\n\trestorationContextRatio?: number;\n}\n\nexport interface MinimalToolCallEvent {\n\ttoolName: string;\n\tinput: Record<string, unknown>;\n}\n\nexport interface RestorationItem {\n\tcontent: string;\n\tlabel: string;\n\tpriority: number;\n\ttokens: number;\n\ttype: RestorationItemType;\n}\n\nexport interface PendingRestorationPayload {\n\tcustomType: typeof POST_COMPACT_RESTORATION_CUSTOM_TYPE;\n\tcontent: string;\n\tdisplay: false;\n\tdetails: {\n\t\tschema: typeof POST_COMPACT_RESTORATION_SCHEMA;\n\t\tbudgetTokens: number;\n\t\tcompactionEntryId: string;\n\t\treason: CompactionReason;\n\t\titems: RestorationItem[];\n\t};\n\tbudgetTokens: number;\n}\n\nexport interface PreparePendingPayloadOptions {\n\taccepted: boolean;\n\treason: CompactionReason;\n\tcompactionEntryId: string;\n\tcontextWindow: number;\n\tusageTokens: number | null;\n\treserveTokens: number;\n\tsettings?: RestorationSettings;\n\tkeptMessages?: AgentMessage[];\n}\n\nexport interface RestorationTrackerState {\n\titems: Map<string, RestorationItem>;\n\trestoredLabels: Set<string>;\n\tpendingPayload: PendingRestorationPayload | null;\n}\n\nexport function createRestorationTrackerState(): RestorationTrackerState {\n\treturn {\n\t\titems: new Map(),\n\t\trestoredLabels: new Set(),\n\t\tpendingPayload: null,\n\t};\n}\n\nexport function trackToolCall(state: RestorationTrackerState, event: MinimalToolCallEvent): void {\n\tswitch (event.toolName) {\n\t\tcase \"read\":\n\t\t\ttrackPathInput(state, event.input, \"read\");\n\t\t\treturn;\n\t\tcase \"write\":\n\t\t\ttrackPathInput(state, event.input, \"write\");\n\t\t\treturn;\n\t\tcase \"edit\":\n\t\t\ttrackPathInput(state, event.input, \"edit\");\n\t\t\treturn;\n\t\tcase \"apply_patch\":\n\t\t\ttrackApplyPatchInput(state, event.input);\n\t\t\treturn;\n\t\tcase \"skill\":\n\t\tcase \"load_skill\":\n\t\t\ttrackSkillInput(state, event.input);\n\t\t\treturn;\n\t}\n}\n\nexport function preparePendingPayload(state: RestorationTrackerState, options: PreparePendingPayloadOptions): void {\n\tif (!options.accepted) return;\n\n\tconst budgetTokens = computeRestorationBudget(options);\n\tif (budgetTokens <= 0) {\n\t\tstate.pendingPayload = null;\n\t\treturn;\n\t}\n\n\tfilterAgainstKeptMessages(state, options.keptMessages ?? []);\n\tconst selectedItems = selectRestorationItems(state, options.settings, budgetTokens);\n\tif (selectedItems.length === 0) {\n\t\tstate.pendingPayload = null;\n\t\treturn;\n\t}\n\n\tconst content = buildRestorationContent(options, selectedItems);\n\tstate.pendingPayload = {\n\t\tcustomType: POST_COMPACT_RESTORATION_CUSTOM_TYPE,\n\t\tcontent,\n\t\tdisplay: false,\n\t\tdetails: {\n\t\t\tschema: POST_COMPACT_RESTORATION_SCHEMA,\n\t\t\tbudgetTokens,\n\t\t\tcompactionEntryId: options.compactionEntryId,\n\t\t\treason: options.reason,\n\t\t\titems: selectedItems,\n\t\t},\n\t\tbudgetTokens,\n\t};\n}\n\nexport function consumePendingPayload(\n\tstate: RestorationTrackerState,\n): BeforeAgentStartEventResult[\"message\"] | undefined {\n\tconst payload = state.pendingPayload;\n\tstate.pendingPayload = null;\n\tif (!payload) return undefined;\n\tfor (const item of payload.details.items) {\n\t\tstate.restoredLabels.add(item.label);\n\t}\n\treturn {\n\t\tcustomType: payload.customType,\n\t\tcontent: payload.content,\n\t\tdisplay: payload.display,\n\t\tdetails: payload.details,\n\t};\n}\n\nexport function computeRestorationBudget(options: PreparePendingPayloadOptions): number {\n\tconst settings = resolveSettings(options.settings);\n\tconst contextWindow = Math.max(0, options.contextWindow);\n\tconst configuredBudget = settings.restorationMaxTotalTokens;\n\tconst contextRatioBudget = Math.floor(contextWindow * settings.restorationContextRatio);\n\tconst usageTokens = Math.max(0, options.usageTokens ?? 0);\n\tconst remainingBudget = Math.max(0, contextWindow - usageTokens - options.reserveTokens);\n\treturn Math.floor(Math.min(configuredBudget, contextRatioBudget, remainingBudget));\n}\n\nfunction trackPathInput(\n\tstate: RestorationTrackerState,\n\tinput: Record<string, unknown>,\n\toperation: FileOperation,\n): void {\n\tif (typeof input.path !== \"string\" || input.path.length === 0) return;\n\ttrackFile(state, input.path, operation);\n}\n\nfunction trackApplyPatchInput(state: RestorationTrackerState, input: Record<string, unknown>): void {\n\tif (typeof input.input !== \"string\") return;\n\tfor (const path of extractPatchedPaths(input.input)) {\n\t\tif (path.length > 0) trackFile(state, path, \"edit\");\n\t}\n}\n\nfunction trackSkillInput(state: RestorationTrackerState, input: Record<string, unknown>): void {\n\tconst skillName = typeof input.name === \"string\" ? input.name : input.skillName;\n\tif (typeof skillName === \"string\" && skillName.length > 0) {\n\t\tsetItem(state, {\n\t\t\tcontent: skillName,\n\t\t\tlabel: skillName,\n\t\t\tpriority: 80,\n\t\t\ttokens: estimateTextTokens(skillName),\n\t\t\ttype: \"skill\",\n\t\t});\n\t}\n}\n\nfunction trackFile(state: RestorationTrackerState, path: string, operation: FileOperation): void {\n\tconst label = path;\n\tconst existing = state.items.get(label);\n\tconst operations = new Set<FileOperation>(parseFileOperations(existing?.content));\n\toperations.add(operation);\n\tconst content = `${path} (${sortOperations(operations).join(\", \")})`;\n\tsetItem(state, {\n\t\tcontent,\n\t\tlabel,\n\t\tpriority: operation === \"read\" && operations.size === 1 ? 50 : 100,\n\t\ttokens: estimateTextTokens(content),\n\t\ttype: \"file\",\n\t});\n}\n\nfunction setItem(state: RestorationTrackerState, item: RestorationItem): void {\n\tstate.items.set(item.label, item);\n}\n\nfunction selectRestorationItems(\n\tstate: RestorationTrackerState,\n\tsettingsInput: RestorationSettings | undefined,\n\tbudgetTokens: number,\n): RestorationItem[] {\n\tconst settings = resolveSettings(settingsInput);\n\tconst candidates = Array.from(state.items.values())\n\t\t.filter((item) => !state.restoredLabels.has(item.label))\n\t\t.map((item) => truncateRestorationItem(item, settings.restorationMaxTokensPerItem))\n\t\t.sort((left, right) => {\n\t\t\tif (left.priority !== right.priority) return right.priority - left.priority;\n\t\t\tif (left.tokens !== right.tokens) return left.tokens - right.tokens;\n\t\t\treturn left.label.localeCompare(right.label);\n\t\t});\n\n\tconst selected: RestorationItem[] = [];\n\tlet totalTokens = 0;\n\tfor (const item of candidates) {\n\t\tif (selected.length >= settings.restorationMaxItems) break;\n\t\tif (totalTokens + item.tokens > budgetTokens) continue;\n\t\tselected.push(item);\n\t\ttotalTokens += item.tokens;\n\t}\n\treturn selected;\n}\n\nfunction buildRestorationContent(options: PreparePendingPayloadOptions, items: RestorationItem[]): string {\n\tconst files = items.filter((item) => item.type === \"file\");\n\tconst skills = items.filter((item) => item.type === \"skill\");\n\tconst lines = [\n\t\t\"[Restored context after compaction — files and skills from before compaction]\",\n\t\t`reason: ${options.reason}`,\n\t\t`compactionEntryId: ${options.compactionEntryId}`,\n\t\t\"\",\n\t];\n\n\tif (files.length > 0) {\n\t\tlines.push(\"<restored-files>\");\n\t\tfor (const file of files) {\n\t\t\tlines.push(`<file label=\"${escapeXmlAttribute(file.label)}\">${file.content}</file>`);\n\t\t}\n\t\tlines.push(\"</restored-files>\");\n\t\tlines.push(\"\");\n\t}\n\n\tif (skills.length > 0) {\n\t\tlines.push(\"<restored-skills>\");\n\t\tfor (const skill of skills) {\n\t\t\tlines.push(`<skill label=\"${escapeXmlAttribute(skill.label)}\">${skill.content}</skill>`);\n\t\t}\n\t\tlines.push(\"</restored-skills>\");\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction truncateRestorationItem(item: RestorationItem, maxTokens: number): RestorationItem {\n\tif (item.tokens <= maxTokens) return item;\n\tconst truncationNotice = \"[... truncated]\";\n\tconst noticeTokens = estimateTextTokens(truncationNotice);\n\tconst targetTokens = Math.max(0, maxTokens - noticeTokens - 1);\n\tconst truncatedBody = truncateToTokenLimit(item.content, targetTokens);\n\tconst content = truncatedBody.length > 0 ? `${truncatedBody}\\n${truncationNotice}` : truncationNotice;\n\treturn { ...item, content, tokens: estimateTextTokens(content) };\n}\n\nfunction filterAgainstKeptMessages(state: RestorationTrackerState, keptMessages: AgentMessage[]): void {\n\tif (keptMessages.length === 0) return;\n\tconst keptText = keptMessages.map(extractMessageText).join(\"\\n\");\n\tfor (const label of state.items.keys()) {\n\t\tif (keptText.includes(label)) {\n\t\t\tstate.items.delete(label);\n\t\t}\n\t}\n}\n\nfunction extractMessageText(message: AgentMessage): string {\n\tif (\"content\" in message) {\n\t\tif (typeof message.content === \"string\") return message.content;\n\t\tif (Array.isArray(message.content)) {\n\t\t\treturn message.content\n\t\t\t\t.filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n\t\t\t\t.map((content) => content.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\t}\n\tif (\"summary\" in message) return message.summary;\n\tif (\"command\" in message) return `${message.command}\\n${message.output}`;\n\treturn \"\";\n}\n\nfunction truncateToTokenLimit(text: string, tokenLimit: number): string {\n\tif (tokenLimit <= 0 || text.length === 0) return \"\";\n\tif (estimateTextTokens(text) <= tokenLimit) return text;\n\n\tlet low = 0;\n\tlet high = text.length;\n\twhile (low < high) {\n\t\tconst mid = Math.ceil((low + high) / 2);\n\t\tconst candidate = text.slice(0, mid);\n\t\tif (estimateTextTokens(candidate) <= tokenLimit) {\n\t\t\tlow = mid;\n\t\t\tcontinue;\n\t\t}\n\t\thigh = mid - 1;\n\t}\n\treturn text.slice(0, low).trimEnd();\n}\n\nfunction resolveSettings(settings: RestorationSettings | undefined): Required<RestorationSettings> {\n\treturn {\n\t\trestorationMaxItems: normalizeNonNegativeInteger(settings?.restorationMaxItems, DEFAULT_RESTORATION_MAX_ITEMS),\n\t\trestorationMaxTokensPerItem: normalizeNonNegativeInteger(\n\t\t\tsettings?.restorationMaxTokensPerItem,\n\t\t\tDEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM,\n\t\t),\n\t\trestorationMaxTotalTokens: normalizeNonNegativeInteger(\n\t\t\tsettings?.restorationMaxTotalTokens,\n\t\t\tDEFAULT_RESTORATION_MAX_TOTAL_TOKENS,\n\t\t),\n\t\trestorationContextRatio: normalizeNonNegativeNumber(\n\t\t\tsettings?.restorationContextRatio,\n\t\t\tDEFAULT_RESTORATION_CONTEXT_RATIO,\n\t\t),\n\t};\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;\n}\n\nfunction normalizeNonNegativeNumber(value: number | undefined, fallback: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nfunction parseFileOperations(content: string | undefined): FileOperation[] {\n\tif (!content) return [];\n\tconst open = content.lastIndexOf(\"(\");\n\tconst close = content.lastIndexOf(\")\");\n\tif (open === -1 || close === -1 || close <= open) return [];\n\treturn content\n\t\t.slice(open + 1, close)\n\t\t.split(\",\")\n\t\t.map((operation) => operation.trim())\n\t\t.filter(\n\t\t\t(operation): operation is FileOperation =>\n\t\t\t\toperation === \"read\" || operation === \"write\" || operation === \"edit\",\n\t\t);\n}\n\nfunction sortOperations(operations: Set<FileOperation>): FileOperation[] {\n\tconst order: FileOperation[] = [\"read\", \"write\", \"edit\"];\n\treturn order.filter((operation) => operations.has(operation));\n}\n\nfunction estimateTextTokens(text: string): number {\n\treturn estimateTokens({ role: \"custom\", customType: \"restoration\", content: text, display: false, timestamp: 0 });\n}\n\nfunction escapeXmlAttribute(value: string): string {\n\treturn value.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speculative.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AssistantMessage,\n\tisContextOverflow,\n\ttype Message,\n\ttype Model,\n\tstream,\n\ttype TextContent,\n} from \"@earendil-works/pi-ai\";\nimport {\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tDEFAULT_COMPACTION_SETTINGS,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n\tserializeConversation,\n} from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { ModelRegistry } from \"../../../model-registry.ts\";\nimport type { ReadonlySessionManager } from \"../../../session-manager.ts\";\nimport type { ApplyCompactionResult, ContextUsage } from \"../../types.ts\";\nimport { computeEffectiveKeepRecentTokens, computeEffectiveThreshold } from \"./policy.ts\";\nimport { buildPrompt, type MergedCompactionPromptVariant } from \"./prompts.ts\";\nimport * as truncation from \"./tool-truncation.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst COMPACTION_BUDGET_RATIO = 0.6;\nconst EMERGENCY_CONTEXT_TARGET_RATIO = 0.95;\nconst MAX_SUMMARY_TOKENS = 8192;\nconst SUMMARY_SCHEMA = \"senpi.compaction.summary.v1\";\ntype CompactionProgressCallback = (delta: string) => void;\n\nexport interface SpeculativeCompactionContext {\n\tmodel: Model<any> | undefined;\n\tsessionManager: ReadonlySessionManager;\n\tmodelRegistry?: ModelRegistry;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetCompactionSettings?(): CompactionPreparation[\"settings\"];\n\tgetMessageRevision(): number;\n\tapplyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: { reason: \"extension\"; expectedRevision: number },\n\t): Promise<ApplyCompactionResult>;\n}\n\nexport interface SpeculativeCompactionSnapshot {\n\tgeneration: number;\n\texpectedRevision: number;\n\tmodel: Model<any>;\n\tcontextWindow: number;\n\tpreparation: CompactionPreparation;\n\tpromptVariant: MergedCompactionPromptVariant;\n\tcustomInstructions?: string;\n}\n\nexport type SpeculativeCompactionResult = ApplyCompactionResult | { applied: false; reason: \"unavailable\" };\n\nexport type ExtensionCompactionRequest = {\n\tcustomInstructions?: string;\n\tgeneration: number;\n\tsignal?: AbortSignal;\n};\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction getSummaryText(message: Message): string {\n\tconst content = Array.isArray(message.content)\n\t\t? message.content\n\t\t: [{ type: \"text\" as const, text: message.content }];\n\treturn content\n\t\t.filter((content): content is TextContent => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isAssistantMessage(message: Message): message is AssistantMessage {\n\treturn message.role === \"assistant\" && \"stopReason\" in message;\n}\n\nasync function generateSummaryMessage(options: {\n\tmessages: AgentMessage[];\n\tonProgress?: CompactionProgressCallback;\n\tprompt: ReturnType<typeof buildPrompt>;\n\tsignal?: AbortSignal;\n\tsnapshot: SpeculativeCompactionSnapshot;\n\tauth: {\n\t\tapiKey: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t};\n}): Promise<Message | undefined> {\n\tconst conversationText = serializeConversation(convertToLlm(options.messages));\n\tconst responseStream = stream(\n\t\toptions.snapshot.model,\n\t\t{\n\t\t\tsystemPrompt: options.prompt.system,\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `${options.prompt.user}\\n\\n<conversation>\\n${conversationText}\\n</conversation>`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tapiKey: options.auth.apiKey,\n\t\t\theaders: options.auth.headers,\n\t\t\textraBody: options.auth.extraBody,\n\t\t\tmaxTokens: MAX_SUMMARY_TOKENS,\n\t\t\tsignal: options.signal,\n\t\t},\n\t);\n\tfor await (const event of responseStream) {\n\t\tif (event.type === \"text_delta\" && event.delta) {\n\t\t\toptions.onProgress?.(event.delta);\n\t\t}\n\t}\n\treturn await responseStream.result();\n}\n\nfunction pruneToolResults(messages: AgentMessage[], contextWindow: number): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst prunedResults = truncation.prePruneToolOutputsToBudget(toolResults, contextWindow * COMPACTION_BUDGET_RATIO);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst pruned = prunedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn pruned ? { ...message, content: pruned.content } : message;\n\t});\n}\n\nexport function truncateContextMessages(messages: AgentMessage[]): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst truncatedResults = truncation.truncateOversizedToolResults(toolResults);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst truncated = truncatedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn truncated ? { ...message, content: truncated.content } : message;\n\t});\n}\n\nfunction getToolCallIds(message: AgentMessage): Set<string> {\n\tconst ids = new Set<string>();\n\tif (message.role !== \"assistant\") return ids;\n\tfor (const block of message.content) {\n\t\tif (block.type === \"toolCall\") ids.add(block.id);\n\t}\n\treturn ids;\n}\n\nfunction findLastUserLikeIndex(messages: AgentMessage[]): number {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst role = messages[index]?.role;\n\t\tif (role === \"user\" || role === \"bashExecution\") return index;\n\t}\n\treturn messages.length;\n}\n\nfunction removeAssistantToolPair(messages: AgentMessage[], assistantIndex: number): AgentMessage[] {\n\tconst ids = getToolCallIds(messages[assistantIndex]);\n\treturn messages.filter((message, index) => {\n\t\tif (index === assistantIndex) return false;\n\t\treturn message.role !== \"toolResult\" || !ids.has(message.toolCallId);\n\t});\n}\n\nfunction removeFirstOldToolPair(messages: AgentMessage[], boundaryIndex: number): AgentMessage[] | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\tif (message.role === \"toolResult\") return messages.filter((_message, candidateIndex) => candidateIndex !== index);\n\t}\n\treturn undefined;\n}\n\nfunction removeFirstOldMessage(messages: AgentMessage[], boundaryIndex: number): AgentMessage[] | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role === \"toolResult\") continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\treturn messages.filter((_candidate, candidateIndex) => candidateIndex !== index);\n\t}\n\treturn undefined;\n}\n\nfunction pruneOldMessagesToBudget(messages: AgentMessage[], targetTokens: number): AgentMessage[] {\n\tlet pruned = messages;\n\twhile (estimateTotalTokens(pruned) > targetTokens) {\n\t\tconst boundaryIndex = findLastUserLikeIndex(pruned);\n\t\tconst next = removeFirstOldToolPair(pruned, boundaryIndex) ?? removeFirstOldMessage(pruned, boundaryIndex);\n\t\tif (!next || next.length === pruned.length) break;\n\t\tpruned = next;\n\t}\n\treturn pruned;\n}\n\nfunction removeOldestHistoryItemForOverflowRetry(messages: AgentMessage[]): AgentMessage[] | undefined {\n\tif (messages.length <= 1) return undefined;\n\tconst boundaryIndex = findLastUserLikeIndex(messages);\n\treturn (\n\t\tremoveFirstOldToolPair(messages, boundaryIndex) ??\n\t\tremoveFirstOldMessage(messages, boundaryIndex) ??\n\t\t(messages.length > 1 ? messages.slice(1) : undefined)\n\t);\n}\n\nfunction estimateTotalTokens(messages: AgentMessage[]): number {\n\tlet total = 0;\n\tfor (const message of messages) total += estimateTokens(message);\n\treturn total;\n}\n\nexport function hardLimitEmergencyPrune(\n\tmessages: AgentMessage[],\n\tcontextWindow: number,\n): {\n\tmessages: AgentMessage[];\n\tneedsAggressiveCompaction: boolean;\n} {\n\tconst targetTokens = Math.floor(contextWindow * EMERGENCY_CONTEXT_TARGET_RATIO);\n\tconst noLlmPruned = truncateContextMessages(pruneToolResults(messages, contextWindow));\n\tif (estimateTotalTokens(noLlmPruned) <= targetTokens) {\n\t\treturn { messages: noLlmPruned, needsAggressiveCompaction: false };\n\t}\n\treturn {\n\t\tmessages: pruneOldMessagesToBudget(noLlmPruned, targetTokens),\n\t\tneedsAggressiveCompaction: true,\n\t};\n}\n\nexport function getPromptVariant(options: {\n\treason: string;\n\tpreparation: { previousSummary?: string; isSplitTurn: boolean };\n}): MergedCompactionPromptVariant {\n\tif (options.reason === \"branch\") return \"branch\";\n\tif (options.preparation.previousSummary) return \"update\";\n\tif (options.preparation.isSplitTurn) return \"turn_prefix\";\n\treturn \"default\";\n}\n\nexport function createSpeculativeCompactionSnapshot(\n\tcontext: SpeculativeCompactionContext,\n\toptions: { customInstructions?: string; generation: number },\n): SpeculativeCompactionSnapshot | undefined {\n\tconst model = context.model;\n\tif (!model) return undefined;\n\n\tconst expectedRevision = context.getMessageRevision();\n\tconst branchEntries = context.sessionManager.getBranch();\n\tconst contextWindow = context.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\tconst settings = context.getCompactionSettings?.() ?? DEFAULT_COMPACTION_SETTINGS;\n\tconst thresholdRatio = computeEffectiveThreshold(contextWindow);\n\tconst preparation = prepareCompaction(branchEntries, {\n\t\t...settings,\n\t\tkeepRecentTokens: computeEffectiveKeepRecentTokens(settings.keepRecentTokens, contextWindow, thresholdRatio),\n\t});\n\tif (!preparation) return undefined;\n\n\treturn {\n\t\tgeneration: options.generation,\n\t\texpectedRevision,\n\t\tmodel,\n\t\tcontextWindow,\n\t\tpreparation,\n\t\tpromptVariant: getPromptVariant({ reason: \"extension\", preparation }),\n\t\tcustomInstructions: options.customInstructions,\n\t};\n}\n\nexport async function runExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tsignal?: AbortSignal,\n\tonProgress?: CompactionProgressCallback,\n): Promise<CompactionResult | undefined> {\n\tconst auth = await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);\n\tif (!auth?.ok || !auth.apiKey) return undefined;\n\n\tlet messages = pruneToolResults(\n\t\t[...snapshot.preparation.messagesToSummarize, ...snapshot.preparation.turnPrefixMessages],\n\t\tsnapshot.contextWindow,\n\t);\n\tconst prompt = buildPrompt({\n\t\tvariant: snapshot.promptVariant,\n\t\tpreviousSummary: snapshot.preparation.previousSummary,\n\t\tcustomInstructions: snapshot.customInstructions,\n\t});\n\n\twhile (true) {\n\t\tconst response = await generateSummaryMessage({\n\t\t\tmessages,\n\t\t\tonProgress,\n\t\t\tprompt,\n\t\t\tsignal,\n\t\t\tsnapshot,\n\t\t\tauth: {\n\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\theaders: auth.headers,\n\t\t\t\textraBody: auth.extraBody,\n\t\t\t},\n\t\t});\n\t\tif (!response) return undefined;\n\n\t\tif (isAssistantMessage(response) && isContextOverflow(response, snapshot.contextWindow)) {\n\t\t\tconst retryMessages = removeOldestHistoryItemForOverflowRetry(messages);\n\t\t\tif (!retryMessages || retryMessages.length === messages.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmessages = retryMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst summary = getSummaryText(response);\n\t\tif (!summary) return undefined;\n\n\t\tconst tokenEstimate = estimateContextTokens(convertToLlm(messages)).tokens + approxTokens(summary);\n\t\tif (tokenEstimate > snapshot.contextWindow * COMPACTION_BUDGET_RATIO) return undefined;\n\n\t\treturn {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId: snapshot.preparation.firstKeptEntryId,\n\t\t\ttokensBefore: snapshot.preparation.tokensBefore,\n\t\t\tdetails: { schema: SUMMARY_SCHEMA, promptVariant: snapshot.promptVariant, tokenEstimate },\n\t\t};\n\t}\n\n\tthrow new Error(\"Compaction summary request exceeded the context window after retrying with a smaller input\");\n}\n\nexport async function applyGeneratedCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tcompaction: CompactionResult | undefined,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot || !compaction) return { applied: false, reason: \"unavailable\" };\n\n\tif (snapshot.generation !== getCurrentGeneration() || snapshot.expectedRevision !== context.getMessageRevision()) {\n\t\treturn { applied: false, reason: \"stale\" };\n\t}\n\n\treturn await context.applyCompaction(compaction, {\n\t\treason: \"extension\",\n\t\texpectedRevision: snapshot.expectedRevision,\n\t});\n}\n\nexport function snapshotExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\trequest: ExtensionCompactionRequest,\n): SpeculativeCompactionSnapshot | undefined {\n\treturn createSpeculativeCompactionSnapshot(context, request);\n}\n\nexport async function applySpeculativeCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tgenerate: () => Promise<CompactionResult | undefined>,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot) return { applied: false, reason: \"unavailable\" };\n\n\tconst compaction = await generate();\n\treturn await applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"speculative.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speculative.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AssistantMessage,\n\tisContextOverflow,\n\ttype Message,\n\ttype Model,\n\tstream,\n\ttype TextContent,\n} from \"@earendil-works/pi-ai\";\nimport {\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tDEFAULT_COMPACTION_SETTINGS,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n\tserializeConversation,\n} from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { ModelRegistry } from \"../../../model-registry.ts\";\nimport type { ReadonlySessionManager } from \"../../../session-manager.ts\";\nimport type { ApplyCompactionResult, ContextUsage } from \"../../types.ts\";\nimport { computeEffectiveKeepRecentTokens, computeEffectiveThreshold } from \"./policy.ts\";\nimport { buildPrompt, type MergedCompactionPromptVariant } from \"./prompts.ts\";\nimport * as truncation from \"./tool-truncation.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst COMPACTION_BUDGET_RATIO = 0.6;\nconst EMERGENCY_CONTEXT_TARGET_RATIO = 0.95;\nconst MAX_SUMMARY_TOKENS = 8192;\nconst SUMMARY_SCHEMA = \"senpi.compaction.summary.v1\";\ntype CompactionProgressCallback = (delta: string) => void;\n\nexport interface SpeculativeCompactionContext {\n\tmodel: Model<any> | undefined;\n\tsessionManager: ReadonlySessionManager;\n\tmodelRegistry?: ModelRegistry;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetCompactionSettings?(): CompactionPreparation[\"settings\"];\n\tgetMessageRevision(): number;\n\tapplyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: { reason: \"extension\"; expectedRevision: number },\n\t): Promise<ApplyCompactionResult>;\n}\n\nexport interface SpeculativeCompactionSnapshot {\n\tgeneration: number;\n\texpectedRevision: number;\n\tmodel: Model<any>;\n\tcontextWindow: number;\n\tpreparation: CompactionPreparation;\n\tpromptVariant: MergedCompactionPromptVariant;\n\tcustomInstructions?: string;\n}\n\nexport type SpeculativeCompactionResult = ApplyCompactionResult | { applied: false; reason: \"unavailable\" };\n\nexport type ExtensionCompactionRequest = {\n\tcustomInstructions?: string;\n\tgeneration: number;\n\tsignal?: AbortSignal;\n};\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction getSummaryText(message: Message): string {\n\tconst content = Array.isArray(message.content)\n\t\t? message.content\n\t\t: [{ type: \"text\" as const, text: message.content }];\n\treturn content\n\t\t.filter((content): content is TextContent => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isAssistantMessage(message: Message): message is AssistantMessage {\n\treturn message.role === \"assistant\" && \"stopReason\" in message;\n}\n\nasync function generateSummaryMessage(options: {\n\tmessages: AgentMessage[];\n\tonProgress?: CompactionProgressCallback;\n\tprompt: ReturnType<typeof buildPrompt>;\n\tsignal?: AbortSignal;\n\tsnapshot: SpeculativeCompactionSnapshot;\n\tauth: {\n\t\tapiKey: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t};\n}): Promise<Message | undefined> {\n\tconst conversationText = serializeConversation(convertToLlm(options.messages));\n\tconst responseStream = stream(\n\t\toptions.snapshot.model,\n\t\t{\n\t\t\tsystemPrompt: options.prompt.system,\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `${options.prompt.user}\\n\\n<conversation>\\n${conversationText}\\n</conversation>`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tapiKey: options.auth.apiKey,\n\t\t\theaders: options.auth.headers,\n\t\t\textraBody: options.auth.extraBody,\n\t\t\tmaxTokens: MAX_SUMMARY_TOKENS,\n\t\t\tsignal: options.signal,\n\t\t},\n\t);\n\tfor await (const event of responseStream) {\n\t\tif (event.type === \"text_delta\" && event.delta) {\n\t\t\toptions.onProgress?.(event.delta);\n\t\t}\n\t}\n\treturn await responseStream.result();\n}\n\nfunction pruneToolResults(messages: AgentMessage[], contextWindow: number): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst prunedResults = truncation.prePruneToolOutputsToBudget(toolResults, contextWindow * COMPACTION_BUDGET_RATIO);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst pruned = prunedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn pruned ? { ...message, content: pruned.content } : message;\n\t});\n}\n\nexport function truncateContextMessages(messages: AgentMessage[]): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst truncatedResults = truncation.truncateOversizedToolResults(toolResults);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst truncated = truncatedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn truncated ? { ...message, content: truncated.content } : message;\n\t});\n}\n\nfunction getToolCallIds(message: AgentMessage): Set<string> {\n\tconst ids = new Set<string>();\n\tif (message.role !== \"assistant\") return ids;\n\tfor (const block of message.content) {\n\t\tif (block.type === \"toolCall\") ids.add(block.id);\n\t}\n\treturn ids;\n}\n\nfunction findLastUserLikeIndex(messages: AgentMessage[]): number {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst role = messages[index]?.role;\n\t\tif (role === \"user\" || role === \"bashExecution\") return index;\n\t}\n\treturn messages.length;\n}\n\nfunction removeAssistantToolPair(messages: AgentMessage[], assistantIndex: number): AgentMessage[] {\n\tconst ids = getToolCallIds(messages[assistantIndex]);\n\treturn messages.filter((message, index) => {\n\t\tif (index === assistantIndex) return false;\n\t\treturn message.role !== \"toolResult\" || !ids.has(message.toolCallId);\n\t});\n}\n\nfunction removeFirstOldToolPair(messages: AgentMessage[], boundaryIndex: number): AgentMessage[] | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\tif (message.role === \"toolResult\") return messages.filter((_message, candidateIndex) => candidateIndex !== index);\n\t}\n\treturn undefined;\n}\n\nfunction removeFirstOldMessage(messages: AgentMessage[], boundaryIndex: number): AgentMessage[] | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role === \"toolResult\") continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\treturn messages.filter((_candidate, candidateIndex) => candidateIndex !== index);\n\t}\n\treturn undefined;\n}\n\nfunction pruneOldMessagesToBudget(messages: AgentMessage[], targetTokens: number): AgentMessage[] {\n\tlet pruned = messages;\n\twhile (estimateTotalTokens(pruned) > targetTokens) {\n\t\tconst boundaryIndex = findLastUserLikeIndex(pruned);\n\t\tconst next = removeFirstOldToolPair(pruned, boundaryIndex) ?? removeFirstOldMessage(pruned, boundaryIndex);\n\t\tif (!next || next.length === pruned.length) break;\n\t\tpruned = next;\n\t}\n\treturn pruned;\n}\n\nfunction removeOldestHistoryItemForOverflowRetry(messages: AgentMessage[]): AgentMessage[] | undefined {\n\tif (messages.length <= 1) return undefined;\n\tconst boundaryIndex = findLastUserLikeIndex(messages);\n\treturn (\n\t\tremoveFirstOldToolPair(messages, boundaryIndex) ??\n\t\tremoveFirstOldMessage(messages, boundaryIndex) ??\n\t\t(messages.length > 1 ? messages.slice(1) : undefined)\n\t);\n}\n\nfunction estimateTotalTokens(messages: AgentMessage[]): number {\n\tlet total = 0;\n\tfor (const message of messages) total += estimateTokens(message);\n\treturn total;\n}\n\nexport function hardLimitEmergencyPrune(\n\tmessages: AgentMessage[],\n\tcontextWindow: number,\n): {\n\tmessages: AgentMessage[];\n\tneedsAggressiveCompaction: boolean;\n} {\n\tconst targetTokens = Math.floor(contextWindow * EMERGENCY_CONTEXT_TARGET_RATIO);\n\tconst noLlmPruned = truncateContextMessages(pruneToolResults(messages, contextWindow));\n\tif (estimateTotalTokens(noLlmPruned) <= targetTokens) {\n\t\treturn { messages: noLlmPruned, needsAggressiveCompaction: false };\n\t}\n\treturn {\n\t\tmessages: pruneOldMessagesToBudget(noLlmPruned, targetTokens),\n\t\tneedsAggressiveCompaction: true,\n\t};\n}\n\nexport function getPromptVariant(options: {\n\treason: string;\n\tpreparation: { previousSummary?: string; isSplitTurn: boolean };\n}): MergedCompactionPromptVariant {\n\tif (options.reason === \"branch\") return \"branch\";\n\tif (options.preparation.previousSummary) return \"update\";\n\tif (options.preparation.isSplitTurn) return \"turn_prefix\";\n\treturn \"default\";\n}\n\nexport function createSpeculativeCompactionSnapshot(\n\tcontext: SpeculativeCompactionContext,\n\toptions: { customInstructions?: string; generation: number },\n): SpeculativeCompactionSnapshot | undefined {\n\tconst model = context.model;\n\tif (!model) return undefined;\n\n\tconst expectedRevision = context.getMessageRevision();\n\tconst branchEntries = context.sessionManager.getBranch();\n\tconst contextWindow = context.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\tconst settings = context.getCompactionSettings?.() ?? DEFAULT_COMPACTION_SETTINGS;\n\tconst thresholdRatio = computeEffectiveThreshold(contextWindow);\n\tconst preparation = prepareCompaction(branchEntries, {\n\t\t...settings,\n\t\tkeepRecentTokens: computeEffectiveKeepRecentTokens(settings.keepRecentTokens, contextWindow, thresholdRatio),\n\t});\n\tif (!preparation) return undefined;\n\n\treturn {\n\t\tgeneration: options.generation,\n\t\texpectedRevision,\n\t\tmodel,\n\t\tcontextWindow,\n\t\tpreparation,\n\t\tpromptVariant: getPromptVariant({ reason: \"extension\", preparation }),\n\t\tcustomInstructions: options.customInstructions,\n\t};\n}\n\nexport async function runExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tsignal?: AbortSignal,\n\tonProgress?: CompactionProgressCallback,\n): Promise<CompactionResult | undefined> {\n\tconst auth = await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);\n\tif (!auth?.ok || !auth.apiKey) return undefined;\n\n\tlet messages = pruneToolResults(\n\t\t[...snapshot.preparation.messagesToSummarize, ...snapshot.preparation.turnPrefixMessages],\n\t\tsnapshot.contextWindow,\n\t);\n\tconst prompt = buildPrompt({\n\t\tvariant: snapshot.promptVariant,\n\t\tpreviousSummary: snapshot.preparation.previousSummary,\n\t\tcustomInstructions: snapshot.customInstructions,\n\t});\n\n\twhile (true) {\n\t\tconst response = await generateSummaryMessage({\n\t\t\tmessages,\n\t\t\tonProgress,\n\t\t\tprompt,\n\t\t\tsignal,\n\t\t\tsnapshot,\n\t\t\tauth: {\n\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\theaders: auth.headers,\n\t\t\t\textraBody: auth.extraBody,\n\t\t\t},\n\t\t});\n\t\tif (!response) return undefined;\n\n\t\tif (isAssistantMessage(response) && isContextOverflow(response, snapshot.contextWindow)) {\n\t\t\tconst retryMessages = removeOldestHistoryItemForOverflowRetry(messages);\n\t\t\tif (!retryMessages || retryMessages.length === messages.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmessages = retryMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst summary = getSummaryText(response);\n\t\tif (!summary) return undefined;\n\n\t\tconst tokenEstimate = estimateContextTokens(convertToLlm(messages)).tokens + approxTokens(summary);\n\t\tif (tokenEstimate > snapshot.contextWindow * COMPACTION_BUDGET_RATIO) return undefined;\n\n\t\treturn {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId: snapshot.preparation.firstKeptEntryId,\n\t\t\ttokensBefore: snapshot.preparation.tokensBefore,\n\t\t\tdetails: { schema: SUMMARY_SCHEMA, promptVariant: snapshot.promptVariant, tokenEstimate },\n\t\t};\n\t}\n\n\tthrow new Error(\"Compaction summary request exceeded the context window after retrying with a smaller input\");\n}\n\nexport async function applyGeneratedCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tcompaction: CompactionResult | undefined,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot || !compaction) return { applied: false, reason: \"unavailable\" };\n\n\tif (snapshot.generation !== getCurrentGeneration() || snapshot.expectedRevision !== context.getMessageRevision()) {\n\t\treturn { applied: false, reason: \"stale\" };\n\t}\n\n\treturn await context.applyCompaction(compaction, {\n\t\treason: \"extension\",\n\t\texpectedRevision: snapshot.expectedRevision,\n\t});\n}\n\nexport function snapshotExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\trequest: ExtensionCompactionRequest,\n): SpeculativeCompactionSnapshot | undefined {\n\treturn createSpeculativeCompactionSnapshot(context, request);\n}\n\nexport async function applySpeculativeCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tgenerate: () => Promise<CompactionResult | undefined>,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot) return { applied: false, reason: \"unavailable\" };\n\n\tconst compaction = await generate();\n\treturn await applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"speculative.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AssistantMessage,\n\tisContextOverflow,\n\ttype Message,\n\ttype Model,\n\tstream,\n\ttype TextContent,\n} from \"@earendil-works/pi-ai\";\nimport {\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tDEFAULT_COMPACTION_SETTINGS,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n\tserializeConversation,\n} from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { ModelRegistry } from \"../../../model-registry.ts\";\nimport type { ReadonlySessionManager } from \"../../../session-manager.ts\";\nimport type { ApplyCompactionResult, ContextUsage } from \"../../types.ts\";\nimport { computeEffectiveKeepRecentTokens, computeEffectiveThreshold } from \"./policy.ts\";\nimport { buildPrompt, type MergedCompactionPromptVariant } from \"./prompts.ts\";\nimport * as truncation from \"./tool-truncation.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst COMPACTION_BUDGET_RATIO = 0.6;\nconst EMERGENCY_CONTEXT_TARGET_RATIO = 0.95;\nconst MAX_SUMMARY_TOKENS = 8192;\nconst SUMMARY_SCHEMA = \"senpi.compaction.summary.v1\";\ntype CompactionProgressCallback = (delta: string) => void;\n\nexport interface SpeculativeCompactionContext {\n\tmodel: Model<any> | undefined;\n\tsessionManager: ReadonlySessionManager;\n\tmodelRegistry?: ModelRegistry;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetCompactionSettings?(): CompactionPreparation[\"settings\"];\n\tgetMessageRevision(): number;\n\tapplyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: { reason: \"extension\"; expectedRevision: number },\n\t): Promise<ApplyCompactionResult>;\n}\n\nexport interface SpeculativeCompactionSnapshot {\n\tgeneration: number;\n\texpectedRevision: number;\n\tmodel: Model<any>;\n\tcontextWindow: number;\n\tpreparation: CompactionPreparation;\n\tpromptVariant: MergedCompactionPromptVariant;\n\tcustomInstructions?: string;\n}\n\nexport type SpeculativeCompactionResult = ApplyCompactionResult | { applied: false; reason: \"unavailable\" };\n\nexport type ExtensionCompactionRequest = {\n\tcustomInstructions?: string;\n\tgeneration: number;\n\tsignal?: AbortSignal;\n};\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction getSummaryText(message: Message): string {\n\tconst content = Array.isArray(message.content)\n\t\t? message.content\n\t\t: [{ type: \"text\" as const, text: message.content }];\n\treturn content\n\t\t.filter((content): content is TextContent => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isAssistantMessage(message: Message): message is AssistantMessage {\n\treturn message.role === \"assistant\" && \"stopReason\" in message;\n}\n\nasync function generateSummaryMessage(options: {\n\tmessages: AgentMessage[];\n\tonProgress?: CompactionProgressCallback;\n\tprompt: ReturnType<typeof buildPrompt>;\n\tsignal?: AbortSignal;\n\tsnapshot: SpeculativeCompactionSnapshot;\n\tauth: {\n\t\tapiKey: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t};\n}): Promise<Message | undefined> {\n\tconst conversationText = serializeConversation(convertToLlm(options.messages));\n\tconst responseStream = stream(\n\t\toptions.snapshot.model,\n\t\t{\n\t\t\tsystemPrompt: options.prompt.system,\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `${options.prompt.user}\\n\\n<conversation>\\n${conversationText}\\n</conversation>`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tapiKey: options.auth.apiKey,\n\t\t\theaders: options.auth.headers,\n\t\t\textraBody: options.auth.extraBody,\n\t\t\tmaxTokens: MAX_SUMMARY_TOKENS,\n\t\t\tsignal: options.signal,\n\t\t},\n\t);\n\tfor await (const event of responseStream) {\n\t\tif (event.type === \"text_delta\" && event.delta) {\n\t\t\toptions.onProgress?.(event.delta);\n\t\t}\n\t}\n\treturn await responseStream.result();\n}\n\nfunction pruneToolResults(messages: AgentMessage[], contextWindow: number): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst prunedResults = truncation.prePruneToolOutputsToBudget(toolResults, contextWindow * COMPACTION_BUDGET_RATIO);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst pruned = prunedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn pruned ? { ...message, content: pruned.content } : message;\n\t});\n}\n\nexport function truncateContextMessages(messages: AgentMessage[]): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst truncatedResults = truncation.truncateOversizedToolResults(toolResults);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst truncated = truncatedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn truncated ? { ...message, content: truncated.content } : message;\n\t});\n}\n\nfunction getToolCallIds(message: AgentMessage): Set<string> {\n\tconst ids = new Set<string>();\n\tif (message.role !== \"assistant\") return ids;\n\tfor (const block of message.content) {\n\t\tif (block.type === \"toolCall\") ids.add(block.id);\n\t}\n\treturn ids;\n}\n\nfunction findLastUserLikeIndex(messages: AgentMessage[]): number {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst role = messages[index]?.role;\n\t\tif (role === \"user\" || role === \"bashExecution\") return index;\n\t}\n\treturn messages.length;\n}\n\nfunction removeAssistantToolPair(messages: AgentMessage[], assistantIndex: number): AgentMessage[] {\n\tconst ids = getToolCallIds(messages[assistantIndex]);\n\treturn messages.filter((message, index) => {\n\t\tif (index === assistantIndex) return false;\n\t\treturn message.role !== \"toolResult\" || !ids.has(message.toolCallId);\n\t});\n}\n\nfunction removeFirstOldToolPair(messages: AgentMessage[], boundaryIndex: number): AgentMessage[] | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\tif (message.role === \"toolResult\") return messages.filter((_message, candidateIndex) => candidateIndex !== index);\n\t}\n\treturn undefined;\n}\n\nfunction removeFirstOldMessage(messages: AgentMessage[], boundaryIndex: number): AgentMessage[] | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role === \"toolResult\") continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\treturn messages.filter((_candidate, candidateIndex) => candidateIndex !== index);\n\t}\n\treturn undefined;\n}\n\nfunction pruneOldMessagesToBudget(messages: AgentMessage[], targetTokens: number): AgentMessage[] {\n\tlet pruned = messages;\n\twhile (estimateTotalTokens(pruned) > targetTokens) {\n\t\tconst boundaryIndex = findLastUserLikeIndex(pruned);\n\t\tconst next = removeFirstOldToolPair(pruned, boundaryIndex) ?? removeFirstOldMessage(pruned, boundaryIndex);\n\t\tif (!next || next.length === pruned.length) break;\n\t\tpruned = next;\n\t}\n\treturn pruned;\n}\n\nfunction removeOldestHistoryItemForOverflowRetry(messages: AgentMessage[]): AgentMessage[] | undefined {\n\tif (messages.length <= 1) return undefined;\n\tconst boundaryIndex = findLastUserLikeIndex(messages);\n\treturn (\n\t\tremoveFirstOldToolPair(messages, boundaryIndex) ??\n\t\tremoveFirstOldMessage(messages, boundaryIndex) ??\n\t\t(messages.length > 1 ? messages.slice(1) : undefined)\n\t);\n}\n\nfunction estimateTotalTokens(messages: AgentMessage[]): number {\n\tlet total = 0;\n\tfor (const message of messages) total += estimateTokens(message);\n\treturn total;\n}\n\nexport function hardLimitEmergencyPrune(\n\tmessages: AgentMessage[],\n\tcontextWindow: number,\n): {\n\tmessages: AgentMessage[];\n\tneedsAggressiveCompaction: boolean;\n} {\n\tconst targetTokens = Math.floor(contextWindow * EMERGENCY_CONTEXT_TARGET_RATIO);\n\tconst noLlmPruned = truncateContextMessages(pruneToolResults(messages, contextWindow));\n\tif (estimateTotalTokens(noLlmPruned) <= targetTokens) {\n\t\treturn { messages: noLlmPruned, needsAggressiveCompaction: false };\n\t}\n\treturn {\n\t\tmessages: pruneOldMessagesToBudget(noLlmPruned, targetTokens),\n\t\tneedsAggressiveCompaction: true,\n\t};\n}\n\nexport function getPromptVariant(options: {\n\treason: string;\n\tpreparation: { previousSummary?: string; isSplitTurn: boolean };\n}): MergedCompactionPromptVariant {\n\tif (options.reason === \"branch\") return \"branch\";\n\tif (options.preparation.previousSummary) return \"update\";\n\tif (options.preparation.isSplitTurn) return \"turn_prefix\";\n\treturn \"default\";\n}\n\nexport function createSpeculativeCompactionSnapshot(\n\tcontext: SpeculativeCompactionContext,\n\toptions: { customInstructions?: string; generation: number },\n): SpeculativeCompactionSnapshot | undefined {\n\tconst model = context.model;\n\tif (!model) return undefined;\n\n\tconst expectedRevision = context.getMessageRevision();\n\tconst branchEntries = context.sessionManager.getBranch();\n\tconst contextWindow = context.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\tconst settings = context.getCompactionSettings?.() ?? DEFAULT_COMPACTION_SETTINGS;\n\tconst thresholdRatio = computeEffectiveThreshold(contextWindow);\n\tconst preparation = prepareCompaction(branchEntries, {\n\t\t...settings,\n\t\tkeepRecentTokens: computeEffectiveKeepRecentTokens(settings.keepRecentTokens, contextWindow, thresholdRatio),\n\t});\n\tif (!preparation) return undefined;\n\n\treturn {\n\t\tgeneration: options.generation,\n\t\texpectedRevision,\n\t\tmodel,\n\t\tcontextWindow,\n\t\tpreparation,\n\t\tpromptVariant: getPromptVariant({ reason: \"extension\", preparation }),\n\t\tcustomInstructions: options.customInstructions,\n\t};\n}\n\nexport async function runExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tsignal?: AbortSignal,\n\tonProgress?: CompactionProgressCallback,\n): Promise<CompactionResult | undefined> {\n\tconst auth = await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);\n\tif (!auth?.ok || !auth.apiKey) return undefined;\n\n\tlet messages = pruneToolResults(\n\t\t[...snapshot.preparation.messagesToSummarize, ...snapshot.preparation.turnPrefixMessages],\n\t\tsnapshot.contextWindow,\n\t);\n\tconst prompt = buildPrompt({\n\t\tvariant: snapshot.promptVariant,\n\t\tpreviousSummary: snapshot.preparation.previousSummary,\n\t\tcustomInstructions: snapshot.customInstructions,\n\t});\n\n\twhile (true) {\n\t\tconst response = await generateSummaryMessage({\n\t\t\tmessages,\n\t\t\tonProgress,\n\t\t\tprompt,\n\t\t\tsignal,\n\t\t\tsnapshot,\n\t\t\tauth: {\n\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\theaders: auth.headers,\n\t\t\t\textraBody: auth.extraBody,\n\t\t\t},\n\t\t});\n\t\tif (!response) return undefined;\n\n\t\tif (isAssistantMessage(response) && isContextOverflow(response, snapshot.contextWindow)) {\n\t\t\tconst retryMessages = removeOldestHistoryItemForOverflowRetry(messages);\n\t\t\tif (!retryMessages || retryMessages.length === messages.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmessages = retryMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst summary = getSummaryText(response);\n\t\tif (!summary) return undefined;\n\n\t\tconst tokenEstimate = estimateContextTokens(convertToLlm(messages)).tokens + approxTokens(summary);\n\t\tif (tokenEstimate > snapshot.contextWindow * COMPACTION_BUDGET_RATIO) return undefined;\n\n\t\treturn {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId: snapshot.preparation.firstKeptEntryId,\n\t\t\ttokensBefore: snapshot.preparation.tokensBefore,\n\t\t\tdetails: { schema: SUMMARY_SCHEMA, promptVariant: snapshot.promptVariant, tokenEstimate },\n\t\t};\n\t}\n\n\tthrow new Error(\"Compaction summary request exceeded the context window after retrying with a smaller input\");\n}\n\nexport async function applyGeneratedCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tcompaction: CompactionResult | undefined,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot || !compaction) return { applied: false, reason: \"unavailable\" };\n\n\tif (snapshot.generation !== getCurrentGeneration() || snapshot.expectedRevision !== context.getMessageRevision()) {\n\t\treturn { applied: false, reason: \"stale\" };\n\t}\n\n\treturn await context.applyCompaction(compaction, {\n\t\treason: \"extension\",\n\t\texpectedRevision: snapshot.expectedRevision,\n\t});\n}\n\nexport function snapshotExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\trequest: ExtensionCompactionRequest,\n): SpeculativeCompactionSnapshot | undefined {\n\treturn createSpeculativeCompactionSnapshot(context, request);\n}\n\nexport async function applySpeculativeCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tgenerate: () => Promise<CompactionResult | undefined>,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot) return { applied: false, reason: \"unavailable\" };\n\n\tconst compaction = await generate();\n\treturn await applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACxC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAgB,kBAAkB,IAAI,wBAAwB,CAU7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAE1G"
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACxC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAgB,kBAAkB,IAAI,wBAAwB,CAU7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAE1G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/state.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,kBAAkB
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/state.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,kBAAkB;IACjC,OAAO;QACN,mBAAmB,EAAE,CAAC;QACtB,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;KACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA+B,EAAE,MAAc;IAC/E,OAAO,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC","sourcesContent":["import type { RestorationTrackerState } from \"./restoration-tracker.ts\";\n\nexport interface CompactionYieldSnapshot {\n\tsavedTokens: number;\n\ttokensBefore: number;\n}\n\nexport interface CompactionExtensionState {\n\tconsecutiveFailures: number;\n\ttrippedAt: number | null;\n\tacceptedThisTurn: number;\n\tacceptedAbsolute: number;\n\tlastYield: CompactionYieldSnapshot | null;\n\tturnId: string | null;\n\trestoration: RestorationTrackerState | null;\n}\n\nexport function createInitialState(): CompactionExtensionState {\n\treturn {\n\t\tconsecutiveFailures: 0,\n\t\ttrippedAt: null,\n\t\tacceptedThisTurn: 0,\n\t\tacceptedAbsolute: 0,\n\t\tlastYield: null,\n\t\tturnId: null,\n\t\trestoration: null,\n\t};\n}\n\nexport function resetTurnCounter(state: CompactionExtensionState, turnId: string): CompactionExtensionState {\n\treturn { ...state, acceptedThisTurn: 0, turnId };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todo-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/todo-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGrE,QAAA,MAAM,oBAAoB,sCAAsC,CAAC;AAEjE,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;CAC/D;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IAC1B,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CAC7D;AASD,UAAU,aAAa;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,SAAS,EAAE,CAAC;CAC3B;AAiCD,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAAC;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAAE,CAAC;AAevG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,CAM7E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAE9F;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;AACnF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;AAmB/G,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;AACrF,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,SAAS,EAAE,EACrB,YAAY,EAAE,SAAS,EAAE,EACzB,EAAE,EAAE,iBAAiB,GACnB,aAAa,CAAC"
|
|
1
|
+
{"version":3,"file":"todo-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/todo-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGrE,QAAA,MAAM,oBAAoB,sCAAsC,CAAC;AAEjE,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;CAC/D;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IAC1B,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CAC7D;AASD,UAAU,aAAa;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,SAAS,EAAE,CAAC;CAC3B;AAiCD,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAAC;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAAE,CAAC;AAevG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,CAM7E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAE9F;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;AACnF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;AAmB/G,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;AACrF,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,SAAS,EAAE,EACrB,YAAY,EAAE,SAAS,EAAE,EACzB,EAAE,EAAE,iBAAiB,GACnB,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todo-bridge.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/todo-bridge.ts"],"names":[],"mappings":"AAGA,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAC7D,MAAM,oBAAoB,GAAG,mCAAmC,CAAC;AA+BjE,SAAS,iBAAiB,CAAC,KAAmB
|
|
1
|
+
{"version":3,"file":"todo-bridge.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/todo-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomEntry, SessionEntry } from \"../../../session-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\n\nconst TODO_SNAPSHOT_CUSTOM_TYPE = \"compaction.todo-snapshot\";\nconst TODO_SNAPSHOT_SCHEMA = \"senpi.compaction.todo-snapshot.v1\";\n\nexport interface TodoEntry {\n\tid: string;\n\tcontent?: string;\n\ttext?: string;\n\tstatus?: \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n}\n\nexport interface TodoSnapshotPayload {\n\tschema: typeof TODO_SNAPSHOT_SCHEMA;\n\ttodos: TodoEntry[] | SessionEntry[];\n\tcapturedAt: number;\n}\n\ninterface AppendEntryTarget {\n\tappendEntry<T = unknown>(customType: string, data?: T): void;\n}\n\ninterface SendMessageTarget extends AppendEntryTarget {\n\tsendMessage<T = unknown>(\n\t\tmessage: { customType: string; content: string; display: boolean; details?: T },\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): void;\n}\n\ninterface RestoreResult {\n\tapplied: boolean;\n\trestoredTodos: TodoEntry[];\n}\n\nfunction isCustomTodoEntry(entry: SessionEntry): entry is CustomEntry {\n\treturn entry.type === \"custom\" && entry.customType.startsWith(\"todowrite\");\n}\n\nfunction isLegacyTodoListEntry(entry: SessionEntry): entry is CustomEntry {\n\treturn entry.type === \"custom\" && entry.customType === \"todo-list\";\n}\n\nfunction readTodosFromEntry(entry: CustomEntry): TodoEntry[] {\n\tconst data = entry.data;\n\tif (typeof data !== \"object\" || data === null || !(\"todos\" in data) || !Array.isArray(data.todos)) {\n\t\treturn [];\n\t}\n\treturn data.todos.filter((todo): todo is TodoEntry => {\n\t\treturn typeof todo === \"object\" && todo !== null && \"id\" in todo && typeof todo.id === \"string\";\n\t});\n}\n\nfunction findLatestTodoSnapshot(ctx: ExtensionContext): TodoSnapshotPayload | null {\n\tconst entries = ctx.sessionManager.getEntries();\n\tfor (let index = entries.length - 1; index >= 0; index--) {\n\t\tconst entry = entries[index];\n\t\tif (entry.type !== \"custom\" || entry.customType !== TODO_SNAPSHOT_CUSTOM_TYPE) continue;\n\t\tconst data = entry.data;\n\t\tif (typeof data === \"object\" && data !== null && \"schema\" in data && data.schema === TODO_SNAPSHOT_SCHEMA) {\n\t\t\treturn data as TodoSnapshotPayload;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport function findTodoEntries(ctx: ExtensionContext): SessionEntry[];\nexport function findTodoEntries(entries: SessionEntry[], options?: { branchId?: string }): TodoEntry[];\nexport function findTodoEntries(\n\tctxOrEntries: ExtensionContext | SessionEntry[],\n\toptions?: { branchId?: string },\n): SessionEntry[] | TodoEntry[] {\n\tif (Array.isArray(ctxOrEntries)) {\n\t\treturn ctxOrEntries\n\t\t\t.filter(isLegacyTodoListEntry)\n\t\t\t.filter((entry) => options?.branchId === undefined || entry.parentId === options.branchId)\n\t\t\t.flatMap(readTodosFromEntry);\n\t}\n\n\treturn ctxOrEntries.sessionManager.getEntries().filter(isCustomTodoEntry);\n}\n\nexport function createTodoSnapshot(ctx: ExtensionContext): TodoSnapshotPayload {\n\treturn {\n\t\tschema: TODO_SNAPSHOT_SCHEMA,\n\t\ttodos: findTodoEntries(ctx),\n\t\tcapturedAt: Date.now(),\n\t};\n}\n\nexport function persistTodoSnapshot(pi: AppendEntryTarget, snapshot: TodoSnapshotPayload): void {\n\tpi.appendEntry(TODO_SNAPSHOT_CUSTOM_TYPE, snapshot);\n}\n\nexport function captureTodoSnapshot(pi: ExtensionAPI, ctx: ExtensionContext): void;\nexport function captureTodoSnapshot(currentTodos: TodoEntry[], pi: AppendEntryTarget, branchId?: string): void;\nexport function captureTodoSnapshot(\n\tpiOrTodos: ExtensionAPI | TodoEntry[],\n\tctxOrPi: ExtensionContext | AppendEntryTarget,\n\t_branchId?: string,\n): void {\n\tif (Array.isArray(piOrTodos)) {\n\t\tconst pi = ctxOrPi as AppendEntryTarget;\n\t\tpersistTodoSnapshot(pi, {\n\t\t\tschema: TODO_SNAPSHOT_SCHEMA,\n\t\t\ttodos: piOrTodos,\n\t\t\tcapturedAt: Date.now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tpersistTodoSnapshot(piOrTodos, createTodoSnapshot(ctxOrPi as ExtensionContext));\n}\n\nexport function restoreTodosIfMissing(pi: ExtensionAPI, ctx: ExtensionContext): void;\nexport function restoreTodosIfMissing(\n\tsnapshot: TodoEntry[],\n\tcurrentTodos: TodoEntry[],\n\tpi: AppendEntryTarget,\n): RestoreResult;\nexport function restoreTodosIfMissing(\n\tpiOrSnapshot: ExtensionAPI | TodoEntry[],\n\tctxOrCurrentTodos: ExtensionContext | TodoEntry[],\n\t_pi?: AppendEntryTarget,\n): undefined | RestoreResult {\n\tif (Array.isArray(piOrSnapshot) && Array.isArray(ctxOrCurrentTodos)) {\n\t\tif (ctxOrCurrentTodos.length > 0) {\n\t\t\treturn { applied: false, restoredTodos: ctxOrCurrentTodos };\n\t\t}\n\t\treturn { applied: piOrSnapshot.length > 0, restoredTodos: piOrSnapshot };\n\t}\n\n\tconst pi = piOrSnapshot as SendMessageTarget;\n\tconst ctx = ctxOrCurrentTodos as ExtensionContext;\n\tif (findTodoEntries(ctx).length > 0) return;\n\n\tconst snapshot = findLatestTodoSnapshot(ctx);\n\tif (!snapshot || snapshot.todos.length === 0) return;\n\n\tpi.sendMessage(\n\t\t{\n\t\t\tcustomType: \"compaction.todo-restore-request\",\n\t\t\tcontent: `Restore missing todowrite todos from snapshot: ${JSON.stringify(snapshot.todos)}`,\n\t\t\tdisplay: false,\n\t\t\tdetails: snapshot,\n\t\t},\n\t\t{ triggerTurn: true, deliverAs: \"nextTurn\" },\n\t);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-truncation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/tool-truncation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAiFrE,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAE5G;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,EACnC,YAAY,EAAE,MAAM,GAClB,eAAe,CAAC,OAAO,CAAC,EAAE,CAS5B"
|
|
1
|
+
{"version":3,"file":"tool-truncation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/tool-truncation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAiFrE,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAE5G;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,EACnC,YAAY,EAAE,MAAM,GAClB,eAAe,CAAC,OAAO,CAAC,EAAE,CAS5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-truncation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/tool-truncation.ts"],"names":[],"mappings":"AAGA,MAAM,mCAAmC,GAAG,IAAI,CAAC;AACjD,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,oBAAoB,GAAG,gCAAgC,CAAC;AAE9D,SAAS,SAAS,CAAC,IAAY
|
|
1
|
+
{"version":3,"file":"tool-truncation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/tool-truncation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\n\nconst PER_RESULT_TRUNCATE_THRESHOLD_BYTES = 4096;\nconst TRUNCATION_HEAD_CHARS = 800;\nconst TRUNCATION_TAIL_CHARS = 400;\nconst TRUNCATION_MARKER_RE = /<truncated:\\d+ bytes original>/;\n\nfunction utf8Bytes(text: string): number {\n\treturn new TextEncoder().encode(text).length;\n}\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction totalTokens(results: AgentToolResult<unknown>[]): number {\n\tlet total = 0;\n\tfor (const result of results) {\n\t\tfor (const block of result.content) {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\ttotal += approxTokens(block.text);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (block.type === \"image\") {\n\t\t\t\ttotal += approxTokens(block.data);\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n\nfunction buildMarker(originalBytes: number): string {\n\treturn `<truncated:${originalBytes} bytes original>`;\n}\n\nfunction truncateTextBlock(block: TextContent, headChars: number, tailChars: number): TextContent | null {\n\tconst text = block.text;\n\tconst bytes = utf8Bytes(text);\n\tif (bytes <= PER_RESULT_TRUNCATE_THRESHOLD_BYTES) return null;\n\tif (TRUNCATION_MARKER_RE.test(text)) return null;\n\tconst head = text.slice(0, headChars);\n\tconst tail = text.slice(text.length - tailChars);\n\tconst marker = buildMarker(bytes);\n\treturn { ...block, text: `${head}\\n${marker}\\n${tail}` };\n}\n\nfunction applyHeadTailTruncation(\n\tresult: AgentToolResult<unknown>,\n\theadChars: number,\n\ttailChars: number,\n): AgentToolResult<unknown> {\n\tlet modified = false;\n\tconst newContent: (TextContent | ImageContent)[] = result.content.map((block) => {\n\t\tif (block.type !== \"text\") return block;\n\t\tconst truncated = truncateTextBlock(block, headChars, tailChars);\n\t\tif (truncated) {\n\t\t\tmodified = true;\n\t\t\treturn truncated;\n\t\t}\n\t\treturn block;\n\t});\n\tif (!modified) return result;\n\treturn { ...result, content: newContent };\n}\n\nfunction reduceMarkedTextToMarker(result: AgentToolResult<unknown>): AgentToolResult<unknown> {\n\tlet modified = false;\n\tconst newContent: (TextContent | ImageContent)[] = result.content.map((block) => {\n\t\tif (block.type !== \"text\") return block;\n\t\tconst markerMatch = block.text.match(TRUNCATION_MARKER_RE);\n\t\tif (markerMatch && block.text !== markerMatch[0]) {\n\t\t\tmodified = true;\n\t\t\treturn { ...block, text: markerMatch[0] };\n\t\t}\n\t\treturn block;\n\t});\n\tif (!modified) return result;\n\treturn { ...result, content: newContent };\n}\n\nexport function truncateOversizedToolResults(results: AgentToolResult<unknown>[]): AgentToolResult<unknown>[] {\n\treturn results.map((result) => applyHeadTailTruncation(result, TRUNCATION_HEAD_CHARS, TRUNCATION_TAIL_CHARS));\n}\n\nexport function prePruneToolOutputsToBudget(\n\tresults: AgentToolResult<unknown>[],\n\ttargetTokens: number,\n): AgentToolResult<unknown>[] {\n\tif (totalTokens(results) <= targetTokens) {\n\t\treturn results.map((result) => ({ ...result }));\n\t}\n\n\tconst firstPass = truncateOversizedToolResults(results);\n\tif (totalTokens(firstPass) <= targetTokens) return firstPass;\n\n\treturn firstPass.map((result) => reduceMarkedTextToMarker(result));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QA0MxC"
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QA0MxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/diff.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Diff Extension\n *\n * /diff command shows modified/deleted/new files from git status and opens\n * the selected file in VS Code's diff view.\n */\n\nimport { Container, Key, matchesKey, type SelectItem, SelectList, Text } from \"@earendil-works/pi-tui\";\nimport { DynamicBorder } from \"../../../modes/interactive/components/dynamic-border.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\ninterface FileInfo {\n\tstatus: string;\n\tstatusLabel: string;\n\tfile: string;\n}\n\nexport default function (pi: ExtensionAPI) {\n\tpi.registerCommand(\"diff\", {\n\t\tdescription: \"Show git changes and open in VS Code diff view\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"No UI available\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get changed files from git status\n\t\t\tconst result = await pi.exec(\"git\", [\"status\", \"--porcelain\"], { cwd: ctx.cwd });\n\n\t\t\tif (result.code !== 0) {\n\t\t\t\tctx.ui.notify(`git status failed: ${result.stderr}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!result.stdout?.trim()) {\n\t\t\t\tctx.ui.notify(\"No changes in working tree\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Parse git status output\n\t\t\t// Format: XY filename (where XY is two-letter status, then space, then filename)\n\t\t\tconst lines = result.stdout.split(\"\\n\");\n\t\t\tconst files: FileInfo[] = [];\n\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.length < 4) continue; // Need at least \"XY f\"\n\n\t\t\t\tconst status = line.slice(0, 2);\n\t\t\t\tconst file = line.slice(2).trimStart();\n\n\t\t\t\t// Translate status codes to short labels\n\t\t\t\tlet statusLabel: string;\n\t\t\t\tif (status.includes(\"M\")) statusLabel = \"M\";\n\t\t\t\telse if (status.includes(\"A\")) statusLabel = \"A\";\n\t\t\t\telse if (status.includes(\"D\")) statusLabel = \"D\";\n\t\t\t\telse if (status.includes(\"?\")) statusLabel = \"?\";\n\t\t\t\telse if (status.includes(\"R\")) statusLabel = \"R\";\n\t\t\t\telse if (status.includes(\"C\")) statusLabel = \"C\";\n\t\t\t\telse statusLabel = status.trim() || \"~\";\n\n\t\t\t\tfiles.push({ status: statusLabel, statusLabel, file });\n\t\t\t}\n\n\t\t\tif (files.length === 0) {\n\t\t\t\tctx.ui.notify(\"No changes found\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst WINDOWS_UNSAFE_CMD_CHARS_RE = /[&|<>^%\\r\\n]/;\n\t\t\tconst quoteCmdArg = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\n\n\t\t\tconst openWithCode = async (file: string) => {\n\t\t\t\tif (process.platform === \"win32\") {\n\t\t\t\t\tif (WINDOWS_UNSAFE_CMD_CHARS_RE.test(file)) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Refusing to open ${file}: path contains Windows cmd metacharacters (& | < > ^ % or newline).`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tconst commandLine = `code -g ${quoteCmdArg(file)}`;\n\t\t\t\t\treturn pi.exec(\"cmd\", [\"/d\", \"/s\", \"/c\", commandLine], { cwd: ctx.cwd });\n\t\t\t\t}\n\t\t\t\treturn pi.exec(\"code\", [\"-g\", file], { cwd: ctx.cwd });\n\t\t\t};\n\n\t\t\tconst openSelected = async (fileInfo: FileInfo): Promise<void> => {\n\t\t\t\ttry {\n\t\t\t\t\t// Open in VS Code diff view.\n\t\t\t\t\t// For untracked files, git difftool won't work, so fall back to just opening the file.\n\t\t\t\t\tif (fileInfo.status === \"?\") {\n\t\t\t\t\t\tconst openResult = await openWithCode(fileInfo.file);\n\t\t\t\t\t\tif (!openResult) return;\n\t\t\t\t\t\tif (openResult.code !== 0) {\n\t\t\t\t\t\t\tconst openStderr = openResult.stderr.trim();\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Failed to open ${fileInfo.file} (exit ${openResult.code})${openStderr ? `: ${openStderr}` : \"\"}`,\n\t\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst diffResult = await pi.exec(\"git\", [\"difftool\", \"-y\", \"--tool=vscode\", fileInfo.file], {\n\t\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\t});\n\t\t\t\t\tif (diffResult.code !== 0) {\n\t\t\t\t\t\tconst diffStderr = diffResult.stderr.trim();\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Failed to show diff with vscode for ${fileInfo.file} (exit ${diffResult.code})${diffStderr ? `: ${diffStderr}` : \"\"}`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\"Troubleshooting: check git difftool config (e.g. `git config --get difftool.vscode.cmd`).\",\n\t\t\t\t\t\t\t\"info\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst openResult = await openWithCode(fileInfo.file);\n\t\t\t\t\t\tif (!openResult) return;\n\t\t\t\t\t\tif (openResult.code !== 0) {\n\t\t\t\t\t\t\tconst openStderr = openResult.stderr.trim();\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Failed to open ${fileInfo.file} (exit ${openResult.code})${openStderr ? `: ${openStderr}` : \"\"}`,\n\t\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tctx.ui.notify(`Failed to open ${fileInfo.file}: ${message}`, \"error\");\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Show file picker with SelectList\n\t\t\tawait ctx.ui.custom<void>((tui, theme, _kb, done) => {\n\t\t\t\tconst container = new Container();\n\n\t\t\t\t// Top border\n\t\t\t\tcontainer.addChild(new DynamicBorder((s: string) => theme.fg(\"accent\", s)));\n\n\t\t\t\t// Title\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"accent\", theme.bold(\" Select file to diff\")), 0, 0));\n\n\t\t\t\t// Build select items with colored status\n\t\t\t\tconst filesByValue = new Map<string, FileInfo>();\n\t\t\t\tconst items: SelectItem[] = files.map((f, i) => {\n\t\t\t\t\tconst key = String(i);\n\t\t\t\t\tfilesByValue.set(key, f);\n\t\t\t\t\tlet statusColor: string;\n\t\t\t\t\tswitch (f.status) {\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"warning\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"A\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"success\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"error\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"?\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"muted\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"dim\", f.status);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\tlabel: `${statusColor} ${f.file}`,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst visibleRows = Math.min(files.length, 15);\n\t\t\t\tlet currentIndex = 0;\n\n\t\t\t\tconst selectList = new SelectList(items, visibleRows, {\n\t\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\t\tselectedText: (t) => t, // Keep existing colors\n\t\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t\t});\n\t\t\t\tselectList.onSelect = (item) => {\n\t\t\t\t\tconst fileInfo = filesByValue.get(item.value);\n\t\t\t\t\tif (fileInfo) void openSelected(fileInfo);\n\t\t\t\t};\n\t\t\t\tselectList.onCancel = () => done();\n\t\t\t\tselectList.onSelectionChange = (item) => {\n\t\t\t\t\tcurrentIndex = items.indexOf(item);\n\t\t\t\t};\n\t\t\t\tcontainer.addChild(selectList);\n\n\t\t\t\t// Help text\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", \" ↑↓ navigate • ←→ page • enter open • esc close\"), 0, 0));\n\n\t\t\t\t// Bottom border\n\t\t\t\tcontainer.addChild(new DynamicBorder((s: string) => theme.fg(\"accent\", s)));\n\n\t\t\t\treturn {\n\t\t\t\t\trender: (w) => container.render(w),\n\t\t\t\t\tinvalidate: () => container.invalidate(),\n\t\t\t\t\thandleInput: (data) => {\n\t\t\t\t\t\t// Add paging with left/right\n\t\t\t\t\t\tif (matchesKey(data, Key.left)) {\n\t\t\t\t\t\t\t// Page up - clamp to 0\n\t\t\t\t\t\t\tcurrentIndex = Math.max(0, currentIndex - visibleRows);\n\t\t\t\t\t\t\tselectList.setSelectedIndex(currentIndex);\n\t\t\t\t\t\t} else if (matchesKey(data, Key.right)) {\n\t\t\t\t\t\t\t// Page down - clamp to last\n\t\t\t\t\t\t\tcurrentIndex = Math.min(items.length - 1, currentIndex + visibleRows);\n\t\t\t\t\t\t\tselectList.setSelectedIndex(currentIndex);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselectList.handleInput(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAmB,UAAU,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AASxF,MAAM,CAAC,OAAO,WAAW,EAAgB;IACxC,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,gDAAgD;QAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;gBAC1C,OAAO;YACR,CAAC;YAED,oCAAoC;YACpC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAEjF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC9D,OAAO;YACR,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;gBACpD,OAAO;YACR,CAAC;YAED,0BAA0B;YAC1B,iFAAiF;YACjF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,KAAK,GAAe,EAAE,CAAC;YAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,SAAS,CAAC,uBAAuB;gBAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAEvC,yCAAyC;gBACzC,IAAI,WAAmB,CAAC;gBACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,WAAW,GAAG,GAAG,CAAC;qBACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,WAAW,GAAG,GAAG,CAAC;qBAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,WAAW,GAAG,GAAG,CAAC;qBAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,WAAW,GAAG,GAAG,CAAC;qBAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,WAAW,GAAG,GAAG,CAAC;qBAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,WAAW,GAAG,GAAG,CAAC;;oBAC5C,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC;gBAExC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;gBAC1C,OAAO;YACR,CAAC;YAED,MAAM,2BAA2B,GAAG,cAAc,CAAC;YACnD,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;YAExE,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;gBAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAClC,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,oBAAoB,IAAI,sEAAsE,EAC9F,OAAO,CACP,CAAC;wBACF,OAAO,IAAI,CAAC;oBACb,CAAC;oBACD,MAAM,WAAW,GAAG,WAAW,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBACD,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC,CAAC;YAEF,MAAM,YAAY,GAAG,KAAK,EAAE,QAAkB,EAAiB,EAAE;gBAChE,IAAI,CAAC;oBACJ,6BAA6B;oBAC7B,uFAAuF;oBACvF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBAC7B,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACrD,IAAI,CAAC,UAAU;4BAAE,OAAO;wBACxB,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;4BAC3B,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;4BAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,kBAAkB,QAAQ,CAAC,IAAI,UAAU,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACjG,OAAO,CACP,CAAC;wBACH,CAAC;wBACD,OAAO;oBACR,CAAC;oBAED,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;wBAC3F,GAAG,EAAE,GAAG,CAAC,GAAG;qBACZ,CAAC,CAAC;oBACH,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBAC3B,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;wBAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,uCAAuC,QAAQ,CAAC,IAAI,UAAU,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACtH,OAAO,CACP,CAAC;wBACF,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,2FAA2F,EAC3F,MAAM,CACN,CAAC;wBAEF,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACrD,IAAI,CAAC,UAAU;4BAAE,OAAO;wBACxB,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;4BAC3B,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;4BAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,kBAAkB,QAAQ,CAAC,IAAI,UAAU,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACjG,OAAO,CACP,CAAC;wBACH,CAAC;oBACF,CAAC;gBACF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvE,CAAC;YACF,CAAC,CAAC;YAEF,mCAAmC;YACnC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAO,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACnD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;gBAElC,aAAa;gBACb,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5E,QAAQ;gBACR,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAE3F,yCAAyC;gBACzC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;gBACjD,MAAM,KAAK,GAAiB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzB,IAAI,WAAmB,CAAC;oBACxB,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;wBAClB,KAAK,GAAG;4BACP,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;4BAC5C,MAAM;wBACP,KAAK,GAAG;4BACP,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;4BAC5C,MAAM;wBACP,KAAK,GAAG;4BACP,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;4BAC1C,MAAM;wBACP,KAAK,GAAG;4BACP,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;4BAC1C,MAAM;wBACP;4BACC,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC1C,CAAC;oBACD,OAAO;wBACN,KAAK,EAAE,GAAG;wBACV,KAAK,EAAE,GAAG,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE;qBACjC,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;gBAErB,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE;oBACrD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC5C,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,uBAAuB;oBAC/C,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oBACxC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;oBACrC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;iBACtC,CAAC,CAAC;gBACH,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;oBAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9C,IAAI,QAAQ;wBAAE,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC,CAAC;gBACF,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;gBACnC,UAAU,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,EAAE;oBACvC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC,CAAC;gBACF,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAE/B,YAAY;gBACZ,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,iDAAiD,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAEvG,gBAAgB;gBAChB,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5E,OAAO;oBACN,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;oBAClC,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE;oBACxC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;wBACrB,6BAA6B;wBAC7B,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;4BAChC,uBAAuB;4BACvB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;4BACvD,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;wBAC3C,CAAC;6BAAM,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;4BACxC,4BAA4B;4BAC5B,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;4BACtE,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;wBAC3C,CAAC;6BAAM,CAAC;4BACP,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBAC9B,CAAC;wBACD,GAAG,CAAC,aAAa,EAAE,CAAC;oBACrB,CAAC;iBACD,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Diff Extension\n *\n * /diff command shows modified/deleted/new files from git status and opens\n * the selected file in VS Code's diff view.\n */\n\nimport { Container, Key, matchesKey, type SelectItem, SelectList, Text } from \"@earendil-works/pi-tui\";\nimport { DynamicBorder } from \"../../../modes/interactive/components/dynamic-border.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\ninterface FileInfo {\n\tstatus: string;\n\tstatusLabel: string;\n\tfile: string;\n}\n\nexport default function (pi: ExtensionAPI) {\n\tpi.registerCommand(\"diff\", {\n\t\tdescription: \"Show git changes and open in VS Code diff view\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"No UI available\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get changed files from git status\n\t\t\tconst result = await pi.exec(\"git\", [\"status\", \"--porcelain\"], { cwd: ctx.cwd });\n\n\t\t\tif (result.code !== 0) {\n\t\t\t\tctx.ui.notify(`git status failed: ${result.stderr}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!result.stdout?.trim()) {\n\t\t\t\tctx.ui.notify(\"No changes in working tree\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Parse git status output\n\t\t\t// Format: XY filename (where XY is two-letter status, then space, then filename)\n\t\t\tconst lines = result.stdout.split(\"\\n\");\n\t\t\tconst files: FileInfo[] = [];\n\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.length < 4) continue; // Need at least \"XY f\"\n\n\t\t\t\tconst status = line.slice(0, 2);\n\t\t\t\tconst file = line.slice(2).trimStart();\n\n\t\t\t\t// Translate status codes to short labels\n\t\t\t\tlet statusLabel: string;\n\t\t\t\tif (status.includes(\"M\")) statusLabel = \"M\";\n\t\t\t\telse if (status.includes(\"A\")) statusLabel = \"A\";\n\t\t\t\telse if (status.includes(\"D\")) statusLabel = \"D\";\n\t\t\t\telse if (status.includes(\"?\")) statusLabel = \"?\";\n\t\t\t\telse if (status.includes(\"R\")) statusLabel = \"R\";\n\t\t\t\telse if (status.includes(\"C\")) statusLabel = \"C\";\n\t\t\t\telse statusLabel = status.trim() || \"~\";\n\n\t\t\t\tfiles.push({ status: statusLabel, statusLabel, file });\n\t\t\t}\n\n\t\t\tif (files.length === 0) {\n\t\t\t\tctx.ui.notify(\"No changes found\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst WINDOWS_UNSAFE_CMD_CHARS_RE = /[&|<>^%\\r\\n]/;\n\t\t\tconst quoteCmdArg = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\n\n\t\t\tconst openWithCode = async (file: string) => {\n\t\t\t\tif (process.platform === \"win32\") {\n\t\t\t\t\tif (WINDOWS_UNSAFE_CMD_CHARS_RE.test(file)) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Refusing to open ${file}: path contains Windows cmd metacharacters (& | < > ^ % or newline).`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tconst commandLine = `code -g ${quoteCmdArg(file)}`;\n\t\t\t\t\treturn pi.exec(\"cmd\", [\"/d\", \"/s\", \"/c\", commandLine], { cwd: ctx.cwd });\n\t\t\t\t}\n\t\t\t\treturn pi.exec(\"code\", [\"-g\", file], { cwd: ctx.cwd });\n\t\t\t};\n\n\t\t\tconst openSelected = async (fileInfo: FileInfo): Promise<void> => {\n\t\t\t\ttry {\n\t\t\t\t\t// Open in VS Code diff view.\n\t\t\t\t\t// For untracked files, git difftool won't work, so fall back to just opening the file.\n\t\t\t\t\tif (fileInfo.status === \"?\") {\n\t\t\t\t\t\tconst openResult = await openWithCode(fileInfo.file);\n\t\t\t\t\t\tif (!openResult) return;\n\t\t\t\t\t\tif (openResult.code !== 0) {\n\t\t\t\t\t\t\tconst openStderr = openResult.stderr.trim();\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Failed to open ${fileInfo.file} (exit ${openResult.code})${openStderr ? `: ${openStderr}` : \"\"}`,\n\t\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst diffResult = await pi.exec(\"git\", [\"difftool\", \"-y\", \"--tool=vscode\", fileInfo.file], {\n\t\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\t});\n\t\t\t\t\tif (diffResult.code !== 0) {\n\t\t\t\t\t\tconst diffStderr = diffResult.stderr.trim();\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Failed to show diff with vscode for ${fileInfo.file} (exit ${diffResult.code})${diffStderr ? `: ${diffStderr}` : \"\"}`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\"Troubleshooting: check git difftool config (e.g. `git config --get difftool.vscode.cmd`).\",\n\t\t\t\t\t\t\t\"info\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst openResult = await openWithCode(fileInfo.file);\n\t\t\t\t\t\tif (!openResult) return;\n\t\t\t\t\t\tif (openResult.code !== 0) {\n\t\t\t\t\t\t\tconst openStderr = openResult.stderr.trim();\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Failed to open ${fileInfo.file} (exit ${openResult.code})${openStderr ? `: ${openStderr}` : \"\"}`,\n\t\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tctx.ui.notify(`Failed to open ${fileInfo.file}: ${message}`, \"error\");\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Show file picker with SelectList\n\t\t\tawait ctx.ui.custom<void>((tui, theme, _kb, done) => {\n\t\t\t\tconst container = new Container();\n\n\t\t\t\t// Top border\n\t\t\t\tcontainer.addChild(new DynamicBorder((s: string) => theme.fg(\"accent\", s)));\n\n\t\t\t\t// Title\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"accent\", theme.bold(\" Select file to diff\")), 0, 0));\n\n\t\t\t\t// Build select items with colored status\n\t\t\t\tconst filesByValue = new Map<string, FileInfo>();\n\t\t\t\tconst items: SelectItem[] = files.map((f, i) => {\n\t\t\t\t\tconst key = String(i);\n\t\t\t\t\tfilesByValue.set(key, f);\n\t\t\t\t\tlet statusColor: string;\n\t\t\t\t\tswitch (f.status) {\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"warning\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"A\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"success\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"error\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"?\":\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"muted\", f.status);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tstatusColor = theme.fg(\"dim\", f.status);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\tlabel: `${statusColor} ${f.file}`,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst visibleRows = Math.min(files.length, 15);\n\t\t\t\tlet currentIndex = 0;\n\n\t\t\t\tconst selectList = new SelectList(items, visibleRows, {\n\t\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\t\tselectedText: (t) => t, // Keep existing colors\n\t\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t\t});\n\t\t\t\tselectList.onSelect = (item) => {\n\t\t\t\t\tconst fileInfo = filesByValue.get(item.value);\n\t\t\t\t\tif (fileInfo) void openSelected(fileInfo);\n\t\t\t\t};\n\t\t\t\tselectList.onCancel = () => done();\n\t\t\t\tselectList.onSelectionChange = (item) => {\n\t\t\t\t\tcurrentIndex = items.indexOf(item);\n\t\t\t\t};\n\t\t\t\tcontainer.addChild(selectList);\n\n\t\t\t\t// Help text\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", \" ↑↓ navigate • ←→ page • enter open • esc close\"), 0, 0));\n\n\t\t\t\t// Bottom border\n\t\t\t\tcontainer.addChild(new DynamicBorder((s: string) => theme.fg(\"accent\", s)));\n\n\t\t\t\treturn {\n\t\t\t\t\trender: (w) => container.render(w),\n\t\t\t\t\tinvalidate: () => container.invalidate(),\n\t\t\t\t\thandleInput: (data) => {\n\t\t\t\t\t\t// Add paging with left/right\n\t\t\t\t\t\tif (matchesKey(data, Key.left)) {\n\t\t\t\t\t\t\t// Page up - clamp to 0\n\t\t\t\t\t\t\tcurrentIndex = Math.max(0, currentIndex - visibleRows);\n\t\t\t\t\t\t\tselectList.setSelectedIndex(currentIndex);\n\t\t\t\t\t\t} else if (matchesKey(data, Key.right)) {\n\t\t\t\t\t\t\t// Page down - clamp to last\n\t\t\t\t\t\t\tcurrentIndex = Math.min(items.length - 1, currentIndex + visibleRows);\n\t\t\t\t\t\t\tselectList.setSelectedIndex(currentIndex);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselectList.handleInput(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t});\n}\n"]}
|