@herbertgao/pi-extensions 2026.8.6 → 2026.8.7
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 +5 -5
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +272 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +14 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +55 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
- package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
- package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +17 -13
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +21 -6
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +20 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +1 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +26 -10
- package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +2 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +30 -7
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +30 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +26 -5
- package/node_modules/@narumitw/pi-btw/README.md +120 -111
- package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
- package/node_modules/@narumitw/pi-btw/package.json +10 -6
- package/node_modules/@narumitw/pi-btw/src/btw.ts +36 -40
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
- package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +45 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/pi-lens/CHANGELOG.md +909 -0
- package/node_modules/pi-lens/README.md +11 -3
- package/node_modules/pi-lens/config/ruff/core.toml +42 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +126 -13
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +67 -11
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
- package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +285 -8
- package/node_modules/pi-lens/dist/clients/biome-client.js +61 -30
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +119 -0
- package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +192 -0
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +20 -1
- package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
- package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +123 -31
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +62 -13
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +25 -3
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +147 -33
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +52 -2
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +256 -88
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +60 -53
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +23 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +14 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +20 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +22 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +10 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +18 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +275 -13
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +21 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +734 -64
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +72 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +22 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +294 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
- package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +31 -0
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +109 -9
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +8 -0
- package/node_modules/pi-lens/dist/clients/installer/index.js +1114 -100
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
- package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +82 -6
- package/node_modules/pi-lens/dist/clients/knip-client.js +310 -10
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +2 -0
- package/node_modules/pi-lens/dist/clients/latency-logger.js +440 -11
- package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +8 -0
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +102 -7
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1516 -159
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +83 -1
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2274 -147
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
- package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
- package/node_modules/pi-lens/dist/clients/lsp/server.js +277 -16
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +79 -3
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/mcp/session.js +10 -2
- package/node_modules/pi-lens/dist/clients/module-report.js +8 -0
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
- package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +154 -33
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +84 -14
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -0
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +1 -1
- package/node_modules/pi-lens/dist/clients/read-guard.js +184 -10
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +52 -4
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +96 -7
- package/node_modules/pi-lens/dist/clients/runtime-context.js +8 -1
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +308 -45
- package/node_modules/pi-lens/dist/clients/runtime-session.js +332 -9
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +212 -79
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +575 -67
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +157 -24
- package/node_modules/pi-lens/dist/clients/sg-runner.js +116 -22
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-timing.js +19 -1
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +151 -16
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +125 -20
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
- package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
- package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +67738 -55739
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +466 -54
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +132 -43
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/docs/agent-guide.md +6 -1
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +515 -506
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +19 -5
- package/node_modules/pi-lens/docs/globalconfig.md +3 -0
- package/node_modules/pi-lens/docs/language-coverage.md +71 -5
- package/node_modules/pi-lens/docs/mcp.md +2 -2
- package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
- package/node_modules/pi-lens/docs/settings.md +19 -1
- package/node_modules/pi-lens/docs/usage.md +1 -0
- package/node_modules/pi-lens/package.json +10 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +15 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +57 -12
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +22 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +23 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +33 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +34 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +6 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +53 -1
- package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +2 -0
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +80 -3
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +41 -0
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +36 -0
- package/node_modules/pi-mcp-adapter/README.md +47 -5
- package/node_modules/pi-mcp-adapter/cli.js +163 -1
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +25 -7
- package/node_modules/pi-mcp-adapter/direct-tools.ts +5 -4
- package/node_modules/pi-mcp-adapter/index.ts +219 -32
- package/node_modules/pi-mcp-adapter/init.ts +36 -4
- package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
- package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +32 -21
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +3 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +31 -37
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +140 -2
- package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
- package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +2 -0
- package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
- package/node_modules/pi-mcp-adapter/utils.ts +70 -0
- package/node_modules/pi-web-access/CHANGELOG.md +23 -0
- package/node_modules/pi-web-access/README.md +27 -9
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/curator-page.ts +6 -3
- package/node_modules/pi-web-access/curator-server.ts +4 -1
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +28 -3
- package/node_modules/pi-web-access/gemini-search.ts +16 -4
- package/node_modules/pi-web-access/index.ts +41 -57
- package/node_modules/pi-web-access/package.json +1 -1
- package/node_modules/pi-web-access/page-query.ts +4 -2
- package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
- package/node_modules/pi-web-access/parallel.ts +2 -2
- package/node_modules/pi-web-access/query-rewrite.ts +51 -0
- package/node_modules/pi-web-access/serper.ts +211 -0
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +44 -22
- package/node_modules/pi-web-access/tavily.ts +16 -4
- package/node_modules/pi-web-access/utils.ts +87 -0
- package/node_modules/pi-web-access/valyu.ts +199 -0
- package/package.json +13 -13
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
import * as fs from "node:fs";
|
|
24
24
|
import * as path from "node:path";
|
|
25
25
|
import { writeFileAtomic, writeFileAtomicAsync } from "./atomic-write.js";
|
|
26
|
+
import { recordDegradationOnce } from "./degradation-ledger.js";
|
|
26
27
|
import { getGlobalPiLensDir } from "./file-utils.js";
|
|
27
28
|
// #735: reuse the #449/#525 reaper's exact conservative liveness check
|
|
28
29
|
// (`process.kill(pid, 0)`, ESRCH-only-means-dead) rather than inventing a
|
|
@@ -57,6 +58,30 @@ export function _resetInstanceRegistryEnabledForTests() {
|
|
|
57
58
|
_enabledCache = undefined;
|
|
58
59
|
}
|
|
59
60
|
// --- Read ---
|
|
61
|
+
/**
|
|
62
|
+
* Distinguishes "no registry yet" (ENOENT — a genuinely clean start, never
|
|
63
|
+
* recorded) from "a registry file exists but couldn't be trusted" (corrupt
|
|
64
|
+
* JSON, wrong shape, or another read error — e.g. a torn write left behind by
|
|
65
|
+
* a killed process, #1609 layer b). Both degrade to `{ instances: [] }`
|
|
66
|
+
* either way (this store is purely observational, per the module docstring),
|
|
67
|
+
* but only the latter is worth recording — a clean empty start must never
|
|
68
|
+
* read the same as a corrupt one, or a genuine torn-file regression would be
|
|
69
|
+
* invisible.
|
|
70
|
+
*
|
|
71
|
+
* `readRegistrySync`/`readRegistryAsync` are called from many sites across a
|
|
72
|
+
* session (register/heartbeat/reap/footprint — not only session_start), so
|
|
73
|
+
* this goes through `recordDegradationOnce` (#1609 review, the small fix)
|
|
74
|
+
* rather than a plain log call: the ledger's own per-kind/subject dedup caps
|
|
75
|
+
* it at one record for the session regardless of how many times the same
|
|
76
|
+
* torn file gets re-read, instead of re-logging on every call.
|
|
77
|
+
*/
|
|
78
|
+
function recordCorruptRegistryRead(reasonCode) {
|
|
79
|
+
recordDegradationOnce({
|
|
80
|
+
kind: "instance-registry-corrupt",
|
|
81
|
+
subject: "instances.json",
|
|
82
|
+
reason: `read failed (${reasonCode}); treating as empty`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
60
85
|
function readRegistrySync() {
|
|
61
86
|
try {
|
|
62
87
|
const raw = fs.readFileSync(registryPath(), "utf-8");
|
|
@@ -64,10 +89,16 @@ function readRegistrySync() {
|
|
|
64
89
|
if (parsed && Array.isArray(parsed.instances)) {
|
|
65
90
|
return parsed;
|
|
66
91
|
}
|
|
92
|
+
recordCorruptRegistryRead("invalid shape");
|
|
67
93
|
return { instances: [] };
|
|
68
94
|
}
|
|
69
|
-
catch {
|
|
70
|
-
// Missing file, corrupt JSON, or
|
|
95
|
+
catch (err) {
|
|
96
|
+
// Missing file, corrupt JSON, or a read error — treat as empty, never
|
|
97
|
+
// throw. Missing (ENOENT) is a clean start and stays silent; anything
|
|
98
|
+
// else is recorded so a corrupt/torn file is distinguishable from one.
|
|
99
|
+
const code = err?.code;
|
|
100
|
+
if (code !== "ENOENT")
|
|
101
|
+
recordCorruptRegistryRead(code ?? "invalid");
|
|
71
102
|
return { instances: [] };
|
|
72
103
|
}
|
|
73
104
|
}
|
|
@@ -78,9 +109,13 @@ async function readRegistryAsync() {
|
|
|
78
109
|
if (parsed && Array.isArray(parsed.instances)) {
|
|
79
110
|
return parsed;
|
|
80
111
|
}
|
|
112
|
+
recordCorruptRegistryRead("invalid shape");
|
|
81
113
|
return { instances: [] };
|
|
82
114
|
}
|
|
83
|
-
catch {
|
|
115
|
+
catch (err) {
|
|
116
|
+
const code = err?.code;
|
|
117
|
+
if (code !== "ENOENT")
|
|
118
|
+
recordCorruptRegistryRead(code ?? "invalid");
|
|
84
119
|
return { instances: [] };
|
|
85
120
|
}
|
|
86
121
|
}
|
|
@@ -186,8 +221,32 @@ export async function updateHeartbeat(patch = {}) {
|
|
|
186
221
|
};
|
|
187
222
|
await writeRegistryAsync(file);
|
|
188
223
|
}
|
|
224
|
+
// Every mutation below (`recordLspChild`, `removeLspChild`) reads the WHOLE
|
|
225
|
+
// registry file, edits this process's own `lspChildren`, and writes the whole
|
|
226
|
+
// file back. Two such mutations from the SAME process — e.g. a client-ceiling
|
|
227
|
+
// eviction's `removeLspChild(victimPid)` racing the replacement spawn's
|
|
228
|
+
// `recordLspChild(newChild)` that follows it — are ordinary concurrent async
|
|
229
|
+
// calls with no ordering guarantee between them. Without serialization, the
|
|
230
|
+
// later WRITE can be built from a read taken before the earlier write landed,
|
|
231
|
+
// silently reverting it (last-writer-wins losing a same-process update, not
|
|
232
|
+
// just the already-accepted cross-process one — see the module docstring).
|
|
233
|
+
// #1724: this is why a forced LSP shutdown's deregistration could get
|
|
234
|
+
// clobbered by a concurrent respawn's registration. One shared tail
|
|
235
|
+
// serializes every same-process registry mutation of this shape so "record"
|
|
236
|
+
// and "remove" can never interleave their read-modify-write against each
|
|
237
|
+
// other — the single seam both the forced-shutdown and self-crash
|
|
238
|
+
// deregistration paths route through.
|
|
239
|
+
let registryChildMutationTail = Promise.resolve();
|
|
240
|
+
function queueRegistryChildMutation(op) {
|
|
241
|
+
const run = registryChildMutationTail.then(op);
|
|
242
|
+
registryChildMutationTail = run.catch(() => { });
|
|
243
|
+
return run;
|
|
244
|
+
}
|
|
189
245
|
/** Append/replace (by pid) an LSP child under this process's entry. */
|
|
190
|
-
export
|
|
246
|
+
export function recordLspChild(entry) {
|
|
247
|
+
return queueRegistryChildMutation(() => recordLspChildNow(entry));
|
|
248
|
+
}
|
|
249
|
+
async function recordLspChildNow(entry) {
|
|
191
250
|
if (!isInstanceRegistryEnabled())
|
|
192
251
|
return;
|
|
193
252
|
const pid = process.pid;
|
|
@@ -226,19 +285,23 @@ export async function recordLspChild(entry) {
|
|
|
226
285
|
}
|
|
227
286
|
await writeRegistryAsync(file);
|
|
228
287
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
288
|
+
/**
|
|
289
|
+
* Remove an LSP child (by pid) from this process's entry. `expectedMarker`,
|
|
290
|
+
* when supplied, guards against the pid-recycling window between this
|
|
291
|
+
* child's death and this call landing: if the recorded entry for `pid` now
|
|
292
|
+
* carries a DIFFERENT marker than the one this caller spawned, some other
|
|
293
|
+
* child has already claimed that pid (recycled) and must not be removed on
|
|
294
|
+
* this caller's behalf — same asymmetric-safety contract as the reaper's
|
|
295
|
+
* `buildIdentityMatcher` (never remove on an unverifiable/mismatched
|
|
296
|
+
* identity). Omit `expectedMarker` for a server this process never derived a
|
|
297
|
+
* marker for (pid-only match, unchanged pre-#1724 behavior) — safe because
|
|
298
|
+
* this call fires synchronously off THIS process's own just-confirmed exit
|
|
299
|
+
* of that exact pid, well inside the OS's pid-reuse latency.
|
|
300
|
+
*/
|
|
301
|
+
export function removeLspChild(pid, expectedMarker) {
|
|
302
|
+
return queueRegistryChildMutation(() => removeLspChildNow(pid, expectedMarker));
|
|
240
303
|
}
|
|
241
|
-
async function removeLspChildNow(pid) {
|
|
304
|
+
async function removeLspChildNow(pid, expectedMarker) {
|
|
242
305
|
if (!isInstanceRegistryEnabled())
|
|
243
306
|
return;
|
|
244
307
|
const selfPid = process.pid;
|
|
@@ -247,7 +310,14 @@ async function removeLspChildNow(pid) {
|
|
|
247
310
|
if (idx === -1)
|
|
248
311
|
return;
|
|
249
312
|
const current = file.instances[idx];
|
|
250
|
-
const filtered = current.lspChildren.filter((child) =>
|
|
313
|
+
const filtered = current.lspChildren.filter((child) => {
|
|
314
|
+
if (child.pid !== pid)
|
|
315
|
+
return true; // keep — different pid
|
|
316
|
+
if (expectedMarker && child.marker && child.marker !== expectedMarker) {
|
|
317
|
+
return true; // keep — pid recycled onto a differently-marked child
|
|
318
|
+
}
|
|
319
|
+
return false; // drop — this is the child we're deregistering
|
|
320
|
+
});
|
|
251
321
|
if (filtered.length === current.lspChildren.length)
|
|
252
322
|
return; // nothing removed
|
|
253
323
|
file.instances[idx] = {
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* Requires: npm install -D jscpd
|
|
8
8
|
* Docs: https://github.com/kucherenko/jscpd
|
|
9
9
|
*/
|
|
10
|
+
import { formatToolFailure } from "./dispatch/runners/utils/tool-failure.js";
|
|
10
11
|
import { createSubsystemLogger } from "./extension-log.js";
|
|
12
|
+
import { incrementDegradationCount } from "./degradation-ledger.js";
|
|
11
13
|
import * as fs from "node:fs";
|
|
12
14
|
import { mkdtempSync } from "node:fs";
|
|
13
15
|
import * as os from "node:os";
|
|
@@ -27,6 +29,31 @@ const EMPTY_RESULT = {
|
|
|
27
29
|
percentage: 0,
|
|
28
30
|
};
|
|
29
31
|
const SCAN_TIMEOUT_MS = 30_000;
|
|
32
|
+
/** jscpd's own config-file names, in its discovery order, checked at `cwd` only
|
|
33
|
+
* (jscpd does not walk up). */
|
|
34
|
+
const JSCPD_CONFIG_FILENAMES = [".jscpd.json", "jscpd.json"];
|
|
35
|
+
/**
|
|
36
|
+
* True when the project ships its own jscpd config: a `.jscpd.json`/
|
|
37
|
+
* `jscpd.json` file, or a `package.json` `jscpd` field. jscpd discovers either
|
|
38
|
+
* unaided, but `--min-lines`/`--min-tokens`/`--ignore` on the CLI override
|
|
39
|
+
* whatever the config sets — passing them unconditionally silently discarded a
|
|
40
|
+
* project's own thresholds and ignore list (#1731, discipline A).
|
|
41
|
+
*/
|
|
42
|
+
function hasProjectJscpdConfig(cwd) {
|
|
43
|
+
for (const name of JSCPD_CONFIG_FILENAMES) {
|
|
44
|
+
if (fs.existsSync(path.join(cwd, name)))
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf-8"));
|
|
49
|
+
if (pkg && typeof pkg === "object" && pkg.jscpd !== undefined)
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// No/malformed package.json — "no project config" is the honest answer.
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
30
57
|
const jscpdAvailability = createAvailabilityChecker("jscpd", "", ["--version"], {
|
|
31
58
|
probeTimeout: 1500,
|
|
32
59
|
// One definition of the managed-shim fast path, shared with knip (#1476).
|
|
@@ -109,6 +136,22 @@ export class JscpdClient {
|
|
|
109
136
|
this.jscpdManagedPath = resolved;
|
|
110
137
|
return true;
|
|
111
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* #1623: public availability verdict for callers outside the dispatch
|
|
141
|
+
* graph (mode=full's fresh-fetch) that need to say WHY `ensureAvailable()`
|
|
142
|
+
* most recently returned false, using the SAME outcome/cause the shared
|
|
143
|
+
* `jscpdAvailability` checker already tracks — not a re-guessed "jscpd
|
|
144
|
+
* binary unavailable" that can't tell a transient retry-cooldown probe
|
|
145
|
+
* from a durable absence.
|
|
146
|
+
*/
|
|
147
|
+
getAvailabilityVerdict() {
|
|
148
|
+
const verdict = jscpdAvailability.getVerdict(process.cwd());
|
|
149
|
+
return {
|
|
150
|
+
outcome: verdict.outcome,
|
|
151
|
+
cause: verdict.cause,
|
|
152
|
+
retryAtMs: verdict.retryAtMs,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
112
155
|
/**
|
|
113
156
|
* Scan a directory for duplicate code blocks.
|
|
114
157
|
* Uses a temp output dir to capture JSON report.
|
|
@@ -183,19 +226,21 @@ export class JscpdClient {
|
|
|
183
226
|
: this.jscpdManagedPath
|
|
184
227
|
? { cmd: this.jscpdManagedPath, prefix: [] }
|
|
185
228
|
: { cmd: "npx", prefix: ["jscpd"] };
|
|
229
|
+
// A project's own jscpd config wins outright (#1731, discipline A):
|
|
230
|
+
// these three flags all override whatever it sets, so none are passed
|
|
231
|
+
// when the project ships one — jscpd discovers it unaided.
|
|
232
|
+
const hasConfig = hasProjectJscpdConfig(cwd);
|
|
186
233
|
const result = await safeSpawnAsync(cmd, [
|
|
187
234
|
...prefix,
|
|
188
235
|
".",
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
String(minTokens),
|
|
236
|
+
...(hasConfig
|
|
237
|
+
? []
|
|
238
|
+
: ["--min-lines", String(minLines), "--min-tokens", String(minTokens)]),
|
|
193
239
|
"--reporters",
|
|
194
240
|
"json",
|
|
195
241
|
"--output",
|
|
196
242
|
outDir,
|
|
197
|
-
"--ignore",
|
|
198
|
-
ignorePattern,
|
|
243
|
+
...(hasConfig ? [] : ["--ignore", ignorePattern]),
|
|
199
244
|
], {
|
|
200
245
|
timeout: SCAN_TIMEOUT_MS,
|
|
201
246
|
cwd,
|
|
@@ -204,8 +249,39 @@ export class JscpdClient {
|
|
|
204
249
|
this.log(`Scan error: ${result.error.message}`);
|
|
205
250
|
return { ...EMPTY_RESULT };
|
|
206
251
|
}
|
|
252
|
+
// Empirical exit-code table (jscpd 3.5.10, verified live for #1736's
|
|
253
|
+
// sweep): a genuinely clean run (no clones) exits 0 and writes NO
|
|
254
|
+
// report file — jscpd only writes `jscpd-report.json` when it has
|
|
255
|
+
// something to report. A crashed run (uncaught exception, e.g. a bad
|
|
256
|
+
// scan path) ALSO writes no report file, but exits nonzero. The
|
|
257
|
+
// missing-file check alone can't tell those apart, so a nonzero exit
|
|
258
|
+
// with no report file is reported as errored, never as "0 clones".
|
|
259
|
+
// (Not `spawnFailedWithNoOutput` — the parsed artifact here is a
|
|
260
|
+
// report FILE, not stdout, so the shared stdout-based discriminator
|
|
261
|
+
// doesn't apply; the underlying "nonzero exit -> not clean" rule is
|
|
262
|
+
// the same one.)
|
|
207
263
|
const reportPath = path.join(outDir, "jscpd-report.json");
|
|
208
264
|
if (!fs.existsSync(reportPath)) {
|
|
265
|
+
if (result.status !== 0) {
|
|
266
|
+
// #1816: one shared wording, one truncation, signal named.
|
|
267
|
+
// `reportMissing` is the artifact-tool arm of the same
|
|
268
|
+
// primitive — the parsed artifact here is a report FILE.
|
|
269
|
+
const reason = formatToolFailure({
|
|
270
|
+
tool: "jscpd",
|
|
271
|
+
status: result.status,
|
|
272
|
+
signal: result.signal,
|
|
273
|
+
stderr: result.stderr,
|
|
274
|
+
reportMissing: true,
|
|
275
|
+
fields: { command: cmd },
|
|
276
|
+
});
|
|
277
|
+
this.log(reason);
|
|
278
|
+
incrementDegradationCount({
|
|
279
|
+
kind: "runner-empty-result",
|
|
280
|
+
subject: "jscpd",
|
|
281
|
+
reason,
|
|
282
|
+
});
|
|
283
|
+
return { ...EMPTY_RESULT };
|
|
284
|
+
}
|
|
209
285
|
return { ...EMPTY_RESULT, success: true };
|
|
210
286
|
}
|
|
211
287
|
return this.parseReport(reportPath);
|