@herbertgao/pi-extensions 2026.8.11 → 2026.8.13
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 +23 -10
- package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
- package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
- package/node_modules/@czottmann/pi-automode/README.md +5 -3
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
- package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
- package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
- package/node_modules/@czottmann/pi-automode/package.json +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
- package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
- package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
- package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
- package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
- package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
- package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
- package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
- package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
- package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
- package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
- package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
- package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
- package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
- package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
- package/node_modules/@narumitw/pi-btw/package.json +6 -6
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
- package/node_modules/@tifan/pi-handoff/package.json +43 -0
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
- package/node_modules/@tifan/pi-recap/package.json +42 -0
- package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
- package/node_modules/@tifan/pi-rename/package.json +47 -0
- package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
- package/node_modules/pi-lens/CHANGELOG.md +96 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
- package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
- package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
- package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
- package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
- package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
- package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
- package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
- package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
- package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
- package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
- package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
- package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
- package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
- package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
- package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
- package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
- package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
- package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
- package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
- package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
- package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
- package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
- package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
- package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
- package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
- package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
- package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
- package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
- package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
- package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
- package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
- package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
- package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
- package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
- package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
- package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
- package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
- package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
- package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
- package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
- package/node_modules/pi-lens/dist/i18n.js +13 -5
- package/node_modules/pi-lens/dist/index.js +10797 -8627
- package/node_modules/pi-lens/dist/mcp/server.js +3 -1
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
- package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
- package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
- package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
- package/node_modules/pi-lens/package.json +160 -156
- package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
- package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
- package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
- package/node_modules/pi-mcp-adapter/README.md +42 -13
- package/node_modules/pi-mcp-adapter/commands.ts +4 -2
- package/node_modules/pi-mcp-adapter/config.ts +45 -5
- package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
- package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
- package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
- package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
- package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
- package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
- package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
- package/node_modules/pi-mcp-adapter/index.ts +204 -82
- package/node_modules/pi-mcp-adapter/init.ts +41 -30
- package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
- package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
- package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
- package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
- package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
- package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
- package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
- package/node_modules/pi-mcp-adapter/package.json +24 -6
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
- package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
- package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
- package/node_modules/pi-mcp-adapter/state.ts +1 -3
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
- package/node_modules/pi-mcp-adapter/types.ts +48 -1
- package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
- package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
- package/node_modules/pi-mcp-adapter/utils.ts +21 -19
- package/node_modules/pi-web-access/CHANGELOG.md +26 -0
- package/node_modules/pi-web-access/README.md +71 -14
- package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
- package/node_modules/pi-web-access/credential-source.ts +6 -2
- package/node_modules/pi-web-access/curator-page.ts +5 -3
- package/node_modules/pi-web-access/curator-server.ts +2 -1
- package/node_modules/pi-web-access/extract.ts +89 -9
- package/node_modules/pi-web-access/fetch-params.ts +13 -0
- package/node_modules/pi-web-access/gemini-adc.ts +298 -0
- package/node_modules/pi-web-access/gemini-api.ts +59 -15
- package/node_modules/pi-web-access/gemini-search.ts +58 -18
- package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
- package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
- package/node_modules/pi-web-access/gemini-web.ts +9 -3
- package/node_modules/pi-web-access/github-api.ts +5 -4
- package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
- package/node_modules/pi-web-access/index.ts +403 -297
- package/node_modules/pi-web-access/kimi-search.ts +234 -0
- package/node_modules/pi-web-access/openai-search.ts +118 -21
- package/node_modules/pi-web-access/package.json +3 -2
- package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
- package/node_modules/pi-web-access/utils.ts +307 -1
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +46 -37
- package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
- package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
- package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
- package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
- package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
- package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
- package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/package.json +0 -55
- package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-rename/package.json +0 -63
- package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
- package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
- /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
|
@@ -35,12 +35,7 @@ function getModelKey(provider: string, modelId: string): string {
|
|
|
35
35
|
|
|
36
36
|
function readSettings(): PiSettings {
|
|
37
37
|
const content = readFileSync(SETTINGS_PATH, "utf8")
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
settings = JSON.parse(content)
|
|
41
|
-
} catch {
|
|
42
|
-
return {}
|
|
43
|
-
}
|
|
38
|
+
const settings = JSON.parse(content) as unknown
|
|
44
39
|
return settings && typeof settings === "object" && !Array.isArray(settings)
|
|
45
40
|
? (settings as PiSettings)
|
|
46
41
|
: {}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
# @
|
|
2
|
-
|
|
3
|
-
> HerbertGao-maintained fork of [@tifan/pi-recap](https://github.com/tifandotme/pi-extensions/tree/master/packages/pi-recap), distributed under MIT with the original attribution preserved.
|
|
1
|
+
# @tifan/pi-recap
|
|
4
2
|
|
|
5
3
|
Re-enter a session without rereading the transcript.
|
|
6
4
|
|
|
@@ -11,7 +9,7 @@ Re-enter a session without rereading the transcript.
|
|
|
11
9
|
## Install
|
|
12
10
|
|
|
13
11
|
```bash
|
|
14
|
-
pi install npm:@
|
|
12
|
+
pi install npm:@tifan/pi-recap
|
|
15
13
|
```
|
|
16
14
|
|
|
17
15
|
This package requires Pi 0.84.2 or newer.
|
|
@@ -56,8 +54,8 @@ You can also edit `~/.config/pi/extensions/pi-recap.json` manually:
|
|
|
56
54
|
|
|
57
55
|
## Release notes
|
|
58
56
|
|
|
59
|
-
See [CHANGELOG.md](CHANGELOG.md)
|
|
57
|
+
See [CHANGELOG.md](https://github.com/tifandotme/pi-extensions/blob/master/packages/pi-recap/CHANGELOG.md)
|
|
60
58
|
|
|
61
59
|
## License
|
|
62
60
|
|
|
63
|
-
[MIT](LICENSE)
|
|
61
|
+
[MIT](https://github.com/tifandotme/pi-extensions/blob/master/LICENSE)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tifan/pi-recap",
|
|
3
|
+
"version": "0.4.5",
|
|
4
|
+
"description": "One-line session recap on demand or after you have been away.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pi",
|
|
7
|
+
"pi-extension",
|
|
8
|
+
"pi-package",
|
|
9
|
+
"recap",
|
|
10
|
+
"summary"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://github.com/tifandotme/pi-extensions/tree/master/packages/pi-recap#readme",
|
|
13
|
+
"bugs": "https://github.com/tifandotme/pi-extensions/issues",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"author": "Tifan Dwi Avianto <hi@tifan.me>",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/tifandotme/pi-extensions.git",
|
|
19
|
+
"directory": "packages/pi-recap"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"src/**/*.ts",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public",
|
|
29
|
+
"provenance": true
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@earendil-works/pi-coding-agent": ">=0.84.2"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20"
|
|
36
|
+
},
|
|
37
|
+
"pi": {
|
|
38
|
+
"extensions": [
|
|
39
|
+
"./src/index.ts"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -79,12 +79,7 @@ export function parseModelSpec(
|
|
|
79
79
|
|
|
80
80
|
function readConfig(): RecapConfig {
|
|
81
81
|
const content = readFileSync(CONFIG_PATH, "utf-8")
|
|
82
|
-
|
|
83
|
-
try {
|
|
84
|
-
config = JSON.parse(content)
|
|
85
|
-
} catch {
|
|
86
|
-
return {}
|
|
87
|
-
}
|
|
82
|
+
const config = JSON.parse(content) as unknown
|
|
88
83
|
return config && typeof config === "object" && !Array.isArray(config)
|
|
89
84
|
? (config as RecapConfig)
|
|
90
85
|
: {}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
# @
|
|
2
|
-
|
|
3
|
-
> HerbertGao-maintained fork of [@tifan/pi-rename](https://github.com/tifandotme/pi-extensions/tree/master/packages/pi-rename), distributed under MIT with the original attribution preserved.
|
|
1
|
+
# @tifan/pi-rename
|
|
4
2
|
|
|
5
3
|
Generate session names for pi and Herdr.
|
|
6
4
|
|
|
7
5
|
## Install
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
|
-
pi install npm:@
|
|
8
|
+
pi install npm:@tifan/pi-rename
|
|
11
9
|
```
|
|
12
10
|
|
|
13
11
|
This package requires Pi 0.84.2 or newer.
|
|
@@ -16,7 +14,7 @@ This package requires Pi 0.84.2 or newer.
|
|
|
16
14
|
|
|
17
15
|
Run `/rename` to generate a fresh hyphen-separated session name. The extension applies the name to the pi session and, when pi is running inside Herdr, to the current pane and tab when it is the tab's only pane, or to the current pane in a split tab.
|
|
18
16
|
|
|
19
|
-
When a named session starts or resumes in Herdr, the extension applies the saved pi session name when the target still has its default
|
|
17
|
+
When a named session starts or resumes in Herdr, the extension applies the saved pi session name when the target still has its default or temporary startup label.
|
|
20
18
|
|
|
21
19
|
`/rename` builds naming context from the first user message plus up to three latest user messages. It ignores assistant replies, tool output, and attachments. Before sending context to the rename model, it redacts common secrets.
|
|
22
20
|
|
|
@@ -53,16 +51,23 @@ Herdr tab renaming requires the `herdr` CLI. If it is unavailable, the extension
|
|
|
53
51
|
|
|
54
52
|
The extension uses `HERDR_PANE_ID` to find the current Herdr pane. With one pane in the tab, it renames both the pane and tab. With sibling panes, it renames only the current pane.
|
|
55
53
|
|
|
56
|
-
On session startup or resume, it does not overwrite custom Herdr labels. It
|
|
54
|
+
On session startup or resume, it does not overwrite custom Herdr labels. It replaces only Herdr's default or temporary startup labels, so saved session names still apply.
|
|
55
|
+
|
|
56
|
+
If your launcher gives Pi a temporary Herdr label, it must set `HERDR_TEMPORARY_LABEL` before starting Pi. The value must match the label shown in Herdr. In Bash, pass it to Pi inline:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
HERDR_TEMPORARY_LABEL="my-project (pi)" pi
|
|
60
|
+
```
|
|
57
61
|
|
|
62
|
+
If you do not set this variable, `pi-rename` replaces only Herdr's default label.
|
|
58
63
|
On quit, the target keeps the last session name.
|
|
59
64
|
|
|
60
65
|
If pi is not running inside Herdr, only the pi session name is updated.
|
|
61
66
|
|
|
62
67
|
## Release notes
|
|
63
68
|
|
|
64
|
-
See [CHANGELOG.md](CHANGELOG.md)
|
|
69
|
+
See [CHANGELOG.md](https://github.com/tifandotme/pi-extensions/blob/master/packages/pi-rename/CHANGELOG.md)
|
|
65
70
|
|
|
66
71
|
## License
|
|
67
72
|
|
|
68
|
-
[MIT](LICENSE)
|
|
73
|
+
[MIT](https://github.com/tifandotme/pi-extensions/blob/master/LICENSE)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tifan/pi-rename",
|
|
3
|
+
"version": "0.5.1",
|
|
4
|
+
"description": "Generate pi session names and rename the current Herdr tab.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"herdr",
|
|
7
|
+
"pi",
|
|
8
|
+
"pi-extension",
|
|
9
|
+
"pi-package",
|
|
10
|
+
"rename",
|
|
11
|
+
"session",
|
|
12
|
+
"tab"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/tifandotme/pi-extensions/tree/master/packages/pi-rename#readme",
|
|
15
|
+
"bugs": "https://github.com/tifandotme/pi-extensions/issues",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"author": "Tifan Dwi Avianto <hi@tifan.me>",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/tifandotme/pi-extensions.git",
|
|
21
|
+
"directory": "packages/pi-rename"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"src/**/*.ts",
|
|
25
|
+
"README.md",
|
|
26
|
+
"LICENSE"
|
|
27
|
+
],
|
|
28
|
+
"type": "module",
|
|
29
|
+
"exports": {
|
|
30
|
+
"./naming": "./src/naming.ts"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public",
|
|
34
|
+
"provenance": true
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"@earendil-works/pi-coding-agent": ">=0.84.2"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=20"
|
|
41
|
+
},
|
|
42
|
+
"pi": {
|
|
43
|
+
"extensions": [
|
|
44
|
+
"./src/index.ts"
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { execFile } from "node:child_process"
|
|
2
|
-
import path from "node:path"
|
|
3
2
|
import { promisify } from "node:util"
|
|
4
3
|
import type { AgentMessage } from "@earendil-works/pi-agent-core"
|
|
5
4
|
import {
|
|
@@ -23,6 +22,7 @@ import {
|
|
|
23
22
|
saveModelPreference,
|
|
24
23
|
type RenameModelConfig,
|
|
25
24
|
} from "./models.js"
|
|
25
|
+
import { isTemporaryHerdrLabel } from "./herdr-label.js"
|
|
26
26
|
import { generateRename, getUserMessageContext } from "./naming.js"
|
|
27
27
|
|
|
28
28
|
const execFileAsync = promisify(execFile)
|
|
@@ -78,21 +78,13 @@ interface HerdrTabInfo {
|
|
|
78
78
|
readonly paneCount?: number
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
function parseRecord(value: string): Record<string, unknown> | undefined {
|
|
82
|
-
try {
|
|
83
|
-
return asRecord(JSON.parse(value) as unknown)
|
|
84
|
-
} catch {
|
|
85
|
-
return undefined
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
81
|
interface HerdrContext {
|
|
90
82
|
readonly pane: HerdrPaneInfo
|
|
91
83
|
readonly tab: HerdrTabInfo
|
|
92
84
|
}
|
|
93
85
|
|
|
94
86
|
function extractPaneInfo(stdout: string): HerdrPaneInfo | undefined {
|
|
95
|
-
const parsed =
|
|
87
|
+
const parsed = asRecord(JSON.parse(stdout) as unknown)
|
|
96
88
|
const result = asRecord(parsed?.["result"])
|
|
97
89
|
const pane = asRecord(result?.["pane"])
|
|
98
90
|
const paneId = pane?.["pane_id"]
|
|
@@ -116,7 +108,7 @@ function extractPaneInfo(stdout: string): HerdrPaneInfo | undefined {
|
|
|
116
108
|
}
|
|
117
109
|
|
|
118
110
|
function extractTabInfo(stdout: string): HerdrTabInfo | undefined {
|
|
119
|
-
const parsed =
|
|
111
|
+
const parsed = asRecord(JSON.parse(stdout) as unknown)
|
|
120
112
|
const result = asRecord(parsed?.["result"])
|
|
121
113
|
const tab = asRecord(result?.["tab"])
|
|
122
114
|
const tabId = tab?.["tab_id"]
|
|
@@ -163,16 +155,12 @@ function isDefaultHerdrTabLabel(tab: HerdrTabInfo): boolean {
|
|
|
163
155
|
return typeof tab.number === "number" && label === String(tab.number)
|
|
164
156
|
}
|
|
165
157
|
|
|
166
|
-
function isPiWrapperLabel(label: string | undefined): boolean {
|
|
167
|
-
return label?.trim() === `${path.basename(process.cwd())} (pi)`
|
|
168
|
-
}
|
|
169
|
-
|
|
170
158
|
function canRenameSessionStart(context: HerdrContext): boolean {
|
|
171
159
|
const singlePane = context.tab.paneCount === 1
|
|
172
160
|
const label = singlePane ? context.tab.label : context.pane.label
|
|
173
161
|
return (
|
|
174
162
|
(singlePane ? isDefaultHerdrTabLabel(context.tab) : !label?.trim()) ||
|
|
175
|
-
|
|
163
|
+
isTemporaryHerdrLabel(label)
|
|
176
164
|
)
|
|
177
165
|
}
|
|
178
166
|
|
|
@@ -83,12 +83,7 @@ export function parseModelSpec(
|
|
|
83
83
|
|
|
84
84
|
function readConfig(): RenameConfig {
|
|
85
85
|
const content = readFileSync(CONFIG_PATH, "utf-8")
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
config = JSON.parse(content)
|
|
89
|
-
} catch {
|
|
90
|
-
return {}
|
|
91
|
-
}
|
|
86
|
+
const config = JSON.parse(content) as unknown
|
|
92
87
|
return config && typeof config === "object" && !Array.isArray(config)
|
|
93
88
|
? (config as RenameConfig)
|
|
94
89
|
: {}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
# @
|
|
2
|
-
|
|
3
|
-
> HerbertGao-maintained fork of [@tifan/pi-titlebar-spinner](https://github.com/tifandotme/pi-extensions/tree/master/packages/pi-titlebar-spinner), distributed under MIT with the original attribution preserved.
|
|
1
|
+
# @tifan/pi-titlebar-spinner
|
|
4
2
|
|
|
5
3
|
Show a braille spinner in the pi titlebar while the agent runs.
|
|
6
4
|
|
|
@@ -14,7 +12,7 @@ The spinner starts on `agent_start` and stops when the agent settles or the sess
|
|
|
14
12
|
## Install
|
|
15
13
|
|
|
16
14
|
```bash
|
|
17
|
-
pi install npm:@
|
|
15
|
+
pi install npm:@tifan/pi-titlebar-spinner
|
|
18
16
|
```
|
|
19
17
|
|
|
20
18
|
## Release notes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@
|
|
2
|
+
"name": "@tifan/pi-titlebar-spinner",
|
|
3
3
|
"version": "0.1.3",
|
|
4
4
|
"description": "Show a spinner in the pi titlebar while the agent runs.",
|
|
5
5
|
"keywords": [
|
|
@@ -9,22 +9,18 @@
|
|
|
9
9
|
"spinner",
|
|
10
10
|
"titlebar"
|
|
11
11
|
],
|
|
12
|
-
"homepage": "https://github.com/
|
|
13
|
-
"bugs": "https://github.com/
|
|
12
|
+
"homepage": "https://github.com/tifandotme/pi-extensions/tree/master/packages/pi-titlebar-spinner#readme",
|
|
13
|
+
"bugs": "https://github.com/tifandotme/pi-extensions/issues",
|
|
14
14
|
"license": "MIT",
|
|
15
|
-
"author": "
|
|
16
|
-
"contributors": [
|
|
17
|
-
"Tifan Dwi Avianto <hi@tifan.me>"
|
|
18
|
-
],
|
|
15
|
+
"author": "Tifan Dwi Avianto <hi@tifan.me>",
|
|
19
16
|
"repository": {
|
|
20
17
|
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/
|
|
18
|
+
"url": "git+https://github.com/tifandotme/pi-extensions.git",
|
|
22
19
|
"directory": "packages/pi-titlebar-spinner"
|
|
23
20
|
},
|
|
24
21
|
"files": [
|
|
25
22
|
"src/**/*.ts",
|
|
26
23
|
"README.md",
|
|
27
|
-
"CHANGELOG.md",
|
|
28
24
|
"LICENSE"
|
|
29
25
|
],
|
|
30
26
|
"type": "module",
|
|
@@ -39,11 +35,5 @@
|
|
|
39
35
|
"extensions": [
|
|
40
36
|
"./src/index.ts"
|
|
41
37
|
]
|
|
42
|
-
},
|
|
43
|
-
"x-upstream": {
|
|
44
|
-
"package": "@tifan/pi-titlebar-spinner",
|
|
45
|
-
"version": "0.1.3",
|
|
46
|
-
"repository": "https://github.com/tifandotme/pi-extensions",
|
|
47
|
-
"commit": "460d580"
|
|
48
38
|
}
|
|
49
39
|
}
|
|
@@ -16,7 +16,7 @@ All notable changes to pi-lens will be documented in this file.
|
|
|
16
16
|
|
|
17
17
|
### Security
|
|
18
18
|
|
|
19
|
-
## [4.1.
|
|
19
|
+
## [4.1.2] - 2026-08-24
|
|
20
20
|
|
|
21
21
|
### Added
|
|
22
22
|
|
|
@@ -44,6 +44,52 @@ All notable changes to pi-lens will be documented in this file.
|
|
|
44
44
|
|
|
45
45
|
- **latency.log now says whether the LSP pool reused a client or spawned one (closes #1934)** — `lsp_client_selected` fired 5601 times in a 20.8h dogfood window carrying only `{serverId, candidateCount}`, so nothing in the log said whether the pool served a warm client or paid for a language-server spawn. This is the most expensive cache in pi-lens: a miss costs a process. The only estimate was a cross-record inference against `lsp_launch_candidate_success`, which counts something else, so a regression that halved pool reuse was invisible. The record now carries an `outcome` field with one of three values on the same record and the same denominator. `warm-reuse` means the pool served an already-connected client. `cold-spawn` means this selection waited on a spawn, whether it started that spawn or joined one already in flight, so a session-start burst where many files wait on the same spawn reads as several cold spawns and deflates the apparent reuse rate for that window. `spawn-failure` means a spawn ran and failed. Reuse rate is `warm-reuse / (warm-reuse + cold-spawn)`. A spawn failure is deliberately distinct from a clean decline: no root, a breaker already open, host trust refused, or a binary absent while installs are disabled. Declines emit no outcome record and keep their existing ones, so `lsp_client_unavailable` and the `outcome` field can both describe the same event and are counted separately. `getWarmClientForFile`, the warm-only lookup the cascade quiet window and read expansion call per file, previously returned `undefined` and emitted nothing; it now emits a bounded `lsp_warm_client_missing` record naming the candidate server and root, rising-edge per candidate set with the exact count in the degradation ledger.
|
|
46
46
|
|
|
47
|
+
- **Dogfood sessions on pi-lens's own repo now activate the oxlint, spellcheck, yamllint, and taplo runner lanes (refs #1844)** — four new root config files (`.oxlintrc.json`, `typos.toml`, `.yamllint`, `taplo.toml`) opt pi-lens's own repository into linters it already ships for every other project. `.oxlintrc.json` pins `oxlint` as a new exact-version devDependency (1.79.0, matching the runner's tested fixture), makes oxlint this repo's sole preferred JS/TS lint runner (dropping the `biome-check-json` fallback — that IS the dogfood intent), and excludes the fixture directories that carry no config override of their own; oxlint's nested-config discovery still finds the two fixture directories that deliberately escalate severity for the runner's own smoke tests, so those stay as they are. The oxlint runner also now tells a config-excluded file (`number_of_files: 0`) apart from a genuinely clean one, reporting `skipped` instead of a false `succeeded`. `typos.toml` allowlists evidenced false positives (a routine "mis-" prefix, HashiCorp's brand abbreviation, and similar); its presence enables typos-lsp's blocking opt-in, but findings stay advisory in practice since typos-lsp's own default diagnostic severity is warning. `.yamllint` scopes yamllint to hand-authored YAML (GitHub Actions workflows, top-level config), downgrades line-length to a warning rather than raising its threshold, and defuses the `on:` truthy false positive. `taplo.toml` activates both the TOML linter and the `taplo fmt` autofix formatter, and this PR runs that formatter once so activation doesn't start the lane red. Markdown linting was already live via the pre-existing `.markdownlint-cli2.jsonc` (since #1917) — confirmed with a real `markdownlint-cli2` run, no new config needed.
|
|
48
|
+
|
|
49
|
+
- **Memory-sample observability upgrades (refs #1999)** — The periodic
|
|
50
|
+
`memory_sample` latency.log line gains three fields. `peakWorkingSetBytes`
|
|
51
|
+
records the OS high-water working set from `process.resourceUsage().maxRSS`,
|
|
52
|
+
so an idle-moment rss sample can be told apart from true growth (on Windows
|
|
53
|
+
libuv backs both counters with one `GetProcessMemoryInfo()` call: rss reads
|
|
54
|
+
current `WorkingSetSize`, maxRSS reads `PeakWorkingSetSize`). A rising-edge
|
|
55
|
+
cadence tightens sampling from every 10 turns to every turn while heapUsed
|
|
56
|
+
grows more than 20% between samples, reverting once growth stabilizes; the
|
|
57
|
+
state resets at each primary session start. Each sample now also carries
|
|
58
|
+
session age, session start time, and turn count, so growth-vs-age curves are
|
|
59
|
+
plottable from logs alone. The `/lens-health` memory line shows peak WS when
|
|
60
|
+
known.
|
|
61
|
+
|
|
62
|
+
- **Opaque-write recovery for bash commands (refs #2000 phase 2)** — commands the path extractor does not recognize (python/node/perl/PowerShell internal writes) now get a bounded pre/post stat diff of the project source universe. Recovered files are attributed to the read guard as agent-authored and dispatched through the mutation seam, with explicit coverage-unknown telemetry instead of silent gaps.
|
|
63
|
+
|
|
64
|
+
- **Collect-later delivery for slow auxiliary LSP servers (closes #2001, refs #2002)** —
|
|
65
|
+
When an auxiliary scanner such as opengrep misses its aux-grace window,
|
|
66
|
+
pi-lens now marks the file and server pair in a bounded pending store
|
|
67
|
+
instead of dropping the scanner's eventual findings. The next turn end
|
|
68
|
+
probes the auxiliary's client cache through a read-only seam,
|
|
69
|
+
freshness-gates the result against the mark timestamp, and delivers
|
|
70
|
+
survivors as a `Late auxiliary diagnostics` advisory. A cited file that was
|
|
71
|
+
edited or deleted since the mark drops its findings, and both drop arms are
|
|
72
|
+
counted in the new `late_auxiliary_findings` latency record.
|
|
73
|
+
|
|
74
|
+
- **Freshness kernel: one comparator, one verdict type for staleness gates (closes #1739)** — `clients/freshness.ts` owns the mtime-vs-reference comparison and shared drift tolerance that six stores had independently reimplemented (three copies carried the identical #1710/#1711 tolerance defect). `freshnessFromMtime` returns an explicit verdict (`fresh` / `stale: modified-after-reference` / `indeterminate: no-mtime-evidence`) so each caller keeps its own no-evidence policy while sharing the comparison. A registered-or-fail sweep fails on any new out-of-kernel mtime-vs-reference comparison in `clients/`.
|
|
75
|
+
|
|
76
|
+
- **Shared fault-injection test kit (closes #1838)** — `tests/support/fault-injection.ts` promotes the bespoke fault probes reviewers kept rebuilding by hand into four one-call primitives: `spawnWedgedChild` (a real child whose stdin pipe is genuinely full — the #1811 fixture generalized, with its fail-fast-instead-of-hang trap asserted against), `delayInside` (deterministic completion delay inside any mocked async seam), `fireResetAt` (fire a lifecycle hook from inside a seam's implementation at a chosen call — the #1746-R2-F1 shape), and `starveBudget` plus `gatedPromise` (the tiny-budget starvation repro). Every primitive carries its own fidelity test in `fault-injection.test.ts`, so a neutered primitive goes red in CI instead of silently weakening every consumer.
|
|
77
|
+
|
|
78
|
+
- **Adversarial garbage battery for every CLI lint runner (closes #1839)** — Twenty runners now meet a 12-case battery of hostile outputs (truncated JSON, usage prose on the findings stream, unknown severities, hostile numbers) under format-blind invariants: never crash, never emit malformed diagnostics, never report clean on a nonzero exit carrying bytes. The first pass found 79 violations of that last invariant across 14 runners — all fixed by consolidating their identical tails onto one shared `finishParsedRun` seam. Also fixes htmlhint's `--rules` flag being fed JSON (the tool wants a ruleid list), which left zero rules enabled so every file read clean.
|
|
79
|
+
|
|
80
|
+
### Changed
|
|
81
|
+
|
|
82
|
+
- **pi-lens formats its own TypeScript with oxfmt (refs #1844)** — The
|
|
83
|
+
repository now carries an `.oxfmtrc.json` and an `oxfmt` devDependency, and
|
|
84
|
+
an advisory `oxfmt --check` job runs in CI. Because `hasOxfmtConfig` gates
|
|
85
|
+
the oxfmt formatter on exactly that config file, a pi-lens session opened on
|
|
86
|
+
this repository now dispatches oxfmt as the format runner for edited
|
|
87
|
+
TypeScript and JavaScript files.
|
|
88
|
+
|
|
89
|
+
- **Opaque-write recovery goes git-first (refs #2000)** — inside a git worktree the pre side records only a timestamp and `git status --porcelain` plus an mtime window answers what changed, with no file-universe cap: recovery now works on any repo size, including large monorepos where the stat-walk previously degraded every command to coverage-unknown. The bounded stat-diff path remains for small non-git trees.
|
|
90
|
+
|
|
91
|
+
- **ONE mutation seam: `RuntimeCoordinator.recordProjectMutation` (refs #2000 phase 1)** — the triplicated bump+change-log pairing (runtime-tool-result, runtime-agent-end, lsp-mutation) is consolidated onto one seam that bumps the seq store, appends a bounded attributed receipt ring (`getMutationsSince`, cap 512 with a surfaced dropped-count), and appends the durable change-log entry. Consumers derive touched-files answers from one store instead of three hand-copied pairings; phase 2's opaque-write recovery feeds the same seam.
|
|
92
|
+
|
|
47
93
|
### Fixed
|
|
48
94
|
|
|
49
95
|
- **Search credit ignores pipe truncation (closes #1908)** — `grep -C2 pattern
|
|
@@ -106,6 +152,55 @@ All notable changes to pi-lens will be documented in this file.
|
|
|
106
152
|
|
|
107
153
|
- **Warmup and workspace-scan walkers gate by file extension before consulting the ignore matcher, cutting a 31.7s stall to sub-second on repos with large ignored file piles (closes #1974, reported by @0xkite)** — `isIgnored` recompiles minimatch patterns per ancestor directory on every call; a runtime-output directory like `wal/` holding tens of thousands of `.log` files, gitignored only by a file-level `*.log` pattern (so the directory itself is never pruned), forced every one of those files through that cost. Six walkers checked `isIgnored` before their own cheap extension gate, paying the expensive check for files the gate would have dropped anyway: `collectSourceFilesForWarmup` (`language-profile.ts`, the reported 31.7s case), `JscpdClient.hasSourceFilesRecursive` (`jscpd-client.ts`), `classifyEntry` (`source-filter.ts`), `makeSourceCountVisitor` (`startup-scan.ts`), `getModuleSourceFiles` (`review-graph/workspace-modules.ts`), and `collectWorkspaceDiagnosticFiles` (`lsp/index.ts`). All six now run their extension (or LSP-server) gate first; output is unchanged, since both gates still have to pass to keep a file — only the order changed. A repo-wide sweep of all 14 files that call `isIgnored` found `tree-sitter-client.ts` and `tools/lsp-diagnostics.ts` already extension-first, and cleared the remaining per-event/no-ext-gate sites by construction; see the PR body for the full per-site table.
|
|
108
154
|
|
|
155
|
+
- **oxfmt no longer fails on a file its own config ignores (refs #1844)** —
|
|
156
|
+
pi-lens offers oxfmt for every extension oxfmt supports, so in a project
|
|
157
|
+
whose oxfmt config carries `ignorePatterns`, oxfmt was selected for files it
|
|
158
|
+
then refused to touch. It exits 2 with "Expected at least one target file",
|
|
159
|
+
which the strict exit-code posture read as a formatting failure, so every
|
|
160
|
+
edit to an ignored file surfaced an error. pi-lens now passes
|
|
161
|
+
`--no-error-on-unmatched-pattern`, which makes an empty target set a clean
|
|
162
|
+
no-op. Every other nonzero exit, including an unparseable file, still fails.
|
|
163
|
+
|
|
164
|
+
- **ESLint warnings are no longer discarded (closes #1954)** — The eslint runner treated every exit 0 as "nothing found". ESLint exits 0 whenever no rule reaches error severity, so a run that produced only warning-severity findings was thrown away silently. The runner now parses stdout unconditionally and surfaces the findings; a clean file still reports clean, and exit 2 stays an unavailable skip.
|
|
165
|
+
|
|
166
|
+
- **Registered tools now always have descriptions in child/subagent sessions (closes #1988)** — the final registration boundary fills missing, empty, and
|
|
167
|
+
whitespace-only descriptions for active, lazy, activation, and wrapped tool
|
|
168
|
+
definitions.
|
|
169
|
+
|
|
170
|
+
- **mode=full no longer replays stale mid-edit blockers (refs #1993)** — a confirmed, fully-covered LSP sweep is now authoritative for its files: widget-store diagnostics captured from a since-fixed broken intermediate state are retired instead of rendering as current 🔴 blockers beside a clean sweep. Unconfirmed or timed-out sweeps keep the fail-open behavior.
|
|
171
|
+
|
|
172
|
+
- **Cache-miss attribution stays useful in long sessions (closes #1996)** — classify full model/provider identities and split unexplained or malformed cache evidence by bounded reason, with fail-closed request hashing, activation-owned primary/secondary isolation, sanitized numeric metadata, and a per-session cause summary.
|
|
173
|
+
|
|
174
|
+
- **Project snapshots no longer rewrite unchanged same-generation bodies (closes #1997)** — Persistence now coalesces concurrent requests and computes semantic identity on its worker before gzip or staging. Same-generation content changes and failed-write repairs still publish.
|
|
175
|
+
|
|
176
|
+
- **Classify oxlint no-match results as expected skips (closes #1998)**. Oxlint now carries `no-files-matched` through runner telemetry without emitting an extension error or claiming the file is clean. A single fail-closed state machine validates process completion, exit status, stderr, the captured banner, and every JSON summary field's type and range; truncated, malformed, wrong-status, or error-bearing lookalikes retain failure or unconfirmed telemetry.
|
|
177
|
+
|
|
178
|
+
- **Project-snapshot persistence validates gzip body integrity before skipping (closes #2008)** —
|
|
179
|
+
The skip decision trusted the meta sidecar and a fingerprint match alone, so a torn or
|
|
180
|
+
truncated gzip under an intact meta kept winning unchanged-dedupe and stayed canonical until
|
|
181
|
+
the project sequence advanced. The meta sidecar now records the on-disk gz byte length
|
|
182
|
+
(`gzBytes`) at every successful persist, and the dedupe baselines compare it against a live
|
|
183
|
+
stat: a size mismatch, or a legacy meta without the field, withholds the dedupe fingerprints
|
|
184
|
+
so the pending save republishes and rewrites the body. A skip that would honor evidence
|
|
185
|
+
failing this gate between dispatch and promotion is refused and rewritten synchronously.
|
|
186
|
+
Detections emit one `project_snapshot_body_integrity` latency record plus a bounded
|
|
187
|
+
`snapshot-integrity` degradation-ledger entry per corrupted body path. The baselines read is
|
|
188
|
+
also now a pure read: its in-process seeding write moved to the single dispatch seam that
|
|
189
|
+
owns the persist lifecycle.
|
|
190
|
+
|
|
191
|
+
- **Installer verify loop broken at the root (closes #2015)** — `verifyToolBinary` now spawns through `safeSpawnAsync` (tree-kill on timeout, typed kill-reason) instead of raw spawn whose SIGTERM orphaned grandchild node processes on Windows `.cmd` shims. A killed/inconclusive prober no longer counts as a verdict: the freshly installed binary is KEPT for cheap re-probe instead of deleted, ending the install/verify/reinstall churn (23 SIGTERMs and 4 cleanups observed in one day).
|
|
192
|
+
|
|
193
|
+
- **Windows `.cmd`/`.bat` spawns no longer fail when System32 is absent from the child PATH (closes #2023)** — The cmd.exe wrapper prefixed every spawn
|
|
194
|
+
with a bare `chcp 65001 &&`. When the child environment's PATH could not
|
|
195
|
+
resolve `chcp.com`, the lookup failed and `&&` short-circuited, so the whole
|
|
196
|
+
spawn exited 1 with empty output. chcp is now invoked via its pinned
|
|
197
|
+
`%SystemRoot%\System32\chcp.com` absolute path and chained with `&`, so a
|
|
198
|
+
code-page failure can never suppress the real command.
|
|
199
|
+
|
|
200
|
+
- **Register remaining agent-facing delivery surfaces (#2028)** — The per-edit 🔴 STOP block now drops blockers whose cited file no longer exists, so a deleted file's stale blocker no longer re-blocks the agent with no remediation. All five previously unregistered surfaces (stop blocker, `lsp_diagnostics` output, git-guard verdicts, read-guard preflight errors, thrashing notices) are registered in the finding-delivery gate registry.
|
|
201
|
+
|
|
202
|
+
- **Wall-clock budget tests get a quiet serial phase (closes #1920)** — Five test files asserting real elapsed-time budgets ran inside the default project's fork storm, measuring scheduler contention instead of code speed (`startup-overhead` measured 659-2321ms against a 500ms budget under load, green solo every time). They now run in a dedicated fully-serialized `wall-clock-budget` Vitest project that phases dead last on a quiet host. A coverage guard keeps the new include list from silently dropping renamed files.
|
|
203
|
+
|
|
109
204
|
## [4.1.0] - 2026-08-20
|
|
110
205
|
|
|
111
206
|
### Added
|
|
@@ -5,7 +5,8 @@ import { createNdjsonLogger } from "./ndjson-logger.js";
|
|
|
5
5
|
const AW_LOG_DIR = getGlobalPiLensDir();
|
|
6
6
|
const AW_LOG_FILE = path.join(AW_LOG_DIR, "actionable-warnings.log");
|
|
7
7
|
const AW_LOG_BACKUP_FILE = path.join(AW_LOG_DIR, "actionable-warnings.log.1");
|
|
8
|
-
const MAX_LOG_BYTES = Math.max(128 * 1024, Number.parseInt(process.env.PI_LENS_AW_LOG_MAX_BYTES ?? "1048576", 10) ||
|
|
8
|
+
const MAX_LOG_BYTES = Math.max(128 * 1024, Number.parseInt(process.env.PI_LENS_AW_LOG_MAX_BYTES ?? "1048576", 10) ||
|
|
9
|
+
1048576);
|
|
9
10
|
const writer = createNdjsonLogger({
|
|
10
11
|
filePath: AW_LOG_FILE,
|
|
11
12
|
maxBytes: MAX_LOG_BYTES,
|
|
@@ -633,7 +633,12 @@ export async function applyConservativeActionableWarningFixes(args) {
|
|
|
633
633
|
}
|
|
634
634
|
const edit = selected.edit;
|
|
635
635
|
const applied = await applyWorkspaceEdit(edit, args.cwd, args.mutationContext
|
|
636
|
-
? {
|
|
636
|
+
? {
|
|
637
|
+
mutationContext: {
|
|
638
|
+
...args.mutationContext,
|
|
639
|
+
emitSummary: false,
|
|
640
|
+
},
|
|
641
|
+
}
|
|
637
642
|
: undefined);
|
|
638
643
|
appliedResults.push(applied);
|
|
639
644
|
for (const changedFile of applied.files)
|
|
@@ -642,8 +647,7 @@ export async function applyConservativeActionableWarningFixes(args) {
|
|
|
642
647
|
}
|
|
643
648
|
catch (err) {
|
|
644
649
|
failedCount++;
|
|
645
|
-
const partial = err
|
|
646
|
-
.appliedWorkspaceEdit;
|
|
650
|
+
const partial = err.appliedWorkspaceEdit;
|
|
647
651
|
if (partial) {
|
|
648
652
|
appliedResults.push(partial);
|
|
649
653
|
for (const changedFile of partial.files)
|
|
@@ -656,13 +660,18 @@ export async function applyConservativeActionableWarningFixes(args) {
|
|
|
656
660
|
}
|
|
657
661
|
}
|
|
658
662
|
summary.changedFiles = [...changedFiles];
|
|
659
|
-
if (args.mutationContext &&
|
|
663
|
+
if (args.mutationContext &&
|
|
664
|
+
(summary.considered > 0 || appliedResults.length > 0)) {
|
|
660
665
|
recordLspMutationBatch(args.mutationContext, {
|
|
661
666
|
results: appliedResults,
|
|
662
667
|
considered: summary.considered,
|
|
663
668
|
completed: summary.applied,
|
|
664
669
|
failedCount,
|
|
665
|
-
status: failedCount > 0
|
|
670
|
+
status: failedCount > 0
|
|
671
|
+
? "failed"
|
|
672
|
+
: appliedResults.length > 0
|
|
673
|
+
? "success"
|
|
674
|
+
: "skipped",
|
|
666
675
|
bookkeep: false,
|
|
667
676
|
});
|
|
668
677
|
}
|
|
@@ -4,7 +4,7 @@ import * as path from "node:path";
|
|
|
4
4
|
import { logLatency } from "./latency-logger.js";
|
|
5
5
|
import { normalizeMapKey, toProjectRelativePath } from "./path-utils.js";
|
|
6
6
|
import { resolveRunnerPath } from "./dispatch/runner-context.js";
|
|
7
|
-
import {
|
|
7
|
+
import { freshnessFromMtime } from "./freshness.js";
|
|
8
8
|
export const MAX_ADVISORY_AFFECTED_FILES = 256;
|
|
9
9
|
export function advisoryPathKey(filePath, cwd) {
|
|
10
10
|
return normalizeMapKey(path.resolve(cwd, filePath));
|
|
@@ -68,25 +68,41 @@ function isFiniteNumber(value) {
|
|
|
68
68
|
return typeof value === "number" && Number.isFinite(value);
|
|
69
69
|
}
|
|
70
70
|
function isCapturedHash(value) {
|
|
71
|
-
return typeof value === "string" &&
|
|
72
|
-
(/^[a-f0-9]{64}$/.test(value) ||
|
|
71
|
+
return (typeof value === "string" &&
|
|
72
|
+
(/^[a-f0-9]{64}$/.test(value) ||
|
|
73
|
+
value === "missing" ||
|
|
74
|
+
value.startsWith("unreadable:")));
|
|
73
75
|
}
|
|
74
76
|
function isWellFormed(value) {
|
|
75
77
|
if (!value || typeof value !== "object")
|
|
76
78
|
return false;
|
|
77
79
|
const record = value;
|
|
78
80
|
const revision = record.revision;
|
|
79
|
-
return !!revision &&
|
|
80
|
-
|
|
81
|
-
isFiniteNumber(revision.
|
|
82
|
-
|
|
83
|
-
(
|
|
84
|
-
isFiniteNumber(
|
|
85
|
-
|
|
81
|
+
return (!!revision &&
|
|
82
|
+
typeof revision.sessionId === "string" &&
|
|
83
|
+
isFiniteNumber(revision.projectSeq) &&
|
|
84
|
+
isFiniteNumber(revision.turnIndex) &&
|
|
85
|
+
isFiniteNumber(revision.generation) &&
|
|
86
|
+
isFiniteNumber(revision.capturedAt) &&
|
|
87
|
+
Array.isArray(record.files) &&
|
|
88
|
+
record.files.length > 0 &&
|
|
89
|
+
record.files.every((file) => !!file &&
|
|
90
|
+
typeof file.path === "string" &&
|
|
91
|
+
(file.role === "source" ||
|
|
92
|
+
file.role === "test" ||
|
|
93
|
+
file.role === "affected") &&
|
|
94
|
+
isFiniteNumber(file.mtimeMs) &&
|
|
95
|
+
isFiniteNumber(file.size) &&
|
|
96
|
+
isCapturedHash(file.sha256)));
|
|
86
97
|
}
|
|
87
98
|
export function validateAdvisoryProvenance(record, cwd, runtime) {
|
|
88
99
|
if (!isWellFormed(record.provenance)) {
|
|
89
|
-
return {
|
|
100
|
+
return {
|
|
101
|
+
status: "unknown",
|
|
102
|
+
reasons: ["malformed-or-legacy-provenance"],
|
|
103
|
+
allFilesDeleted: false,
|
|
104
|
+
changedPathCount: 0,
|
|
105
|
+
};
|
|
90
106
|
}
|
|
91
107
|
const provenance = record.provenance;
|
|
92
108
|
const reasons = [];
|
|
@@ -149,9 +165,19 @@ export function validateAdvisoryProvenance(record, cwd, runtime) {
|
|
|
149
165
|
}
|
|
150
166
|
const allFilesDeleted = deletedFiles === provenance.files.length;
|
|
151
167
|
if (unknown)
|
|
152
|
-
return {
|
|
168
|
+
return {
|
|
169
|
+
status: "unknown",
|
|
170
|
+
reasons,
|
|
171
|
+
allFilesDeleted,
|
|
172
|
+
changedPathCount: changedPaths.size,
|
|
173
|
+
};
|
|
153
174
|
return reasons.length > 0
|
|
154
|
-
? {
|
|
175
|
+
? {
|
|
176
|
+
status: "superseded",
|
|
177
|
+
reasons,
|
|
178
|
+
allFilesDeleted,
|
|
179
|
+
changedPathCount: changedPaths.size,
|
|
180
|
+
}
|
|
155
181
|
: { status: "current", reasons: [], allFilesDeleted, changedPathCount: 0 };
|
|
156
182
|
}
|
|
157
183
|
// ── Finding-cited path existence (#1461 slice 1) ──────────────────────────────
|
|
@@ -224,11 +250,15 @@ const MAX_LOGGED_DEAD_PATHS = 3;
|
|
|
224
250
|
export function findingPathFreshness(resolvedPath, scannedAtMs) {
|
|
225
251
|
try {
|
|
226
252
|
const stat = fs.statSync(resolvedPath);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
253
|
+
// No scan timestamp recorded: the pre-kernel behavior treated the
|
|
254
|
+
// path as live (no reference to be stale against) - preserved.
|
|
255
|
+
if (scannedAtMs === undefined)
|
|
256
|
+
return "live";
|
|
257
|
+
const verdict = freshnessFromMtime({
|
|
258
|
+
mtimeMs: stat.mtimeMs,
|
|
259
|
+
referenceMs: scannedAtMs,
|
|
260
|
+
});
|
|
261
|
+
return verdict.verdict === "stale" ? "stale" : "live";
|
|
232
262
|
}
|
|
233
263
|
catch (error) {
|
|
234
264
|
const code = error.code ?? "unknown";
|
|
@@ -113,9 +113,7 @@ export class AstGrepClient {
|
|
|
113
113
|
(fs.existsSync(projectRuleDir)
|
|
114
114
|
? projectRuleDir
|
|
115
115
|
: resolvePackagePath(import.meta.url, "rules"));
|
|
116
|
-
this.log = verbose
|
|
117
|
-
? createSubsystemLogger("ast-grep")
|
|
118
|
-
: () => { };
|
|
116
|
+
this.log = verbose ? createSubsystemLogger("ast-grep") : () => { };
|
|
119
117
|
this.ruleManager = new AstGrepRuleManager(this.ruleDir, this.log);
|
|
120
118
|
this.runner = new SgRunner(verbose);
|
|
121
119
|
}
|