shortcutxl 0.3.76 → 0.3.78
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/BINARY-INVENTORY.json +813 -813
- package/CHANGELOG.md +14 -0
- package/dist/ai/models.d.ts +10 -6
- package/dist/ai/models.generated.d.ts +72 -0
- package/dist/ai/models.generated.js +33 -0
- package/dist/ai/models.js +36 -13
- package/dist/ai/providers/anthropic.d.ts +4 -2
- package/dist/ai/providers/anthropic.js +59 -29
- package/dist/ai/providers/azure-openai-responses.d.ts +2 -1
- package/dist/ai/providers/azure-openai-responses.js +4 -20
- package/dist/ai/providers/google-vertex.d.ts +8 -2
- package/dist/ai/providers/google-vertex.js +66 -54
- package/dist/ai/providers/google.js +15 -48
- package/dist/ai/providers/openai-completions.d.ts +4 -1
- package/dist/ai/providers/openai-completions.js +26 -10
- package/dist/ai/providers/openai-reasoning.d.ts +5 -0
- package/dist/ai/providers/openai-reasoning.js +13 -0
- package/dist/ai/providers/openai-responses-shared.js +1 -1
- package/dist/ai/providers/openai-responses.d.ts +6 -2
- package/dist/ai/providers/openai-responses.js +28 -23
- package/dist/ai/providers/simple-options.d.ts +2 -3
- package/dist/ai/providers/simple-options.js +4 -6
- package/dist/ai/types.d.ts +19 -2
- package/dist/app/agent-session-runtime-adapter.js +7 -6
- package/dist/app/agent-session.d.ts +0 -15
- package/dist/app/agent-session.js +0 -37
- package/dist/app/approvals/approval-errors.d.ts +15 -0
- package/dist/app/approvals/approval-errors.js +14 -0
- package/dist/app/approvals/runtime-approval-gates.d.ts +1 -2
- package/dist/app/approvals/tool-approval.d.ts +1 -0
- package/dist/app/approvals/tool-approval.js +11 -23
- package/dist/app/approvals/types.d.ts +0 -14
- package/dist/app/approvals/types.js +0 -2
- package/dist/app/background/tool-summaries.js +0 -2
- package/dist/app/extensions/slash-commands.js +1 -3
- package/dist/app/local/tools/execute-code/executor.d.ts +1 -1
- package/dist/app/local/tools/execute-code/executor.js +20 -10
- package/dist/app/local/tools/execute-code/tool.js +21 -2
- package/dist/app/modes/action/agent.js +4 -5
- package/dist/app/modes/ask/agent.js +4 -6
- package/dist/app/modes/index.js +20 -10
- package/dist/app/modes/installation/agent.js +4 -5
- package/dist/app/modes/manage/agent.js +3 -4
- package/dist/app/modes/manage/prompt.js +1 -2
- package/dist/app/modes/metadata.d.ts +31 -0
- package/dist/app/modes/metadata.js +35 -0
- package/dist/app/modes/plan/agent.js +5 -8
- package/dist/app/modes/plan/prompt.js +3 -3
- package/dist/app/permissions/runtime-approval-flow.d.ts +1 -5
- package/dist/app/permissions/runtime-approval-flow.js +0 -28
- package/dist/app/permissions/tool-gates.d.ts +2 -3
- package/dist/app/permissions/tool-gates.js +3 -81
- package/dist/app/prompts/com-api.js +1 -1
- package/dist/app/prompts/shared-guidelines.js +7 -3
- package/dist/app/providers/google-vertex-gateway.js +4 -51
- package/dist/app/providers/model-registry.d.ts +1 -0
- package/dist/app/providers/model-registry.js +39 -0
- package/dist/app/providers/model-resolver.js +10 -7
- package/dist/app/providers/register-shortcut-provider.js +6 -6
- package/dist/app/providers/shortcut-api-v2-transport.js +4 -0
- package/dist/app/providers/shortcut-llm-proxy-client.d.ts +2 -2
- package/dist/app/providers/shortcut-llm-proxy-client.js +1 -0
- package/dist/app/resources/package-manager.js +2 -123
- package/dist/app/resources/resource-patterns.d.ts +9 -0
- package/dist/app/resources/resource-patterns.js +120 -0
- package/dist/app/session/forked-agent.d.ts +2 -2
- package/dist/app/session/model-manager.js +3 -2
- package/dist/app/session/session-lifecycle.js +3 -2
- package/dist/app/session/session-models.d.ts +2 -0
- package/dist/app/session/session-models.js +14 -6
- package/dist/app/settings-manager.d.ts +3 -3
- package/dist/app/shared/tools/execute-code/mog.d.ts +3 -1
- package/dist/app/shared/tools/execute-code/mog.js +18 -2
- package/dist/app/tools/bash.js +3 -3
- package/dist/app/tools/execute-code/index.d.ts +1 -0
- package/dist/app/tools/execute-code/index.js +3 -1
- package/dist/app/tools/find-ignore-files.d.ts +3 -0
- package/dist/app/tools/find-ignore-files.js +33 -0
- package/dist/app/tools/find.js +2 -21
- package/dist/app/tools/llm-analysis.js +0 -2
- package/dist/app/tools/refresh-context.d.ts +1 -1
- package/dist/app/tools/session-settings/update-session-settings.js +2 -2
- package/dist/app/tools/switch-mode.js +2 -2
- package/dist/app/tools/take-screenshot.js +0 -2
- package/dist/app/tools/task/runner.js +1 -2
- package/dist/app/tools/task/task.d.ts +1 -3
- package/dist/app/tools/task/task.js +20 -40
- package/dist/app/tools/web-search.js +12 -2
- package/dist/autocomplete/core.d.ts +33 -0
- package/dist/autocomplete/core.js +113 -0
- package/dist/{tui → autocomplete}/fuzzy.d.ts +0 -1
- package/dist/{tui → autocomplete}/fuzzy.js +0 -1
- package/dist/{tui/autocomplete.d.ts → autocomplete/index.d.ts} +0 -1
- package/dist/{tui/autocomplete.js → autocomplete/index.js} +62 -158
- package/dist/cli/args.js +1 -1
- package/dist/cli/list-models.js +1 -1
- package/dist/cli.js +26227 -30480
- package/dist/constants.d.ts +0 -2
- package/dist/constants.js +0 -3
- package/dist/contracts/agent-session-store.d.ts +1 -1
- package/dist/contracts/agent-settings.d.ts +1 -0
- package/dist/contracts/agent-settings.js +2 -1
- package/dist/contracts/model-call.d.ts +1 -2
- package/dist/contracts/model-call.js +1 -2
- package/dist/contracts/model-stream.d.ts +1 -0
- package/dist/contracts/model-stream.js +1 -0
- package/dist/contracts/wire.d.ts +10 -7
- package/dist/contracts/wire.js +8 -0
- package/dist/core/agent-engine.js +1 -1
- package/dist/core/core-types.d.ts +1 -21
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.js +9 -1
- package/dist/core/prompts/agent-guidelines.d.ts +4 -5
- package/dist/core/prompts/agent-guidelines.js +28 -42
- package/dist/core/session-schema.d.ts +1 -1
- package/dist/embedded-agent/ai-invoke.d.ts +1 -2
- package/dist/embedded-agent/ai-invoke.js +2 -70
- package/dist/embedded-agent/anthropic-messages-transport.d.ts +4 -20
- package/dist/embedded-agent/anthropic-messages-transport.js +23 -786
- package/dist/embedded-agent/bootstrap.js +2 -2
- package/dist/embedded-agent/compose.js +8 -7
- package/dist/embedded-agent/gateway-base-url.d.ts +3 -0
- package/dist/embedded-agent/gateway-base-url.js +35 -0
- package/dist/embedded-agent/google-vertex-transport.d.ts +2 -11
- package/dist/embedded-agent/google-vertex-transport.js +20 -117
- package/dist/embedded-agent/host-runtime-options.d.ts +0 -8
- package/dist/embedded-agent/host-runtime-options.js +10 -2
- package/dist/embedded-agent/host-tools/invoke-llm/contract.d.ts +2 -2
- package/dist/embedded-agent/host-tools/invoke-llm/contract.js +4 -2
- package/dist/embedded-agent/host-tools/sandbox-llm/contract.d.ts +8 -3
- package/dist/embedded-agent/host-tools/sandbox-llm/contract.js +12 -8
- package/dist/embedded-agent/host-tools/sandbox-llm/index.d.ts +1 -1
- package/dist/embedded-agent/host-tools/sandbox-llm/index.js +1 -1
- package/dist/embedded-agent/host-tools/shared/index.d.ts +1 -1
- package/dist/embedded-agent/host-tools/shared/index.js +1 -1
- package/dist/embedded-agent/host-tools/shared/llm-stream-error.d.ts +7 -0
- package/dist/embedded-agent/host-tools/shared/llm-stream-error.js +10 -0
- package/dist/embedded-agent/host-tools/take-screenshot/contract.d.ts +0 -2
- package/dist/embedded-agent/host-tools/take-screenshot/contract.js +1 -3
- package/dist/embedded-agent/host-tools/take-screenshot/index.d.ts +1 -1
- package/dist/embedded-agent/host-tools/take-screenshot/index.js +1 -1
- package/dist/embedded-agent/host-tools/task/agents/clone.js +1 -2
- package/dist/embedded-agent/host-tools/task/contract.js +1 -1
- package/dist/embedded-agent/index.d.ts +3 -4
- package/dist/embedded-agent/index.js +2 -3
- package/dist/embedded-agent/model-selection.d.ts +0 -6
- package/dist/embedded-agent/model-selection.js +15 -8
- package/dist/embedded-agent/openai-completions-transport.d.ts +2 -11
- package/dist/embedded-agent/openai-completions-transport.js +20 -120
- package/dist/embedded-agent/openai-responses-transport.d.ts +2 -11
- package/dist/embedded-agent/openai-responses-transport.js +15 -170
- package/dist/embedded-agent/prompt/build.js +1 -2
- package/dist/embedded-agent/prompt/sections.d.ts +1 -1
- package/dist/embedded-agent/prompt/sections.js +2 -0
- package/dist/embedded-agent/provider-native-request.d.ts +29 -0
- package/dist/embedded-agent/provider-native-request.js +65 -0
- package/dist/embedded-agent/run-stats.d.ts +1 -1
- package/dist/embedded-agent/stream.d.ts +10 -96
- package/dist/embedded-agent/stream.js +31 -556
- package/dist/embedded-agent/suggestions.d.ts +1 -1
- package/dist/embedded-agent/suggestions.js +1 -1
- package/dist/embedded-agent/worker-bridge/host-client.d.ts +7 -0
- package/dist/embedded-agent/worker-bridge/host-client.js +15 -0
- package/dist/embedded-agent/worker-bridge/worker-port.js +17 -1
- package/dist/main.js +18 -14
- package/dist/rpc/index.d.ts +1 -1
- package/dist/rpc/rpc-approval-gates.js +1 -2
- package/dist/rpc/rpc-host.d.ts +4 -0
- package/dist/rpc/rpc-host.js +13 -24
- package/dist/rpc/rpc-types.d.ts +6 -17
- package/dist/shared/platform/open.d.ts +4 -1
- package/dist/shared/platform/open.js +14 -2
- package/dist/shell/approvals/runtime-approval-gates.js +1 -3
- package/dist/shell/components/selectors/model-selector.js +2 -1
- package/dist/shell/components/selectors/session-selector-search.js +1 -1
- package/dist/shell/components/selectors/thinking-selector.js +7 -6
- package/dist/shell/index.d.ts +0 -1
- package/dist/shell/index.js +0 -1
- package/dist/shell/interactive/interactive-mode-options.d.ts +10 -0
- package/dist/shell/interactive/interactive-mode.d.ts +6 -12
- package/dist/shell/interactive/interactive-mode.js +39 -158
- package/dist/shell/interactive/slash-commands.d.ts +0 -34
- package/dist/shell/interactive/slash-commands.js +0 -2
- package/dist/shell/links/local-file-link-input.d.ts +15 -0
- package/dist/shell/links/local-file-link-input.js +38 -0
- package/dist/shell/links/local-file-link.d.ts +7 -0
- package/dist/shell/links/local-file-link.js +35 -0
- package/dist/shell/links/local-file-opener.d.ts +16 -0
- package/dist/shell/links/local-file-opener.js +90 -0
- package/dist/shell/session-client.d.ts +0 -1
- package/dist/shell/session-client.js +0 -6
- package/dist/shell/status/update-check-scheduler.d.ts +30 -0
- package/dist/shell/status/update-check-scheduler.js +71 -0
- package/dist/shell/status/update-reminder-controller.d.ts +22 -0
- package/dist/shell/status/update-reminder-controller.js +40 -0
- package/dist/shell/status/update-reminder.d.ts +6 -0
- package/dist/shell/status/update-reminder.js +4 -0
- package/dist/shell/theme/dark.json +1 -2
- package/dist/shell/theme/light.json +1 -2
- package/dist/shell/theme/runtime.d.ts +2 -3
- package/dist/shell/theme/runtime.js +2 -6
- package/dist/shell/theme/theme-schema.json +1 -6
- package/dist/shortcut-model-catalog.d.ts +7 -2
- package/dist/shortcut-model-catalog.js +134 -10
- package/dist/startup/update-manager.d.ts +6 -6
- package/dist/startup/update-manager.js +23 -38
- package/dist/startup/update-prompt.d.ts +1 -0
- package/dist/startup/update-prompt.js +2 -2
- package/dist/tui/components/editor.d.ts +1 -1
- package/dist/tui/components/editor.js +1 -1
- package/dist/tui/components/markdown.js +15 -6
- package/dist/tui/components/settings-list.js +1 -1
- package/dist/tui/editor-component.d.ts +1 -1
- package/dist/tui/index.d.ts +7 -8
- package/dist/tui/index.js +7 -6
- package/dist/tui/tui.d.ts +2 -0
- package/dist/tui/tui.js +16 -1
- package/dist/tui/utils.d.ts +7 -0
- package/dist/tui/utils.js +58 -8
- package/native-app/main/index.js +3200 -48
- package/native-app/main/{photon_rs-SoVDgheu.js → photon_rs-XkYyYTVA.js} +2 -2
- package/native-app/package.json +1 -1
- package/native-app/preload/index.cjs +2 -0
- package/native-app/renderer/assets/{index-CFc-oZuS.js → index-B4jz6epR.js} +825 -155
- package/native-app/renderer/assets/{index-OhGE0UY4.css → index-C__g36ft.css} +412 -162
- package/native-app/renderer/assets/shortcutagent-DxFsGSkw.png +0 -0
- package/native-app/renderer/index.html +2 -2
- package/package.json +17 -3
- package/skills/add-custom-model/SKILL.md +52 -0
- package/user-docs/dist/index.html +1 -1
- package/user-docs/dist/shortcutxl-docs.pdf +0 -0
- package/xll/ShortcutXL.xll +0 -0
- package/xll/modules/shortcut_xl/_managed.py +26 -7
- package/xll/modules/shortcut_xl/_tracking.py +141 -251
- package/xll/modules/shortcut_xl/api/__init__.py +60 -0
- package/xll/modules/shortcut_xl/api/workbook.py +9 -1
- package/xll/modules/shortcut_xl/api/worksheet.py +4 -1
- package/xll/python/Lib/site-packages/httpx-0.28.1.dist-info/RECORD +1 -1
- package/xll/python/Lib/site-packages/idna-3.18.dist-info/RECORD +1 -1
- package/xll/python/Lib/site-packages/pip/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/build_env/__init__.py +25 -0
- package/xll/python/Lib/site-packages/pip/_internal/build_env/base.py +103 -0
- package/xll/python/Lib/site-packages/pip/_internal/build_env/installer.py +333 -0
- package/xll/python/Lib/site-packages/pip/_internal/build_env/noop.py +42 -0
- package/xll/python/Lib/site-packages/pip/_internal/build_env/venv.py +145 -0
- package/xll/python/Lib/site-packages/pip/_internal/build_env/virtual.py +139 -0
- package/xll/python/Lib/site-packages/pip/_internal/cache.py +4 -1
- package/xll/python/Lib/site-packages/pip/_internal/cli/autocompletion.py +4 -1
- package/xll/python/Lib/site-packages/pip/_internal/cli/base_command.py +11 -14
- package/xll/python/Lib/site-packages/pip/_internal/cli/cmdoptions.py +133 -22
- package/xll/python/Lib/site-packages/pip/_internal/cli/index_command.py +11 -6
- package/xll/python/Lib/site-packages/pip/_internal/cli/main.py +2 -1
- package/xll/python/Lib/site-packages/pip/_internal/cli/main_parser.py +1 -2
- package/xll/python/Lib/site-packages/pip/_internal/cli/parser.py +10 -2
- package/xll/python/Lib/site-packages/pip/_internal/cli/progress_bars.py +2 -2
- package/xll/python/Lib/site-packages/pip/_internal/cli/req_command.py +57 -25
- package/xll/python/Lib/site-packages/pip/_internal/cli/status_codes.py +1 -0
- package/xll/python/Lib/site-packages/pip/_internal/commands/cache.py +7 -6
- package/xll/python/Lib/site-packages/pip/_internal/commands/configuration.py +2 -1
- package/xll/python/Lib/site-packages/pip/_internal/commands/debug.py +4 -5
- package/xll/python/Lib/site-packages/pip/_internal/commands/download.py +4 -0
- package/xll/python/Lib/site-packages/pip/_internal/commands/freeze.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/commands/index.py +10 -3
- package/xll/python/Lib/site-packages/pip/_internal/commands/inspect.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/commands/install.py +6 -6
- package/xll/python/Lib/site-packages/pip/_internal/commands/list.py +11 -6
- package/xll/python/Lib/site-packages/pip/_internal/commands/lock.py +4 -6
- package/xll/python/Lib/site-packages/pip/_internal/commands/show.py +14 -8
- package/xll/python/Lib/site-packages/pip/_internal/commands/wheel.py +7 -1
- package/xll/python/Lib/site-packages/pip/_internal/configuration.py +2 -3
- package/xll/python/Lib/site-packages/pip/_internal/distributions/base.py +5 -3
- package/xll/python/Lib/site-packages/pip/_internal/distributions/installed.py +3 -2
- package/xll/python/Lib/site-packages/pip/_internal/distributions/sdist.py +45 -20
- package/xll/python/Lib/site-packages/pip/_internal/distributions/wheel.py +3 -2
- package/xll/python/Lib/site-packages/pip/_internal/exceptions.py +174 -0
- package/xll/python/Lib/site-packages/pip/_internal/index/collector.py +70 -48
- package/xll/python/Lib/site-packages/pip/_internal/index/package_finder.py +46 -7
- package/xll/python/Lib/site-packages/pip/_internal/index/sources.py +1 -2
- package/xll/python/Lib/site-packages/pip/_internal/locations/_sysconfig.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/locations/base.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/metadata/base.py +10 -5
- package/xll/python/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +8 -3
- package/xll/python/Lib/site-packages/pip/_internal/models/candidate.py +5 -1
- package/xll/python/Lib/site-packages/pip/_internal/models/link.py +53 -13
- package/xll/python/Lib/site-packages/pip/_internal/network/auth.py +38 -21
- package/xll/python/Lib/site-packages/pip/_internal/network/cache.py +2 -2
- package/xll/python/Lib/site-packages/pip/_internal/network/download.py +58 -11
- package/xll/python/Lib/site-packages/pip/_internal/network/session.py +35 -40
- package/xll/python/Lib/site-packages/pip/_internal/network/utils.py +109 -1
- package/xll/python/Lib/site-packages/pip/_internal/operations/check.py +2 -3
- package/xll/python/Lib/site-packages/pip/_internal/operations/install/wheel.py +23 -18
- package/xll/python/Lib/site-packages/pip/_internal/operations/prepare.py +152 -7
- package/xll/python/Lib/site-packages/pip/_internal/req/__init__.py +2 -0
- package/xll/python/Lib/site-packages/pip/_internal/req/constructors.py +54 -69
- package/xll/python/Lib/site-packages/pip/_internal/req/req_file.py +6 -6
- package/xll/python/Lib/site-packages/pip/_internal/req/req_install.py +25 -21
- package/xll/python/Lib/site-packages/pip/_internal/req/req_uninstall.py +13 -8
- package/xll/python/Lib/site-packages/pip/_internal/resolution/base.py +2 -2
- package/xll/python/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +2 -2
- package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +1 -1
- package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +0 -1
- package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +39 -52
- package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +3 -3
- package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +3 -0
- package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +9 -0
- package/xll/python/Lib/site-packages/pip/_internal/utils/compat.py +15 -9
- package/xll/python/Lib/site-packages/pip/_internal/utils/deprecation.py +6 -1
- package/xll/python/Lib/site-packages/pip/_internal/utils/filesystem.py +2 -2
- package/xll/python/Lib/site-packages/pip/_internal/utils/logging.py +11 -3
- package/xll/python/Lib/site-packages/pip/_internal/utils/misc.py +48 -4
- package/xll/python/Lib/site-packages/pip/_internal/utils/pylock.py +18 -2
- package/xll/python/Lib/site-packages/pip/_internal/utils/retry.py +2 -1
- package/xll/python/Lib/site-packages/pip/_internal/utils/subprocess.py +4 -3
- package/xll/python/Lib/site-packages/pip/_internal/utils/temp_dir.py +1 -2
- package/xll/python/Lib/site-packages/pip/_internal/utils/unpacking.py +30 -4
- package/xll/python/Lib/site-packages/pip/_internal/utils/urls.py +5 -2
- package/xll/python/Lib/site-packages/pip/_internal/utils/virtualenv.py +2 -36
- package/xll/python/Lib/site-packages/pip/_internal/vcs/git.py +8 -5
- package/xll/python/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +1 -2
- package/xll/python/Lib/site-packages/pip/_internal/wheel_builder.py +5 -1
- package/xll/python/Lib/site-packages/pip/_vendor/bom.cdx.json +231 -0
- package/xll/python/Lib/site-packages/pip/_vendor/certifi/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/certifi/cacert.pem +0 -631
- package/xll/python/Lib/site-packages/pip/_vendor/distlib/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/distlib/compat.py +34 -64
- package/xll/python/Lib/site-packages/pip/_vendor/distlib/resources.py +28 -14
- package/xll/python/Lib/site-packages/pip/_vendor/distlib/scripts.py +7 -3
- package/xll/python/Lib/site-packages/pip/_vendor/distlib/util.py +48 -11
- package/xll/python/Lib/site-packages/pip/_vendor/idna/LICENSE.md +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/idna/__main__.py +6 -0
- package/xll/python/Lib/site-packages/pip/_vendor/idna/cli.py +128 -0
- package/xll/python/Lib/site-packages/pip/_vendor/idna/codec.py +50 -13
- package/xll/python/Lib/site-packages/pip/_vendor/idna/compat.py +26 -0
- package/xll/python/Lib/site-packages/pip/_vendor/idna/core.py +352 -141
- package/xll/python/Lib/site-packages/pip/_vendor/idna/idnadata.py +571 -2983
- package/xll/python/Lib/site-packages/pip/_vendor/idna/intranges.py +5 -7
- package/xll/python/Lib/site-packages/pip/_vendor/idna/package_data.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/idna/uts46data.py +16887 -8832
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +352 -66
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +11 -0
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/_xdg.py +171 -0
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/android.py +92 -41
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/api.py +213 -49
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/macos.py +128 -51
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/unix.py +176 -127
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/version.py +8 -18
- package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/windows.py +185 -68
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/__init__.py +2 -2
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/__main__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/console.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/filter.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +10 -8
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/formatter.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexer.py +7 -5
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +9 -8
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +35 -32
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/modeline.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/plugin.py +3 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/regexopt.py +13 -2
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/scanner.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/style.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/token.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/unistring.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/pygments/util.py +2 -2
- package/xll/python/Lib/site-packages/pip/_vendor/requests/__init__.py +52 -16
- package/xll/python/Lib/site-packages/pip/_vendor/requests/__version__.py +2 -2
- package/xll/python/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +2 -2
- package/xll/python/Lib/site-packages/pip/_vendor/requests/_types.py +183 -0
- package/xll/python/Lib/site-packages/pip/_vendor/requests/adapters.py +101 -50
- package/xll/python/Lib/site-packages/pip/_vendor/requests/api.py +31 -8
- package/xll/python/Lib/site-packages/pip/_vendor/requests/auth.py +80 -40
- package/xll/python/Lib/site-packages/pip/_vendor/requests/compat.py +9 -3
- package/xll/python/Lib/site-packages/pip/_vendor/requests/cookies.py +143 -79
- package/xll/python/Lib/site-packages/pip/_vendor/requests/exceptions.py +15 -5
- package/xll/python/Lib/site-packages/pip/_vendor/requests/help.py +13 -10
- package/xll/python/Lib/site-packages/pip/_vendor/requests/hooks.py +23 -9
- package/xll/python/Lib/site-packages/pip/_vendor/requests/models.py +265 -126
- package/xll/python/Lib/site-packages/pip/_vendor/requests/py.typed +0 -0
- package/xll/python/Lib/site-packages/pip/_vendor/requests/sessions.py +164 -78
- package/xll/python/Lib/site-packages/pip/_vendor/requests/status_codes.py +2 -2
- package/xll/python/Lib/site-packages/pip/_vendor/requests/structures.py +51 -20
- package/xll/python/Lib/site-packages/pip/_vendor/requests/utils.py +161 -89
- package/xll/python/Lib/site-packages/pip/_vendor/tomli/__init__.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/tomli/_parser.py +9 -4
- package/xll/python/Lib/site-packages/pip/_vendor/tomli/_re.py +13 -9
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/_base_connection.py +3 -1
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/_collections.py +0 -1
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/_version.py +8 -18
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/connection.py +4 -4
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +23 -10
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/contrib/emscripten/response.py +5 -1
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +7 -8
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +1 -1
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +2 -2
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/fields.py +14 -14
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +8 -6
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/response.py +35 -22
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +8 -0
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +11 -61
- package/xll/python/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +5 -11
- package/xll/python/Lib/site-packages/pip/_vendor/vendor.txt +8 -8
- package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/METADATA +3 -2
- package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/RECORD +208 -188
- package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/AUTHORS.txt +20 -0
- package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/idna/LICENSE.md +1 -1
- package/xll/python/Lib/site-packages/pywin32-311.dist-info/RECORD +2 -2
- package/xll/python/Scripts/httpx.exe +0 -0
- package/xll/python/Scripts/idna.exe +0 -0
- package/xll/python/Scripts/pip.exe +0 -0
- package/xll/python/Scripts/pip3.13.exe +0 -0
- package/xll/python/Scripts/pip3.exe +0 -0
- package/xll/python/Scripts/pywin32_postinstall.exe +0 -0
- package/xll/python/Scripts/pywin32_testall.exe +0 -0
- package/dist/app/collab/awareness.d.ts +0 -32
- package/dist/app/collab/awareness.js +0 -52
- package/dist/app/collab/collab-client.d.ts +0 -37
- package/dist/app/collab/collab-client.js +0 -208
- package/dist/app/collab/collab-manager.d.ts +0 -91
- package/dist/app/collab/collab-manager.js +0 -218
- package/dist/app/collab/collab-sync.d.ts +0 -62
- package/dist/app/collab/collab-sync.js +0 -215
- package/dist/app/collab/index.d.ts +0 -9
- package/dist/app/collab/index.js +0 -6
- package/dist/app/collab/super-fight.d.ts +0 -90
- package/dist/app/collab/super-fight.js +0 -310
- package/dist/app/collab/sync-bridge.d.ts +0 -35
- package/dist/app/collab/sync-bridge.js +0 -109
- package/dist/app/collab/types.d.ts +0 -75
- package/dist/app/collab/types.js +0 -5
- package/dist/embedded-agent/ai-content.d.ts +0 -52
- package/dist/embedded-agent/ai-content.js +0 -101
- package/dist/embedded-agent/host-tools/shared/llm-stream.d.ts +0 -31
- package/dist/embedded-agent/host-tools/shared/llm-stream.js +0 -136
- package/dist/embedded-agent/model-call-orchestrator.d.ts +0 -22
- package/dist/embedded-agent/model-call-orchestrator.js +0 -22
- package/dist/embedded-agent/stream-errors.d.ts +0 -10
- package/dist/embedded-agent/stream-errors.js +0 -73
- package/dist/embedded-agent/stream-message-state.d.ts +0 -14
- package/dist/embedded-agent/stream-message-state.js +0 -271
- package/dist/embedded-agent/stream-sse.d.ts +0 -78
- package/dist/embedded-agent/stream-sse.js +0 -73
- package/dist/shell/approvals/task-spawn-approval.d.ts +0 -20
- package/dist/shell/approvals/task-spawn-approval.js +0 -93
- package/dist/shell/interactive/collab-command.d.ts +0 -9
- package/dist/shell/interactive/collab-command.js +0 -115
- package/dist/shell/interactive/super-fight-ui.d.ts +0 -80
- package/dist/shell/interactive/super-fight-ui.js +0 -484
- package/dist/shell/status/collab-status.d.ts +0 -18
- package/dist/shell/status/collab-status.js +0 -46
- package/xll/python/Lib/site-packages/pip/_internal/build_env.py +0 -606
- /package/dist/{tui → autocomplete}/skill-autocomplete.js +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/INSTALLER +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/REQUESTED +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/WHEEL +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/entry_points.txt +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/LICENSE.txt +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/certifi/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/distlib/LICENSE.txt +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/distro/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/msgpack/COPYING +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE.APACHE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE.BSD +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/pkg_resources/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/platformdirs/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/pygments/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/requests/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/resolvelib/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/rich/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/tomli/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/tomli_w/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/truststore/LICENSE +0 -0
- /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/urllib3/LICENSE.txt +0 -0
|
@@ -62,6 +62,7 @@ class WheelCommand(RequirementCommand):
|
|
|
62
62
|
self.cmd_opts.add_option(cmdoptions.src())
|
|
63
63
|
self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
|
|
64
64
|
self.cmd_opts.add_option(cmdoptions.no_deps())
|
|
65
|
+
self.cmd_opts.add_option(cmdoptions.only_deps())
|
|
65
66
|
self.cmd_opts.add_option(cmdoptions.progress_bar())
|
|
66
67
|
|
|
67
68
|
self.cmd_opts.add_option(
|
|
@@ -75,6 +76,7 @@ class WheelCommand(RequirementCommand):
|
|
|
75
76
|
self.cmd_opts.add_option(cmdoptions.config_settings())
|
|
76
77
|
|
|
77
78
|
self.cmd_opts.add_option(cmdoptions.require_hashes())
|
|
79
|
+
self.cmd_opts.add_option(cmdoptions.no_require_hashes())
|
|
78
80
|
|
|
79
81
|
index_opts = cmdoptions.make_option_group(
|
|
80
82
|
cmdoptions.index_group,
|
|
@@ -94,6 +96,7 @@ class WheelCommand(RequirementCommand):
|
|
|
94
96
|
def run(self, options: Values, args: list[str]) -> int:
|
|
95
97
|
cmdoptions.check_build_constraints(options)
|
|
96
98
|
cmdoptions.check_release_control_exclusive(options)
|
|
99
|
+
cmdoptions.check_only_deps_option_does_not_conflict(options)
|
|
97
100
|
|
|
98
101
|
session = self.get_default_session(options)
|
|
99
102
|
|
|
@@ -123,6 +126,7 @@ class WheelCommand(RequirementCommand):
|
|
|
123
126
|
download_dir=options.wheel_dir,
|
|
124
127
|
use_user_site=False,
|
|
125
128
|
verbosity=self.verbosity,
|
|
129
|
+
allow_editables=False,
|
|
126
130
|
)
|
|
127
131
|
|
|
128
132
|
resolver = self.make_resolver(
|
|
@@ -151,6 +155,7 @@ class WheelCommand(RequirementCommand):
|
|
|
151
155
|
reqs_to_build,
|
|
152
156
|
wheel_cache=wheel_cache,
|
|
153
157
|
verify=(not options.no_verify),
|
|
158
|
+
allow_editables=False,
|
|
154
159
|
)
|
|
155
160
|
for req in build_successes:
|
|
156
161
|
assert req.link and req.link.is_wheel
|
|
@@ -160,8 +165,9 @@ class WheelCommand(RequirementCommand):
|
|
|
160
165
|
shutil.copy(req.local_file_path, options.wheel_dir)
|
|
161
166
|
except OSError as e:
|
|
162
167
|
logger.warning(
|
|
163
|
-
"
|
|
168
|
+
"Failed to copy built wheel %s to %s: %s",
|
|
164
169
|
req.name,
|
|
170
|
+
options.wheel_dir,
|
|
165
171
|
e,
|
|
166
172
|
)
|
|
167
173
|
build_failures.append(req)
|
|
@@ -14,7 +14,6 @@ Some terminology:
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
16
|
import configparser
|
|
17
|
-
import locale
|
|
18
17
|
import os
|
|
19
18
|
import sys
|
|
20
19
|
from collections.abc import Iterable
|
|
@@ -25,7 +24,7 @@ from pip._internal.exceptions import (
|
|
|
25
24
|
ConfigurationFileCouldNotBeLoaded,
|
|
26
25
|
)
|
|
27
26
|
from pip._internal.utils import appdirs
|
|
28
|
-
from pip._internal.utils.compat import WINDOWS
|
|
27
|
+
from pip._internal.utils.compat import WINDOWS, get_locale_encoding
|
|
29
28
|
from pip._internal.utils.logging import getLogger
|
|
30
29
|
from pip._internal.utils.misc import ensure_dir, enum
|
|
31
30
|
|
|
@@ -293,7 +292,7 @@ class Configuration:
|
|
|
293
292
|
# Doing this is useful when modifying and saving files, where we don't
|
|
294
293
|
# need to construct a parser.
|
|
295
294
|
if os.path.exists(fname):
|
|
296
|
-
locale_encoding =
|
|
295
|
+
locale_encoding = get_locale_encoding()
|
|
297
296
|
try:
|
|
298
297
|
parser.read(fname, encoding=locale_encoding)
|
|
299
298
|
except UnicodeDecodeError:
|
|
@@ -7,7 +7,7 @@ from pip._internal.metadata.base import BaseDistribution
|
|
|
7
7
|
from pip._internal.req import InstallRequirement
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
|
-
from pip._internal.build_env import BuildEnvironmentInstaller
|
|
10
|
+
from pip._internal.build_env import BuildEnvironmentInstaller, BuildIsolationMode
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class AbstractDistribution(metaclass=abc.ABCMeta):
|
|
@@ -33,7 +33,8 @@ class AbstractDistribution(metaclass=abc.ABCMeta):
|
|
|
33
33
|
super().__init__()
|
|
34
34
|
self.req = req
|
|
35
35
|
|
|
36
|
-
@
|
|
36
|
+
@property
|
|
37
|
+
@abc.abstractmethod
|
|
37
38
|
def build_tracker_id(self) -> str | None:
|
|
38
39
|
"""A string that uniquely identifies this requirement to the build tracker.
|
|
39
40
|
|
|
@@ -49,7 +50,8 @@ class AbstractDistribution(metaclass=abc.ABCMeta):
|
|
|
49
50
|
def prepare_distribution_metadata(
|
|
50
51
|
self,
|
|
51
52
|
build_env_installer: BuildEnvironmentInstaller,
|
|
52
|
-
build_isolation:
|
|
53
|
+
build_isolation: BuildIsolationMode,
|
|
53
54
|
check_build_deps: bool,
|
|
55
|
+
allow_editables: bool,
|
|
54
56
|
) -> None:
|
|
55
57
|
raise NotImplementedError()
|
|
@@ -6,7 +6,7 @@ from pip._internal.distributions.base import AbstractDistribution
|
|
|
6
6
|
from pip._internal.metadata import BaseDistribution
|
|
7
7
|
|
|
8
8
|
if TYPE_CHECKING:
|
|
9
|
-
from pip._internal.build_env import BuildEnvironmentInstaller
|
|
9
|
+
from pip._internal.build_env import BuildEnvironmentInstaller, BuildIsolationMode
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class InstalledDistribution(AbstractDistribution):
|
|
@@ -27,7 +27,8 @@ class InstalledDistribution(AbstractDistribution):
|
|
|
27
27
|
def prepare_distribution_metadata(
|
|
28
28
|
self,
|
|
29
29
|
build_env_installer: BuildEnvironmentInstaller,
|
|
30
|
-
build_isolation:
|
|
30
|
+
build_isolation: BuildIsolationMode,
|
|
31
31
|
check_build_deps: bool,
|
|
32
|
+
allow_editables: bool,
|
|
32
33
|
) -> None:
|
|
33
34
|
pass
|
|
@@ -4,7 +4,12 @@ import logging
|
|
|
4
4
|
from collections.abc import Iterable
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
|
-
from pip._internal.build_env import
|
|
7
|
+
from pip._internal.build_env import (
|
|
8
|
+
BuildIsolationMode,
|
|
9
|
+
NoOpBuildEnvironment,
|
|
10
|
+
VenvBuildEnvironment,
|
|
11
|
+
VirtualBuildEnvironment,
|
|
12
|
+
)
|
|
8
13
|
from pip._internal.distributions.base import AbstractDistribution
|
|
9
14
|
from pip._internal.exceptions import InstallationError
|
|
10
15
|
from pip._internal.metadata import BaseDistribution
|
|
@@ -35,24 +40,28 @@ class SourceDistribution(AbstractDistribution):
|
|
|
35
40
|
def prepare_distribution_metadata(
|
|
36
41
|
self,
|
|
37
42
|
build_env_installer: BuildEnvironmentInstaller,
|
|
38
|
-
build_isolation:
|
|
43
|
+
build_isolation: BuildIsolationMode,
|
|
39
44
|
check_build_deps: bool,
|
|
45
|
+
allow_editables: bool,
|
|
40
46
|
) -> None:
|
|
41
|
-
# Load pyproject.toml
|
|
47
|
+
# Load pyproject.toml and set up backend environment
|
|
42
48
|
self.req.load_pyproject_toml()
|
|
49
|
+
self._prepare_build_env(build_isolation, build_env_installer)
|
|
43
50
|
|
|
44
51
|
# Set up the build isolation, if this requirement should be isolated
|
|
45
|
-
if build_isolation:
|
|
52
|
+
if build_isolation != "off":
|
|
46
53
|
# Setup an isolated environment and install the build backend static
|
|
47
54
|
# requirements in it.
|
|
48
|
-
self._prepare_build_backend(
|
|
55
|
+
self._prepare_build_backend()
|
|
49
56
|
# Check that the build backend supports PEP 660. This cannot be done
|
|
50
57
|
# earlier because we need to setup the build backend to verify it
|
|
51
58
|
# supports build_editable, nor can it be done later, because we want
|
|
52
59
|
# to avoid installing build requirements needlessly.
|
|
53
60
|
self.req.editable_sanity_check()
|
|
54
61
|
# Install the dynamic build requirements.
|
|
55
|
-
self._install_build_reqs(
|
|
62
|
+
self._install_build_reqs(
|
|
63
|
+
build_env_installer, allow_editables=allow_editables
|
|
64
|
+
)
|
|
56
65
|
else:
|
|
57
66
|
# When not using build isolation, we still need to check that
|
|
58
67
|
# the build backend supports PEP 660.
|
|
@@ -68,20 +77,33 @@ class SourceDistribution(AbstractDistribution):
|
|
|
68
77
|
self._raise_conflicts("the backend dependencies", conflicting)
|
|
69
78
|
if missing:
|
|
70
79
|
self._raise_missing_reqs(missing)
|
|
71
|
-
self.req.prepare_metadata()
|
|
80
|
+
self.req.prepare_metadata(allow_editables)
|
|
72
81
|
|
|
73
|
-
def
|
|
74
|
-
self,
|
|
82
|
+
def _prepare_build_env(
|
|
83
|
+
self,
|
|
84
|
+
build_isolation: BuildIsolationMode,
|
|
85
|
+
build_env_installer: BuildEnvironmentInstaller,
|
|
75
86
|
) -> None:
|
|
76
|
-
|
|
77
|
-
|
|
87
|
+
if build_isolation == "virtual":
|
|
88
|
+
self.req.build_env = VirtualBuildEnvironment(build_env_installer)
|
|
89
|
+
elif build_isolation == "venv":
|
|
90
|
+
self.req.build_env = VenvBuildEnvironment(build_env_installer)
|
|
91
|
+
|
|
92
|
+
self.req.configure_backend(self.req.build_env.python_executable)
|
|
93
|
+
|
|
94
|
+
def _prepare_build_backend(self) -> None:
|
|
95
|
+
# Install the pyproject.toml declared build-time requirements.
|
|
78
96
|
pyproject_requires = self.req.pyproject_requires
|
|
79
97
|
assert pyproject_requires is not None
|
|
98
|
+
assert not isinstance(self.req.build_env, NoOpBuildEnvironment)
|
|
80
99
|
|
|
81
|
-
self.req.build_env
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
100
|
+
with self.req.build_env:
|
|
101
|
+
self.req.build_env.install_requirements(
|
|
102
|
+
pyproject_requires,
|
|
103
|
+
"overlay",
|
|
104
|
+
kind="build dependencies",
|
|
105
|
+
for_req=self.req,
|
|
106
|
+
)
|
|
85
107
|
conflicting, missing = self.req.build_env.check_requirements(
|
|
86
108
|
self.req.requirements_to_check
|
|
87
109
|
)
|
|
@@ -117,14 +139,16 @@ class SourceDistribution(AbstractDistribution):
|
|
|
117
139
|
return backend.get_requires_for_build_editable()
|
|
118
140
|
|
|
119
141
|
def _install_build_reqs(
|
|
120
|
-
self,
|
|
142
|
+
self,
|
|
143
|
+
build_env_installer: BuildEnvironmentInstaller,
|
|
144
|
+
allow_editables: bool,
|
|
121
145
|
) -> None:
|
|
122
146
|
# Install any extra build dependencies that the backend requests.
|
|
123
147
|
# This must be done in a second pass, as the pyproject.toml
|
|
124
148
|
# dependencies must be installed before we can call the backend.
|
|
125
149
|
if (
|
|
126
150
|
self.req.editable
|
|
127
|
-
and
|
|
151
|
+
and allow_editables
|
|
128
152
|
and self.req.supports_pyproject_editable
|
|
129
153
|
):
|
|
130
154
|
build_reqs = self._get_build_requires_editable()
|
|
@@ -133,9 +157,10 @@ class SourceDistribution(AbstractDistribution):
|
|
|
133
157
|
conflicting, missing = self.req.build_env.check_requirements(build_reqs)
|
|
134
158
|
if conflicting:
|
|
135
159
|
self._raise_conflicts("the backend dependencies", conflicting)
|
|
136
|
-
self.req.build_env
|
|
137
|
-
|
|
138
|
-
|
|
160
|
+
with self.req.build_env:
|
|
161
|
+
self.req.build_env.install_requirements(
|
|
162
|
+
missing, "normal", kind="backend dependencies", for_req=self.req
|
|
163
|
+
)
|
|
139
164
|
|
|
140
165
|
def _raise_conflicts(
|
|
141
166
|
self, conflicting_with: str, conflicting_reqs: set[tuple[str, str]]
|
|
@@ -12,7 +12,7 @@ from pip._internal.metadata import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
from pip._internal.build_env import BuildEnvironmentInstaller
|
|
15
|
+
from pip._internal.build_env import BuildEnvironmentInstaller, BuildIsolationMode
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class WheelDistribution(AbstractDistribution):
|
|
@@ -38,7 +38,8 @@ class WheelDistribution(AbstractDistribution):
|
|
|
38
38
|
def prepare_distribution_metadata(
|
|
39
39
|
self,
|
|
40
40
|
build_env_installer: BuildEnvironmentInstaller,
|
|
41
|
-
build_isolation:
|
|
41
|
+
build_isolation: BuildIsolationMode,
|
|
42
42
|
check_build_deps: bool,
|
|
43
|
+
allow_editables: bool,
|
|
43
44
|
) -> None:
|
|
44
45
|
pass
|
|
@@ -11,6 +11,7 @@ import configparser
|
|
|
11
11
|
import contextlib
|
|
12
12
|
import locale
|
|
13
13
|
import logging
|
|
14
|
+
import os
|
|
14
15
|
import pathlib
|
|
15
16
|
import re
|
|
16
17
|
import sys
|
|
@@ -28,6 +29,7 @@ from pip._vendor.rich.text import Text
|
|
|
28
29
|
if TYPE_CHECKING:
|
|
29
30
|
from hashlib import _Hash
|
|
30
31
|
|
|
32
|
+
from pip._vendor import urllib3
|
|
31
33
|
from pip._vendor.requests.models import PreparedRequest, Request, Response
|
|
32
34
|
|
|
33
35
|
from pip._internal.metadata import BaseDistribution
|
|
@@ -337,6 +339,119 @@ class NetworkConnectionError(PipError):
|
|
|
337
339
|
return str(self.error_msg)
|
|
338
340
|
|
|
339
341
|
|
|
342
|
+
class ConnectionFailedError(DiagnosticPipError):
|
|
343
|
+
reference = "connection-failed"
|
|
344
|
+
|
|
345
|
+
def __init__(self, url: str, host: str, error: Exception) -> None:
|
|
346
|
+
from http.client import RemoteDisconnected
|
|
347
|
+
|
|
348
|
+
from pip._vendor.urllib3.exceptions import (
|
|
349
|
+
NameResolutionError,
|
|
350
|
+
NewConnectionError,
|
|
351
|
+
ProtocolError,
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
details = str(error)
|
|
355
|
+
if isinstance(error, NameResolutionError):
|
|
356
|
+
parts = details.split("Failed to resolve ", maxsplit=1)
|
|
357
|
+
if len(parts) == 2:
|
|
358
|
+
details = "Failed to resolve IP address for " + parts[1]
|
|
359
|
+
elif isinstance(error, NewConnectionError):
|
|
360
|
+
parts = details.split("Failed to establish a new connection: ", maxsplit=1)
|
|
361
|
+
if len(parts) == 2:
|
|
362
|
+
_, details = parts
|
|
363
|
+
elif isinstance(error, ProtocolError):
|
|
364
|
+
try:
|
|
365
|
+
reason = error.args[1]
|
|
366
|
+
except IndexError:
|
|
367
|
+
pass
|
|
368
|
+
else:
|
|
369
|
+
if isinstance(reason, (RemoteDisconnected, ConnectionResetError)):
|
|
370
|
+
details = (
|
|
371
|
+
"the connection was closed without a reply from the server."
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
super().__init__(
|
|
375
|
+
message=(
|
|
376
|
+
f"Failed to connect to [magenta]{escape(host)}[/] while fetching "
|
|
377
|
+
f"{escape(url)}"
|
|
378
|
+
),
|
|
379
|
+
context=Text(details),
|
|
380
|
+
hint_stmt=(
|
|
381
|
+
"Are you connected to the Internet? If so, check whether your system "
|
|
382
|
+
f"can connect to [magenta]{escape(host)}[/] before trying again. "
|
|
383
|
+
"There may be a firewall or proxy that's preventing the connection."
|
|
384
|
+
),
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
class ConnectionTimeoutError(DiagnosticPipError):
|
|
389
|
+
reference = "connection-timeout"
|
|
390
|
+
|
|
391
|
+
def __init__(
|
|
392
|
+
self,
|
|
393
|
+
url: str,
|
|
394
|
+
host: str,
|
|
395
|
+
*,
|
|
396
|
+
kind: Literal["connect", "read"],
|
|
397
|
+
timeout: float,
|
|
398
|
+
) -> None:
|
|
399
|
+
context = Text.assemble(
|
|
400
|
+
(host, "magenta"), f" didn't respond within {timeout} seconds"
|
|
401
|
+
)
|
|
402
|
+
if kind == "connect":
|
|
403
|
+
context.append(" (while establishing a connection)")
|
|
404
|
+
super().__init__(
|
|
405
|
+
message=f"Unable to fetch {escape(url)}",
|
|
406
|
+
context=context,
|
|
407
|
+
hint_stmt=(
|
|
408
|
+
"This is probably a temporary issue with the remote server or the "
|
|
409
|
+
"network connection. If this error persists, check the network "
|
|
410
|
+
"configuration. There may be a firewall or proxy that's preventing "
|
|
411
|
+
"the connection."
|
|
412
|
+
),
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
class SSLMissingError(DiagnosticPipError):
|
|
417
|
+
reference = "ssl-missing"
|
|
418
|
+
|
|
419
|
+
def __init__(self, url: str) -> None:
|
|
420
|
+
super().__init__(
|
|
421
|
+
message=f"Failed to establish a secure connection for {escape(url)}",
|
|
422
|
+
context="The 'ssl' module is unavailable but required for HTTPS URLs",
|
|
423
|
+
hint_stmt=None,
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
class SSLVerificationError(DiagnosticPipError):
|
|
428
|
+
reference = "ssl-verification-failed"
|
|
429
|
+
|
|
430
|
+
def __init__(self, url: str, host: str, error: urllib3.exceptions.SSLError) -> None:
|
|
431
|
+
message = (
|
|
432
|
+
"Failed to establish a secure connection to "
|
|
433
|
+
f"[magenta]{escape(host)}[/] while fetching {escape(url)}"
|
|
434
|
+
)
|
|
435
|
+
hint = "You may need to use --cert or check your proxy/firewall configuration"
|
|
436
|
+
super().__init__(message=message, context=Text(str(error)), hint_stmt=hint)
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
class ProxyConnectionError(DiagnosticPipError):
|
|
440
|
+
reference = "proxy-connection-failed"
|
|
441
|
+
|
|
442
|
+
def __init__(
|
|
443
|
+
self, url: str, proxy: str, error: urllib3.exceptions.ProxyError
|
|
444
|
+
) -> None:
|
|
445
|
+
super().__init__(
|
|
446
|
+
message=(
|
|
447
|
+
"Failed to connect to proxy "
|
|
448
|
+
f"[magenta]{escape(proxy)}[/] while fetching {escape(url)}"
|
|
449
|
+
),
|
|
450
|
+
context=Text(str(error)),
|
|
451
|
+
hint_stmt="This is likely a proxy configuration issue.",
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
|
|
340
455
|
class InvalidWheelFilename(InstallationError):
|
|
341
456
|
"""Invalid wheel filename."""
|
|
342
457
|
|
|
@@ -379,6 +494,23 @@ class MetadataInconsistent(InstallationError):
|
|
|
379
494
|
)
|
|
380
495
|
|
|
381
496
|
|
|
497
|
+
class SidecarMetadataInconsistent(MetadataInconsistent):
|
|
498
|
+
"""The wheel's METADATA disagrees with its PEP 658 ``.metadata`` file.
|
|
499
|
+
|
|
500
|
+
Raised after the wheel has been downloaded and hash-verified, when a
|
|
501
|
+
resolver-affecting field in the wheel's embedded ``METADATA`` does not
|
|
502
|
+
match the value taken from the remote ``.metadata`` sidecar that drove
|
|
503
|
+
resolution. ``f_val`` is the sidecar value, ``m_val`` is the wheel value.
|
|
504
|
+
"""
|
|
505
|
+
|
|
506
|
+
def __str__(self) -> str:
|
|
507
|
+
return (
|
|
508
|
+
f"Requested {self.ireq} has inconsistent {self.field} between "
|
|
509
|
+
f"its PEP 658 .metadata file and the wheel's METADATA: "
|
|
510
|
+
f"sidecar has {self.f_val!r}, wheel has {self.m_val!r}"
|
|
511
|
+
)
|
|
512
|
+
|
|
513
|
+
|
|
382
514
|
class MetadataInvalid(InstallationError):
|
|
383
515
|
"""Metadata is invalid."""
|
|
384
516
|
|
|
@@ -969,3 +1101,45 @@ class BuildDependencyInstallError(DiagnosticPipError):
|
|
|
969
1101
|
super().__init__(
|
|
970
1102
|
message=message, context=context, hint_stmt=None, note_stmt=note
|
|
971
1103
|
)
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
class VenvImportError(DiagnosticPipError):
|
|
1107
|
+
"""Raised when 'venv' can't be imported."""
|
|
1108
|
+
|
|
1109
|
+
reference = "venv-import-error"
|
|
1110
|
+
|
|
1111
|
+
def __init__(self) -> None:
|
|
1112
|
+
if sys.platform != "linux":
|
|
1113
|
+
hint_stmt = None
|
|
1114
|
+
else:
|
|
1115
|
+
hint_stmt = (
|
|
1116
|
+
"If this is an OS-provided Python, it's likely that your OS "
|
|
1117
|
+
"package maintainers have split Python's standard library across "
|
|
1118
|
+
"multiple OS packages."
|
|
1119
|
+
)
|
|
1120
|
+
super().__init__(
|
|
1121
|
+
message="Cannot import the 'venv' module of the Python standard library",
|
|
1122
|
+
context=(
|
|
1123
|
+
"This is a symptom of a broken/modified Python, which cannot be used "
|
|
1124
|
+
"with pip."
|
|
1125
|
+
),
|
|
1126
|
+
note_stmt="This is an issue with the Python installation itself, not pip.",
|
|
1127
|
+
hint_stmt=hint_stmt,
|
|
1128
|
+
)
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
class VenvCreationError(DiagnosticPipError):
|
|
1132
|
+
"""Raised when a virtual environment can't be created."""
|
|
1133
|
+
|
|
1134
|
+
reference = "venv-creation-error"
|
|
1135
|
+
|
|
1136
|
+
def __init__(self, context: str) -> None:
|
|
1137
|
+
if os.name == "nt":
|
|
1138
|
+
hint = "This may be caused by running antivirus software."
|
|
1139
|
+
else:
|
|
1140
|
+
hint = None
|
|
1141
|
+
super().__init__(
|
|
1142
|
+
message="Cannot create a virtual environment",
|
|
1143
|
+
context=Text(context),
|
|
1144
|
+
hint_stmt=hint,
|
|
1145
|
+
)
|
|
@@ -12,21 +12,27 @@ import json
|
|
|
12
12
|
import logging
|
|
13
13
|
import os
|
|
14
14
|
import urllib.parse
|
|
15
|
-
from collections.abc import Iterable, MutableMapping, Sequence
|
|
15
|
+
from collections.abc import Callable, Iterable, MutableMapping, Sequence
|
|
16
16
|
from dataclasses import dataclass
|
|
17
17
|
from html.parser import HTMLParser
|
|
18
18
|
from optparse import Values
|
|
19
19
|
from typing import (
|
|
20
|
-
Callable,
|
|
21
20
|
NamedTuple,
|
|
22
21
|
Protocol,
|
|
23
22
|
)
|
|
24
23
|
|
|
25
|
-
from pip._vendor import
|
|
24
|
+
from pip._vendor.packaging.utils import canonicalize_name
|
|
26
25
|
from pip._vendor.requests import Response
|
|
27
|
-
from pip._vendor.requests.exceptions import RetryError
|
|
28
|
-
|
|
29
|
-
from pip._internal.exceptions import
|
|
26
|
+
from pip._vendor.requests.exceptions import RetryError
|
|
27
|
+
|
|
28
|
+
from pip._internal.exceptions import (
|
|
29
|
+
ConnectionFailedError,
|
|
30
|
+
ConnectionTimeoutError,
|
|
31
|
+
NetworkConnectionError,
|
|
32
|
+
ProxyConnectionError,
|
|
33
|
+
SSLMissingError,
|
|
34
|
+
SSLVerificationError,
|
|
35
|
+
)
|
|
30
36
|
from pip._internal.models.link import Link
|
|
31
37
|
from pip._internal.models.search_scope import SearchScope
|
|
32
38
|
from pip._internal.network.session import PipSession
|
|
@@ -80,7 +86,7 @@ def _ensure_api_header(response: Response) -> None:
|
|
|
80
86
|
):
|
|
81
87
|
return
|
|
82
88
|
|
|
83
|
-
raise _NotAPIContent(content_type, response.request.method)
|
|
89
|
+
raise _NotAPIContent(content_type, response.request.method) # type: ignore[arg-type]
|
|
84
90
|
|
|
85
91
|
|
|
86
92
|
class _NotHTTP(Exception):
|
|
@@ -105,7 +111,11 @@ def _ensure_api_response(url: str, session: PipSession) -> None:
|
|
|
105
111
|
_ensure_api_header(resp)
|
|
106
112
|
|
|
107
113
|
|
|
108
|
-
def _get_simple_response(
|
|
114
|
+
def _get_simple_response(
|
|
115
|
+
url: str,
|
|
116
|
+
session: PipSession,
|
|
117
|
+
force_revalidate: bool = False,
|
|
118
|
+
) -> Response:
|
|
109
119
|
"""Access an Simple API response with GET, and return the response.
|
|
110
120
|
|
|
111
121
|
This consists of three parts:
|
|
@@ -123,32 +133,24 @@ def _get_simple_response(url: str, session: PipSession) -> Response:
|
|
|
123
133
|
|
|
124
134
|
logger.debug("Getting page %s", redact_auth_from_url(url))
|
|
125
135
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
# minimize traffic sent in cases where the page hasn't
|
|
145
|
-
# changed at all, we will just always incur the round
|
|
146
|
-
# trip for the conditional GET now instead of only
|
|
147
|
-
# once per 10 minutes.
|
|
148
|
-
# For more information, please see pypa/pip#5670.
|
|
149
|
-
"Cache-Control": "max-age=0",
|
|
150
|
-
},
|
|
151
|
-
)
|
|
136
|
+
headers = {
|
|
137
|
+
"Accept": ", ".join(
|
|
138
|
+
[
|
|
139
|
+
"application/vnd.pypi.simple.v1+json",
|
|
140
|
+
"application/vnd.pypi.simple.v1+html; q=0.1",
|
|
141
|
+
"text/html; q=0.01",
|
|
142
|
+
]
|
|
143
|
+
),
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if force_revalidate:
|
|
147
|
+
# Using max-age=0 rather than no-cache still supports conditional
|
|
148
|
+
# requests, minimizing traffic when the page hasn't changed.
|
|
149
|
+
# See pypa/pip#5670.
|
|
150
|
+
logger.debug("Refreshing package index response.")
|
|
151
|
+
headers["Cache-Control"] = "max-age=0"
|
|
152
|
+
|
|
153
|
+
resp = session.get(url, headers=headers)
|
|
152
154
|
raise_for_status(resp)
|
|
153
155
|
|
|
154
156
|
# The check for archives above only works if the url ends with
|
|
@@ -316,7 +318,12 @@ def _make_index_content(
|
|
|
316
318
|
)
|
|
317
319
|
|
|
318
320
|
|
|
319
|
-
def _get_index_content(
|
|
321
|
+
def _get_index_content(
|
|
322
|
+
link: Link,
|
|
323
|
+
*,
|
|
324
|
+
session: PipSession,
|
|
325
|
+
force_revalidate: bool = False,
|
|
326
|
+
) -> IndexContent | None:
|
|
320
327
|
url = link.url.split("#", 1)[0]
|
|
321
328
|
|
|
322
329
|
# Check for VCS schemes that do not support lookup as web pages.
|
|
@@ -343,7 +350,9 @@ def _get_index_content(link: Link, *, session: PipSession) -> IndexContent | Non
|
|
|
343
350
|
logger.debug(" file: URL is directory, getting %s", url)
|
|
344
351
|
|
|
345
352
|
try:
|
|
346
|
-
resp = _get_simple_response(
|
|
353
|
+
resp = _get_simple_response(
|
|
354
|
+
url, session=session, force_revalidate=force_revalidate
|
|
355
|
+
)
|
|
347
356
|
except _NotHTTP:
|
|
348
357
|
logger.warning(
|
|
349
358
|
"Skipping page %s because it looks like an archive, and cannot "
|
|
@@ -359,18 +368,17 @@ def _get_index_content(link: Link, *, session: PipSession) -> IndexContent | Non
|
|
|
359
368
|
exc.request_desc,
|
|
360
369
|
exc.content_type,
|
|
361
370
|
)
|
|
362
|
-
except NetworkConnectionError as exc:
|
|
363
|
-
_handle_get_simple_fail(link, exc)
|
|
364
|
-
except RetryError as exc:
|
|
371
|
+
except (RetryError, NetworkConnectionError) as exc:
|
|
365
372
|
_handle_get_simple_fail(link, exc)
|
|
366
|
-
except
|
|
367
|
-
reason = "There was a problem confirming the ssl certificate: "
|
|
368
|
-
reason += str(exc)
|
|
373
|
+
except (SSLVerificationError, SSLMissingError) as exc:
|
|
374
|
+
reason = f"There was a problem confirming the ssl certificate: {exc.context}"
|
|
369
375
|
_handle_get_simple_fail(link, reason, meth=logger.info)
|
|
370
|
-
except
|
|
371
|
-
_handle_get_simple_fail(link, f"connection error: {exc}")
|
|
372
|
-
except
|
|
373
|
-
_handle_get_simple_fail(link, "
|
|
376
|
+
except ConnectionFailedError as exc:
|
|
377
|
+
_handle_get_simple_fail(link, f"connection error: {exc.context}")
|
|
378
|
+
except ProxyConnectionError as exc:
|
|
379
|
+
_handle_get_simple_fail(link, f"proxy connection error: {exc.context}")
|
|
380
|
+
except ConnectionTimeoutError as exc:
|
|
381
|
+
_handle_get_simple_fail(link, str(exc.context))
|
|
374
382
|
else:
|
|
375
383
|
return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing)
|
|
376
384
|
return None
|
|
@@ -435,11 +443,25 @@ class LinkCollector:
|
|
|
435
443
|
def find_links(self) -> list[str]:
|
|
436
444
|
return self.search_scope.find_links
|
|
437
445
|
|
|
438
|
-
def fetch_response(
|
|
446
|
+
def fetch_response(
|
|
447
|
+
self, location: Link, package_name: str | None = None
|
|
448
|
+
) -> IndexContent | None:
|
|
439
449
|
"""
|
|
440
450
|
Fetch an HTML page containing package links.
|
|
441
451
|
"""
|
|
442
|
-
return
|
|
452
|
+
# By default we may return cached /simple/ responses. Users can force
|
|
453
|
+
# revalidation to ensure newly uploaded distributions become visible
|
|
454
|
+
# immediately after publication. See pypa/pip#5670.
|
|
455
|
+
force_revalidate = self.session.refresh_package
|
|
456
|
+
should_force_revalidate = ":all:" in force_revalidate or (
|
|
457
|
+
package_name is not None
|
|
458
|
+
and canonicalize_name(package_name) in force_revalidate
|
|
459
|
+
)
|
|
460
|
+
return _get_index_content(
|
|
461
|
+
location,
|
|
462
|
+
session=self.session,
|
|
463
|
+
force_revalidate=should_force_revalidate,
|
|
464
|
+
)
|
|
443
465
|
|
|
444
466
|
def collect_sources(
|
|
445
467
|
self,
|