@herbertgao/pi-extensions 2026.8.11 → 2026.8.12
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 +18 -10
- package/{node_modules/@herbertgao/pi-inline-skills/LICENSE → THIRD_PARTY_NOTICES.md} +15 -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/@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 +34 -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 +35 -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 +1077 -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 +36 -29
- 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 +40 -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-mermaid-open/CHANGELOG.md +0 -39
- package/node_modules/@herbertgao/pi-mermaid-open/LICENSE +0 -22
- 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
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
1
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
4
|
+
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
5
|
+
import { homedir, hostname, tmpdir } from "node:os";
|
|
3
6
|
import { join } from "node:path";
|
|
4
7
|
|
|
5
8
|
export function getWebSearchConfigDir(): string {
|
|
@@ -186,3 +189,306 @@ export function mapFfmpegError(err: unknown): string {
|
|
|
186
189
|
const snippet = trimErrorText(stderr || message);
|
|
187
190
|
return snippet ? `ffmpeg failed: ${snippet}` : "ffmpeg failed";
|
|
188
191
|
}
|
|
192
|
+
|
|
193
|
+
const proxyStorage = new AsyncLocalStorage<string | null>();
|
|
194
|
+
|
|
195
|
+
export function normalizeProxyUrl(value: unknown, source: string): string | null {
|
|
196
|
+
if (value === undefined || value === null) return null;
|
|
197
|
+
if (typeof value !== "string") throw new Error(`${source} must be an http(s) proxy URL string`);
|
|
198
|
+
const trimmed = value.trim();
|
|
199
|
+
if (!trimmed) return null;
|
|
200
|
+
let parsed: URL;
|
|
201
|
+
try {
|
|
202
|
+
parsed = new URL(trimmed);
|
|
203
|
+
} catch {
|
|
204
|
+
throw new Error(`${source} must be a valid proxy URL: ${JSON.stringify(trimmed)}`);
|
|
205
|
+
}
|
|
206
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
207
|
+
throw new Error(`${source} must use the http:// or https:// scheme: ${trimmed}`);
|
|
208
|
+
}
|
|
209
|
+
if (!parsed.hostname) throw new Error(`${source} must include a proxy host: ${trimmed}`);
|
|
210
|
+
parsed.hash = "";
|
|
211
|
+
parsed.search = "";
|
|
212
|
+
return parsed.toString();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function redactProxyUrl(value: string): string {
|
|
216
|
+
const parsed = new URL(value);
|
|
217
|
+
if (parsed.username) parsed.username = "redacted";
|
|
218
|
+
if (parsed.password) parsed.password = "redacted";
|
|
219
|
+
return parsed.toString();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function loadConfiguredProxy(): string | null {
|
|
223
|
+
let configured: unknown;
|
|
224
|
+
const path = getWebSearchConfigPath();
|
|
225
|
+
if (existsSync(path)) {
|
|
226
|
+
let raw: unknown;
|
|
227
|
+
try {
|
|
228
|
+
raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
229
|
+
} catch (err) {
|
|
230
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
231
|
+
throw new Error(`Failed to load proxy config from ${path}: ${message}`);
|
|
232
|
+
}
|
|
233
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) configured = (raw as { proxy?: unknown }).proxy;
|
|
234
|
+
}
|
|
235
|
+
if (configured === undefined) return null;
|
|
236
|
+
return normalizeProxyUrl(configured, `proxy in ${getWebSearchConfigPath()}`);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function runWithProxy<T>(proxy: string | undefined, fn: () => T): T {
|
|
240
|
+
if (proxy === undefined) return fn();
|
|
241
|
+
const normalized = normalizeProxyUrl(proxy, "proxy");
|
|
242
|
+
return proxyStorage.run(normalized, fn);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export function getActiveProxy(): string | null {
|
|
246
|
+
const scoped = proxyStorage.getStore();
|
|
247
|
+
return scoped !== undefined ? scoped : loadConfiguredProxy();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export function hasScopedProxyDecision(): boolean {
|
|
251
|
+
return proxyStorage.getStore() !== undefined;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function noProxyEntryMatches(hostname: string, entry: string): boolean {
|
|
255
|
+
if (!entry) return false;
|
|
256
|
+
if (entry === "*") return true;
|
|
257
|
+
let host = entry;
|
|
258
|
+
if (host.startsWith("[")) {
|
|
259
|
+
const close = host.indexOf("]");
|
|
260
|
+
if (close > 0) host = host.slice(0, close + 1);
|
|
261
|
+
} else {
|
|
262
|
+
const colon = host.lastIndexOf(":");
|
|
263
|
+
if (colon > -1 && /^\d+$/.test(host.slice(colon + 1))) host = host.slice(0, colon);
|
|
264
|
+
}
|
|
265
|
+
host = host.toLowerCase().replace(/^\[|\]$/g, "");
|
|
266
|
+
if (!host) return false;
|
|
267
|
+
return hostname === host || hostname.endsWith(host.startsWith(".") ? host : `.${host}`);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** True when a URL must NOT be sent through the active proxy. */
|
|
271
|
+
export function isProxyBypassedUrl(url: URL): boolean {
|
|
272
|
+
const hostname = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
273
|
+
if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname === "127.0.0.1" || hostname === "::1") return true;
|
|
274
|
+
const noProxy = process.env.NO_PROXY || process.env.no_proxy;
|
|
275
|
+
if (noProxy && noProxy.split(",").some((entry) => noProxyEntryMatches(hostname, entry.trim()))) return true;
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export interface ProxiedRequestInit extends RequestInit {
|
|
280
|
+
/** Caller-supplied proxy; bypasses AsyncLocalStorage for pLimit-safe contexts. */
|
|
281
|
+
__proxy?: string;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
interface ProxiedFetch {
|
|
285
|
+
(input: RequestInfo | URL, init?: ProxiedRequestInit): Promise<Response>;
|
|
286
|
+
__piWebAccessProxyFetch?: boolean;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** Wraps globalThis.fetch so every http(s) call routes through curl while a proxy is active. Idempotent. */
|
|
290
|
+
export function installGlobalProxyFetch(): void {
|
|
291
|
+
const current = globalThis.fetch as ProxiedFetch;
|
|
292
|
+
if (typeof current !== "function" || current.__piWebAccessProxyFetch === true) return;
|
|
293
|
+
const nativeFetch = current;
|
|
294
|
+
const wrapped: ProxiedFetch = ((input: RequestInfo | URL, init?: ProxiedRequestInit) => {
|
|
295
|
+
// Prefer caller-attached __proxy (survives pLimit context loss) over AsyncLocalStorage.
|
|
296
|
+
const proxy = init?.__proxy ?? getActiveProxy();
|
|
297
|
+
if (!proxy) return nativeFetch(input, init);
|
|
298
|
+
let url: URL | null = null;
|
|
299
|
+
try {
|
|
300
|
+
url = new URL(typeof input === "string" || input instanceof URL ? input : input.url);
|
|
301
|
+
} catch {
|
|
302
|
+
url = null;
|
|
303
|
+
}
|
|
304
|
+
if (!url || (url.protocol !== "http:" && url.protocol !== "https:") || isProxyBypassedUrl(url)) {
|
|
305
|
+
return nativeFetch(input, init);
|
|
306
|
+
}
|
|
307
|
+
return fetchViaCurl(url, init ?? {}, proxy);
|
|
308
|
+
});
|
|
309
|
+
wrapped.__piWebAccessProxyFetch = true;
|
|
310
|
+
globalThis.fetch = wrapped;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function parseHeaderDump(dump: string): { status: number; statusText: string; headers: Array<[string, string]> } {
|
|
314
|
+
const blocks = dump.split(/\r?\n\r?\n/).filter((block) => /^HTTP\/[\d.]+\s+\d{3}/.test(block.trim()));
|
|
315
|
+
const block = (blocks.length > 0 ? blocks[blocks.length - 1] : "").trim();
|
|
316
|
+
const lines = block.split(/\r?\n/);
|
|
317
|
+
let status = 0;
|
|
318
|
+
let statusText = "";
|
|
319
|
+
const headers: Array<[string, string]> = [];
|
|
320
|
+
for (const line of lines) {
|
|
321
|
+
const match = /^HTTP\/[\d.]+\s+(\d{3})(?:\s+(.*))?$/.exec(line.trim());
|
|
322
|
+
if (match) {
|
|
323
|
+
status = Number(match[1]);
|
|
324
|
+
statusText = match[2] ?? "";
|
|
325
|
+
headers.length = 0;
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
const separator = line.indexOf(":");
|
|
329
|
+
if (separator > 0) {
|
|
330
|
+
const name = line.slice(0, separator).trim();
|
|
331
|
+
if (name.toLowerCase() === "content-encoding" || name.toLowerCase() === "content-length") continue;
|
|
332
|
+
headers.push([name, line.slice(separator + 1).trim()]);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return { status, statusText, headers };
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
class CurlTransportError extends Error {}
|
|
339
|
+
|
|
340
|
+
async function fetchViaCurl(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {
|
|
341
|
+
let current = url;
|
|
342
|
+
let currentInit = init;
|
|
343
|
+
for (let redirects = 0; ; redirects++) {
|
|
344
|
+
const response = await fetchViaCurlOnce(current, currentInit, proxyUrl);
|
|
345
|
+
const location = response.headers.get("location");
|
|
346
|
+
if (!location || ![301, 302, 303, 307, 308].includes(response.status)) {
|
|
347
|
+
if (redirects > 0) Object.defineProperty(response, "redirected", { value: true, configurable: true });
|
|
348
|
+
return response;
|
|
349
|
+
}
|
|
350
|
+
if (currentInit.redirect === "manual") return response;
|
|
351
|
+
if (currentInit.redirect === "error") throw new TypeError(`Proxy fetch redirect blocked from ${current.toString()}`);
|
|
352
|
+
if (redirects === 20) throw new Error(`Too many proxy redirects from ${url.toString()}`);
|
|
353
|
+
|
|
354
|
+
const next = new URL(location, current);
|
|
355
|
+
if (next.protocol !== "http:" && next.protocol !== "https:") throw new Error(`Proxy redirect from ${current.origin} must use HTTP(S)`);
|
|
356
|
+
|
|
357
|
+
let headers = new Headers(currentInit.headers);
|
|
358
|
+
let nextInit: RequestInit;
|
|
359
|
+
const method = currentInit.method?.toUpperCase() ?? "GET";
|
|
360
|
+
if (((response.status === 301 || response.status === 302) && method === "POST") || (response.status === 303 && method !== "GET" && method !== "HEAD")) {
|
|
361
|
+
for (const name of ["Content-Encoding", "Content-Language", "Content-Location", "Content-Type"]) headers.delete(name);
|
|
362
|
+
const { body: _body, ...withoutBody } = currentInit;
|
|
363
|
+
nextInit = { ...withoutBody, method: "GET", headers };
|
|
364
|
+
} else {
|
|
365
|
+
nextInit = { ...currentInit, headers };
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (next.origin !== current.origin) {
|
|
369
|
+
headers = new Headers();
|
|
370
|
+
nextInit = { ...nextInit, headers };
|
|
371
|
+
}
|
|
372
|
+
current = next;
|
|
373
|
+
currentInit = nextInit;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
async function fetchViaCurlOnce(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {
|
|
378
|
+
const method = (init.method ?? "GET").toUpperCase();
|
|
379
|
+
const headers = new Headers(init.headers);
|
|
380
|
+
|
|
381
|
+
const dir = await mkdtemp(join(tmpdir(), "pi-web-access-proxy-"));
|
|
382
|
+
const headerFile = join(dir, "headers");
|
|
383
|
+
const bodyFile = join(dir, "body");
|
|
384
|
+
const requestBodyFile = join(dir, "request-body");
|
|
385
|
+
|
|
386
|
+
const args: string[] = [
|
|
387
|
+
"--silent",
|
|
388
|
+
"--show-error",
|
|
389
|
+
"--compressed",
|
|
390
|
+
"--connect-timeout", "20",
|
|
391
|
+
"-x", proxyUrl,
|
|
392
|
+
"-D", headerFile,
|
|
393
|
+
"--output", bodyFile,
|
|
394
|
+
"--write-out", "%{json}",
|
|
395
|
+
];
|
|
396
|
+
|
|
397
|
+
if (method !== "GET" && method !== "HEAD") args.push("-X", method);
|
|
398
|
+
|
|
399
|
+
for (const [name, value] of headers.entries()) {
|
|
400
|
+
if (value === "") continue;
|
|
401
|
+
args.push("-H", `${name}: ${value}`);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const body = init.body;
|
|
405
|
+
if (body !== undefined && body !== null) {
|
|
406
|
+
let buffer: Buffer;
|
|
407
|
+
if (typeof body === "string") buffer = Buffer.from(body, "utf-8");
|
|
408
|
+
else if (body instanceof URLSearchParams) buffer = Buffer.from(body.toString(), "utf-8");
|
|
409
|
+
else if (body instanceof ArrayBuffer) buffer = Buffer.from(body);
|
|
410
|
+
else if (ArrayBuffer.isView(body)) buffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
|
|
411
|
+
else throw new Error(`Unsupported request body type for proxy fetch: ${typeof body}`);
|
|
412
|
+
await writeFile(requestBodyFile, buffer);
|
|
413
|
+
args.push("--data-binary", `@${requestBodyFile}`);
|
|
414
|
+
if (method === "GET") args.unshift("-X", "GET");
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
args.push(url.toString());
|
|
418
|
+
|
|
419
|
+
const signal = init.signal ?? null;
|
|
420
|
+
let stdout: string;
|
|
421
|
+
try {
|
|
422
|
+
stdout = await new Promise<string>((resolve, reject) => {
|
|
423
|
+
if (signal?.aborted) {
|
|
424
|
+
reject(new DOMException("The operation was aborted.", "AbortError"));
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const child = spawn("curl", args, { windowsHide: true });
|
|
428
|
+
let out = "";
|
|
429
|
+
let stderr = "";
|
|
430
|
+
const onAbort = () => { try { child.kill(); } catch {} };
|
|
431
|
+
if (signal) {
|
|
432
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
433
|
+
}
|
|
434
|
+
child.stdout?.on("data", (chunk: Buffer) => { out += chunk.toString("utf-8"); });
|
|
435
|
+
child.stderr?.on("data", (chunk: Buffer) => { if (stderr.length < 4096) stderr += chunk.toString("utf-8"); });
|
|
436
|
+
child.once("error", (err: NodeJS.ErrnoException) => {
|
|
437
|
+
signal?.removeEventListener("abort", onAbort);
|
|
438
|
+
reject(new CurlTransportError(err.code === "ENOENT"
|
|
439
|
+
? "curl executable not found on PATH; proxy transport requires curl"
|
|
440
|
+
: `curl failed to start: ${err.message}`));
|
|
441
|
+
});
|
|
442
|
+
child.once("close", (code) => {
|
|
443
|
+
signal?.removeEventListener("abort", onAbort);
|
|
444
|
+
if (signal?.aborted) return reject(new DOMException("The operation was aborted.", "AbortError"));
|
|
445
|
+
if (code !== 0 && !out.trim()) {
|
|
446
|
+
return reject(new CurlTransportError(`curl exited with code ${code ?? "unknown"} via ${redactProxyUrl(proxyUrl)}${stderr.trim() ? `: ${stderr.trim()}` : ""}`));
|
|
447
|
+
}
|
|
448
|
+
resolve(out);
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
} catch (err) {
|
|
452
|
+
await rm(dir, { recursive: true, force: true }).catch(() => {});
|
|
453
|
+
if (err instanceof CurlTransportError) throw new Error(err.message);
|
|
454
|
+
throw err;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
let bodyBuffer = Buffer.alloc(0);
|
|
458
|
+
let dump = "";
|
|
459
|
+
try {
|
|
460
|
+
[dump, bodyBuffer] = await Promise.all([readFile(headerFile, "utf-8"), readFile(bodyFile)]);
|
|
461
|
+
} catch {
|
|
462
|
+
// HEAD or empty responses may not produce output files.
|
|
463
|
+
} finally {
|
|
464
|
+
await rm(dir, { recursive: true, force: true }).catch(() => {});
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
const { status, statusText, headers: responseHeaders } = parseHeaderDump(dump);
|
|
468
|
+
if (status === 0) {
|
|
469
|
+
throw new Error(`Proxy fetch to ${url.toString()} via ${redactProxyUrl(proxyUrl)} returned no HTTP status`);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
let finalUrl = url.toString();
|
|
473
|
+
let redirected = false;
|
|
474
|
+
try {
|
|
475
|
+
const trimmed = stdout.trim();
|
|
476
|
+
if (trimmed.startsWith("{")) {
|
|
477
|
+
const writeOut = JSON.parse(trimmed) as { url_effective?: string; num_redirects?: number };
|
|
478
|
+
if (writeOut.url_effective) finalUrl = writeOut.url_effective;
|
|
479
|
+
redirected = (writeOut.num_redirects ?? 0) > 0;
|
|
480
|
+
}
|
|
481
|
+
} catch {
|
|
482
|
+
// Older curl without %{json}; the header dump already provided the status.
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const nullBody = status === 204 || status === 205 || status === 304;
|
|
486
|
+
const response = new Response(nullBody ? null : new Uint8Array(bodyBuffer), {
|
|
487
|
+
status,
|
|
488
|
+
statusText: statusText || undefined,
|
|
489
|
+
headers: new Headers(responseHeaders),
|
|
490
|
+
});
|
|
491
|
+
Object.defineProperty(response, "url", { value: finalUrl, configurable: true });
|
|
492
|
+
Object.defineProperty(response, "redirected", { value: redirected, configurable: true });
|
|
493
|
+
return response;
|
|
494
|
+
}
|
|
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { activityMonitor } from "./activity.ts";
|
|
4
4
|
import { canAttachImages } from "./feature-config.ts";
|
|
5
5
|
import { isGeminiWebAvailable, queryWithCookies } from "./gemini-web.ts";
|
|
6
|
-
import {
|
|
6
|
+
import { isGeminiApiAvailableWithVideo, queryGeminiApiWithVideo } from "./gemini-api.ts";
|
|
7
7
|
import { isPerplexityAvailable, searchWithPerplexity } from "./perplexity.ts";
|
|
8
8
|
import { extractHeadingTitle, type ExtractedContent, type FrameResult, type VideoFrame } from "./extract.ts";
|
|
9
9
|
import { formatSeconds, readExecError, isTimeoutError, trimErrorText, mapFfmpegError, getWebSearchConfigPath } from "./utils.ts";
|
|
@@ -266,7 +266,7 @@ async function tryGeminiApi(
|
|
|
266
266
|
attemptErrors: string[],
|
|
267
267
|
): Promise<ExtractedContent | null> {
|
|
268
268
|
try {
|
|
269
|
-
if (!
|
|
269
|
+
if (!isGeminiApiAvailableWithVideo()) return null;
|
|
270
270
|
|
|
271
271
|
if (signal?.aborted) return null;
|
|
272
272
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herbertgao/pi-extensions",
|
|
3
|
-
"version": "2026.8.
|
|
3
|
+
"version": "2026.8.12",
|
|
4
4
|
"description": "Aggregate installer for HerbertGao-maintained Pi extensions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"extensions",
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"files": [
|
|
23
23
|
"examples/pi-footer.json",
|
|
24
24
|
"README.md",
|
|
25
|
-
"LICENSE"
|
|
25
|
+
"LICENSE",
|
|
26
|
+
"THIRD_PARTY_NOTICES.md"
|
|
26
27
|
],
|
|
27
28
|
"type": "module",
|
|
28
29
|
"publishConfig": {
|
|
@@ -36,43 +37,44 @@
|
|
|
36
37
|
"dependencies": {
|
|
37
38
|
"@ast-grep/cli": "^0.45.0",
|
|
38
39
|
"@ast-grep/napi": "^0.45.0",
|
|
39
|
-
"@czottmann/pi-automode": "1.
|
|
40
|
+
"@czottmann/pi-automode": "1.13.0",
|
|
40
41
|
"@dietrichgebert/ponytail": "4.9.0",
|
|
41
42
|
"@earendil-works/pi-coding-agent": "^0.84.2",
|
|
42
43
|
"@earendil-works/pi-tui": "^0.84.2",
|
|
43
44
|
"@effect/platform-node": "4.0.0-beta.103",
|
|
44
45
|
"@effect/platform-node-shared": "4.0.0-beta.103",
|
|
45
|
-
"@herbertgao/pi-cc-extensions": "0.8.
|
|
46
|
-
"@herbertgao/pi-copy-response": "0.2.6",
|
|
47
|
-
"@herbertgao/pi-handoff": "2.0.0",
|
|
48
|
-
"@herbertgao/pi-inline-skills": "1.0.5",
|
|
49
|
-
"@herbertgao/pi-mermaid-open": "0.2.0",
|
|
50
|
-
"@herbertgao/pi-preferred-thinking": "0.4.0",
|
|
51
|
-
"@herbertgao/pi-recap": "0.4.5",
|
|
52
|
-
"@herbertgao/pi-rename": "0.5.0",
|
|
46
|
+
"@herbertgao/pi-cc-extensions": "0.8.59",
|
|
53
47
|
"@herbertgao/pi-stash": "0.1.2",
|
|
54
|
-
"@herbertgao/pi-subagents": "0.
|
|
55
|
-
"@herbertgao/pi-titlebar-spinner": "0.1.3",
|
|
48
|
+
"@herbertgao/pi-subagents": "0.17.0",
|
|
56
49
|
"@herbertgao/resume-from": "0.2.0",
|
|
57
|
-
"@juicesharp/rpiv-ask-user-question": "2.7.
|
|
58
|
-
"@juicesharp/rpiv-config": "^2.7.
|
|
50
|
+
"@juicesharp/rpiv-ask-user-question": "2.7.1",
|
|
51
|
+
"@juicesharp/rpiv-config": "^2.7.1",
|
|
59
52
|
"@modelcontextprotocol/client": "2.0.0",
|
|
60
53
|
"@modelcontextprotocol/core": "2.0.0",
|
|
61
54
|
"@modelcontextprotocol/ext-apps": "^1.2.2",
|
|
62
55
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
63
56
|
"@mozilla/readability": "^0.6.0",
|
|
64
57
|
"@napi-rs/keyring": "^1.3.0",
|
|
65
|
-
"@narumitw/pi-btw": "0.55.
|
|
66
|
-
"@narumitw/pi-tui-kit": "^0.
|
|
58
|
+
"@narumitw/pi-btw": "0.55.3",
|
|
59
|
+
"@narumitw/pi-tui-kit": "^0.58.1",
|
|
67
60
|
"@noble/ed25519": "^3.1.0",
|
|
68
61
|
"@pi-plugins/fast-mode": "0.1.10",
|
|
69
62
|
"@shikijs/cli": "^4.0.2",
|
|
70
63
|
"@sinclair/typebox": "^0.34.49",
|
|
64
|
+
"@tifan/pi-copy-response": "0.2.6",
|
|
65
|
+
"@tifan/pi-handoff": "2.0.1",
|
|
66
|
+
"@tifan/pi-inline-skills": "1.0.5",
|
|
67
|
+
"@tifan/pi-mermaid-open": "0.2.0",
|
|
68
|
+
"@tifan/pi-preferred-thinking": "1.0.0",
|
|
69
|
+
"@tifan/pi-recap": "0.4.5",
|
|
70
|
+
"@tifan/pi-rename": "0.5.1",
|
|
71
|
+
"@tifan/pi-titlebar-spinner": "0.1.3",
|
|
71
72
|
"ajv": "^8.17.1",
|
|
72
73
|
"ajv-formats": "^3.0.1",
|
|
73
74
|
"chalk": "^6.0.0",
|
|
74
75
|
"croner": "^10.0.1",
|
|
75
76
|
"cross-spawn": "^7.0.6",
|
|
77
|
+
"defuddle": "0.19.3",
|
|
76
78
|
"effect": "4.0.0-beta.103",
|
|
77
79
|
"gpt-tokenizer": "^3.4.0",
|
|
78
80
|
"grok-mermaid": "0.2.2",
|
|
@@ -84,9 +86,9 @@
|
|
|
84
86
|
"open": "^10.2.0",
|
|
85
87
|
"p-limit": "^6.1.0",
|
|
86
88
|
"pi-footer": "0.5.1",
|
|
87
|
-
"pi-lens": "4.1.
|
|
88
|
-
"pi-mcp-adapter": "2.
|
|
89
|
-
"pi-web-access": "0.
|
|
89
|
+
"pi-lens": "4.1.2",
|
|
90
|
+
"pi-mcp-adapter": "2.28.0",
|
|
91
|
+
"pi-web-access": "0.25.0",
|
|
90
92
|
"pidusage": "^4.0.1",
|
|
91
93
|
"promise.try": "^2.0.1",
|
|
92
94
|
"qrcode-terminal": "^0.12.0",
|
|
@@ -96,6 +98,7 @@
|
|
|
96
98
|
"strip-json-comments": "^5.0.3",
|
|
97
99
|
"turndown": "^7.2.0",
|
|
98
100
|
"typebox": "^1.1.38",
|
|
101
|
+
"unbash": "4.0.10",
|
|
99
102
|
"undici": "^8.9.0",
|
|
100
103
|
"unpdf": "^1.6.2",
|
|
101
104
|
"vscode-jsonrpc": "^9.0.0",
|
|
@@ -109,20 +112,20 @@
|
|
|
109
112
|
"@czottmann/pi-automode",
|
|
110
113
|
"@dietrichgebert/ponytail",
|
|
111
114
|
"@herbertgao/pi-cc-extensions",
|
|
112
|
-
"@herbertgao/pi-copy-response",
|
|
113
|
-
"@herbertgao/pi-handoff",
|
|
114
|
-
"@herbertgao/pi-inline-skills",
|
|
115
|
-
"@herbertgao/pi-mermaid-open",
|
|
116
|
-
"@herbertgao/pi-preferred-thinking",
|
|
117
|
-
"@herbertgao/pi-recap",
|
|
118
|
-
"@herbertgao/pi-rename",
|
|
119
115
|
"@herbertgao/pi-stash",
|
|
120
116
|
"@herbertgao/pi-subagents",
|
|
121
|
-
"@herbertgao/pi-titlebar-spinner",
|
|
122
117
|
"@herbertgao/resume-from",
|
|
123
118
|
"@juicesharp/rpiv-ask-user-question",
|
|
124
119
|
"@narumitw/pi-btw",
|
|
125
120
|
"@pi-plugins/fast-mode",
|
|
121
|
+
"@tifan/pi-copy-response",
|
|
122
|
+
"@tifan/pi-handoff",
|
|
123
|
+
"@tifan/pi-inline-skills",
|
|
124
|
+
"@tifan/pi-mermaid-open",
|
|
125
|
+
"@tifan/pi-preferred-thinking",
|
|
126
|
+
"@tifan/pi-recap",
|
|
127
|
+
"@tifan/pi-rename",
|
|
128
|
+
"@tifan/pi-titlebar-spinner",
|
|
126
129
|
"pi-footer",
|
|
127
130
|
"pi-lens",
|
|
128
131
|
"pi-mcp-adapter",
|
|
@@ -136,18 +139,18 @@
|
|
|
136
139
|
"extensions": [
|
|
137
140
|
"./node_modules/@dietrichgebert/ponytail/pi-extension/index.js",
|
|
138
141
|
"./node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts",
|
|
139
|
-
"./node_modules/@
|
|
142
|
+
"./node_modules/@tifan/pi-copy-response/src/index.ts",
|
|
140
143
|
"./node_modules/@herbertgao/resume-from/shims/pi/extensions/resume-from.js",
|
|
141
|
-
"./node_modules/@
|
|
142
|
-
"./node_modules/@
|
|
143
|
-
"./node_modules/@
|
|
144
|
-
"./node_modules/@
|
|
145
|
-
"./node_modules/@
|
|
146
|
-
"./node_modules/@
|
|
147
|
-
"./node_modules/@
|
|
144
|
+
"./node_modules/@tifan/pi-handoff/src/index.ts",
|
|
145
|
+
"./node_modules/@tifan/pi-handoff/src/session-query.ts",
|
|
146
|
+
"./node_modules/@tifan/pi-inline-skills/src/index.ts",
|
|
147
|
+
"./node_modules/@tifan/pi-mermaid-open/src/index.ts",
|
|
148
|
+
"./node_modules/@tifan/pi-preferred-thinking/src/index.ts",
|
|
149
|
+
"./node_modules/@tifan/pi-recap/src/index.ts",
|
|
150
|
+
"./node_modules/@tifan/pi-rename/src/index.ts",
|
|
148
151
|
"./node_modules/@herbertgao/pi-stash/src/index.ts",
|
|
149
152
|
"./node_modules/@herbertgao/pi-subagents/src/index.ts",
|
|
150
|
-
"./node_modules/@
|
|
153
|
+
"./node_modules/@tifan/pi-titlebar-spinner/src/index.ts",
|
|
151
154
|
"./node_modules/@juicesharp/rpiv-ask-user-question/index.ts",
|
|
152
155
|
"./node_modules/@narumitw/pi-btw/dist/index.ts",
|
|
153
156
|
"./node_modules/@pi-plugins/fast-mode/dist/index.mjs",
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# @tifan/pi-copy-response
|
|
2
|
-
|
|
3
|
-
## 0.2.6
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- [`f0090c2`](https://github.com/tifandotme/pi-extensions/commit/f0090c2a5c648febc7281f88c25634414af22b99) Thanks [@tifandotme](https://github.com/tifandotme)! - Use Pi 0.78.1's new `ctx.mode` field to require interactive TUI mode before opening the `/copy-response` picker.
|
|
8
|
-
|
|
9
|
-
## 0.2.5
|
|
10
|
-
|
|
11
|
-
### Patch Changes
|
|
12
|
-
|
|
13
|
-
- [`ca8e467`](https://github.com/tifandotme/pi-extensions/commit/ca8e467068b4b25677e6752d94caac53fa4a56e7) Thanks [@tifandotme](https://github.com/tifandotme)! - Add CHANGELOG links in README.
|
|
14
|
-
|
|
15
|
-
## 0.2.4
|
|
16
|
-
|
|
17
|
-
### Patch Changes
|
|
18
|
-
|
|
19
|
-
- [`3018901`](https://github.com/tifandotme/pi-extensions/commit/3018901a1c77bdf356c495ed95eae3d64ae950f6) Thanks [@tifandotme](https://github.com/tifandotme)! - Update README
|
|
20
|
-
|
|
21
|
-
## 0.2.3
|
|
22
|
-
|
|
23
|
-
### Patch Changes
|
|
24
|
-
|
|
25
|
-
- [`b36a9c4`](https://github.com/tifandotme/pi-extensions/commit/b36a9c47fe8073017a54b2fb1828610fde7e66a2) Thanks [@tifandotme](https://github.com/tifandotme)! - Update readme to fix image rendering. Adjust author in package.json
|
|
26
|
-
|
|
27
|
-
## 0.2.2
|
|
28
|
-
|
|
29
|
-
### Patch Changes
|
|
30
|
-
|
|
31
|
-
- [`e5567f3`](https://github.com/tifandotme/pi-extensions/commit/e5567f35167c64bee8c28c14d4a578d740d93b17) Thanks [@tifandotme](https://github.com/tifandotme)! - Update README.md to use remote images
|
|
32
|
-
|
|
33
|
-
## 0.2.1
|
|
34
|
-
|
|
35
|
-
### Patch Changes
|
|
36
|
-
|
|
37
|
-
- [`f1cfdbd`](https://github.com/tifandotme/pi-extensions/commit/f1cfdbdb9cd36e61cd63cb8f21e0cfff1ead17fc) Thanks [@tifandotme](https://github.com/tifandotme)! - update readme
|
|
38
|
-
|
|
39
|
-
## 0.2.0
|
|
40
|
-
|
|
41
|
-
### Minor Changes
|
|
42
|
-
|
|
43
|
-
- [`0e1b896`](https://github.com/tifandotme/pi-extensions/commit/0e1b8967376c23e43fd3ddd182933cc4ec869889) Thanks [@tifandotme](https://github.com/tifandotme)! - Add a full-text preview to the response picker before copying an assistant response.
|
|
44
|
-
|
|
45
|
-
## 0.1.0
|
|
46
|
-
|
|
47
|
-
### Minor Changes
|
|
48
|
-
|
|
49
|
-
- Initial release.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Tifan Dwi Avianto
|
|
4
|
-
Copyright (c) 2026 Herbert Gao
|
|
5
|
-
|
|
6
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
-
in the Software without restriction, including without limitation the rights
|
|
9
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
-
furnished to do so, subject to the following conditions:
|
|
12
|
-
|
|
13
|
-
The above copyright notice and this permission notice shall be included in
|
|
14
|
-
all copies or substantial portions of the Software.
|
|
15
|
-
|
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
-
THE SOFTWARE.
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# @tifan/pi-handoff
|
|
2
|
-
|
|
3
|
-
## 2.0.0
|
|
4
|
-
|
|
5
|
-
### Major Changes
|
|
6
|
-
|
|
7
|
-
- [#116](https://github.com/HerbertGao/pi-extensions/pull/116) [`ecda398`](https://github.com/HerbertGao/pi-extensions/commit/ecda398b9a95212c512d53325c617e485e6ded8d) Thanks [@HerbertGao](https://github.com/HerbertGao)! - Adopt prompt-marker handoffs that generate a handoff artifact and start a clean session, while retaining the session query tool and local rename package integration.
|
|
8
|
-
|
|
9
|
-
### Patch Changes
|
|
10
|
-
|
|
11
|
-
- Updated dependencies [[`ecda398`](https://github.com/HerbertGao/pi-extensions/commit/ecda398b9a95212c512d53325c617e485e6ded8d)]:
|
|
12
|
-
- @herbertgao/pi-rename@0.5.0
|
|
13
|
-
|
|
14
|
-
## 2.0.1
|
|
15
|
-
|
|
16
|
-
### Patch Changes
|
|
17
|
-
|
|
18
|
-
- Updated dependencies [[`b2ea184`](https://github.com/tifandotme/pi-extensions/commit/b2ea1841e99243aa4773bd5c33f43c40248859db)]:
|
|
19
|
-
- @tifan/pi-rename@0.5.0
|
|
20
|
-
|
|
21
|
-
## 2.0.0
|
|
22
|
-
|
|
23
|
-
### Major Changes
|
|
24
|
-
|
|
25
|
-
- [`297e825`](https://github.com/tifandotme/pi-extensions/commit/297e825ba42eeed32814a34cd4fe5bdbe935b11c) Thanks [@tifandotme](https://github.com/tifandotme)! - Replace `/handoff-session` with the `-handoff` prompt marker and automatically start the new session from the generated handoff.
|
|
26
|
-
|
|
27
|
-
### Patch Changes
|
|
28
|
-
|
|
29
|
-
- Updated dependencies [[`e8709bc`](https://github.com/tifandotme/pi-extensions/commit/e8709bc388aa8e094918ec465cfab511358f18ff)]:
|
|
30
|
-
- @tifan/pi-rename@0.4.3
|
|
31
|
-
|
|
32
|
-
## 1.1.2
|
|
33
|
-
|
|
34
|
-
### Patch Changes
|
|
35
|
-
|
|
36
|
-
- [`edf72a2`](https://github.com/tifandotme/pi-extensions/commit/edf72a238757bfd71d32ebe9f0d3f14653e21d87) Thanks [@tifandotme](https://github.com/tifandotme)! - Use gpt-5.6-luna as the default model for naming handoff sessions.
|
|
37
|
-
|
|
38
|
-
- Updated dependencies [[`b27ba8a`](https://github.com/tifandotme/pi-extensions/commit/b27ba8aef49ea00879cec87d913840f39e02b19e)]:
|
|
39
|
-
- @tifan/pi-rename@0.4.2
|
|
40
|
-
|
|
41
|
-
## 1.1.1
|
|
42
|
-
|
|
43
|
-
### Patch Changes
|
|
44
|
-
|
|
45
|
-
- [`ba259a0`](https://github.com/tifandotme/pi-extensions/commit/ba259a0c990563e4dad3443371cc2ed31d122cd0) Thanks [@tifandotme](https://github.com/tifandotme)! - Keep model-powered handoffs and session names compatible with Pi 0.80.
|
|
46
|
-
|
|
47
|
-
- Updated dependencies [[`ba259a0`](https://github.com/tifandotme/pi-extensions/commit/ba259a0c990563e4dad3443371cc2ed31d122cd0)]:
|
|
48
|
-
- @tifan/pi-rename@0.4.1
|
|
49
|
-
|
|
50
|
-
## 1.1.0
|
|
51
|
-
|
|
52
|
-
### Minor Changes
|
|
53
|
-
|
|
54
|
-
- [`38bebf2`](https://github.com/tifandotme/pi-extensions/commit/38bebf2827c37f1fcefe7de585c9d03dd0a7edee) Thanks [@tifandotme](https://github.com/tifandotme)! - Name new handoff sessions from the current conversation using pi-rename-style rules, with a local fallback when model naming is unavailable.
|
|
55
|
-
|
|
56
|
-
### Patch Changes
|
|
57
|
-
|
|
58
|
-
- Updated dependencies [[`416ac2f`](https://github.com/tifandotme/pi-extensions/commit/416ac2fecc6aa731c23ae895220bac87317152e4)]:
|
|
59
|
-
- @tifan/pi-rename@0.4.0
|
|
60
|
-
|
|
61
|
-
## 1.0.1
|
|
62
|
-
|
|
63
|
-
### Patch Changes
|
|
64
|
-
|
|
65
|
-
- [`f0090c2`](https://github.com/tifandotme/pi-extensions/commit/f0090c2a5c648febc7281f88c25634414af22b99) Thanks [@tifandotme](https://github.com/tifandotme)! - Use Pi 0.78.1's new extension context APIs so `/handoff-session` records loaded skills and context file paths from system prompt options, and gates its custom UI with `ctx.mode`.
|
|
66
|
-
|
|
67
|
-
## 1.0.0
|
|
68
|
-
|
|
69
|
-
### Major Changes
|
|
70
|
-
|
|
71
|
-
- [`a049f90`](https://github.com/tifandotme/pi-extensions/commit/a049f90a485de7b893574600d0aec4dbfe678999) Thanks [@tifandotme](https://github.com/tifandotme)! - Replace `/handoff` with `/handoff-session`, which generates a temp handoff document from the installed `handoff` skill, starts a clean parent-linked session, and leaves the continuation prompt in the editor for manual submit.
|
|
72
|
-
|
|
73
|
-
## 0.1.1
|
|
74
|
-
|
|
75
|
-
### Patch Changes
|
|
76
|
-
|
|
77
|
-
- [`48e1167`](https://github.com/tifandotme/pi-extensions/commit/48e11674378fd22b74a319d8fd3ce6c7919e47df) Thanks [@tifandotme](https://github.com/tifandotme)! - update readme, fix type error in inline-skills package
|
|
78
|
-
|
|
79
|
-
## 0.1.0
|
|
80
|
-
|
|
81
|
-
### Minor Changes
|
|
82
|
-
|
|
83
|
-
- [`de412e0`](https://github.com/tifandotme/pi-extensions/commit/de412e0957517c926c69962fe7ccef36495491e5) Thanks [@tifandotme](https://github.com/tifandotme)! - initial release
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Tifan Dwi Avianto
|
|
4
|
-
Copyright (c) 2026 Herbert Gao
|
|
5
|
-
|
|
6
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
-
in the Software without restriction, including without limitation the rights
|
|
9
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
-
furnished to do so, subject to the following conditions:
|
|
12
|
-
|
|
13
|
-
The above copyright notice and this permission notice shall be included in
|
|
14
|
-
all copies or substantial portions of the Software.
|
|
15
|
-
|
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
-
THE SOFTWARE.
|