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
|
@@ -1,484 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Super Fight UI — Terminal takeover for the multiplayer ASCII fighting game.
|
|
3
|
-
*
|
|
4
|
-
* Clears and takes over the outer TUI's alternate screen, intercepts all
|
|
5
|
-
* keyboard input, runs the game loop, and bridges the headless game engine
|
|
6
|
-
* with terminal rendering and network I/O.
|
|
7
|
-
*/
|
|
8
|
-
import { DAMAGE, GROUND_Y, JUMP_VY, SPRITE_H, TICK_MS, VIEWPORT_H, VIEWPORT_W, applyDamage, checkHit, createPlayer, decodeGameMsg, encodeGameMsg, renderFrame, tickPlayer } from '../../app/collab/super-fight.js';
|
|
9
|
-
export class SuperFightUI {
|
|
10
|
-
ui;
|
|
11
|
-
client;
|
|
12
|
-
localPeerId;
|
|
13
|
-
localDisplayName;
|
|
14
|
-
gameState = new Map();
|
|
15
|
-
gameLoop = null;
|
|
16
|
-
removeInputListener = null;
|
|
17
|
-
inputListener = null;
|
|
18
|
-
resizeHandler = null;
|
|
19
|
-
running = false;
|
|
20
|
-
paused = false; // true when terminal too small
|
|
21
|
-
localAction = 'idle';
|
|
22
|
-
/** Set of target IDs we've already registered a hit for this attack */
|
|
23
|
-
hitTargets = new Set();
|
|
24
|
-
titleScreenTimeout = null;
|
|
25
|
-
showingTitle = true;
|
|
26
|
-
killFeed = [];
|
|
27
|
-
/** Tick counter for respawn invincibility flash */
|
|
28
|
-
invincibilityTicks = new Map();
|
|
29
|
-
/** Callback fired when game stops (for cleanup by InteractiveMode) */
|
|
30
|
-
onStop;
|
|
31
|
-
constructor(opts) {
|
|
32
|
-
this.ui = opts.ui;
|
|
33
|
-
this.client = opts.client;
|
|
34
|
-
this.localPeerId = opts.localPeerId;
|
|
35
|
-
this.localDisplayName = opts.localDisplayName;
|
|
36
|
-
// Initialize players from peer list
|
|
37
|
-
let colorIdx = 0;
|
|
38
|
-
// Add local player first
|
|
39
|
-
this.gameState.set(this.localPeerId, createPlayer(this.localDisplayName, colorIdx++, 20));
|
|
40
|
-
// Add remote peers
|
|
41
|
-
for (const [peerId, peer] of opts.peers) {
|
|
42
|
-
if (peerId === this.localPeerId)
|
|
43
|
-
continue;
|
|
44
|
-
this.gameState.set(peerId, createPlayer(peer.displayName, colorIdx++, 20 + colorIdx * 10));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// ── Lifecycle ──────────────────────────────────────────────────────────
|
|
48
|
-
start() {
|
|
49
|
-
if (this.running)
|
|
50
|
-
return;
|
|
51
|
-
this.running = true;
|
|
52
|
-
// Suspend TUI rendering so resize events don't clobber the game screen
|
|
53
|
-
this.ui.renderSuspended = true;
|
|
54
|
-
// The main TUI already owns the alternate screen; clear it for the game.
|
|
55
|
-
this.ui.terminal.write('\x1b[2J\x1b[H\x1b[?25l');
|
|
56
|
-
// Register input listener (intercepts ALL keys)
|
|
57
|
-
this.inputListener = (data) => this.handleInput(data);
|
|
58
|
-
this.removeInputListener = this.ui.addInputListener(this.inputListener);
|
|
59
|
-
// Listen for resize
|
|
60
|
-
this.resizeHandler = () => this.handleResize();
|
|
61
|
-
process.stdout.on('resize', this.resizeHandler);
|
|
62
|
-
// Check terminal size — if too small, show warning and wait for resize
|
|
63
|
-
if (!this.checkSize()) {
|
|
64
|
-
this.paused = true;
|
|
65
|
-
this.renderSizeWarning();
|
|
66
|
-
// Don't show title screen until terminal is big enough
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
this.showTitleAndStart();
|
|
70
|
-
}
|
|
71
|
-
stop() {
|
|
72
|
-
if (!this.running)
|
|
73
|
-
return;
|
|
74
|
-
this.running = false;
|
|
75
|
-
// Clear title timeout if still showing
|
|
76
|
-
if (this.titleScreenTimeout) {
|
|
77
|
-
clearTimeout(this.titleScreenTimeout);
|
|
78
|
-
this.titleScreenTimeout = null;
|
|
79
|
-
}
|
|
80
|
-
// Stop game loop
|
|
81
|
-
if (this.gameLoop) {
|
|
82
|
-
clearInterval(this.gameLoop);
|
|
83
|
-
this.gameLoop = null;
|
|
84
|
-
}
|
|
85
|
-
// Remove input listener
|
|
86
|
-
if (this.removeInputListener) {
|
|
87
|
-
this.removeInputListener();
|
|
88
|
-
this.removeInputListener = null;
|
|
89
|
-
}
|
|
90
|
-
// Remove resize listener
|
|
91
|
-
if (this.resizeHandler) {
|
|
92
|
-
process.stdout.removeListener('resize', this.resizeHandler);
|
|
93
|
-
this.resizeHandler = null;
|
|
94
|
-
}
|
|
95
|
-
// Broadcast quit
|
|
96
|
-
this.client.sendChat(encodeGameMsg({ type: 'quit' }));
|
|
97
|
-
// Keep the main TUI's alternate screen active and restore its cursor state.
|
|
98
|
-
this.ui.terminal.write('\x1b[?25h');
|
|
99
|
-
// Resume TUI rendering and force a full re-render to restore normal display
|
|
100
|
-
this.ui.renderSuspended = false;
|
|
101
|
-
this.ui.requestRender(true);
|
|
102
|
-
this.onStop?.();
|
|
103
|
-
}
|
|
104
|
-
// ── Game Loop ──────────────────────────────────────────────────────────
|
|
105
|
-
showTitleAndStart() {
|
|
106
|
-
this.showingTitle = true;
|
|
107
|
-
// Clear alternate screen before rendering title
|
|
108
|
-
this.ui.terminal.write('\x1b[2J');
|
|
109
|
-
this.renderTitleScreen();
|
|
110
|
-
this.titleScreenTimeout = setTimeout(() => {
|
|
111
|
-
this.showingTitle = false;
|
|
112
|
-
this.titleScreenTimeout = null;
|
|
113
|
-
// Clear screen before first game frame to remove title remnants
|
|
114
|
-
this.ui.terminal.write('\x1b[2J');
|
|
115
|
-
this.startGameLoop();
|
|
116
|
-
}, 2000);
|
|
117
|
-
}
|
|
118
|
-
startGameLoop() {
|
|
119
|
-
if (!this.running || this.gameLoop)
|
|
120
|
-
return;
|
|
121
|
-
this.gameLoop = setInterval(() => {
|
|
122
|
-
if (this.paused || this.showingTitle)
|
|
123
|
-
return;
|
|
124
|
-
this.tick();
|
|
125
|
-
}, TICK_MS);
|
|
126
|
-
}
|
|
127
|
-
tick() {
|
|
128
|
-
const localPlayer = this.gameState.get(this.localPeerId);
|
|
129
|
-
if (!localPlayer)
|
|
130
|
-
return;
|
|
131
|
-
// Apply local input action
|
|
132
|
-
this.applyLocalInput(localPlayer);
|
|
133
|
-
// Track pre-tick dead state for respawn detection
|
|
134
|
-
const wasDead = new Map();
|
|
135
|
-
for (const [id, p] of this.gameState)
|
|
136
|
-
wasDead.set(id, p.action === 'dead');
|
|
137
|
-
// Physics
|
|
138
|
-
tickPlayer(localPlayer);
|
|
139
|
-
// Detect respawns → start invincibility flash (15 ticks ≈ 1s)
|
|
140
|
-
for (const [id, p] of this.gameState) {
|
|
141
|
-
if (wasDead.get(id) && p.action !== 'dead') {
|
|
142
|
-
this.invincibilityTicks.set(id, 15);
|
|
143
|
-
}
|
|
144
|
-
const remaining = this.invincibilityTicks.get(id);
|
|
145
|
-
if (remaining && remaining > 0) {
|
|
146
|
-
this.invincibilityTicks.set(id, remaining - 1);
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
this.invincibilityTicks.delete(id);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// Hit detection — check local player's attacks against all remotes
|
|
153
|
-
for (const [peerId, target] of this.gameState) {
|
|
154
|
-
if (peerId === this.localPeerId)
|
|
155
|
-
continue;
|
|
156
|
-
if (this.hitTargets.has(peerId))
|
|
157
|
-
continue; // already hit this attack
|
|
158
|
-
if (this.invincibilityTicks.has(peerId))
|
|
159
|
-
continue; // invincible
|
|
160
|
-
if (checkHit(localPlayer, target)) {
|
|
161
|
-
this.hitTargets.add(peerId);
|
|
162
|
-
// Terminal bell on hit
|
|
163
|
-
this.ui.terminal.write('\x07');
|
|
164
|
-
// Broadcast hit
|
|
165
|
-
this.client.sendChat(encodeGameMsg({ type: 'hit', targetId: peerId, damage: DAMAGE }));
|
|
166
|
-
// Apply locally too
|
|
167
|
-
const killed = applyDamage(target, DAMAGE);
|
|
168
|
-
if (killed) {
|
|
169
|
-
localPlayer.kills++;
|
|
170
|
-
this.addKillFeedEntry(localPlayer.displayName, localPlayer.action === 'kick' ? 'kicked' : 'punched', target.displayName);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Broadcast local state
|
|
175
|
-
this.client.sendChat(encodeGameMsg({
|
|
176
|
-
type: 'state',
|
|
177
|
-
peerId: this.localPeerId,
|
|
178
|
-
x: localPlayer.x,
|
|
179
|
-
y: localPlayer.y,
|
|
180
|
-
vy: localPlayer.vy,
|
|
181
|
-
action: localPlayer.action,
|
|
182
|
-
facing: localPlayer.facing,
|
|
183
|
-
health: localPlayer.health,
|
|
184
|
-
kills: localPlayer.kills
|
|
185
|
-
}));
|
|
186
|
-
// Render
|
|
187
|
-
this.renderGameFrame();
|
|
188
|
-
}
|
|
189
|
-
// ── Input ──────────────────────────────────────────────────────────────
|
|
190
|
-
handleInput(data) {
|
|
191
|
-
if (!this.running)
|
|
192
|
-
return undefined;
|
|
193
|
-
// Quit — Escape, q, or Ctrl+C
|
|
194
|
-
if (data === '\x1b' || data === 'q' || data === '\x03') {
|
|
195
|
-
this.stop();
|
|
196
|
-
return { consume: true };
|
|
197
|
-
}
|
|
198
|
-
// Movement keys
|
|
199
|
-
switch (data) {
|
|
200
|
-
case '\x1b[A':
|
|
201
|
-
case 'w': // Up / Jump
|
|
202
|
-
this.localAction = 'jump';
|
|
203
|
-
break;
|
|
204
|
-
case '\x1b[B':
|
|
205
|
-
case 's': // Down / Crouch
|
|
206
|
-
this.localAction = 'crouch';
|
|
207
|
-
break;
|
|
208
|
-
case '\x1b[C':
|
|
209
|
-
case 'd': // Right
|
|
210
|
-
this.localAction = 'walk-right';
|
|
211
|
-
break;
|
|
212
|
-
case '\x1b[D':
|
|
213
|
-
case 'a': // Left
|
|
214
|
-
this.localAction = 'walk-left';
|
|
215
|
-
break;
|
|
216
|
-
case 'j':
|
|
217
|
-
case 'z': // Punch
|
|
218
|
-
this.localAction = 'punch';
|
|
219
|
-
this.hitTargets.clear(); // new attack, clear hit tracking
|
|
220
|
-
break;
|
|
221
|
-
case 'k':
|
|
222
|
-
case 'x': // Kick
|
|
223
|
-
this.localAction = 'kick';
|
|
224
|
-
this.hitTargets.clear();
|
|
225
|
-
break;
|
|
226
|
-
default:
|
|
227
|
-
// On key release or unknown key, go idle
|
|
228
|
-
if (data.length === 1 && data >= ' ') {
|
|
229
|
-
// Ignore other printable chars
|
|
230
|
-
}
|
|
231
|
-
break;
|
|
232
|
-
}
|
|
233
|
-
return { consume: true };
|
|
234
|
-
}
|
|
235
|
-
applyLocalInput(player) {
|
|
236
|
-
if (player.action === 'dead')
|
|
237
|
-
return;
|
|
238
|
-
const onGround = player.y >= GROUND_Y - SPRITE_H;
|
|
239
|
-
switch (this.localAction) {
|
|
240
|
-
case 'jump':
|
|
241
|
-
if (onGround && player.action !== 'jump') {
|
|
242
|
-
player.vy = JUMP_VY;
|
|
243
|
-
player.action = 'jump';
|
|
244
|
-
}
|
|
245
|
-
this.localAction = 'idle'; // jump is one-shot
|
|
246
|
-
break;
|
|
247
|
-
case 'crouch':
|
|
248
|
-
if (onGround) {
|
|
249
|
-
player.action = 'crouch';
|
|
250
|
-
}
|
|
251
|
-
break;
|
|
252
|
-
case 'walk-left':
|
|
253
|
-
if (player.action !== 'punch' && player.action !== 'kick' && player.action !== 'hit') {
|
|
254
|
-
player.action = 'walk-left';
|
|
255
|
-
player.facing = 'left';
|
|
256
|
-
}
|
|
257
|
-
break;
|
|
258
|
-
case 'walk-right':
|
|
259
|
-
if (player.action !== 'punch' && player.action !== 'kick' && player.action !== 'hit') {
|
|
260
|
-
player.action = 'walk-right';
|
|
261
|
-
player.facing = 'right';
|
|
262
|
-
}
|
|
263
|
-
break;
|
|
264
|
-
case 'punch':
|
|
265
|
-
if (player.actionTimer <= 0) {
|
|
266
|
-
player.action = 'punch';
|
|
267
|
-
player.actionTimer = 4; // 4 ticks of punch animation
|
|
268
|
-
}
|
|
269
|
-
this.localAction = 'idle';
|
|
270
|
-
break;
|
|
271
|
-
case 'kick':
|
|
272
|
-
if (player.actionTimer <= 0) {
|
|
273
|
-
player.action = 'kick';
|
|
274
|
-
player.actionTimer = 5; // 5 ticks of kick animation
|
|
275
|
-
}
|
|
276
|
-
this.localAction = 'idle';
|
|
277
|
-
break;
|
|
278
|
-
case 'idle':
|
|
279
|
-
// Only go idle if not in an attack/hit animation and on the ground
|
|
280
|
-
if (player.actionTimer <= 0 && player.action !== 'jump' && onGround) {
|
|
281
|
-
player.action = 'idle';
|
|
282
|
-
}
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
// ── Incoming Network Messages ──────────────────────────────────────────
|
|
287
|
-
/** Called by the chat handler when a game message arrives */
|
|
288
|
-
handleGameMessage(peerId, text) {
|
|
289
|
-
const msg = decodeGameMsg(text);
|
|
290
|
-
if (!msg)
|
|
291
|
-
return;
|
|
292
|
-
switch (msg.type) {
|
|
293
|
-
case 'state':
|
|
294
|
-
this.handleRemoteState(msg.peerId, msg);
|
|
295
|
-
break;
|
|
296
|
-
case 'hit':
|
|
297
|
-
if (msg.targetId === this.localPeerId) {
|
|
298
|
-
const localPlayer = this.gameState.get(this.localPeerId);
|
|
299
|
-
if (localPlayer) {
|
|
300
|
-
applyDamage(localPlayer, msg.damage);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
break;
|
|
304
|
-
case 'quit':
|
|
305
|
-
this.gameState.delete(peerId);
|
|
306
|
-
break;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
handleRemoteState(peerId, msg) {
|
|
310
|
-
let player = this.gameState.get(peerId);
|
|
311
|
-
if (!player) {
|
|
312
|
-
// New player joined mid-game
|
|
313
|
-
player = createPlayer(peerId, this.gameState.size);
|
|
314
|
-
this.gameState.set(peerId, player);
|
|
315
|
-
}
|
|
316
|
-
player.x = msg.x;
|
|
317
|
-
player.y = msg.y;
|
|
318
|
-
player.vy = msg.vy;
|
|
319
|
-
player.action = msg.action;
|
|
320
|
-
player.facing = msg.facing;
|
|
321
|
-
player.health = msg.health;
|
|
322
|
-
player.kills = msg.kills;
|
|
323
|
-
}
|
|
324
|
-
/** Add a peer that joined the collab room during the game */
|
|
325
|
-
addPeer(peerId, displayName) {
|
|
326
|
-
if (!this.gameState.has(peerId)) {
|
|
327
|
-
this.gameState.set(peerId, createPlayer(displayName, this.gameState.size));
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
/** Remove a peer that left the collab room during the game */
|
|
331
|
-
removePeer(peerId) {
|
|
332
|
-
this.gameState.delete(peerId);
|
|
333
|
-
}
|
|
334
|
-
// ── Rendering ──────────────────────────────────────────────────────────
|
|
335
|
-
addKillFeedEntry(killer, verb, victim) {
|
|
336
|
-
this.killFeed.push({ text: `${killer} ${verb} ${victim}!`, time: Date.now() });
|
|
337
|
-
// Keep only last 3
|
|
338
|
-
if (this.killFeed.length > 3)
|
|
339
|
-
this.killFeed.shift();
|
|
340
|
-
}
|
|
341
|
-
tickCount = 0;
|
|
342
|
-
renderGameFrame() {
|
|
343
|
-
this.tickCount++;
|
|
344
|
-
// Invincibility flash: temporarily remove flashing players on odd ticks
|
|
345
|
-
const hidden = new Map();
|
|
346
|
-
for (const [id, ticks] of this.invincibilityTicks) {
|
|
347
|
-
if (ticks > 0 && this.tickCount % 2 === 0) {
|
|
348
|
-
const player = this.gameState.get(id);
|
|
349
|
-
if (player) {
|
|
350
|
-
hidden.set(id, player);
|
|
351
|
-
this.gameState.delete(id);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
const lines = renderFrame(this.gameState, VIEWPORT_W, VIEWPORT_H);
|
|
356
|
-
// Restore hidden players
|
|
357
|
-
for (const [id, player] of hidden) {
|
|
358
|
-
this.gameState.set(id, player);
|
|
359
|
-
}
|
|
360
|
-
const now = Date.now();
|
|
361
|
-
// Overlay kill feed at bottom of viewport (above ground)
|
|
362
|
-
this.killFeed = this.killFeed.filter((e) => now - e.time < 5000);
|
|
363
|
-
for (let i = 0; i < this.killFeed.length; i++) {
|
|
364
|
-
const row = GROUND_Y - 2 - (this.killFeed.length - 1 - i);
|
|
365
|
-
if (row >= 1 && row < lines.length) {
|
|
366
|
-
const entry = this.killFeed[i];
|
|
367
|
-
const age = now - entry.time;
|
|
368
|
-
// Fade: bright for first 3s, dim for last 2s
|
|
369
|
-
const color = age < 3000 ? '\x1b[97m' : '\x1b[90m';
|
|
370
|
-
const pad = Math.max(0, VIEWPORT_W - entry.text.length - 4);
|
|
371
|
-
lines[row] = ' '.repeat(pad) + color + ' ' + entry.text + ' \x1b[0m ';
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
// Move cursor to home position and overwrite
|
|
375
|
-
let output = '\x1b[H';
|
|
376
|
-
for (let i = 0; i < lines.length; i++) {
|
|
377
|
-
output += lines[i];
|
|
378
|
-
if (i < lines.length - 1)
|
|
379
|
-
output += '\r\n';
|
|
380
|
-
}
|
|
381
|
-
this.ui.terminal.write(output);
|
|
382
|
-
}
|
|
383
|
-
renderTitleScreen() {
|
|
384
|
-
const w = VIEWPORT_W;
|
|
385
|
-
const h = VIEWPORT_H;
|
|
386
|
-
const lines = Array(h).fill(' '.repeat(w));
|
|
387
|
-
// ASCII art title centered
|
|
388
|
-
const title = [
|
|
389
|
-
' ____ _ _ ____ _____ ____ _____ ___ ____ _ _ _____ _ ',
|
|
390
|
-
' / ___|| | | | _ \\| ____| _ \\ | ___|_ _/ ___| | | |_ _| |',
|
|
391
|
-
' \\___ \\| | | | |_) | _| | |_) | | |_ | | | _| |_| | | | | |',
|
|
392
|
-
' ___) | |_| | __/| |___| _ < | _| | | |_| | _ | | | |_|',
|
|
393
|
-
' |____/ \\___/|_| |_____|_| \\_\\ |_| |___\\____|_| |_| |_| (_)'
|
|
394
|
-
];
|
|
395
|
-
const startRow = Math.floor((h - title.length - 6) / 2);
|
|
396
|
-
const result = [...lines];
|
|
397
|
-
for (let i = 0; i < title.length; i++) {
|
|
398
|
-
const row = startRow + i;
|
|
399
|
-
if (row >= 0 && row < h) {
|
|
400
|
-
const pad = Math.max(0, Math.floor((w - title[i].length) / 2));
|
|
401
|
-
result[row] =
|
|
402
|
-
' '.repeat(pad) +
|
|
403
|
-
'\x1b[93m' +
|
|
404
|
-
title[i] +
|
|
405
|
-
'\x1b[0m' +
|
|
406
|
-
' '.repeat(Math.max(0, w - pad - title[i].length));
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
// Player list below title
|
|
410
|
-
const playerRow = startRow + title.length + 2;
|
|
411
|
-
const players = [...this.gameState.values()];
|
|
412
|
-
let playerLine = '';
|
|
413
|
-
for (const p of players) {
|
|
414
|
-
playerLine += `${p.color}● ${p.displayName}\x1b[0m `;
|
|
415
|
-
}
|
|
416
|
-
if (playerRow < h) {
|
|
417
|
-
const pad = Math.max(0, Math.floor((w - players.length * 12) / 2));
|
|
418
|
-
result[playerRow] =
|
|
419
|
-
' '.repeat(pad) + playerLine + ' '.repeat(Math.max(0, w - pad - players.length * 12));
|
|
420
|
-
}
|
|
421
|
-
// "Get ready!" text
|
|
422
|
-
const readyRow = playerRow + 2;
|
|
423
|
-
const readyText = 'Get ready...';
|
|
424
|
-
if (readyRow < h) {
|
|
425
|
-
const pad = Math.floor((w - readyText.length) / 2);
|
|
426
|
-
result[readyRow] =
|
|
427
|
-
' '.repeat(pad) +
|
|
428
|
-
'\x1b[97m' +
|
|
429
|
-
readyText +
|
|
430
|
-
'\x1b[0m' +
|
|
431
|
-
' '.repeat(Math.max(0, w - pad - readyText.length));
|
|
432
|
-
}
|
|
433
|
-
let output = '\x1b[H';
|
|
434
|
-
for (let i = 0; i < result.length; i++) {
|
|
435
|
-
output += result[i];
|
|
436
|
-
if (i < result.length - 1)
|
|
437
|
-
output += '\r\n';
|
|
438
|
-
}
|
|
439
|
-
this.ui.terminal.write(output);
|
|
440
|
-
}
|
|
441
|
-
// ── Terminal Size ──────────────────────────────────────────────────────
|
|
442
|
-
checkSize() {
|
|
443
|
-
return this.ui.terminal.columns >= VIEWPORT_W && this.ui.terminal.rows >= VIEWPORT_H;
|
|
444
|
-
}
|
|
445
|
-
handleResize() {
|
|
446
|
-
if (!this.running)
|
|
447
|
-
return;
|
|
448
|
-
if (this.checkSize()) {
|
|
449
|
-
if (this.paused) {
|
|
450
|
-
this.paused = false;
|
|
451
|
-
// If we never showed the title (was paused from the start), show it now
|
|
452
|
-
if (!this.gameLoop && !this.titleScreenTimeout) {
|
|
453
|
-
this.showTitleAndStart();
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
else {
|
|
458
|
-
this.paused = true;
|
|
459
|
-
this.renderSizeWarning();
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
renderSizeWarning() {
|
|
463
|
-
const cols = this.ui.terminal.columns;
|
|
464
|
-
const rows = this.ui.terminal.rows;
|
|
465
|
-
const msg1 = `Resize terminal to at least ${VIEWPORT_W}×${VIEWPORT_H} to play`;
|
|
466
|
-
const msg2 = `Current: ${cols}×${rows}`;
|
|
467
|
-
// Clear screen and center the message
|
|
468
|
-
let output = '\x1b[2J\x1b[H';
|
|
469
|
-
const row1 = Math.max(0, Math.floor(rows / 2) - 1);
|
|
470
|
-
const row2 = row1 + 1;
|
|
471
|
-
if (row1 > 0)
|
|
472
|
-
output += `\x1b[${row1 + 1};1H`;
|
|
473
|
-
const pad1 = Math.max(0, Math.floor((cols - msg1.length) / 2));
|
|
474
|
-
output += ' '.repeat(pad1) + msg1;
|
|
475
|
-
output += `\x1b[${row2 + 1};1H`;
|
|
476
|
-
const pad2 = Math.max(0, Math.floor((cols - msg2.length) / 2));
|
|
477
|
-
output += ' '.repeat(pad2) + '\x1b[90m' + msg2 + '\x1b[0m';
|
|
478
|
-
this.ui.terminal.write(output);
|
|
479
|
-
}
|
|
480
|
-
get isRunning() {
|
|
481
|
-
return this.running;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
//# sourceMappingURL=super-fight-ui.js.map
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Collab footer status — shows room, peers, and sync info when in a collab session.
|
|
3
|
-
*
|
|
4
|
-
* Uses the FooterDataProvider's setExtensionStatus('collab', text) pattern.
|
|
5
|
-
*/
|
|
6
|
-
import type { CollabClient } from '../../app/collab/collab-client.js';
|
|
7
|
-
import type { InteractiveSessionClient } from '../session-client.js';
|
|
8
|
-
type SetStatusFn = (key: string, text: string | undefined) => void;
|
|
9
|
-
type RequestRenderFn = () => void;
|
|
10
|
-
/**
|
|
11
|
-
* Start the collab footer status updater.
|
|
12
|
-
*
|
|
13
|
-
* Registers event handlers on the collab client to keep the footer
|
|
14
|
-
* line up to date. Returns a cleanup function.
|
|
15
|
-
*/
|
|
16
|
-
export declare function startCollabStatusUpdater(session: Pick<InteractiveSessionClient, 'sheetPool'>, client: CollabClient, setStatus: SetStatusFn, requestRender: RequestRenderFn): () => void;
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=collab-status.d.ts.map
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Collab footer status — shows room, peers, and sync info when in a collab session.
|
|
3
|
-
*
|
|
4
|
-
* Uses the FooterDataProvider's setExtensionStatus('collab', text) pattern.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Start the collab footer status updater.
|
|
8
|
-
*
|
|
9
|
-
* Registers event handlers on the collab client to keep the footer
|
|
10
|
-
* line up to date. Returns a cleanup function.
|
|
11
|
-
*/
|
|
12
|
-
export function startCollabStatusUpdater(session, client, setStatus, requestRender) {
|
|
13
|
-
function update() {
|
|
14
|
-
const state = client.state;
|
|
15
|
-
if (!state.roomId) {
|
|
16
|
-
setStatus('collab', undefined);
|
|
17
|
-
requestRender();
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const peerNames = [...state.peers.values()].map((p) => p.displayName);
|
|
21
|
-
const peerPart = peerNames.length > 0 ? peerNames.join(', ') : 'waiting for peers';
|
|
22
|
-
const pool = session.sheetPool;
|
|
23
|
-
const wbCount = pool?.size ?? 0;
|
|
24
|
-
const wbPart = wbCount > 0 ? `${wbCount} workbook${wbCount > 1 ? 's' : ''}` : '';
|
|
25
|
-
const parts = [`room ${state.roomId}`, `${state.peers.size + 1} peers (${peerPart})`];
|
|
26
|
-
if (wbPart)
|
|
27
|
-
parts.push(wbPart);
|
|
28
|
-
setStatus('collab', parts.join(' · '));
|
|
29
|
-
requestRender();
|
|
30
|
-
}
|
|
31
|
-
// Initial update
|
|
32
|
-
update();
|
|
33
|
-
// Subscribe to events that change the status
|
|
34
|
-
client.on('onPeerJoined', update);
|
|
35
|
-
client.on('onPeerLeft', update);
|
|
36
|
-
client.on('onAwareness', update);
|
|
37
|
-
client.on('onDisconnect', () => {
|
|
38
|
-
setStatus('collab', undefined);
|
|
39
|
-
requestRender();
|
|
40
|
-
});
|
|
41
|
-
return () => {
|
|
42
|
-
setStatus('collab', undefined);
|
|
43
|
-
requestRender();
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=collab-status.js.map
|