@herbertgao/pi-extensions 2026.8.3 → 2026.8.5
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/README.md +45 -4
- package/examples/pi-footer.json +275 -0
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +24 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +91 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +7 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +21 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +4 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +5 -8
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +22 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +2 -4
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +8 -4
- package/node_modules/@herbertgao/pi-subagents/src/agent-color.ts +72 -67
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +255 -0
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +191 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +15 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +289 -113
- package/node_modules/@herbertgao/pi-subagents/src/output-file.ts +24 -1
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +24 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/schedule-menu.ts +9 -8
- package/node_modules/@herbertgao/pi-subagents/src/ui/select-item.ts +48 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/keyboard.md +7 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +7 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +16 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +4 -2
- package/node_modules/@narumitw/pi-btw/README.md +8 -7
- package/node_modules/@narumitw/pi-btw/package.json +2 -2
- package/node_modules/@narumitw/pi-btw/src/menu.ts +1 -0
- package/node_modules/pi-footer/CHANGELOG.md +145 -0
- package/node_modules/pi-footer/LICENSE +21 -0
- package/node_modules/pi-footer/README.md +354 -0
- package/node_modules/pi-footer/package.json +68 -0
- package/node_modules/pi-footer/src/cache.ts +106 -0
- package/node_modules/pi-footer/src/colors.ts +237 -0
- package/node_modules/pi-footer/src/config.ts +202 -0
- package/node_modules/pi-footer/src/event-widgets.ts +41 -0
- package/node_modules/pi-footer/src/extension-statuses.ts +102 -0
- package/node_modules/pi-footer/src/git.ts +135 -0
- package/node_modules/pi-footer/src/index.ts +268 -0
- package/node_modules/pi-footer/src/metrics.ts +141 -0
- package/node_modules/pi-footer/src/presets.ts +383 -0
- package/node_modules/pi-footer/src/render.ts +114 -0
- package/node_modules/pi-footer/src/separators.ts +52 -0
- package/node_modules/pi-footer/src/types.ts +122 -0
- package/node_modules/pi-footer/src/ui/color-level-confirm.ts +22 -0
- package/node_modules/pi-footer/src/ui/color-options.ts +195 -0
- package/node_modules/pi-footer/src/ui/config-lifecycle.ts +61 -0
- package/node_modules/pi-footer/src/ui/edit-colors.ts +13 -0
- package/node_modules/pi-footer/src/ui/events.ts +35 -0
- package/node_modules/pi-footer/src/ui/extension-status-picker.ts +60 -0
- package/node_modules/pi-footer/src/ui/extension-statuses.ts +73 -0
- package/node_modules/pi-footer/src/ui/fields.ts +252 -0
- package/node_modules/pi-footer/src/ui/global-menu.ts +126 -0
- package/node_modules/pi-footer/src/ui/helpers.ts +44 -0
- package/node_modules/pi-footer/src/ui/layout.ts +17 -0
- package/node_modules/pi-footer/src/ui/line-list.ts +19 -0
- package/node_modules/pi-footer/src/ui/model.ts +64 -0
- package/node_modules/pi-footer/src/ui/navigation.ts +29 -0
- package/node_modules/pi-footer/src/ui/option-edit.ts +93 -0
- package/node_modules/pi-footer/src/ui/overlay-render.ts +103 -0
- package/node_modules/pi-footer/src/ui/screen-context.ts +18 -0
- package/node_modules/pi-footer/src/ui/screen-controller.ts +27 -0
- package/node_modules/pi-footer/src/ui/screen-render.ts +32 -0
- package/node_modules/pi-footer/src/ui/screen-state.ts +20 -0
- package/node_modules/pi-footer/src/ui/screen.ts +243 -0
- package/node_modules/pi-footer/src/ui/screens/add-widget.ts +92 -0
- package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +52 -0
- package/node_modules/pi-footer/src/ui/screens/controller.ts +12 -0
- package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +68 -0
- package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +115 -0
- package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +61 -0
- package/node_modules/pi-footer/src/ui/screens/global.ts +75 -0
- package/node_modules/pi-footer/src/ui/screens/line-list.ts +108 -0
- package/node_modules/pi-footer/src/ui/screens/main.ts +99 -0
- package/node_modules/pi-footer/src/ui/screens/terminal.ts +121 -0
- package/node_modules/pi-footer/src/ui/screens/widget-list.ts +154 -0
- package/node_modules/pi-footer/src/ui/terminal-menu.ts +32 -0
- package/node_modules/pi-footer/src/ui/theme.ts +48 -0
- package/node_modules/pi-footer/src/ui/title-bar.ts +100 -0
- package/node_modules/pi-footer/src/ui/widget-actions.ts +76 -0
- package/node_modules/pi-footer/src/ui.ts +66 -0
- package/node_modules/pi-footer/src/widgets/context.ts +28 -0
- package/node_modules/pi-footer/src/widgets/core/active-tools.ts +17 -0
- package/node_modules/pi-footer/src/widgets/core/context-window.ts +24 -0
- package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +19 -0
- package/node_modules/pi-footer/src/widgets/core/cwd.ts +108 -0
- package/node_modules/pi-footer/src/widgets/core/event.ts +34 -0
- package/node_modules/pi-footer/src/widgets/core/external-status.ts +102 -0
- package/node_modules/pi-footer/src/widgets/core/model-provider.ts +20 -0
- package/node_modules/pi-footer/src/widgets/core/model.ts +35 -0
- package/node_modules/pi-footer/src/widgets/core/provider.ts +17 -0
- package/node_modules/pi-footer/src/widgets/core/session-name.ts +17 -0
- package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +17 -0
- package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/branch.ts +81 -0
- package/node_modules/pi-footer/src/widgets/git/clean.ts +19 -0
- package/node_modules/pi-footer/src/widgets/git/deletions.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/diff.ts +38 -0
- package/node_modules/pi-footer/src/widgets/git/insertions.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/remote.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/root.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/sha.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/staged.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/status.ts +19 -0
- package/node_modules/pi-footer/src/widgets/git/unstaged.ts +17 -0
- package/node_modules/pi-footer/src/widgets/git/untracked.ts +17 -0
- package/node_modules/pi-footer/src/widgets/instance.ts +118 -0
- package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +18 -0
- package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +32 -0
- package/node_modules/pi-footer/src/widgets/layout/separator.ts +57 -0
- package/node_modules/pi-footer/src/widgets/layout/spacer.ts +31 -0
- package/node_modules/pi-footer/src/widgets/options.ts +122 -0
- package/node_modules/pi-footer/src/widgets/project/runtime.ts +361 -0
- package/node_modules/pi-footer/src/widgets/registry.ts +223 -0
- package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +17 -0
- package/node_modules/pi-footer/src/widgets/session/compactions.ts +17 -0
- package/node_modules/pi-footer/src/widgets/session/elapsed.ts +18 -0
- package/node_modules/pi-footer/src/widgets/session/last-activity.ts +18 -0
- package/node_modules/pi-footer/src/widgets/session/messages.ts +19 -0
- package/node_modules/pi-footer/src/widgets/session/session-id.ts +17 -0
- package/node_modules/pi-footer/src/widgets/session/session-start.ts +18 -0
- package/node_modules/pi-footer/src/widgets/session/tool-results.ts +17 -0
- package/node_modules/pi-footer/src/widgets/session/total-messages.ts +19 -0
- package/node_modules/pi-footer/src/widgets/session/total-time.ts +18 -0
- package/node_modules/pi-footer/src/widgets/session/user-messages.ts +17 -0
- package/node_modules/pi-footer/src/widgets/store.ts +26 -0
- package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +55 -0
- package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +18 -0
- package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +18 -0
- package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +108 -0
- package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +26 -0
- package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +29 -0
- package/node_modules/pi-footer/src/widgets/tokens/context.ts +29 -0
- package/node_modules/pi-footer/src/widgets/tokens/cost.ts +51 -0
- package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +25 -0
- package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +18 -0
- package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +25 -0
- package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +18 -0
- package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +20 -0
- package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +25 -0
- package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +18 -0
- package/node_modules/pi-footer/src/widgets/types.ts +181 -0
- package/node_modules/pi-footer/src/widgets/utils/colors.ts +11 -0
- package/node_modules/pi-footer/src/widgets/utils/context.ts +112 -0
- package/node_modules/pi-footer/src/widgets/utils/session.ts +19 -0
- package/node_modules/pi-footer/src/widgets/utils/token-format.ts +78 -0
- package/node_modules/pi-lens/CHANGELOG.md +2440 -954
- package/node_modules/pi-lens/README.md +13 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +73 -18
- package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +21 -4
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +68 -16
- package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -1
- package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +37 -10
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +63 -0
- package/node_modules/pi-lens/dist/clients/atomic-write.js +114 -14
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +193 -23
- package/node_modules/pi-lens/dist/clients/biome-client.js +29 -25
- package/node_modules/pi-lens/dist/clients/bootstrap.js +11 -2
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +34 -0
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +192 -0
- package/node_modules/pi-lens/dist/clients/bus-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +47 -5
- package/node_modules/pi-lens/dist/clients/cache-manager.js +97 -9
- package/node_modules/pi-lens/dist/clients/cache-observability.js +301 -14
- package/node_modules/pi-lens/dist/clients/call-graph.js +449 -117
- package/node_modules/pi-lens/dist/clients/child-unref.js +85 -0
- package/node_modules/pi-lens/dist/clients/codebase-model.js +52 -23
- package/node_modules/pi-lens/dist/clients/collateral-test-role.js +40 -0
- package/node_modules/pi-lens/dist/clients/complexity-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +14 -0
- package/node_modules/pi-lens/dist/clients/cooperative-budget.js +42 -0
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +206 -0
- package/node_modules/pi-lens/dist/clients/debug-heap.js +167 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +153 -0
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +347 -75
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +61 -11
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +63 -20
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +23 -7
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +8 -18
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +8 -5
- package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +35 -0
- package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +17 -8
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +1085 -681
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +14 -0
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +11 -1
- package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +50 -0
- package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +135 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +23 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +5 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +154 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +14 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +4 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +9 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +4 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +163 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +37 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +13 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +3 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +277 -26
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +22 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +5 -4
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/durable-store.js +97 -0
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +94 -3
- package/node_modules/pi-lens/dist/clients/extension-log.js +139 -0
- package/node_modules/pi-lens/dist/clients/extension-mode.js +73 -0
- package/node_modules/pi-lens/dist/clients/file-kinds.js +57 -0
- package/node_modules/pi-lens/dist/clients/file-role.js +18 -3
- package/node_modules/pi-lens/dist/clients/file-utils.js +56 -34
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +16 -3
- package/node_modules/pi-lens/dist/clients/format-service.js +24 -8
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +8 -0
- package/node_modules/pi-lens/dist/clients/formatters.js +358 -61
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +148 -15
- package/node_modules/pi-lens/dist/clients/git-guard.js +681 -11
- package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +4 -0
- package/node_modules/pi-lens/dist/clients/go-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +8 -0
- package/node_modules/pi-lens/dist/clients/grammar-source.js +12 -4
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +21 -3
- package/node_modules/pi-lens/dist/clients/host-ports.js +31 -0
- package/node_modules/pi-lens/dist/clients/installer/index.js +390 -99
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +142 -172
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +31 -54
- package/node_modules/pi-lens/dist/clients/knip-client.js +15 -36
- package/node_modules/pi-lens/dist/clients/language-policy.js +14 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +13 -7
- package/node_modules/pi-lens/dist/clients/latency-logger.js +23 -1
- package/node_modules/pi-lens/dist/clients/lens-config.js +12 -1
- package/node_modules/pi-lens/dist/clients/lens-engine.js +86 -17
- package/node_modules/pi-lens/dist/clients/lens-events.js +27 -4
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +8 -0
- package/node_modules/pi-lens/dist/clients/lens-map.js +94 -19
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +30 -0
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/client.js +493 -48
- package/node_modules/pi-lens/dist/clients/lsp/config.js +13 -2
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +86 -0
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +1012 -121
- package/node_modules/pi-lens/dist/clients/lsp/index.js +1807 -780
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +32 -26
- package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +83 -0
- package/node_modules/pi-lens/dist/clients/lsp/server.js +196 -32
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +28 -4
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +8 -0
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +248 -0
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +123 -32
- package/node_modules/pi-lens/dist/clients/mcp/ipc.js +157 -24
- package/node_modules/pi-lens/dist/clients/mcp/session.js +216 -8
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +115 -0
- package/node_modules/pi-lens/dist/clients/metrics-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/metrics-history.js +2 -1
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +5 -0
- package/node_modules/pi-lens/dist/clients/module-report.js +168 -3
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +319 -118
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +1 -1
- package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +120 -5
- package/node_modules/pi-lens/dist/clients/path-utils.js +110 -9
- package/node_modules/pi-lens/dist/clients/pipeline.js +47 -13
- package/node_modules/pi-lens/dist/clients/print-mode.js +21 -0
- package/node_modules/pi-lens/dist/clients/project-changes.js +40 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +3 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +8 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +21 -1
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +86 -9
- package/node_modules/pi-lens/dist/clients/project-report.js +27 -13
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +175 -20
- package/node_modules/pi-lens/dist/clients/project-trust.js +181 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +18 -4
- package/node_modules/pi-lens/dist/clients/read-bridge.js +147 -0
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +159 -1
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +150 -29
- package/node_modules/pi-lens/dist/clients/read-guard.js +185 -4
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +70 -84
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +1122 -221
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +2 -1
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +21 -10
- package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +46 -0
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +57 -6
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +51 -3
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +30 -1
- package/node_modules/pi-lens/dist/clients/ruff-client.js +27 -44
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +107 -73
- package/node_modules/pi-lens/dist/clients/runtime-context.js +36 -12
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +74 -6
- package/node_modules/pi-lens/dist/clients/runtime-session.js +405 -117
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +71 -48
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +218 -23
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +237 -64
- package/node_modules/pi-lens/dist/clients/rust-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +777 -62
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/session-state-store.js +3 -2
- package/node_modules/pi-lens/dist/clients/sg-runner.js +284 -174
- package/node_modules/pi-lens/dist/clients/slow-fs.js +2 -1
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +224 -0
- package/node_modules/pi-lens/dist/clients/source-filter.js +184 -20
- package/node_modules/pi-lens/dist/clients/source-walker.js +66 -10
- package/node_modules/pi-lens/dist/clients/startup-scan.js +15 -16
- package/node_modules/pi-lens/dist/clients/startup-timing.js +1 -1
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +38 -8
- package/node_modules/pi-lens/dist/clients/tool-event.js +35 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +388 -39
- package/node_modules/pi-lens/dist/clients/tool-render.js +155 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +6 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +419 -50
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +21 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +7 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +7 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +44 -7
- package/node_modules/pi-lens/dist/clients/user-notify.js +51 -0
- package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +57 -0
- package/node_modules/pi-lens/dist/clients/warm-attach.js +33 -13
- package/node_modules/pi-lens/dist/clients/widget-state.js +300 -43
- package/node_modules/pi-lens/dist/clients/word-index.js +391 -64
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +89 -6
- package/node_modules/pi-lens/dist/index.js +49361 -36888
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +182 -29
- package/node_modules/pi-lens/dist/mcp/server.js +211 -44
- package/node_modules/pi-lens/dist/tools/ast-grep-search.js +93 -27
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +200 -36
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +153 -40
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -3
- package/node_modules/pi-lens/dist/tools/module-report.js +9 -0
- package/node_modules/pi-lens/docs/agent-guide.md +2 -2
- package/node_modules/pi-lens/docs/agent-tools.md +21 -10
- package/node_modules/pi-lens/docs/analysisall.md +192 -0
- package/node_modules/pi-lens/docs/api-ports-inventory.md +165 -0
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +5 -2
- package/node_modules/pi-lens/docs/durable-store-audit-1202.md +32 -0
- package/node_modules/pi-lens/docs/environment-variables.md +44 -0
- package/node_modules/pi-lens/docs/fable.md +27 -0
- package/node_modules/pi-lens/docs/features.md +31 -2
- package/node_modules/pi-lens/docs/globalconfig.md +45 -1
- package/node_modules/pi-lens/docs/language-coverage.md +4 -3
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +2 -2
- package/node_modules/pi-lens/docs/mcp.md +37 -4
- package/node_modules/pi-lens/docs/servercapabilities.md +3 -3
- package/node_modules/pi-lens/docs/settings.md +12 -1
- package/node_modules/pi-lens/docs/tools.md +4 -1
- package/node_modules/pi-lens/docs/usage.md +18 -0
- package/node_modules/pi-lens/package.json +10 -10
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-except-test.yml +49 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-host-path-in-win32-branch-test.yml +87 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-nested-links-test.yml +11 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-raw-json-store-write-test.yml +17 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-win32-isabsolute-for-qualification-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-except.yml +3 -15
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +25 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-nested-links.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +30 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +23 -0
- package/node_modules/pi-lens/rules/tree-sitter-queries/tsx/no-nested-links.yml +4 -6
- package/node_modules/pi-lens/rules/tree-sitter-queries/typescript/duplicate-function-arg.yml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +55 -2
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +25 -0
- package/node_modules/pi-mcp-adapter/README.md +34 -3
- package/node_modules/pi-mcp-adapter/agent-plugin-loader.ts +1 -1
- package/node_modules/pi-mcp-adapter/commands.ts +15 -7
- package/node_modules/pi-mcp-adapter/direct-tools.ts +54 -7
- package/node_modules/pi-mcp-adapter/host-html-template.ts +0 -8
- package/node_modules/pi-mcp-adapter/index.ts +8 -3
- package/node_modules/pi-mcp-adapter/init.ts +29 -5
- package/node_modules/pi-mcp-adapter/lifecycle.ts +0 -4
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +1 -2
- package/node_modules/pi-mcp-adapter/mcp-auth.ts +60 -2
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +45 -9
- package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +22 -20
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +27 -4
- package/node_modules/pi-mcp-adapter/npx-resolver.ts +81 -26
- package/node_modules/pi-mcp-adapter/package.json +3 -3
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +108 -26
- package/node_modules/pi-mcp-adapter/search-ranking.ts +86 -7
- package/node_modules/pi-mcp-adapter/server-manager.ts +36 -7
- package/node_modules/pi-mcp-adapter/session-recovery.ts +8 -2
- package/node_modules/pi-mcp-adapter/tool-approval.ts +48 -7
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +42 -4
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +138 -12
- package/node_modules/pi-mcp-adapter/types.ts +93 -27
- package/node_modules/pi-mcp-adapter/ui-server.ts +20 -1
- package/package.json +17 -13
- package/node_modules/pi-lens/dist/clients/ast-grep-parser.js +0 -86
- package/node_modules/pi-lens/dist/clients/lsp/interactive-install.js +0 -367
- package/node_modules/pi-lens/dist/clients/lsp/lsp-index.js +0 -10
- package/node_modules/pi-lens/dist/clients/lsp/server-strategies.js +0 -5
- package/node_modules/pi-lens/dist/clients/project-metadata.js +0 -690
- package/node_modules/pi-lens/dist/clients/source-groups.js +0 -96
- package/node_modules/pi-lens/dist/clients/startup-marker.js +0 -6
- package/node_modules/pi-lens/dist/clients/types.js +0 -11
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent"
|
|
12
12
|
import type { SubagentScheduler } from "../schedule.js"
|
|
13
13
|
import type { ScheduledSubagent } from "../types.js"
|
|
14
|
+
import { selectItem } from "./select-item.js"
|
|
14
15
|
|
|
15
16
|
/** Format an ISO timestamp as relative time ("in 4h", "2d ago", "—"). */
|
|
16
17
|
function relTime(iso: string | undefined, now = Date.now()): string {
|
|
@@ -88,16 +89,16 @@ export async function showSchedulesMenu(
|
|
|
88
89
|
return
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
// Numbered + item-paired: two jobs whose names agree in the first 18
|
|
93
|
+
// characters format identically, and matching the returned string back
|
|
94
|
+
// against a parallel label array cancelled whichever came first.
|
|
95
|
+
const job = await selectItem(
|
|
96
|
+
ctx.ui,
|
|
93
97
|
`Scheduled jobs (${jobs.length}) — select to cancel`,
|
|
94
|
-
|
|
98
|
+
jobs,
|
|
99
|
+
(j) => formatJob(j, scheduler),
|
|
95
100
|
)
|
|
96
|
-
if (!
|
|
97
|
-
|
|
98
|
-
const idx = labels.indexOf(choice)
|
|
99
|
-
if (idx < 0) return
|
|
100
|
-
const job = jobs[idx]
|
|
101
|
+
if (!job) return
|
|
101
102
|
|
|
102
103
|
const ok = await ctx.ui.confirm(
|
|
103
104
|
`Cancel "${job.name}"?`,
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* select-item.ts — pick an item from a list via `ctx.ui.select`, safely.
|
|
3
|
+
*
|
|
4
|
+
* Pi's dialog API is `select(title, options: string[]) => Promise<string | undefined>`:
|
|
5
|
+
* strings in, string out, with no index or value form. Callers therefore have to
|
|
6
|
+
* map the returned string back to the item it came from, and the obvious way —
|
|
7
|
+
* `labels.indexOf(choice)` over a parallel array — silently resolves to the
|
|
8
|
+
* FIRST match whenever two rows format identically. Row formatters here truncate
|
|
9
|
+
* (job names to 18 chars, agent descriptions to whatever fits), and the text they
|
|
10
|
+
* truncate is LLM-authored, so collisions are ordinary rather than exotic.
|
|
11
|
+
*
|
|
12
|
+
* This numbers every row, which makes the labels unique by construction — no
|
|
13
|
+
* data-dependent branch that only executes in the case nobody exercises — and
|
|
14
|
+
* keeps each label paired with its item so a later edit that sorts or filters
|
|
15
|
+
* between building and resolving cannot desync them.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** Minimal shape of the `ctx.ui` surface this needs. */
|
|
19
|
+
export interface SelectUI {
|
|
20
|
+
select(title: string, options: string[]): Promise<string | undefined>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Show a numbered picker and return the chosen item (not its label).
|
|
25
|
+
*
|
|
26
|
+
* Returns undefined when the user escapes, or when the returned string is not
|
|
27
|
+
* one we offered.
|
|
28
|
+
*/
|
|
29
|
+
export async function selectItem<T>(
|
|
30
|
+
ui: SelectUI,
|
|
31
|
+
title: string,
|
|
32
|
+
items: readonly T[],
|
|
33
|
+
format: (item: T, index: number) => string,
|
|
34
|
+
): Promise<T | undefined> {
|
|
35
|
+
// Pad the number so a 10+ item list keeps its columns aligned.
|
|
36
|
+
const width = String(items.length).length
|
|
37
|
+
const rows = items.map((item, i) => ({
|
|
38
|
+
item,
|
|
39
|
+
label: `${String(i + 1).padStart(width)}. ${format(item, i)}`,
|
|
40
|
+
}))
|
|
41
|
+
|
|
42
|
+
const choice = await ui.select(
|
|
43
|
+
title,
|
|
44
|
+
rows.map((r) => r.label),
|
|
45
|
+
)
|
|
46
|
+
if (!choice) return undefined
|
|
47
|
+
return rows.find((r) => r.label === choice)?.item
|
|
48
|
+
}
|
|
@@ -18,6 +18,13 @@ adapts to the size of your terminal.
|
|
|
18
18
|
| `Ctrl+U` | Clear the current custom-answer draft. | `Type something.` input |
|
|
19
19
|
| `Ctrl+]` | Collapse or expand the dialog. Configurable via `collapseKey`. | Everywhere, including while collapsed |
|
|
20
20
|
|
|
21
|
+
The table names the default keys; the dialog actually follows your Pi keybindings.
|
|
22
|
+
Confirm listens to both `tui.select.confirm` and `tui.input.submit`, and a key bound to
|
|
23
|
+
`tui.input.newLine` always inserts a newline even if it also matches confirm. So a
|
|
24
|
+
Slack-style configuration — `enter` folded into `tui.input.newLine`, submit moved to
|
|
25
|
+
`ctrl+enter` — keeps working: `enter` breaks lines, and your submit key confirms
|
|
26
|
+
everywhere `Enter` does.
|
|
27
|
+
|
|
21
28
|
In a multi-select question, `Enter` on a regular row toggles its checkbox exactly like
|
|
22
29
|
`Space` — it does not submit. Committing the question means focusing the `Next` row and
|
|
23
30
|
pressing `Enter`. That is deliberate: it makes `Enter` a zero-cost way to flip boxes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juicesharp/rpiv-ask-user-question",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.2",
|
|
4
4
|
"description": "Pi extension. A structured questionnaire the model can put to you when it would otherwise guess, with typed options instead of free-form replies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
|
-
"@juicesharp/rpiv-config": "^2.
|
|
96
|
+
"@juicesharp/rpiv-config": "^2.5.2",
|
|
97
97
|
"typebox": "^1.1.24"
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -130,6 +130,13 @@ class QuestionnaireBuilder {
|
|
|
130
130
|
const textEditorTheme = editorTheme(this.theme);
|
|
131
131
|
this.notesInput = new Editor(this.tui, textEditorTheme);
|
|
132
132
|
this.inlineInput = new Editor(this.tui, textEditorTheme);
|
|
133
|
+
// The key router owns confirm/submit semantics; keys reaching these headless
|
|
134
|
+
// editors are text-editing only. Without this, a `tui.input.submit` match inside
|
|
135
|
+
// Editor.handleInput would run submitValue(), which resets the buffer and
|
|
136
|
+
// silently destroys the draft — no onSubmit is wired here, so the text is
|
|
137
|
+
// unrecoverable (#156).
|
|
138
|
+
this.notesInput.disableSubmit = true;
|
|
139
|
+
this.inlineInput.disableSubmit = true;
|
|
133
140
|
}
|
|
134
141
|
|
|
135
142
|
build(): QuestionnaireBuilt {
|
|
@@ -6,6 +6,7 @@ import type { QuestionnaireRuntime, QuestionnaireState } from "./state.js";
|
|
|
6
6
|
const KEYBIND_UP = "tui.select.up";
|
|
7
7
|
const KEYBIND_DOWN = "tui.select.down";
|
|
8
8
|
const KEYBIND_CONFIRM = "tui.select.confirm";
|
|
9
|
+
const KEYBIND_SUBMIT = "tui.input.submit";
|
|
9
10
|
const KEYBIND_CANCEL = "tui.select.cancel";
|
|
10
11
|
const KEYBIND_NEW_LINE = "tui.input.newLine";
|
|
11
12
|
const KEYBIND_EDITOR_UP = "tui.editor.cursorUp";
|
|
@@ -39,6 +40,16 @@ export interface QuestionnaireKeybindings {
|
|
|
39
40
|
matches(data: string, name: string): boolean;
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
// Confirm has two semantic sources: `tui.select.confirm` (the select-list default)
|
|
44
|
+
// and `tui.input.submit` (the user's "send" key). A Slack-style configuration folds
|
|
45
|
+
// `enter` into `tui.input.newLine` and moves submit elsewhere (e.g. `ctrl+enter`);
|
|
46
|
+
// the newline checks below stay first, so without the submit source every confirm
|
|
47
|
+
// branch would be shadowed by the collision and no key could confirm (#156). With
|
|
48
|
+
// pi defaults both names resolve to `enter`, so matching either is equivalent.
|
|
49
|
+
function isConfirm(kb: QuestionnaireKeybindings, data: string): boolean {
|
|
50
|
+
return kb.matches(data, KEYBIND_CONFIRM) || kb.matches(data, KEYBIND_SUBMIT);
|
|
51
|
+
}
|
|
52
|
+
|
|
42
53
|
export function wrapTab(index: number, total: number): number {
|
|
43
54
|
if (total <= 0) return 0;
|
|
44
55
|
return ((index % total) + total) % total;
|
|
@@ -183,7 +194,7 @@ export function routeKey(data: string, state: QuestionnaireState, runtime: Quest
|
|
|
183
194
|
if (state.notesVisible) {
|
|
184
195
|
if (kb.matches(data, KEYBIND_CANCEL)) return { kind: "notes_exit" };
|
|
185
196
|
if (kb.matches(data, KEYBIND_NEW_LINE)) return { kind: "notes_forward", data };
|
|
186
|
-
if (kb
|
|
197
|
+
if (isConfirm(kb, data)) return { kind: "notes_exit" };
|
|
187
198
|
return { kind: "notes_forward", data };
|
|
188
199
|
}
|
|
189
200
|
|
|
@@ -191,7 +202,7 @@ export function routeKey(data: string, state: QuestionnaireState, runtime: Quest
|
|
|
191
202
|
// Newline takes precedence over confirmation if a user configuration binds
|
|
192
203
|
// the same physical key to both semantic actions.
|
|
193
204
|
if (kb.matches(data, KEYBIND_NEW_LINE)) return { kind: "ignore" };
|
|
194
|
-
if (kb
|
|
205
|
+
if (isConfirm(kb, data)) {
|
|
195
206
|
const answer = buildSingleSelectAnswer(state, runtime);
|
|
196
207
|
if (!answer) return { kind: "ignore" };
|
|
197
208
|
return { kind: "confirm", answer, autoAdvanceTab: computeAutoAdvanceTab(state, runtime) };
|
|
@@ -219,7 +230,7 @@ export function routeKey(data: string, state: QuestionnaireState, runtime: Quest
|
|
|
219
230
|
const next = wrapTab(state.submitChoiceIndex + delta, 2);
|
|
220
231
|
return { kind: "submit_nav", nextIndex: (next === 1 ? 1 : 0) as 0 | 1 };
|
|
221
232
|
}
|
|
222
|
-
if (kb
|
|
233
|
+
if (isConfirm(kb, data)) {
|
|
223
234
|
// D1 (revised): Submit always submits; Cancel always cancels. The warning header
|
|
224
235
|
// is informational only — `allAnswered(state)` no longer gates submission. Partial
|
|
225
236
|
// answers flow through `orderedAnswers()` in the host.
|
|
@@ -265,7 +276,7 @@ export function routeKey(data: string, state: QuestionnaireState, runtime: Quest
|
|
|
265
276
|
if (focusedMeta?.activatesInputMode) return { kind: "ignore" };
|
|
266
277
|
return { kind: "toggle", index: state.optionIndex };
|
|
267
278
|
}
|
|
268
|
-
if (kb
|
|
279
|
+
if (isConfirm(kb, data)) {
|
|
269
280
|
// Enter on the "Type something." row is handled by the inputMode block above
|
|
270
281
|
// (→ confirm kind:"custom"). Defensive: never enter the toggle/multi_confirm
|
|
271
282
|
// path for an inputMode-activating row.
|
|
@@ -289,7 +300,7 @@ export function routeKey(data: string, state: QuestionnaireState, runtime: Quest
|
|
|
289
300
|
return { kind: "ignore" };
|
|
290
301
|
}
|
|
291
302
|
|
|
292
|
-
if (kb
|
|
303
|
+
if (isConfirm(kb, data)) {
|
|
293
304
|
const answer = buildSingleSelectAnswer(state, runtime);
|
|
294
305
|
if (!answer) return { kind: "ignore" };
|
|
295
306
|
return { kind: "confirm", answer, autoAdvanceTab: computeAutoAdvanceTab(state, runtime) };
|
|
@@ -139,7 +139,9 @@ export class QuestionnaireSession {
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
private mirrorNotesDraft(s: QuestionnaireState): QuestionnaireState {
|
|
142
|
-
|
|
142
|
+
// Drafts restore through Editor.setText, which clears the backing paste map —
|
|
143
|
+
// read expanded so stored drafts never orphan a paste marker.
|
|
144
|
+
const draft = this.notesInput.getExpandedText?.() ?? this.notesInput.getText();
|
|
143
145
|
return s.notesDraft === draft ? s : { ...s, notesDraft: draft };
|
|
144
146
|
}
|
|
145
147
|
|
|
@@ -202,7 +204,7 @@ export class QuestionnaireSession {
|
|
|
202
204
|
const lastLine = this.inlineInput.getLines().length - 1;
|
|
203
205
|
return {
|
|
204
206
|
keybindings: this.keybindings,
|
|
205
|
-
inputBuffer: this.inlineInput.getText(),
|
|
207
|
+
inputBuffer: this.inlineInput.getExpandedText?.() ?? this.inlineInput.getText(),
|
|
206
208
|
canMoveInputUp: cursor.line > 0,
|
|
207
209
|
canMoveInputDown: cursor.line < lastLine,
|
|
208
210
|
questions: this.questions,
|
|
@@ -58,14 +58,15 @@ Examples:
|
|
|
58
58
|
/btw is this API name idiomatic?
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
Running `/btw` alone opens a menu with **Start side thread** selected first.
|
|
62
|
-
session has non-empty side threads in memory, **Resume side thread** opens a bounded choice list
|
|
61
|
+
Running `/btw` alone opens a menu with **Start side thread** selected first.
|
|
62
|
+
When the current Pi session has non-empty side threads in memory, **Resume side thread** opens a bounded searchable choice list.
|
|
63
|
+
Search matches the displayed first question and question count while returning the thread's raw in-memory ID.
|
|
63
64
|
**Settings** changes the starting thinking level and whether shortcut changes are remembered.
|
|
64
|
-
Each Resume row keeps the first question as its fixed title, shows its question count, and the list
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
terminal view.
|
|
65
|
+
Each Resume row keeps the first question as its fixed title, shows its question count, and the list is ordered by the newest recorded answer or visible error.
|
|
66
|
+
Opening and closing a thread without a new result does not reorder it.
|
|
67
|
+
`/btw <question>` bypasses this menu and always starts a fresh side thread.
|
|
68
|
+
Its answer opens above the side-thread editor.
|
|
69
|
+
The side thread uses a dedicated full-screen terminal view.
|
|
69
70
|
The main agent continues running in the background, but its screen rendering stays suspended until
|
|
70
71
|
`/btw` closes, so new main-thread output cannot move a mouse selection inside the side thread.
|
|
71
72
|
Drag the primary mouse button across side-thread text to select and copy it through Pi's terminal
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@narumitw/pi-btw",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.51.0",
|
|
4
4
|
"description": "Pi extension that adds a /btw side-question command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"directory": "packages/pi-btw"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@narumitw/pi-tui-kit": "^0.
|
|
46
|
+
"@narumitw/pi-tui-kit": "^0.54.0"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@earendil-works/pi-ai": "*",
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.5.1](https://github.com/wobondar/pi-footer/compare/v0.5.0...v0.5.1) (2026-08-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Dependencies
|
|
7
|
+
|
|
8
|
+
* **deps-dev:** bump oxfmt from 0.59.0 to 0.60.0 ([#59](https://github.com/wobondar/pi-footer/issues/59)) ([0efe7d7](https://github.com/wobondar/pi-footer/commit/0efe7d7ab686ddbe1e5c0999522e91d9fe6f85c0))
|
|
9
|
+
* **deps-dev:** bump oxfmt from 0.60.0 to 0.61.0 ([#65](https://github.com/wobondar/pi-footer/issues/65)) ([a97e9c5](https://github.com/wobondar/pi-footer/commit/a97e9c59d242aa163880f1deb4c92e077a45003e))
|
|
10
|
+
* **deps-dev:** bump oxlint from 1.74.0 to 1.75.0 ([#61](https://github.com/wobondar/pi-footer/issues/61)) ([ad8721b](https://github.com/wobondar/pi-footer/commit/ad8721b2d55a38037457730dfa19e8ea1d164474))
|
|
11
|
+
* **deps-dev:** bump oxlint from 1.75.0 to 1.76.0 ([#64](https://github.com/wobondar/pi-footer/issues/64)) ([9fa9d68](https://github.com/wobondar/pi-footer/commit/9fa9d68b1f98c16ba3589815e5fc0a398baedcfd))
|
|
12
|
+
* **deps-dev:** bump oxlint-tsgolint from 0.25.0 to 7.0.2001 ([#60](https://github.com/wobondar/pi-footer/issues/60)) ([893f562](https://github.com/wobondar/pi-footer/commit/893f5629eef911285dda7d2c90e3dca59ed5f9a8))
|
|
13
|
+
* **deps-dev:** bump postcss from 8.5.17 to 8.5.23 ([#62](https://github.com/wobondar/pi-footer/issues/62)) ([a1cc8dd](https://github.com/wobondar/pi-footer/commit/a1cc8dd9719f55d46db35af8520de219fc49bc3c))
|
|
14
|
+
* **deps-dev:** bump typescript from 6.0.3 to 7.0.2 ([#50](https://github.com/wobondar/pi-footer/issues/50)) ([d4f6dff](https://github.com/wobondar/pi-footer/commit/d4f6dff394bb3f77c7c4abd488ab0bd6783678d7))
|
|
15
|
+
* **deps:** bump @earendil-works/pi-coding-agent from 0.80.3 to 0.83.0 ([#67](https://github.com/wobondar/pi-footer/issues/67)) ([126d938](https://github.com/wobondar/pi-footer/commit/126d938e9c211caee59d16c39abe5a8cd53d22a7))
|
|
16
|
+
* **deps:** bump chalk from 5.6.2 to 6.0.0 ([#63](https://github.com/wobondar/pi-footer/issues/63)) ([fe399b8](https://github.com/wobondar/pi-footer/commit/fe399b86d97b48bc6f391345ddc77b5419033efb))
|
|
17
|
+
|
|
18
|
+
## [0.5.0](https://github.com/wobondar/pi-footer/compare/v0.4.2...v0.5.0) (2026-07-23)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
* add cache hit rate widget ([#57](https://github.com/wobondar/pi-footer/issues/57)) ([edce7d2](https://github.com/wobondar/pi-footer/commit/edce7d29f0ae48ddde4ff9cf3247f0a6dbd82676))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Dependencies
|
|
27
|
+
|
|
28
|
+
* **deps-dev:** bump @vitest/coverage-v8 from 4.1.9 to 4.1.10 ([#48](https://github.com/wobondar/pi-footer/issues/48)) ([66236c0](https://github.com/wobondar/pi-footer/commit/66236c04ac8c13da532bc38878751d64a10881a7))
|
|
29
|
+
* **deps-dev:** bump oxfmt from 0.57.0 to 0.58.0 ([#49](https://github.com/wobondar/pi-footer/issues/49)) ([d0d0ebb](https://github.com/wobondar/pi-footer/commit/d0d0ebbcd5540275fb3d9580004419393588599e))
|
|
30
|
+
* **deps-dev:** bump oxfmt from 0.58.0 to 0.59.0 ([#55](https://github.com/wobondar/pi-footer/issues/55)) ([71bc5cf](https://github.com/wobondar/pi-footer/commit/71bc5cf53955fa4f077b0593d966bc95fb27b971))
|
|
31
|
+
* **deps-dev:** bump oxlint from 1.72.0 to 1.73.0 ([#52](https://github.com/wobondar/pi-footer/issues/52)) ([5ce5632](https://github.com/wobondar/pi-footer/commit/5ce56329002c7854e4c527e38c095bfd0232c29e))
|
|
32
|
+
* **deps-dev:** bump oxlint from 1.73.0 to 1.74.0 ([#54](https://github.com/wobondar/pi-footer/issues/54)) ([6ccfccd](https://github.com/wobondar/pi-footer/commit/6ccfccd6272fdb1f8dbf405c88de04832d24f6e0))
|
|
33
|
+
* **deps-dev:** bump oxlint-tsgolint from 0.24.0 to 0.25.0 ([#56](https://github.com/wobondar/pi-footer/issues/56)) ([a138fc8](https://github.com/wobondar/pi-footer/commit/a138fc8e794c649134a6bbae1c85d32abf6898be))
|
|
34
|
+
* **deps-dev:** bump vitest from 4.1.9 to 4.1.10 ([#51](https://github.com/wobondar/pi-footer/issues/51)) ([6408e67](https://github.com/wobondar/pi-footer/commit/6408e6769cc07cc8f33661eba24583330be87ab9))
|
|
35
|
+
* **deps:** bump actions/setup-node from 6 to 7 ([#53](https://github.com/wobondar/pi-footer/issues/53)) ([bee2dfb](https://github.com/wobondar/pi-footer/commit/bee2dfbbd97ade2f3266503fb7db70e1dbdebaf8))
|
|
36
|
+
|
|
37
|
+
## [0.4.2](https://github.com/wobondar/pi-footer/compare/v0.4.1...v0.4.2) (2026-07-01)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Dependencies
|
|
41
|
+
|
|
42
|
+
* **deps-dev:** bump @types/node from 25.9.1 to 26.0.0 ([#39](https://github.com/wobondar/pi-footer/issues/39)) ([fc53522](https://github.com/wobondar/pi-footer/commit/fc53522b3fa0a528b201bd8baa0e8d6039cde11c))
|
|
43
|
+
* **deps-dev:** bump @types/node from 26.0.0 to 26.1.0 ([#42](https://github.com/wobondar/pi-footer/issues/42)) ([1ef23c8](https://github.com/wobondar/pi-footer/commit/1ef23c849166e5fc0163d4bd5541f29890a8a0fc))
|
|
44
|
+
* **deps-dev:** bump @vitest/coverage-v8 from 4.1.8 to 4.1.9 ([#41](https://github.com/wobondar/pi-footer/issues/41)) ([d660601](https://github.com/wobondar/pi-footer/commit/d660601e3d83ca0c0074d6b170d131ed62c73a48))
|
|
45
|
+
* **deps-dev:** bump oxfmt from 0.53.0 to 0.54.0 ([#32](https://github.com/wobondar/pi-footer/issues/32)) ([89d4bdb](https://github.com/wobondar/pi-footer/commit/89d4bdbfa21965843f9b6e18953963b0bf5d33d6))
|
|
46
|
+
* **deps-dev:** bump oxfmt from 0.54.0 to 0.55.0 ([#37](https://github.com/wobondar/pi-footer/issues/37)) ([5aaa074](https://github.com/wobondar/pi-footer/commit/5aaa0746608a88e6393c44c30ddcf289d27eedfe))
|
|
47
|
+
* **deps-dev:** bump oxfmt from 0.55.0 to 0.57.0 ([#45](https://github.com/wobondar/pi-footer/issues/45)) ([d4733d5](https://github.com/wobondar/pi-footer/commit/d4733d5e3533ac7d05509fd523af9052ac04bc40))
|
|
48
|
+
* **deps-dev:** bump oxlint from 1.68.0 to 1.69.0 ([#33](https://github.com/wobondar/pi-footer/issues/33)) ([f31d05f](https://github.com/wobondar/pi-footer/commit/f31d05f50c663328b483e3e05286ed9739c833de))
|
|
49
|
+
* **deps-dev:** bump oxlint from 1.69.0 to 1.70.0 ([#40](https://github.com/wobondar/pi-footer/issues/40)) ([405b880](https://github.com/wobondar/pi-footer/commit/405b880960684e5021cc3ea85de1396ad28d9c3b))
|
|
50
|
+
* **deps-dev:** bump oxlint from 1.70.0 to 1.72.0 ([#43](https://github.com/wobondar/pi-footer/issues/43)) ([6ef9cc5](https://github.com/wobondar/pi-footer/commit/6ef9cc5894b82406abbc8f4e6ad91f4607f15714))
|
|
51
|
+
* **deps-dev:** bump oxlint-tsgolint from 0.23.0 to 0.24.0 ([#44](https://github.com/wobondar/pi-footer/issues/44)) ([a75ad99](https://github.com/wobondar/pi-footer/commit/a75ad998f87f46ea2e624fcf698a202c0eb82a3d))
|
|
52
|
+
* **deps-dev:** bump vitest from 4.1.8 to 4.1.9 ([#38](https://github.com/wobondar/pi-footer/issues/38)) ([c47b551](https://github.com/wobondar/pi-footer/commit/c47b551f99bd50765537ab122f7b48576c05123a))
|
|
53
|
+
* **deps:** bump @earendil-works/pi-coding-agent and related pkgs to 0.80.3 ([#46](https://github.com/wobondar/pi-footer/issues/46)) ([62f4aef](https://github.com/wobondar/pi-footer/commit/62f4aefead342afec04b3150979039c7cf0e98e8))
|
|
54
|
+
* **deps:** bump @earendil-works/pi-coding-agent from 0.74.0 to 0.79.8 ([#35](https://github.com/wobondar/pi-footer/issues/35)) ([e8ac663](https://github.com/wobondar/pi-footer/commit/e8ac663bad29ad9195dce2da8189d6e61b8e1e9d))
|
|
55
|
+
* **deps:** bump actions/checkout from 6 to 7 ([#36](https://github.com/wobondar/pi-footer/issues/36)) ([3aad8f4](https://github.com/wobondar/pi-footer/commit/3aad8f40598c4ba6cdbc79155f7f3d7f26f84323))
|
|
56
|
+
|
|
57
|
+
## [0.4.1](https://github.com/wobondar/pi-footer/compare/v0.4.0...v0.4.1) (2026-06-11)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
### Bug Fixes
|
|
61
|
+
|
|
62
|
+
* **ci:** merge smoke jobs, add PR trigger with trimmed matrix ([#31](https://github.com/wobondar/pi-footer/issues/31)) ([e1911a2](https://github.com/wobondar/pi-footer/commit/e1911a286aae2e913fa54a6ec8efc20de5a6a208))
|
|
63
|
+
* refactor widget context and simplify clone settings ([#30](https://github.com/wobondar/pi-footer/issues/30)) ([6ce2973](https://github.com/wobondar/pi-footer/commit/6ce2973dbbc0294ddfec5cac0bd9a468c942c09f))
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
### Dependencies
|
|
67
|
+
|
|
68
|
+
* **deps-dev:** bump @vitest/coverage-v8 from 4.1.7 to 4.1.8 ([#25](https://github.com/wobondar/pi-footer/issues/25)) ([61fb783](https://github.com/wobondar/pi-footer/commit/61fb783d42fd3552db818864548bcfc506263e8b))
|
|
69
|
+
* **deps-dev:** bump oxfmt from 0.52.0 to 0.53.0 ([#24](https://github.com/wobondar/pi-footer/issues/24)) ([9b36f14](https://github.com/wobondar/pi-footer/commit/9b36f148ad5b7d6261a92c59721853e404c15493))
|
|
70
|
+
* **deps-dev:** bump oxlint from 1.67.0 to 1.68.0 ([#26](https://github.com/wobondar/pi-footer/issues/26)) ([0817eb9](https://github.com/wobondar/pi-footer/commit/0817eb9d8fb80c87fba726fa372135c5ba568875))
|
|
71
|
+
* **deps-dev:** bump vitest from 4.1.7 to 4.1.8 ([#27](https://github.com/wobondar/pi-footer/issues/27)) ([ea1d50c](https://github.com/wobondar/pi-footer/commit/ea1d50c64e7710333240d1a9cf182a17e312c032))
|
|
72
|
+
|
|
73
|
+
## [0.4.0](https://github.com/wobondar/pi-footer/compare/v0.3.0...v0.4.0) (2026-06-04)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
### Features
|
|
77
|
+
|
|
78
|
+
* widget containers and modular widget registry ([#23](https://github.com/wobondar/pi-footer/issues/23)) ([8f9e4bb](https://github.com/wobondar/pi-footer/commit/8f9e4bb66b75a2c70621390d1bddcf1a0bbc1edc))
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
### Bug Fixes
|
|
82
|
+
|
|
83
|
+
* enable manual triggering of release workflow ([0c1f8d8](https://github.com/wobondar/pi-footer/commit/0c1f8d84e41f4224a6e0dc131ab665610dd489ca))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
### Dependencies
|
|
87
|
+
|
|
88
|
+
* **deps-dev:** bump @types/node from 25.6.2 to 25.8.0 ([#9](https://github.com/wobondar/pi-footer/issues/9)) ([aed1f36](https://github.com/wobondar/pi-footer/commit/aed1f36746ee78d05500a6266ffb67a943cbbf1c))
|
|
89
|
+
* **deps-dev:** bump @types/node from 25.8.0 to 25.9.1 ([#12](https://github.com/wobondar/pi-footer/issues/12)) ([935a1f4](https://github.com/wobondar/pi-footer/commit/935a1f4f2f630c29ab662ea12a0a5c14d1e3460a))
|
|
90
|
+
* **deps-dev:** bump @vitest/coverage-v8 from 4.1.5 to 4.1.6 ([#10](https://github.com/wobondar/pi-footer/issues/10)) ([38f988c](https://github.com/wobondar/pi-footer/commit/38f988c476dc41116f5880c5d6a64fdb82c19258))
|
|
91
|
+
* **deps-dev:** bump @vitest/coverage-v8 from 4.1.6 to 4.1.7 ([#17](https://github.com/wobondar/pi-footer/issues/17)) ([55cb502](https://github.com/wobondar/pi-footer/commit/55cb5023a084fb42bebce5bb48399e51ac246a46))
|
|
92
|
+
* **deps-dev:** bump oxfmt from 0.48.0 to 0.50.0 ([#7](https://github.com/wobondar/pi-footer/issues/7)) ([e0f7d89](https://github.com/wobondar/pi-footer/commit/e0f7d89b9bee8dd3b5a7a935b9e9dc1e4e55cfb1))
|
|
93
|
+
* **deps-dev:** bump oxfmt from 0.50.0 to 0.51.0 ([#13](https://github.com/wobondar/pi-footer/issues/13)) ([1de1845](https://github.com/wobondar/pi-footer/commit/1de184546fa60af0ee03477d02f0f1ce2be59d80))
|
|
94
|
+
* **deps-dev:** bump oxfmt from 0.51.0 to 0.52.0 ([#21](https://github.com/wobondar/pi-footer/issues/21)) ([9fa53f2](https://github.com/wobondar/pi-footer/commit/9fa53f28403f5f85b84714e7411c77a55ae17f02))
|
|
95
|
+
* **deps-dev:** bump oxlint from 1.63.0 to 1.65.0 ([#8](https://github.com/wobondar/pi-footer/issues/8)) ([e3d6c2e](https://github.com/wobondar/pi-footer/commit/e3d6c2ef81dea916edf09191b6ac369992bc1179))
|
|
96
|
+
* **deps-dev:** bump oxlint from 1.65.0 to 1.66.0 ([#16](https://github.com/wobondar/pi-footer/issues/16)) ([1dc7296](https://github.com/wobondar/pi-footer/commit/1dc72966836b5c64d9e7913eac16514a8fa12bde))
|
|
97
|
+
* **deps-dev:** bump oxlint from 1.66.0 to 1.67.0 ([#22](https://github.com/wobondar/pi-footer/issues/22)) ([5910539](https://github.com/wobondar/pi-footer/commit/5910539484e313455b982d7b0df82a1096ba6838))
|
|
98
|
+
* **deps-dev:** bump oxlint-tsgolint from 0.22.1 to 0.23.0 ([#14](https://github.com/wobondar/pi-footer/issues/14)) ([0178315](https://github.com/wobondar/pi-footer/commit/0178315dac50583b92d2da17524428292dc4f12f))
|
|
99
|
+
* **deps-dev:** bump vitest from 4.1.6 to 4.1.7 ([#15](https://github.com/wobondar/pi-footer/issues/15)) ([f06570a](https://github.com/wobondar/pi-footer/commit/f06570a17ee4acd59bbe3530bb7510cedc4685b0))
|
|
100
|
+
* **deps:** bump protobufjs from 7.5.7 to 7.6.1 ([#18](https://github.com/wobondar/pi-footer/issues/18)) ([cbd496b](https://github.com/wobondar/pi-footer/commit/cbd496b7a61e9fcfc888ad97bf591d6c187297ca))
|
|
101
|
+
* **deps:** bump ws from 8.20.0 to 8.21.0 ([#19](https://github.com/wobondar/pi-footer/issues/19)) ([3ff5247](https://github.com/wobondar/pi-footer/commit/3ff52474e84a54aa3823a7d0be162e4993426f52))
|
|
102
|
+
|
|
103
|
+
## [0.3.0](https://github.com/wobondar/pi-footer/compare/v0.2.1...v0.3.0) (2026-05-10)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
### Features
|
|
107
|
+
|
|
108
|
+
* enhance git info caching ([3963e69](https://github.com/wobondar/pi-footer/commit/3963e69286f95514df212acae69470d4d9fea00a))
|
|
109
|
+
|
|
110
|
+
## [0.2.1](https://github.com/wobondar/pi-footer/compare/v0.2.0...v0.2.1) (2026-05-10)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
### Bug Fixes
|
|
114
|
+
|
|
115
|
+
* update image links to use raw GitHub URLs ([804c8c2](https://github.com/wobondar/pi-footer/commit/804c8c2a91224604dd4177eb6b9ea0e9ff9b0af7))
|
|
116
|
+
|
|
117
|
+
## [0.2.0](https://github.com/wobondar/pi-footer/compare/v0.1.0...v0.2.0) (2026-05-10)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
### Features
|
|
121
|
+
|
|
122
|
+
* rebrand to pi-footer due to npm similarity with existing package ([cceba8c](https://github.com/wobondar/pi-footer/commit/cceba8ce838d7f4fc4b2653d5bfeea4f39eb19f2))
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
### Bug Fixes
|
|
126
|
+
|
|
127
|
+
* enable npm publish with provenance ([39e3709](https://github.com/wobondar/pi-footer/commit/39e3709c769a7911b4c1fb0ea79759e67e55b29c))
|
|
128
|
+
|
|
129
|
+
## [0.1.0](https://github.com/wobondar/pi-footer/compare/v0.0.1...v0.1.0) (2026-05-09)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
### Features
|
|
133
|
+
|
|
134
|
+
* initial extension ([8998c7b](https://github.com/wobondar/pi-footer/commit/8998c7b44dc6b91b069a46a265d2e5466f3d41fe))
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
### Bug Fixes
|
|
138
|
+
|
|
139
|
+
* embed video ([02f0668](https://github.com/wobondar/pi-footer/commit/02f0668bb75eed7a343454c277e83d92b65533f9))
|
|
140
|
+
* replace video embed with tag ([e79d2c4](https://github.com/wobondar/pi-footer/commit/e79d2c45b80be96321d5ecd2de67e7d14e0f16fc))
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
### Dependencies
|
|
144
|
+
|
|
145
|
+
* **deps-dev:** bump oxfmt from 0.47.0 to 0.48.0 ([#2](https://github.com/wobondar/pi-footer/issues/2)) ([d82e354](https://github.com/wobondar/pi-footer/commit/d82e3548ee6a839867ec066fd3dc4088da436769))
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 wobondar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|