pi-coding-master 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py +80 -0
- package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py.CHANGELOG +1 -0
- package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py.SPEC +3 -0
- package/core/god.agent.capability/hands.dev.writeissue/issue.ts +209 -0
- package/core/god.agent.capability/hands.dev.writeissue/issue.ts.SPEC +26 -0
- package/core/god.agent.capability/hands.files.changewatcher/watcher.ts +44 -0
- package/core/god.agent.capability/hands.files.changewatcher/watcher.ts.SPEC +25 -0
- package/core/god.pi.mod/cli/pi-completion.zsh +21 -0
- package/core/god.pi.mod/cli/pi-completion.zsh.CHANGELOG +1 -0
- package/core/god.pi.mod/cli/pi-people.sh +264 -0
- package/core/god.pi.mod/cli/pi-people.sh.LESSON +10 -0
- package/core/god.pi.mod/cli/pi-people.sh.SPEC +31 -0
- package/core/god.pi.mod/paths.ts +47 -0
- package/core/god.pi.mod/tui.mods.blockrender/blockrender.js +90 -0
- package/core/god.pi.mod/tui.mods.blockrender/blockrender.js.SPEC +29 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts +154 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.CHANGELOG +10 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.LESSON +12 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.SPEC +26 -0
- package/core/god.pi.mod/tui.mods.footer.budget/footer-cny.CHANGELOG +39 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode-thinking.patch +55 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode-tools.patch +19 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode-tools.patch.CHANGELOG +1 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode.ts +50 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode.ts.SPEC +12 -0
- package/core/god.pi.mod/tui.variants.userterminal/user_terminal.CHANGELOG +10 -0
- package/core/god.pi.mod/tui.variants.userterminal/user_terminal.ts +66 -0
- package/core/god.pi.mod/tui.variants.userterminal/user_terminal.ts.SPEC +31 -0
- package/core/index.ts +3 -0
- package/core/individual.bio.gene/dna.coded/coded.dna +257 -0
- package/core/individual.bio.gene/dna.coded/coded.dna.CHANGELOG +12 -0
- package/core/individual.bio.gene/dna.coded/coded.dna.SPEC +11 -0
- package/core/individual.bio.gene/dna.coded/core.dna +110 -0
- package/core/individual.bio.gene/dna.promotor/promotor.dna +117 -0
- package/core/individual.bio.gene/dna.promotor/promotor.dna.CHANGELOG +4 -0
- package/core/individual.bio.gene/dna.promotor/promotor.dna.SPEC +7 -0
- package/core/individual.bio.gene/dna.transpiler/transpiler.ts +395 -0
- package/core/individual.bio.gene/dna.transpiler/transpiler.ts.CHANGELOG +7 -0
- package/core/individual.bio.gene/dna.transpiler/transpiler.ts.SPEC +28 -0
- package/core/individual.bio.gene/gene.README +19 -0
- package/core/individual.bio.gene/rna/rna.json +536 -0
- package/core/individual.bio.gene/rna/rna.json.CHANGELOG +2 -0
- package/core/individual.bio.gene/rna/rna.json.SPEC +8 -0
- package/core/individual.bio.organs/blood.runtime/messages.ts +236 -0
- package/core/individual.bio.organs/blood.runtime/runtime.ts +173 -0
- package/core/individual.bio.organs/blood.runtime/runtime.ts.CHANGELOG +5 -0
- package/core/individual.bio.organs/blood.runtime/runtime.ts.SPEC +32 -0
- package/core/individual.bio.organs/brain.amygdala/amygdala.ts +25 -0
- package/core/individual.bio.organs/brain.amygdala/amygdala.ts.COMMENT +3 -0
- package/core/individual.bio.organs/brain.amygdala/amygdala.ts.SPEC +9 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus-launcher.sh.template +108 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts +166 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.CHANGELOG +12 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.LESSON +22 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.SPEC +16 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts +879 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts.CHANGELOG +66 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts.LESSON +25 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts.SPEC +46 -0
- package/core/individual.bio.organs/brain.hippocampus/sleep.ts +139 -0
- package/core/individual.bio.organs/brain.hippocampus/sleep.ts.CHANGELOG +11 -0
- package/core/individual.bio.organs/brain.hippocampus/sleep.ts.SPEC +16 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.SPEC +44 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts +73 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts.CHANGELOG +3 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts.SPEC +24 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/index.ts.CHANGELOG +3 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/main.ts +13 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/main.ts.SPEC +17 -0
- package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts +94 -0
- package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts.LESSON +13 -0
- package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts.SPEC +20 -0
- package/core/individual.bio.organs/brain.senses.subconscious/feed-format.SPEC +56 -0
- package/core/individual.bio.organs/brain.senses.subconscious/index.ts.CHANGELOG +13 -0
- package/core/individual.bio.organs/brain.senses.subconscious/spawner.ts +130 -0
- package/core/individual.bio.organs/brain.senses.subconscious/spawner.ts.SPEC +13 -0
- package/core/individual.bio.organs/brain.senses.subconscious/subconscious.ts +280 -0
- package/core/individual.bio.organs/brain.senses.subconscious/subconscious.ts.CHANGELOG +7 -0
- package/core/individual.bio.organs/brain.senses.subconscious/tools.ts +180 -0
- package/core/individual.bio.organs/brain.senses.subconscious/tools.ts.SPEC +3 -0
- package/core/individual.bio.organs/ears.listen/config.json +9 -0
- package/core/individual.bio.organs/ears.listen/config.json.CHANGELOG +1 -0
- package/core/individual.bio.organs/ears.listen/config.json.SPEC +3 -0
- package/core/individual.bio.organs/ears.listen/ears.ts.CHANGELOG +48 -0
- package/core/individual.bio.organs/ears.listen/ears_recorder.py.CHANGELOG +6 -0
- package/core/individual.bio.organs/ears.listen/index.ts +1 -0
- package/core/individual.bio.organs/ears.listen/index.ts.SPEC +16 -0
- package/core/individual.bio.organs/ears.listen/listen.ts +208 -0
- package/core/individual.bio.organs/ears.listen/listen.ts.SPEC +3 -0
- package/core/individual.bio.organs/ears.listen/listen_recorder.py +445 -0
- package/core/individual.bio.organs/ears.listen/listen_recorder.py.SPEC +7 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/events_pb2.py +38 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/events_pb2_grpc.py +24 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/rpcmeta_pb2.py +42 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/rpcmeta_pb2_grpc.py +24 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/ast_service_pb2.py +45 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/ast_service_pb2_grpc.py +97 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/au_base_pb2.py +80 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/au_base_pb2_grpc.py +24 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.TRUST +1 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.ts +70 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.ts.CHANGELOG +1 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.ts.SPEC +3 -0
- package/core/individual.bio.organs/hands.fileactions/dir.README +13 -0
- package/core/individual.bio.organs/hands.fileactions/file_rules.json +23 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.README +12 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.ts +540 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.ts.CHANGELOG +25 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.ts.SPEC +30 -0
- package/core/individual.bio.organs/hands.fileactions/filewatch.ts +66 -0
- package/core/individual.bio.organs/hands.fileactions/filewatch.ts.SPEC +3 -0
- package/core/individual.bio.organs/hands.main/main.ts +18 -0
- package/core/individual.bio.organs/hands.main/main.ts.SPEC +20 -0
- package/core/individual.bio.organs/hands.sensitive/sensitive.ts +24 -0
- package/core/individual.bio.organs/hands.sensitive/sensitive.ts.CHANGELOG +2 -0
- package/core/individual.bio.organs/hands.sensitive/sensitive.ts.SPEC +3 -0
- package/core/individual.bio.organs/heart.interrupt/agent_start-loader-flicker.patch +13 -0
- package/core/individual.bio.organs/heart.interrupt/interactive-mode-loader.patch +11 -0
- package/core/individual.bio.organs/heart.interrupt/runner_esc.patch +10 -0
- package/core/individual.bio.organs/heart.interrupt/runner_esc.patch.SPEC +9 -0
- package/core/individual.bio.organs/heart.kernel/kernel.ts +253 -0
- package/core/individual.bio.organs/heart.kernel/kernel.ts.CHANGELOG +13 -0
- package/core/individual.bio.organs/heart.kernel/kernel.ts.SPEC +23 -0
- package/core/individual.bio.organs/heart.main/heart.main.CHANGELOG +43 -0
- package/core/individual.bio.organs/heart.main/heartbeat.ts +494 -0
- package/core/individual.bio.organs/heart.main/heartbeat.ts.LESSON +43 -0
- package/core/individual.bio.organs/heart.main/main.ts +8 -0
- package/core/individual.bio.organs/heart.main/main.ts.SPEC +19 -0
- package/core/individual.bio.organs/heart.main/process.ts +122 -0
- package/core/individual.bio.organs/heart.main/process.ts.CHANGELOG +2 -0
- package/core/individual.bio.organs/heart.main/process.ts.SPEC +24 -0
- package/core/individual.bio.organs/heart.main/remove_timeout.patch +110 -0
- package/core/individual.bio.organs/heart.main/stop.ts.CHANGELOG +3 -0
- package/core/individual.bio.organs/heart.main/stop.ts.SPEC +28 -0
- package/core/individual.bio.organs/mouth.speak/index.ts +1 -0
- package/core/individual.bio.organs/mouth.speak/index.ts.CHANGELOG +1 -0
- package/core/individual.bio.organs/mouth.speak/index.ts.SPEC +6 -0
- package/core/individual.bio.organs/mouth.speak/mouth.ts.CHANGELOG +15 -0
- package/core/individual.bio.organs/mouth.speak/mouth_recorder.py.CHANGELOG +1 -0
- package/core/individual.bio.organs/mouth.speak/speak.ts +180 -0
- package/core/individual.bio.organs/mouth.speak/speak.ts.SPEC +3 -0
- package/core/individual.bio.organs/mouth.speak/speak_recorder.py +35 -0
- package/core/individual.bio.organs/mouth.speak/speak_recorder.py.SPEC +3 -0
- package/core/individual.bio.organs/organs.README +110 -0
- package/core/package-lock.json +18 -0
- package/core/package.json +35 -0
- package/core/prompts/prompts.json +77 -0
- package/core/prompts/prompts.ts +44 -0
- package/core/prompts/prompts.ts.SPEC +9 -0
- package/core/society.world/.gitkeep +0 -0
- package/core/society.world/accessibility.claudecode/message-service.cjs +217 -0
- package/core/society.world/accessibility.claudecode/message-service.cjs.SPEC +7 -0
- package/core/society.world/accessibility.claudecode/send.ts +34 -0
- package/core/society.world/dollar.distribution.ubi/ubi.ts +55 -0
- package/core/society.world/dollar.main/dollar-service.cjs +185 -0
- package/core/society.world/dollar.main/main.ts +116 -0
- package/core/society.world/dollar.transaction/transaction.ts +71 -0
- package/core/society.world/space/space.ts +206 -0
- package/core/society.world/space/space.ts.SPEC +30 -0
- package/core/technology.laptop/#agent.macos.BLUEPRINT +278 -0
- package/core/technology.phone/apps.preinstalled/albums.FUTURE/albums.ts +69 -0
- package/core/technology.phone/apps.preinstalled/albums.FUTURE/albums.ts.SPEC +15 -0
- package/core/technology.phone/apps.preinstalled/calendar/calendar.ts +406 -0
- package/core/technology.phone/apps.preinstalled/calendar/calendar.ts.SPEC +22 -0
- package/core/technology.phone/apps.preinstalled/calendar/holiday-calendar.ts +529 -0
- package/core/technology.phone/apps.preinstalled/clock/clock.ts +132 -0
- package/core/technology.phone/apps.preinstalled/clock/clock.ts.SPEC +11 -0
- package/core/technology.phone/apps.preinstalled/contacts.FUTURE/contacts.ts +300 -0
- package/core/technology.phone/apps.preinstalled/contacts.FUTURE/contacts.ts.SPEC +22 -0
- package/core/technology.phone/apps.preinstalled/developer.FUTURE/developer.ts +22 -0
- package/core/technology.phone/apps.preinstalled/developer.FUTURE/developer.ts.SPEC +15 -0
- package/core/technology.phone/apps.preinstalled/notes/notes.ts +239 -0
- package/core/technology.phone/apps.preinstalled/notes/notes.ts.SPEC +21 -0
- package/core/technology.phone/apps.preinstalled/polymarket/polymarket.ts +261 -0
- package/core/technology.phone/apps.preinstalled/polymarket/polymarket.ts.SPEC +7 -0
- package/core/technology.phone/apps.preinstalled/reminder/reminder.ts +404 -0
- package/core/technology.phone/apps.preinstalled/reminder/reminder.ts.SPEC +25 -0
- package/core/technology.phone/apps.preinstalled/siri.FUTURE/siri.ts +22 -0
- package/core/technology.phone/apps.preinstalled/siri.FUTURE/siri.ts.SPEC +15 -0
- package/core/technology.phone/apps.preinstalled/spotlight/spotlight.ts +29 -0
- package/core/technology.phone/apps.preinstalled/spotlight/spotlight.ts.SPEC +7 -0
- package/core/technology.phone/apps.preinstalled/steam/chess.ts +230 -0
- package/core/technology.phone/apps.preinstalled/steam/snake.ts +100 -0
- package/core/technology.phone/apps.preinstalled/steam/snake.ts.SPEC +7 -0
- package/core/technology.phone/apps.preinstalled/steam/spy-cmd.ts +4 -0
- package/core/technology.phone/apps.preinstalled/steam/spy-tool.ts +56 -0
- package/core/technology.phone/apps.preinstalled/steam/spy.ts +302 -0
- package/core/technology.phone/apps.preinstalled/steam/steam.ts +299 -0
- package/core/technology.phone/apps.preinstalled/weather/weather.ts +50 -0
- package/core/technology.phone/apps.preinstalled/weather/weather.ts.SPEC +9 -0
- package/core/technology.phone/apps.preinstalled/wechat/imessage.ts +423 -0
- package/core/technology.phone/apps.preinstalled/wechat/imessage.ts.SPEC +24 -0
- package/core/technology.phone/apps.system/appstore/appstore.ts +22 -0
- package/core/technology.phone/apps.system/appstore/appstore.ts.SPEC +15 -0
- package/core/technology.phone/apps.system/finder.FUTURE/finder.ts +64 -0
- package/core/technology.phone/apps.system/finder.FUTURE/finder.ts.SPEC +8 -0
- package/core/technology.phone/apps.system/safari/safari-app.ts +146 -0
- package/core/technology.phone/apps.system/safari/safari.ts.SPEC +24 -0
- package/core/technology.phone/apps.system/settings/settings.ts +126 -0
- package/core/technology.phone/apps.system/settings/settings.ts.SPEC +17 -0
- package/core/technology.phone/apps.system/tips/tips.ts +22 -0
- package/core/technology.phone/apps.system/tips/tips.ts.SPEC +15 -0
- package/core/technology.phone/apps.thirdparty/alipay/alipay.ts +148 -0
- package/core/technology.phone/apps.thirdparty/alipay/alipay.ts.SPEC +7 -0
- package/core/technology.phone/apps.thirdparty/bilibili/bilibili-app.ts +33 -0
- package/core/technology.phone/apps.thirdparty/bilibili/bilibili.ts +142 -0
- package/core/technology.phone/apps.thirdparty/bilibili/bilibili.ts.SPEC +22 -0
- package/core/technology.phone/apps.thirdparty/wechatread/wechatread.ts +80 -0
- package/core/technology.phone/apps.thirdparty/wechatread/wechatread.ts.SPEC +15 -0
- package/core/technology.phone/index.ts +1 -0
- package/core/technology.phone/package.json +2 -0
- package/core/technology.phone/system.homepage/homepage.ts +247 -0
- package/core/technology.phone/system.homepage/homepage.ts.SPEC +22 -0
- package/core/technology.phone/system.kernel/kernel.ts +264 -0
- package/core/technology.phone/system.kernel/kernel.ts.SPEC +7 -0
- package/core/technology.phone/system.notifications/notifications.ts +87 -0
- package/core/technology.phone/system.notifications/notifications.ts.SPEC +7 -0
- package/core/technology.phone/system.share/share.ts +46 -0
- package/core/technology.phone/system.share/share.ts.SPEC +7 -0
- package/core/technology.server/browser-service.cjs +152 -0
- package/core/technology.server/data/cookies/arxiv.json +30 -0
- package/core/technology.server/data/cookies/bili.json +184 -0
- package/core/technology.server/data/cookies/default.json +30 -0
- package/core/technology.server/data/cookies/news.json +113 -0
- package/core/technology.server/data/cookies/s1.json +45 -0
- package/core/technology.server/data/cookies/safari.json +184 -0
- package/core/technology.server/data/cookies/safari2.json +1 -0
- package/core/technology.server/data/cookies/safaridbg.json +1 -0
- package/core/technology.server/data/cookies/search.json +45 -0
- package/core/technology.server/data/cookies/sw.json +30 -0
- package/core/technology.server/data/cookies/t1.json +1 -0
- package/core/technology.server/data/cookies/testread.json +1 -0
- package/core/technology.server/data/cookies/video1.json +113 -0
- package/core/technology.server/data/cookies/yt.json +170 -0
- package/core/technology.server/data/cookies/yt2.json +113 -0
- package/core/technology.server/pikipedia/#pikipedia.BLUEPRINT +106 -0
- package/core/technology.server/playleft.cjs +247 -0
- package/core/technology.server/search-proxy.py +76 -0
- package/core/technology.server/server.README +59 -0
- package/deploy/dist-overrides/cli/cli.js +18 -0
- package/deploy/dist-overrides/core/extensions/loader.js +518 -0
- package/deploy/dist-overrides/core/package-manager.js +2081 -0
- package/deploy/dist-overrides/core/system-prompt.js +109 -0
- package/deploy/dist-overrides/core/system-prompt.js.LESSON +17 -0
- package/deploy/dist-overrides/core/tools/bash.js +353 -0
- package/deploy/dist-overrides/core/tools/bash.js.CHANGELOG +2 -0
- package/deploy/dist-overrides/core/tools/edit-diff.js +345 -0
- package/deploy/dist-overrides/core/tools/edit.js +315 -0
- package/deploy/dist-overrides/core/tools/edit.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/file-mutation-queue.js +52 -0
- package/deploy/dist-overrides/core/tools/find.js +298 -0
- package/deploy/dist-overrides/core/tools/find.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/grep.js +305 -0
- package/deploy/dist-overrides/core/tools/grep.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/index.js +112 -0
- package/deploy/dist-overrides/core/tools/ls-guard.js +4 -0
- package/deploy/dist-overrides/core/tools/ls.js +170 -0
- package/deploy/dist-overrides/core/tools/ls.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/output-accumulator.js +184 -0
- package/deploy/dist-overrides/core/tools/path-utils.js +99 -0
- package/deploy/dist-overrides/core/tools/prompts-reader.js +53 -0
- package/deploy/dist-overrides/core/tools/read.js +392 -0
- package/deploy/dist-overrides/core/tools/read.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/render-utils.js +65 -0
- package/deploy/dist-overrides/core/tools/tool-definition-wrapper.js +34 -0
- package/deploy/dist-overrides/core/tools/truncate.js +215 -0
- package/deploy/dist-overrides/core/tools/write.js +203 -0
- package/deploy/dist-overrides/core/tools/write.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/dist-overrides.README +18 -0
- package/deploy/dist-overrides/main.js +665 -0
- package/deploy/dist-overrides/modes/interactive/components/assistant-message.js +139 -0
- package/deploy/dist-overrides/modes/interactive/components/footer.js +326 -0
- package/deploy/dist-overrides/modes/interactive/components/model-selector.js +285 -0
- package/deploy/dist-overrides/modes/interactive/components/tool-execution.js +383 -0
- package/deploy/dist-overrides/modes/interactive/components/tool-execution.js.CHANGELOG +3 -0
- package/deploy/dist-overrides/modes/interactive/interactive-mode.js +4781 -0
- package/deploy/dist-overrides/pi-ai/providers/anthropic.js +931 -0
- package/deploy/dist-overrides/pi-ai/providers/openai-completions.js +1007 -0
- package/deploy/dist-overrides/pi-ai/providers/openai-completions.js.LESSON +15 -0
- package/deploy/dist-overrides/pi-tui/components/loader.js +69 -0
- package/deploy/dist-overrides/pi-tui/components/markdown.js +646 -0
- package/deploy/dist-overrides/pi-tui/components/text.js +92 -0
- package/deploy/dist-overrides/pi-tui/custom-message.js +75 -0
- package/deploy/dist-overrides/pi-tui/tui.js +1266 -0
- package/deploy/dist-overrides/pi-tui/utils.js +1060 -0
- package/deploy/dist-overrides/vendor.REMOVED/jiti/lib/jiti.mjs +3 -0
- package/deploy/install.sh +186 -0
- package/deploy/install.sh.CHANGELOG +6 -0
- package/deploy/lint/lint-naming.ts +202 -0
- package/deploy/scripts/apply.js +18 -0
- package/deploy/scripts/build-github.sh +219 -0
- package/deploy/scripts/build-phone.sh +24 -0
- package/deploy/scripts/check-deploy.sh +42 -0
- package/deploy/scripts/migrate-context.sh +72 -0
- package/deploy/scripts/patch-pi-dist.js +39 -0
- package/deploy/scripts/uninstall.sh +34 -0
- package/package.json +18 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// apps.preinstalled/steam/chess.ts — 国际象棋(纯规则 minimax AI,零 LLM)
|
|
2
|
+
|
|
3
|
+
interface Move { fr: number; fc: number; tr: number; tc: number; promo?: string }
|
|
4
|
+
|
|
5
|
+
const INIT = [
|
|
6
|
+
['r','n','b','q','k','b','n','r'],
|
|
7
|
+
['p','p','p','p','p','p','p','p'],
|
|
8
|
+
['','','','','','','',''],
|
|
9
|
+
['','','','','','','',''],
|
|
10
|
+
['','','','','','','',''],
|
|
11
|
+
['','','','','','','',''],
|
|
12
|
+
['P','P','P','P','P','P','P','P'],
|
|
13
|
+
['R','N','B','Q','K','B','N','R'],
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
function cp(b: string[][]): string[][] { return b.map(r => [...r]); }
|
|
17
|
+
function ok(r: number, c: number) { return r >= 0 && r < 8 && c >= 0 && c < 8; }
|
|
18
|
+
function isW(p: string) { return p >= 'A' && p <= 'Z'; }
|
|
19
|
+
function isB(p: string) { return p >= 'a' && p <= 'z'; }
|
|
20
|
+
|
|
21
|
+
interface S { b: string[][]; t: 'w' | 'b'; cs: { K: boolean; Q: boolean; k: boolean; q: boolean }; ep: [number, number] | null; over: boolean; res: string | null }
|
|
22
|
+
|
|
23
|
+
function init(): S { return { b: cp(INIT), t: 'w', cs: { K: true, Q: true, k: true, q: true }, ep: null, over: false, res: null }; }
|
|
24
|
+
|
|
25
|
+
function gen(s: S, c: 'w' | 'b'): Move[] {
|
|
26
|
+
const ms: Move[] = [], own = c === 'w' ? isW : isB, opp = c === 'w' ? isB : isW;
|
|
27
|
+
const dir = c === 'w' ? -1 : 1, sr = c === 'w' ? 6 : 1, pr = c === 'w' ? 0 : 7;
|
|
28
|
+
for (let r = 0; r < 8; r++) for (let co = 0; co < 8; co++) {
|
|
29
|
+
const p = s.b[r][co]; if (!own(p)) continue;
|
|
30
|
+
const t = p.toUpperCase();
|
|
31
|
+
if (t === 'P') {
|
|
32
|
+
const nr = r + dir;
|
|
33
|
+
if (ok(nr, co) && !s.b[nr][co]) {
|
|
34
|
+
if (nr === pr) { for (const pp of c === 'w' ? ['Q','R','B','N'] : ['q','r','b','n']) ms.push({ fr: r, fc: co, tr: nr, tc: co, promo: pp }); }
|
|
35
|
+
else { ms.push({ fr: r, fc: co, tr: nr, tc: co }); if (r === sr) { const n2 = r + dir * 2; if (!s.b[n2][co]) ms.push({ fr: r, fc: co, tr: n2, tc: co }); } }
|
|
36
|
+
}
|
|
37
|
+
for (const dc of [-1, 1]) { const nc = co + dc; if (!ok(nr, nc)) continue; if (opp(s.b[nr][nc])) { if (nr === pr) { for (const pp of c === 'w' ? ['Q','R','B','N'] : ['q','r','b','n']) ms.push({ fr: r, fc: co, tr: nr, tc: nc, promo: pp }); } else ms.push({ fr: r, fc: co, tr: nr, tc: nc }); } if (s.ep && s.ep[0] === nr && s.ep[1] === nc) ms.push({ fr: r, fc: co, tr: nr, tc: nc }); }
|
|
38
|
+
}
|
|
39
|
+
if (t === 'N') for (const [dr, dc] of [[-2,-1],[-2,1],[-1,-2],[-1,2],[1,-2],[1,2],[2,-1],[2,1]]) { const nr = r + dr, nc = co + dc; if (ok(nr, nc) && !own(s.b[nr][nc])) ms.push({ fr: r, fc: co, tr: nr, tc: nc }); }
|
|
40
|
+
const sl = (dirs: number[][]) => { for (const [dr, dc] of dirs) { let nr = r + dr, nc = co + dc; while (ok(nr, nc)) { if (own(s.b[nr][nc])) break; ms.push({ fr: r, fc: co, tr: nr, tc: nc }); if (opp(s.b[nr][nc])) break; nr += dr; nc += dc; } } };
|
|
41
|
+
if (t === 'B' || t === 'Q') sl([[-1,-1],[-1,1],[1,-1],[1,1]]);
|
|
42
|
+
if (t === 'R' || t === 'Q') sl([[-1,0],[1,0],[0,-1],[0,1]]);
|
|
43
|
+
if (t === 'K') {
|
|
44
|
+
for (const [dr, dc] of [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]) { const nr = r + dr, nc = co + dc; if (ok(nr, nc) && !own(s.b[nr][nc])) ms.push({ fr: r, fc: co, tr: nr, tc: nc }); }
|
|
45
|
+
const rk = c === 'w' ? 7 : 0, rc = c === 'w' ? 'R' : 'r';
|
|
46
|
+
if (r === rk && co === 4) {
|
|
47
|
+
if ((c === 'w' ? s.cs.K : s.cs.k) && !s.b[rk][5] && !s.b[rk][6] && s.b[rk][7] === rc) ms.push({ fr: rk, fc: 4, tr: rk, tc: 6 });
|
|
48
|
+
if ((c === 'w' ? s.cs.Q : s.cs.q) && !s.b[rk][3] && !s.b[rk][2] && !s.b[rk][1] && s.b[rk][0] === rc) ms.push({ fr: rk, fc: 4, tr: rk, tc: 2 });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return ms;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function ap(s: S, m: Move): S {
|
|
56
|
+
const n: S = { b: cp(s.b), t: s.t === 'w' ? 'b' : 'w', cs: { ...s.cs }, ep: null, over: false, res: null };
|
|
57
|
+
const p = n.b[m.fr][m.fc], t = p.toUpperCase();
|
|
58
|
+
n.b[m.tr][m.tc] = m.promo || p; n.b[m.fr][m.fc] = '';
|
|
59
|
+
if (t === 'P' && s.ep && m.tr === s.ep[0] && m.tc === s.ep[1]) n.b[m.fr][m.tc] = '';
|
|
60
|
+
if (t === 'P' && Math.abs(m.tr - m.fr) === 2) n.ep = [((m.fr + m.tr) >> 1), m.fc];
|
|
61
|
+
if (t === 'K') {
|
|
62
|
+
if (m.fc === 4 && m.tc === 6) { n.b[m.fr][5] = n.b[m.fr][7]; n.b[m.fr][7] = ''; }
|
|
63
|
+
if (m.fc === 4 && m.tc === 2) { n.b[m.fr][3] = n.b[m.fr][0]; n.b[m.fr][0] = ''; }
|
|
64
|
+
if (s.t === 'w') { n.cs.K = false; n.cs.Q = false; } else { n.cs.k = false; n.cs.q = false; }
|
|
65
|
+
}
|
|
66
|
+
if (m.fr === 7 && m.fc === 0) n.cs.Q = false; if (m.fr === 7 && m.fc === 7) n.cs.K = false;
|
|
67
|
+
if (m.fr === 0 && m.fc === 0) n.cs.q = false; if (m.fr === 0 && m.fc === 7) n.cs.k = false;
|
|
68
|
+
if (m.tr === 7 && m.tc === 0) n.cs.Q = false; if (m.tr === 7 && m.tc === 7) n.cs.K = false;
|
|
69
|
+
if (m.tr === 0 && m.tc === 0) n.cs.q = false; if (m.tr === 0 && m.tc === 7) n.cs.k = false;
|
|
70
|
+
return n;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function att(s: S, r: number, c: number, by: 'w' | 'b'): boolean {
|
|
74
|
+
const own = by === 'w' ? isW : isB;
|
|
75
|
+
for (const [dr, dc] of [[-2,-1],[-2,1],[-1,-2],[-1,2],[1,-2],[1,2],[2,-1],[2,1]]) { const nr = r + dr, nc = c + dc; if (ok(nr, nc) && own(s.b[nr][nc]) && s.b[nr][nc].toUpperCase() === 'N') return true; }
|
|
76
|
+
for (const [dr, dc] of [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]) { const nr = r + dr, nc = c + dc; if (ok(nr, nc) && own(s.b[nr][nc]) && s.b[nr][nc].toUpperCase() === 'K') return true; }
|
|
77
|
+
const pr = by === 'w' ? r + 1 : r - 1;
|
|
78
|
+
for (const dc of [-1, 1]) { const nc = c + dc; if (ok(pr, nc) && s.b[pr][nc] === (by === 'w' ? 'P' : 'p')) return true; }
|
|
79
|
+
const sl = (dirs: number[][], pcs: string[]) => { for (const [dr, dc] of dirs) { let nr = r + dr, nc = c + dc; while (ok(nr, nc)) { const sq = s.b[nr][nc]; if (sq) { if (own(sq) && pcs.includes(sq.toUpperCase())) return true; break; } nr += dr; nc += dc; } } return false; };
|
|
80
|
+
return sl([[-1,-1],[-1,1],[1,-1],[1,1]], ['B','Q']) || sl([[-1,0],[1,0],[0,-1],[0,1]], ['R','Q']);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function fk(s: S, c: 'w' | 'b'): [number, number] {
|
|
84
|
+
const k = c === 'w' ? 'K' : 'k';
|
|
85
|
+
for (let r = 0; r < 8; r++) for (let co = 0; co < 8; co++) if (s.b[r][co] === k) return [r, co];
|
|
86
|
+
return [-1, -1];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function chk(s: S, c: 'w' | 'b'): boolean { const [r, co] = fk(s, c); return att(s, r, co, c === 'w' ? 'b' : 'w'); }
|
|
90
|
+
|
|
91
|
+
function legal(s: S): Move[] {
|
|
92
|
+
return gen(s, s.t).filter(m => {
|
|
93
|
+
const ns = ap(s, m);
|
|
94
|
+
if (chk(ns, s.t)) return false;
|
|
95
|
+
if (s.b[m.fr][m.fc].toUpperCase() === 'K' && Math.abs(m.tc - m.fc) === 2) {
|
|
96
|
+
if (chk(s, s.t)) return false;
|
|
97
|
+
const mid = ap(s, { fr: m.fr, fc: m.fc, tr: m.fr, tc: ((m.fc + m.tc) >> 1) });
|
|
98
|
+
if (chk(mid, s.t)) return false;
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ── Evaluation ──
|
|
105
|
+
|
|
106
|
+
const PV: Record<string, number> = { P: 100, N: 320, B: 330, R: 500, Q: 900, K: 20000 };
|
|
107
|
+
const PST: Record<string, number[]> = {
|
|
108
|
+
P: [0,0,0,0,0,0,0,0,50,50,50,50,50,50,50,50,10,10,20,30,30,20,10,10,5,5,10,25,25,10,5,5,0,0,0,20,20,0,0,0,5,-5,-10,0,0,-10,-5,5,5,10,10,-20,-20,10,10,5,0,0,0,0,0,0,0,0],
|
|
109
|
+
N: [-50,-40,-30,-30,-30,-30,-40,-50,-40,-20,0,0,0,0,-20,-40,-30,0,10,15,15,10,0,-30,-30,5,15,20,20,15,5,-30,-30,0,15,20,20,15,0,-30,-30,5,10,15,15,10,5,-30,-40,-20,0,5,5,0,-20,-40,-50,-40,-30,-30,-30,-30,-40,-50],
|
|
110
|
+
B: [-20,-10,-10,-10,-10,-10,-10,-20,-10,0,0,0,0,0,0,-10,-10,0,10,10,10,10,0,-10,-10,5,5,10,10,5,5,-10,-10,0,10,10,10,10,0,-10,-10,10,10,10,10,10,10,-10,-10,5,0,0,0,0,5,-10,-20,-10,-10,-10,-10,-10,-10,-20],
|
|
111
|
+
R: [0,0,0,0,0,0,0,0,5,10,10,10,10,10,10,5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,0,0,0,5,5,0,0,0],
|
|
112
|
+
Q: [-20,-10,-10,-5,-5,-10,-10,-20,-10,0,0,0,0,0,0,-10,-10,0,5,5,5,5,0,-10,-5,0,5,5,5,5,0,-5,0,0,5,5,5,5,0,-5,-10,5,5,5,5,5,0,-10,-10,0,5,0,0,0,0,-10,-20,-10,-10,-5,-5,-10,-10,-20],
|
|
113
|
+
K: [-30,-40,-40,-50,-50,-40,-40,-30,-30,-40,-40,-50,-50,-40,-40,-30,-30,-40,-40,-50,-50,-40,-40,-30,-30,-40,-40,-50,-50,-40,-40,-30,-20,-30,-30,-40,-40,-30,-30,-20,-10,-20,-20,-20,-20,-20,-20,-10,20,20,0,0,0,0,20,20,20,30,10,0,0,10,30,20],
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
function ev(s: S): number {
|
|
117
|
+
let sc = 0;
|
|
118
|
+
for (let r = 0; r < 8; r++) for (let c = 0; c < 8; c++) {
|
|
119
|
+
const p = s.b[r][c]; if (!p) continue;
|
|
120
|
+
const t = p.toUpperCase(), v = PV[t] || 0, ps = PST[t];
|
|
121
|
+
if (isW(p)) sc += v + (ps ? ps[r * 8 + c] : 0);
|
|
122
|
+
else sc -= v + (ps ? ps[(7 - r) * 8 + c] : 0);
|
|
123
|
+
}
|
|
124
|
+
return sc;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ── AI: minimax + alpha-beta ──
|
|
128
|
+
|
|
129
|
+
function mm(s: S, d: number, a: number, b: number, mx: boolean): number {
|
|
130
|
+
const ms = legal(s);
|
|
131
|
+
if (!ms.length) return chk(s, s.t) ? (mx ? -99999 + d : 99999 - d) : 0;
|
|
132
|
+
if (d === 0) return ev(s);
|
|
133
|
+
ms.sort((x, y) => {
|
|
134
|
+
const cx = s.b[x.tr][x.tc] ? PV[s.b[x.tr][x.tc].toUpperCase()] || 0 : 0;
|
|
135
|
+
const cy = s.b[y.tr][y.tc] ? PV[s.b[y.tr][y.tc].toUpperCase()] || 0 : 0;
|
|
136
|
+
return cy - cx;
|
|
137
|
+
});
|
|
138
|
+
if (mx) { let v = -Infinity; for (const m of ms) { v = Math.max(v, mm(ap(s, m), d - 1, a, b, false)); a = Math.max(a, v); if (b <= a) break; } return v; }
|
|
139
|
+
let v = Infinity; for (const m of ms) { v = Math.min(v, mm(ap(s, m), d - 1, a, b, true)); b = Math.min(b, v); if (b <= a) break; } return v;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function best(s: S, depth = 3): Move | null {
|
|
143
|
+
const ms = legal(s);
|
|
144
|
+
if (!ms.length) return null;
|
|
145
|
+
ms.sort((x, y) => { const cx = s.b[x.tr][x.tc] ? PV[s.b[x.tr][x.tc].toUpperCase()] || 0 : 0; const cy = s.b[y.tr][y.tc] ? PV[s.b[y.tr][y.tc].toUpperCase()] || 0 : 0; return cy - cx; });
|
|
146
|
+
let top: Move = ms[0], topV = s.t === 'w' ? -Infinity : Infinity;
|
|
147
|
+
const mx = s.t === 'w';
|
|
148
|
+
let al = -Infinity, be = Infinity;
|
|
149
|
+
for (const m of ms) {
|
|
150
|
+
const v = mm(ap(s, m), depth - 1, al, be, !mx);
|
|
151
|
+
if (mx) { if (v > topV) { topV = v; top = m; } al = Math.max(al, v); }
|
|
152
|
+
else { if (v < topV) { topV = v; top = m; } be = Math.min(be, v); }
|
|
153
|
+
}
|
|
154
|
+
return top;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ── Public ──
|
|
158
|
+
|
|
159
|
+
function sq(r: number, c: number): string { return String.fromCharCode(97 + c) + (8 - r); }
|
|
160
|
+
|
|
161
|
+
export class ChessGame {
|
|
162
|
+
s: S;
|
|
163
|
+
log: string[] = [];
|
|
164
|
+
|
|
165
|
+
constructor() { this.s = init(); }
|
|
166
|
+
|
|
167
|
+
parseInput(input: string): Move | null {
|
|
168
|
+
const m = input.match(/^([a-h])([1-8])([a-h])([1-8])([qrbn])?$/i);
|
|
169
|
+
if (!m) return null;
|
|
170
|
+
return { fr: 8 - +m[2], fc: m[1].charCodeAt(0) - 97, tr: 8 - +m[4], tc: m[3].charCodeAt(0) - 97, promo: m[5] ? (this.s.t === 'w' ? m[5].toUpperCase() : m[5].toLowerCase()) : undefined };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
move(input: string): { ok: boolean; error?: string; ai?: string } {
|
|
174
|
+
if (this.s.over) return { ok: false, error: "游戏已结束。输入「新局」重开。" };
|
|
175
|
+
if (this.s.t !== 'w') return { ok: false, error: "等待对手走棋。" };
|
|
176
|
+
const parsed = this.parseInput(input);
|
|
177
|
+
if (!parsed) return { ok: false, error: "格式: e2e4(起点终点)。升变加字母如 e7e8q。" };
|
|
178
|
+
const ls = legal(this.s);
|
|
179
|
+
let hit = ls.find(m => m.fr === parsed.fr && m.fc === parsed.fc && m.tr === parsed.tr && m.tc === parsed.tc);
|
|
180
|
+
if (!hit) return { ok: false, error: `${input} 不合法。` };
|
|
181
|
+
if (parsed.promo && hit.promo) hit = { ...hit, promo: parsed.promo };
|
|
182
|
+
|
|
183
|
+
this.s = ap(this.s, hit);
|
|
184
|
+
this.log.push(sq(hit.fr, hit.fc) + sq(hit.tr, hit.tc));
|
|
185
|
+
this.ckEnd();
|
|
186
|
+
if (this.s.over) return { ok: true };
|
|
187
|
+
|
|
188
|
+
const ai = best(this.s, 3);
|
|
189
|
+
if (!ai) { this.ckEnd(); return { ok: true }; }
|
|
190
|
+
this.s = ap(this.s, ai);
|
|
191
|
+
const as = sq(ai.fr, ai.fc) + sq(ai.tr, ai.tc);
|
|
192
|
+
this.log.push(as);
|
|
193
|
+
this.ckEnd();
|
|
194
|
+
return { ok: true, ai: as };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
ckEnd() {
|
|
198
|
+
if (this.s.over) return;
|
|
199
|
+
if (!legal(this.s).length) {
|
|
200
|
+
this.s.over = true;
|
|
201
|
+
this.s.res = chk(this.s, this.s.t) ? (this.s.t === 'w' ? "黑方胜(将杀)" : "白方胜(将杀)") : "和棋(逼和)";
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
resign() { this.s.over = true; this.s.res = "认输 — 黑方胜"; }
|
|
206
|
+
|
|
207
|
+
toJSON() { return { b: this.s.b, t: this.s.t, cs: this.s.cs, ep: this.s.ep, over: this.s.over, res: this.s.res, log: this.log }; }
|
|
208
|
+
static fromJSON(j: any): ChessGame { const g = new ChessGame(); if (j) { g.s.b = j.b; g.s.t = j.t; g.s.cs = j.cs; g.s.ep = j.ep; g.s.over = j.over; g.s.res = j.res; g.log = j.log || []; } return g; }
|
|
209
|
+
|
|
210
|
+
render(): string {
|
|
211
|
+
const lines = [" a b c d e f g h"];
|
|
212
|
+
for (let r = 0; r < 8; r++) lines.push(`${8 - r} ${this.s.b[r].map(p => p || '.').join(' ')} ${8 - r}`);
|
|
213
|
+
lines.push(" a b c d e f g h");
|
|
214
|
+
return lines.join("\n");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
screen(): string {
|
|
218
|
+
const lines = ["═══ 国际象棋 ═══", "", this.render(), ""];
|
|
219
|
+
if (this.s.over) {
|
|
220
|
+
lines.push(`结果: ${this.s.res}`);
|
|
221
|
+
lines.push("「新局」重开,「菜单」回 Steam");
|
|
222
|
+
} else {
|
|
223
|
+
if (chk(this.s, this.s.t)) lines.push(" 将军!");
|
|
224
|
+
lines.push("你执白,轮到你走。输入走法(如 e2e4)");
|
|
225
|
+
lines.push("「认输」放弃,「菜单」回 Steam");
|
|
226
|
+
}
|
|
227
|
+
if (this.log.length) lines.push("", `近步: ${this.log.slice(-8).join(" ")}`);
|
|
228
|
+
return lines.join("\n");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// steam/snake.ts — 贪吃蛇(时间驱动:每次查看自动推进,反应慢就死)
|
|
2
|
+
|
|
3
|
+
export type Dir = 'u' | 'd' | 'l' | 'r';
|
|
4
|
+
const W = 20, H = 15;
|
|
5
|
+
const TICK_MS = 200; // 每 200ms 走一步
|
|
6
|
+
|
|
7
|
+
const DIR_DELTA: Record<Dir, [number, number]> = { u: [-1, 0], d: [1, 0], l: [0, -1], r: [0, 1] };
|
|
8
|
+
|
|
9
|
+
export class SnakeGame {
|
|
10
|
+
body: [number, number][];
|
|
11
|
+
dir: Dir;
|
|
12
|
+
food: [number, number];
|
|
13
|
+
over: boolean;
|
|
14
|
+
score: number;
|
|
15
|
+
lastTick: number; // Date.now()
|
|
16
|
+
|
|
17
|
+
constructor() {
|
|
18
|
+
const cy = Math.floor(H / 2);
|
|
19
|
+
this.body = [[cy, 4], [cy, 3], [cy, 2]];
|
|
20
|
+
this.dir = 'r';
|
|
21
|
+
this.score = 0;
|
|
22
|
+
this.over = false;
|
|
23
|
+
this.food = this.#spawnFood();
|
|
24
|
+
this.lastTick = Date.now();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
#spawnFood(): [number, number] {
|
|
28
|
+
const bodySet = new Set(this.body.map(([r, c]) => `${r},${c}`));
|
|
29
|
+
const free: [number, number][] = [];
|
|
30
|
+
for (let r = 0; r < H; r++) for (let c = 0; c < W; c++) if (!bodySet.has(`${r},${c}`)) free.push([r, c]);
|
|
31
|
+
return free.length ? free[Math.floor(Math.random() * free.length)] : [-1, -1];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
input(dir: Dir) {
|
|
35
|
+
if (this.over) return;
|
|
36
|
+
// 先追上时间,再改方向
|
|
37
|
+
this.#catchUp();
|
|
38
|
+
const opp: Record<Dir, Dir> = { u: 'd', d: 'u', l: 'r', r: 'l' };
|
|
39
|
+
if (dir !== opp[this.dir]) this.dir = dir;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 追赶流逝时间:每 TICK_MS 走一步
|
|
43
|
+
#catchUp() {
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
const steps = Math.floor((now - this.lastTick) / TICK_MS);
|
|
46
|
+
for (let i = 0; i < steps; i++) {
|
|
47
|
+
if (this.over) break;
|
|
48
|
+
this.#tick();
|
|
49
|
+
}
|
|
50
|
+
this.lastTick = now;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#tick() {
|
|
54
|
+
const [dr, dc] = DIR_DELTA[this.dir];
|
|
55
|
+
const [hr, hc] = this.body[0];
|
|
56
|
+
const nr = hr + dr, nc = hc + dc;
|
|
57
|
+
if (nr < 0 || nr >= H || nc < 0 || nc >= W) { this.over = true; return; }
|
|
58
|
+
for (let i = 0; i < this.body.length - 1; i++) {
|
|
59
|
+
if (this.body[i][0] === nr && this.body[i][1] === nc) { this.over = true; return; }
|
|
60
|
+
}
|
|
61
|
+
this.body.unshift([nr, nc]);
|
|
62
|
+
if (nr === this.food[0] && nc === this.food[1]) {
|
|
63
|
+
this.score += 10;
|
|
64
|
+
this.food = this.#spawnFood();
|
|
65
|
+
} else {
|
|
66
|
+
this.body.pop();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 获取当前画面(先追时间)
|
|
71
|
+
view(): string { this.#catchUp(); return this.#render(); }
|
|
72
|
+
|
|
73
|
+
#render(): string {
|
|
74
|
+
const grid: string[][] = Array.from({ length: H }, () => Array(W).fill(' '));
|
|
75
|
+
for (let i = 0; i < this.body.length; i++) {
|
|
76
|
+
const [r, c] = this.body[i];
|
|
77
|
+
if (r >= 0 && r < H && c >= 0 && c < W) grid[r][c] = i === 0 ? '●' : '○';
|
|
78
|
+
}
|
|
79
|
+
const [fr, fc] = this.food;
|
|
80
|
+
if (fr >= 0 && fr < H && fc >= 0 && fc < W) grid[fr][fc] = '★';
|
|
81
|
+
const top = '┌' + '─'.repeat(W) + '┐';
|
|
82
|
+
const bot = '└' + '─'.repeat(W) + '┘';
|
|
83
|
+
const rows = grid.map(r => '│' + r.join('') + '│');
|
|
84
|
+
return [top, ...rows, bot].join('\n');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
screen(): string {
|
|
88
|
+
this.#catchUp();
|
|
89
|
+
const lines = ['═══ 贪吃蛇 ═══', '', this.#render(), ''];
|
|
90
|
+
if (this.over) {
|
|
91
|
+
lines.push(`游戏结束!得分: ${this.score}`);
|
|
92
|
+
lines.push('「新局」重开,「菜单」回 Steam');
|
|
93
|
+
} else {
|
|
94
|
+
lines.push(`得分: ${this.score} | 每 ${TICK_MS}ms 自动走一步`);
|
|
95
|
+
lines.push('方向: w上 s下 a左 d右');
|
|
96
|
+
lines.push('反应要快——慢了就撞墙!');
|
|
97
|
+
}
|
|
98
|
+
return lines.join('\n');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// who_is_spy/spy-tool.ts — spy 工具(零依赖,内联引擎)
|
|
2
|
+
export async function spyTool(args: any, _ctx: any, _personDir: string): Promise<{ content: any[]; details: any }> {
|
|
3
|
+
const a = args.action || "";
|
|
4
|
+
if (!a) return m("谁是卧底\n\n spy new [人数] — 开局\n spy describe <描述>\n spy vote <名字>\n spy status / history");
|
|
5
|
+
if (a === "new") return doNew(args);
|
|
6
|
+
if (!G) return m("无游戏。spy new 开局");
|
|
7
|
+
if (G.over) return m(G.view() + "\n\nspy new 再来");
|
|
8
|
+
if (a === "status") return m(G.view());
|
|
9
|
+
if (a === "history") return m(G.h.join("\n") || "暂无");
|
|
10
|
+
if (a === "describe") { const t = (args.text||"").trim(); if(!t)return m("描述什么?"); const ok=G.desc("你",t); return m(ok?G.view():G.err); }
|
|
11
|
+
if (a === "vote") { const t=args.target||""; if(!t)return m("投谁?"); const ok=G.vote("你",t); return m(ok?G.view():G.err); }
|
|
12
|
+
return m("未知: "+a);
|
|
13
|
+
}
|
|
14
|
+
function m(s:string){return{content:[{type:"text",text:s}],details:{}}}
|
|
15
|
+
|
|
16
|
+
let G:any=null;
|
|
17
|
+
const W=[["苹果","梨"],["猫","狗"],["咖啡","茶"],["雨伞","遮阳伞"],["火车","地铁"],["沙发","椅子"],["钢琴","电子琴"],["汉堡","三明治"]];
|
|
18
|
+
|
|
19
|
+
function doNew(args:any){
|
|
20
|
+
const n=Math.max(3,Math.min(7,+(args.players||5)||5));
|
|
21
|
+
const p=W[Math.random()*W.length|0],si=Math.random()*n|0;
|
|
22
|
+
const nm=["你","甲","乙","丙","丁","戊"].slice(0,n);
|
|
23
|
+
const ps=nm.map((x,i)=>({n:x,w:i===si?p[0]:p[1],s:i===si,l:true}));
|
|
24
|
+
let ph=0,r=1,ti=0,vr:Record<string,string>={},hs:string[]=[],er="",ds:{p:string;t:string}[]=[];
|
|
25
|
+
const lv=()=>ps.filter((x:any)=>x.l).map((x:any)=>x.n);
|
|
26
|
+
const tn=()=>lv()[ti%lv().length];
|
|
27
|
+
function nx(){
|
|
28
|
+
if(ph===0){ph=1;vr={}}
|
|
29
|
+
else if(ph===1){
|
|
30
|
+
const ta:Record<string,number>={};for(const t of Object.values(vr))ta[t]=(ta[t]||0)+1;
|
|
31
|
+
const mx=Math.max(...Object.values(ta));
|
|
32
|
+
const el=Object.entries(ta).filter(([,c])=>c===mx).map(([n])=>n);
|
|
33
|
+
if(el.length===1){
|
|
34
|
+
const x=ps.find((x:any)=>x.n===el[0])!;x.l=false;
|
|
35
|
+
hs.push("淘汰: "+x.n+(x.s?" (卧底!)":""));
|
|
36
|
+
const sc=ps.filter((x:any)=>x.l&&x.s).length,cc=ps.filter((x:any)=>x.l&&!x.s).length;
|
|
37
|
+
if(sc===0){ph=2;hs.push("平民胜利!")}
|
|
38
|
+
else if(sc>=cc){ph=2;hs.push("卧底胜利!")}
|
|
39
|
+
else{ph=0;r++;ti=0;ds=[]}
|
|
40
|
+
}else{hs.push("平票: "+el.join(","));ph=0;r++;ti=0;ds=[]}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
G={
|
|
44
|
+
get over(){return ph===2},get err(){return er},h:hs,
|
|
45
|
+
view(){
|
|
46
|
+
if(ph===2){const x=ps.find((x:any)=>x.s)!;return "结束\n卧底: "+x.n+" (词: "+x.w+")\n"+hs.join("\n")}
|
|
47
|
+
const lns=["第"+r+"轮 | "+(ph===0?"描述":"投票"),"你的词: "+ps[0].w];
|
|
48
|
+
if(ph===0){lns.push("轮到: "+tn());if(ds.length)lns.push(...ds.map((d:any)=>" "+d.p+": \""+d.t+"\""))}
|
|
49
|
+
else{if(ds.length)lns.push(...ds.map((d:any)=>" "+d.p+": \""+d.t+"\""));lns.push("已投: "+(Object.keys(vr).join(",")||"无"),"可选: "+lv().filter((n:string)=>n!=="你").join(","))}
|
|
50
|
+
return lns.join("\n");
|
|
51
|
+
},
|
|
52
|
+
desc(nm:string,tx:string){if(ph!==0){er="非描述阶段";return false}if(nm!==tn()){er="没轮到("+tn()+")";return false}if(ds.find((d:any)=>d.p===nm)){er="已描述";return false}ds.push({p:nm,t:tx});hs.push("R"+r+" "+nm+": \""+tx+"\"");ti++;if(ds.length>=lv().length)nx();return true},
|
|
53
|
+
vote(vt:string,tg:string){if(ph!==1){er="非投票";return false}if(vr[vt]){er="已投";return false}if(!lv().includes(tg)){er=tg+"不在可选";return false}vr[vt]=tg;hs.push(vt+"→"+tg);if(Object.keys(vr).length>=lv().length)nx();return true},
|
|
54
|
+
};
|
|
55
|
+
return m(G.view());
|
|
56
|
+
}
|