@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
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
* remaining wall-clock budget.
|
|
16
16
|
* - OPT-IN: disabled by default (budget 0) until validated in a real pi session;
|
|
17
17
|
* enable with PI_LENS_MODULE_REPORT_LSP_BUDGET_MS.
|
|
18
|
+
*
|
|
19
|
+
* PARKED BY DECISION (#1090, 2026-08-12): zero live importers by design —
|
|
20
|
+
* efe3d2a5 unwired module_report's LSP path (#256) and re-homed live
|
|
21
|
+
* enrichment to #236 (LSP-confirmed graph edges). Kept for that future
|
|
22
|
+
* implementation; do not re-flag in dead-code sweeps while #236 is open.
|
|
18
23
|
*/
|
|
19
24
|
import { withinRemaining } from "./deadline-utils.js";
|
|
20
25
|
import { uriToPath } from "./path-utils.js";
|
|
@@ -37,10 +37,23 @@ import { detectFileKind } from "./file-kinds.js";
|
|
|
37
37
|
import { logLatency } from "./latency-logger.js";
|
|
38
38
|
import { annotateMiddleMan } from "./middle-man-analysis.js";
|
|
39
39
|
import { normalizeMapKey, toProjectRelativePath } from "./path-utils.js";
|
|
40
|
+
import { loadCallGraph, } from "./call-graph.js";
|
|
40
41
|
import { resolveImportToFiles } from "./review-graph/import-resolvers.js";
|
|
41
42
|
import { buildSymbolId } from "./review-graph/symbol-id.js";
|
|
42
43
|
import { getSharedTreeSitterClient, resolveTreeSitterLanguage, } from "./tree-sitter-shared.js";
|
|
43
44
|
import { TreeSitterSymbolExtractor, } from "./tree-sitter-symbol-extractor.js";
|
|
45
|
+
// NOTE: live-LSP enrichment is NO LONGER called on this read path (#256). Firing
|
|
46
|
+
// LSP per read — speculatively, on the agent's fan-out path — repeatedly OOM'd
|
|
47
|
+
// pi. The enrichment logic is kept as a separate module (clients/module-report-
|
|
48
|
+
// lsp.ts) to be re-homed in #236, where LSP writes provenance-tagged edges INTO
|
|
49
|
+
// the review graph (computed once, persisted) so this path just reads them.
|
|
50
|
+
/** Hard payload bound for the per-symbol who-uses-this section. */
|
|
51
|
+
export const MAX_MODULE_REPORT_REFS = 100;
|
|
52
|
+
function normalizeMaxRefsPerSymbol(value) {
|
|
53
|
+
if (value === undefined || !Number.isFinite(value))
|
|
54
|
+
return 10;
|
|
55
|
+
return Math.min(MAX_MODULE_REPORT_REFS, Math.max(1, Math.floor(value)));
|
|
56
|
+
}
|
|
44
57
|
// kind -> tree-sitter languageId. The languageId keys BOTH the grammar map
|
|
45
58
|
// (tree-sitter-client) and SYMBOL_QUERIES (tree-sitter-symbol-extractor), so it
|
|
46
59
|
// must match a key present in both. jsts/cxx are extension-split kinds resolved
|
|
@@ -225,7 +238,9 @@ function resolveUsedBy(graph, symbolNodeId, cap, projectRoot) {
|
|
|
225
238
|
symbol,
|
|
226
239
|
line,
|
|
227
240
|
relation: edge.kind,
|
|
228
|
-
...(edge.resolution
|
|
241
|
+
...(edge.resolution && edge.resolution !== "unresolved"
|
|
242
|
+
? { resolution: edge.resolution }
|
|
243
|
+
: {}),
|
|
229
244
|
});
|
|
230
245
|
if (out.length >= cap)
|
|
231
246
|
break;
|
|
@@ -1143,6 +1158,120 @@ function extractCallbacks(root, entries, languageId, warnings) {
|
|
|
1143
1158
|
}
|
|
1144
1159
|
return callbacks.slice(0, callbackCap);
|
|
1145
1160
|
}
|
|
1161
|
+
const CALL_GRAPH_DEFAULT_ENTRY_CAP = 20;
|
|
1162
|
+
const CALL_GRAPH_MAX_ENTRY_CAP = 100;
|
|
1163
|
+
function unavailableCallGraph(reason) {
|
|
1164
|
+
return {
|
|
1165
|
+
available: false,
|
|
1166
|
+
reason,
|
|
1167
|
+
callers: [],
|
|
1168
|
+
callees: [],
|
|
1169
|
+
truncated: false,
|
|
1170
|
+
coverage: { status: "unavailable", complete: false },
|
|
1171
|
+
};
|
|
1172
|
+
}
|
|
1173
|
+
function callGraphCoverage(coverage) {
|
|
1174
|
+
const languages = coverage.languages;
|
|
1175
|
+
const complete = coverage.complete && Object.values(languages ?? {}).every((status) => status === "complete");
|
|
1176
|
+
return {
|
|
1177
|
+
status: complete ? "complete" : "partial",
|
|
1178
|
+
complete,
|
|
1179
|
+
totalEvidence: coverage.totalEvidence,
|
|
1180
|
+
callsEvidence: coverage.callsEvidence,
|
|
1181
|
+
referencesEvidence: coverage.referencesEvidence,
|
|
1182
|
+
eligibleEvidence: coverage.eligibleEvidence,
|
|
1183
|
+
resolvedEvidence: coverage.resolvedEvidence,
|
|
1184
|
+
unresolvedEvidence: coverage.unresolvedEvidence,
|
|
1185
|
+
typeOnlyEvidence: coverage.typeOnlyEvidence,
|
|
1186
|
+
unsupportedEvidence: coverage.unsupportedEvidence,
|
|
1187
|
+
sameFileEvidence: coverage.sameFileEvidence,
|
|
1188
|
+
duplicateEvidence: coverage.duplicateEvidence,
|
|
1189
|
+
...(languages ? { languages } : {}),
|
|
1190
|
+
};
|
|
1191
|
+
}
|
|
1192
|
+
function callGraphRelation(edge, kind, projectRoot) {
|
|
1193
|
+
const caller = kind === "caller";
|
|
1194
|
+
return {
|
|
1195
|
+
symbolId: caller ? edge.callerKey : edge.calleeKey,
|
|
1196
|
+
targetSymbolId: caller ? edge.calleeKey : edge.callerKey,
|
|
1197
|
+
file: toDisplayPath(caller ? edge.callerFile : edge.calleeFile, projectRoot),
|
|
1198
|
+
...(caller
|
|
1199
|
+
? {
|
|
1200
|
+
symbol: edge.callerSymbol,
|
|
1201
|
+
kind: edge.callerKind,
|
|
1202
|
+
line: edge.callerLine,
|
|
1203
|
+
}
|
|
1204
|
+
: {
|
|
1205
|
+
symbol: edge.calleeSymbol,
|
|
1206
|
+
kind: edge.calleeKind,
|
|
1207
|
+
line: edge.calleeLine,
|
|
1208
|
+
}),
|
|
1209
|
+
...(edge.evidenceKind ? { evidenceKind: edge.evidenceKind } : {}),
|
|
1210
|
+
...(edge.resolution ? { resolution: edge.resolution } : {}),
|
|
1211
|
+
...(edge.evidenceCount && edge.evidenceCount > 1
|
|
1212
|
+
? { evidenceCount: edge.evidenceCount }
|
|
1213
|
+
: {}),
|
|
1214
|
+
...(edge.weight !== 1 ? { weight: edge.weight } : {}),
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1217
|
+
/**
|
|
1218
|
+
* Read the separately persisted FunctionCallGraph projection. This accessor is
|
|
1219
|
+
* deliberately conservative: the module-report path never walks/builds the
|
|
1220
|
+
* review graph, and a changed source file invalidates the projection rather
|
|
1221
|
+
* than being reported as a clean zero-call result.
|
|
1222
|
+
*/
|
|
1223
|
+
function readCallGraph(projectRoot, normalizedPath, maxEntries, graphFileCap, identity, reviewGraph) {
|
|
1224
|
+
if (graphFileCap !== undefined)
|
|
1225
|
+
return unavailableCallGraph("file-cap");
|
|
1226
|
+
// The canonical review graph is the only freshness authority. This path is
|
|
1227
|
+
// read-only: do not walk source files or compare an independent mtime map.
|
|
1228
|
+
if (!reviewGraph)
|
|
1229
|
+
return unavailableCallGraph("review-graph-missing");
|
|
1230
|
+
if (reviewGraph.persistCoverage?.partial || reviewGraph.persistCoverage?.inProgress) {
|
|
1231
|
+
return unavailableCallGraph("partial");
|
|
1232
|
+
}
|
|
1233
|
+
if (!identity)
|
|
1234
|
+
return unavailableCallGraph("identity-missing");
|
|
1235
|
+
if (!reviewGraph.fileNodes.has(normalizedPath))
|
|
1236
|
+
return unavailableCallGraph("stale");
|
|
1237
|
+
const cached = loadCallGraph(projectRoot, identity);
|
|
1238
|
+
if (!cached)
|
|
1239
|
+
return unavailableCallGraph("stale");
|
|
1240
|
+
const callers = [];
|
|
1241
|
+
const callees = [];
|
|
1242
|
+
for (const edge of cached.graph.edges) {
|
|
1243
|
+
if (normalizeMapKey(edge.calleeFile) === normalizedPath) {
|
|
1244
|
+
callers.push(callGraphRelation(edge, "caller", projectRoot));
|
|
1245
|
+
}
|
|
1246
|
+
if (normalizeMapKey(edge.callerFile) === normalizedPath) {
|
|
1247
|
+
callees.push(callGraphRelation(edge, "callee", projectRoot));
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
const stable = (left, right) => left.targetSymbolId.localeCompare(right.targetSymbolId) ||
|
|
1251
|
+
(left.line ?? 0) - (right.line ?? 0) ||
|
|
1252
|
+
left.symbolId.localeCompare(right.symbolId);
|
|
1253
|
+
callers.sort(stable);
|
|
1254
|
+
callees.sort(stable);
|
|
1255
|
+
return {
|
|
1256
|
+
available: true,
|
|
1257
|
+
callers: callers.slice(0, maxEntries),
|
|
1258
|
+
callees: callees.slice(0, maxEntries),
|
|
1259
|
+
truncated: callers.length > maxEntries || callees.length > maxEntries,
|
|
1260
|
+
coverage: callGraphCoverage(cached.graph.coverage ?? {
|
|
1261
|
+
totalEvidence: cached.graph.totalRefs,
|
|
1262
|
+
callsEvidence: cached.graph.totalRefs,
|
|
1263
|
+
referencesEvidence: 0,
|
|
1264
|
+
eligibleEvidence: cached.graph.totalRefs,
|
|
1265
|
+
resolvedEvidence: cached.graph.totalRefs,
|
|
1266
|
+
unresolvedEvidence: cached.graph.unresolvedRefs,
|
|
1267
|
+
typeOnlyEvidence: 0,
|
|
1268
|
+
unsupportedEvidence: 0,
|
|
1269
|
+
sameFileEvidence: 0,
|
|
1270
|
+
duplicateEvidence: 0,
|
|
1271
|
+
complete: false,
|
|
1272
|
+
}),
|
|
1273
|
+
};
|
|
1274
|
+
}
|
|
1146
1275
|
function unavailableReport(displayPath, error) {
|
|
1147
1276
|
return {
|
|
1148
1277
|
available: false,
|
|
@@ -1168,7 +1297,8 @@ function unavailableReport(displayPath, error) {
|
|
|
1168
1297
|
*/
|
|
1169
1298
|
export async function moduleReport(file, cwd, options) {
|
|
1170
1299
|
const startedAt = Date.now();
|
|
1171
|
-
const maxRefs =
|
|
1300
|
+
const maxRefs = normalizeMaxRefsPerSymbol(options?.maxRefsPerSymbol);
|
|
1301
|
+
const maxCallGraphEntries = Math.min(CALL_GRAPH_MAX_ENTRY_CAP, Math.max(1, Math.floor(options?.maxCallGraphEntries ?? CALL_GRAPH_DEFAULT_ENTRY_CAP)));
|
|
1172
1302
|
const absPath = path.resolve(cwd, file);
|
|
1173
1303
|
const normalizedPath = normalizeMapKey(absPath);
|
|
1174
1304
|
let content;
|
|
@@ -1199,13 +1329,26 @@ export async function moduleReport(file, cwd, options) {
|
|
|
1199
1329
|
// jsts) and two racing builds OOM'd pi (#256). Cold cache → outline-only.
|
|
1200
1330
|
let graph;
|
|
1201
1331
|
let graphFileCap;
|
|
1332
|
+
let callGraphIdentity;
|
|
1202
1333
|
try {
|
|
1203
|
-
const { getCachedReviewGraph, getReviewGraphSizeSkipVerdict } = await import("./review-graph/builder.js");
|
|
1334
|
+
const { getCachedReviewGraph, getReviewGraphCacheIdentity, getReviewGraphSizeSkipVerdict, } = await import("./review-graph/builder.js");
|
|
1204
1335
|
graph = getCachedReviewGraph(cwd);
|
|
1205
1336
|
graphFileCap = getReviewGraphSizeSkipVerdict(cwd)?.maxFileCount;
|
|
1337
|
+
callGraphIdentity = graph
|
|
1338
|
+
? (() => {
|
|
1339
|
+
const identity = getReviewGraphCacheIdentity(cwd, graph);
|
|
1340
|
+
return identity
|
|
1341
|
+
? {
|
|
1342
|
+
reviewGraphVersion: identity.version,
|
|
1343
|
+
reviewGraphSignature: identity.signature,
|
|
1344
|
+
}
|
|
1345
|
+
: undefined;
|
|
1346
|
+
})()
|
|
1347
|
+
: undefined;
|
|
1206
1348
|
}
|
|
1207
1349
|
catch {
|
|
1208
1350
|
graph = undefined;
|
|
1351
|
+
callGraphIdentity = undefined;
|
|
1209
1352
|
}
|
|
1210
1353
|
// Drop function-local declarations (a nested const/arrow/function) from the
|
|
1211
1354
|
// outline — they're implementation detail of a parent symbol, not navigable
|
|
@@ -1277,6 +1420,9 @@ export async function moduleReport(file, cwd, options) {
|
|
|
1277
1420
|
const blastRadius = options?.blastRadius && graph && hasGraphNode
|
|
1278
1421
|
? await computeBlastRadius(graph, normalizedPath, cwd, Math.max(1, options.blastRadiusDepth ?? 3))
|
|
1279
1422
|
: undefined;
|
|
1423
|
+
const callGraph = options?.callGraph
|
|
1424
|
+
? readCallGraph(cwd, normalizedPath, maxCallGraphEntries, graphFileCap, callGraphIdentity, graph)
|
|
1425
|
+
: undefined;
|
|
1280
1426
|
const view = options?.view ?? "default";
|
|
1281
1427
|
const summaryView = view === "summary";
|
|
1282
1428
|
// "compact" computes the same full data as "default" — it's a rendering
|
|
@@ -1297,6 +1443,11 @@ export async function moduleReport(file, cwd, options) {
|
|
|
1297
1443
|
const blastRadiusProvenance = blastRadius
|
|
1298
1444
|
? "cached-review-graph"
|
|
1299
1445
|
: unavailableGraphProvenance;
|
|
1446
|
+
const callGraphProvenance = callGraph?.available
|
|
1447
|
+
? "cached-call-graph"
|
|
1448
|
+
: callGraph?.reason === "file-cap"
|
|
1449
|
+
? "unavailable:file-cap"
|
|
1450
|
+
: "none";
|
|
1300
1451
|
const report = {
|
|
1301
1452
|
available: entries.length > 0 || hasGraphNode,
|
|
1302
1453
|
staleness: entries.length === 0 && !hasGraphNode ? "unavailable" : "fresh",
|
|
@@ -1318,6 +1469,7 @@ export async function moduleReport(file, cwd, options) {
|
|
|
1318
1469
|
...(summaryView ? { view: "summary" } : {}),
|
|
1319
1470
|
...(compactView ? { view: "compact" } : {}),
|
|
1320
1471
|
...(blastRadius && !summaryView ? { blastRadius } : {}),
|
|
1472
|
+
...(callGraph ? { callGraph } : {}),
|
|
1321
1473
|
...(graph ? { graphBuiltAt: graph.builtAt } : {}),
|
|
1322
1474
|
provenance: {
|
|
1323
1475
|
symbols: languageId ? "syntax" : "none",
|
|
@@ -1329,6 +1481,7 @@ export async function moduleReport(file, cwd, options) {
|
|
|
1329
1481
|
...(options?.blastRadius
|
|
1330
1482
|
? { blastRadius: blastRadiusProvenance }
|
|
1331
1483
|
: {}),
|
|
1484
|
+
...(options?.callGraph ? { callGraph: callGraphProvenance } : {}),
|
|
1332
1485
|
},
|
|
1333
1486
|
semantic: {
|
|
1334
1487
|
// Provenance of who-uses-this / references. The AST review graph is the
|
|
@@ -1472,6 +1625,18 @@ export function renderCompactModuleReport(report) {
|
|
|
1472
1625
|
lines.push(compactCallbackLine(callback, width));
|
|
1473
1626
|
}
|
|
1474
1627
|
}
|
|
1628
|
+
if (report.callGraph) {
|
|
1629
|
+
const callGraph = report.callGraph;
|
|
1630
|
+
const suffix = callGraph.truncated ? " (truncated)" : "";
|
|
1631
|
+
lines.push("CALL GRAPH:");
|
|
1632
|
+
if (!callGraph.available) {
|
|
1633
|
+
lines.push(` unavailable (${callGraph.reason ?? "unknown"})`);
|
|
1634
|
+
}
|
|
1635
|
+
else {
|
|
1636
|
+
lines.push(` callers: ${callGraph.callers.length} · callees: ${callGraph.callees.length}` +
|
|
1637
|
+
` · coverage: ${callGraph.coverage.status}${suffix}`);
|
|
1638
|
+
}
|
|
1639
|
+
}
|
|
1475
1640
|
if (report.recommendedReads.length > 0) {
|
|
1476
1641
|
lines.push("RECOMMENDED:");
|
|
1477
1642
|
for (const r of report.recommendedReads) {
|