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,146 @@
|
|
|
1
|
+
// safari-app.ts — Safari (自包含,零 jiti 跨文件缓存)
|
|
2
|
+
import type { PhoneApp } from "../../system.kernel/kernel.ts";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
|
|
6
|
+
const BROWSER_URL = process.env.PI_BROWSER || "http://127.0.0.1:9222";
|
|
7
|
+
|
|
8
|
+
interface SafariState {
|
|
9
|
+
currentUrl: string; currentTitle: string;
|
|
10
|
+
history: string[]; histIdx: number;
|
|
11
|
+
pageText: string; pageLinks: string[];
|
|
12
|
+
}
|
|
13
|
+
const _s: SafariState = {
|
|
14
|
+
currentUrl: "", currentTitle: "",
|
|
15
|
+
history: [], histIdx: -1,
|
|
16
|
+
pageText: "", pageLinks: [],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
function loadJson(p: string): any[] { try { return JSON.parse(fs.readFileSync(p, "utf8")); } catch { return []; } }
|
|
20
|
+
function saveJson(p: string, data: any[]) { fs.mkdirSync(path.dirname(p), { recursive: true }); fs.writeFileSync(p, JSON.stringify(data, null, 2)); }
|
|
21
|
+
|
|
22
|
+
function recordHistory(personDir: string, entry: string) {
|
|
23
|
+
if (!personDir) return;
|
|
24
|
+
try {
|
|
25
|
+
const histFile = path.join(personDir, "safari_history.json");
|
|
26
|
+
const hist = loadJson(histFile);
|
|
27
|
+
hist.push({ url: entry, ts: new Date().toISOString() });
|
|
28
|
+
saveJson(histFile, hist.slice(-500));
|
|
29
|
+
} catch {}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let _svcStarting = false;
|
|
33
|
+
async function ensureSvc(): Promise<boolean> {
|
|
34
|
+
try { const r = await fetch(BROWSER_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "ping" }), signal: AbortSignal.timeout(500) }); return r.ok; } catch {}
|
|
35
|
+
if (_svcStarting) return false;
|
|
36
|
+
_svcStarting = true;
|
|
37
|
+
try {
|
|
38
|
+
const { spawn } = await import("node:child_process");
|
|
39
|
+
const { homedir } = await import("node:os");
|
|
40
|
+
const svc = path.join(homedir(), "smart-pi/pi-coding-master.DEV/Codebase/core/technology.server/browser-service.cjs");
|
|
41
|
+
const env = { ...process.env, PORT: "9222" };
|
|
42
|
+
if (!env.CHROMIUM_PATH) env.CHROMIUM_PATH = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
|
|
43
|
+
const child = spawn("node", [svc], { stdio: "ignore", detached: true, env });
|
|
44
|
+
child.unref();
|
|
45
|
+
for (let i = 0; i < 10; i++) { await new Promise(r => setTimeout(r, 500)); try { const r = await fetch(BROWSER_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "ping" }), signal: AbortSignal.timeout(500) }); if (r.ok) return true; } catch {} }
|
|
46
|
+
} catch {} finally { _svcStarting = false; }
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function bc(action: string, params: Record<string, any> = {}, session = "safari"): Promise<any> {
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch(BROWSER_URL, {
|
|
53
|
+
method: "POST", headers: { "Content-Type": "application/json" },
|
|
54
|
+
body: JSON.stringify({ action, session, ...params }),
|
|
55
|
+
signal: AbortSignal.timeout(10000),
|
|
56
|
+
});
|
|
57
|
+
return await res.json();
|
|
58
|
+
} catch {
|
|
59
|
+
if (await ensureSvc()) {
|
|
60
|
+
try {
|
|
61
|
+
const res = await fetch(BROWSER_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action, session, ...params }), signal: AbortSignal.timeout(10000) });
|
|
62
|
+
return await res.json();
|
|
63
|
+
} catch (e: any) { return { error: `browser: ${e.message}` }; }
|
|
64
|
+
}
|
|
65
|
+
return { error: "browser-service 启动失败" };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function fetchUrl(url: string, limit = 10000): Promise<string> {
|
|
70
|
+
const res = await fetch(url, {
|
|
71
|
+
headers: { "User-Agent": "Mozilla/5.0" },
|
|
72
|
+
signal: AbortSignal.timeout(10000),
|
|
73
|
+
});
|
|
74
|
+
const ct = res.headers.get("content-type") || "";
|
|
75
|
+
return (ct.includes("json") ? JSON.stringify(await res.json(), null, 2) : await res.text()).slice(0, limit);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function openBg(url: string): void {
|
|
79
|
+
_s.currentUrl = url; _s.currentTitle = url;
|
|
80
|
+
_s.pageText = ""; _s.pageLinks = [];
|
|
81
|
+
_s.history = _s.history.slice(0, _s.histIdx + 1);
|
|
82
|
+
_s.history.push(url); _s.histIdx = _s.history.length - 1;
|
|
83
|
+
// 全异步加载,不等任何返回
|
|
84
|
+
bc("open", { url }).then(r => {
|
|
85
|
+
if (r.error) { console.log("[safari] open fail:", r.error); return; }
|
|
86
|
+
_s.currentTitle = (r.text || "").replace(/^已打开: /, "").split("\n")[0] || url;
|
|
87
|
+
return Promise.all([bc("text", { limit: 10000 }), bc("links", { limit: 50 })]);
|
|
88
|
+
}).then((results: any) => {
|
|
89
|
+
if (results) {
|
|
90
|
+
_s.pageText = results[0]?.text || "";
|
|
91
|
+
_s.pageLinks = results[1]?.text ? results[1].text.split("\n").filter(Boolean) : [];
|
|
92
|
+
console.log("[safari] loaded", _s.pageText.length, "chars from", url);
|
|
93
|
+
}
|
|
94
|
+
}).catch((e: any) => console.log("[safari] bg fail:", e.message));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function searchWeb(q: string): Promise<string> {
|
|
98
|
+
try {
|
|
99
|
+
const sxng = process.env.SEARXNG_URL || "http://127.0.0.1:8888";
|
|
100
|
+
const r = await fetch(`${sxng}/search?q=${encodeURIComponent(q)}&format=json&language=zh-CN`, { signal: AbortSignal.timeout(8000) });
|
|
101
|
+
const j = await r.json() as any; const items = j.results || [];
|
|
102
|
+
if (items.length) return "搜索: " + q + "\n\n" + items.slice(0, 8).map((i: any, n: number) => `[${n+1}] ${i.title}\n ${i.content || i.snippet || ""}\n → ${i.url}`).join("\n\n");
|
|
103
|
+
} catch {}
|
|
104
|
+
try { return await fetchUrl("https://www.google.com/search?q=" + encodeURIComponent(q), 5000); } catch { return "搜索失败"; }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const app: PhoneApp = {
|
|
108
|
+
name: "Safari",
|
|
109
|
+
icon: "浏览器",
|
|
110
|
+
messageDescription: "打开网页、搜索、读取内容",
|
|
111
|
+
onOpen(s: any) {
|
|
112
|
+
return { screen: "Safari\n URL | 搜索 xxx | 读 | 返回", state: s };
|
|
113
|
+
},
|
|
114
|
+
async onAction(input: string, state: any, personDir: string) {
|
|
115
|
+
const cmd = input.trim();
|
|
116
|
+
try {
|
|
117
|
+
if (cmd === "返回" || cmd === "back") return { screen: "已返回", state: { ...state, _close: true } };
|
|
118
|
+
if (cmd === "读" || cmd === "read") {
|
|
119
|
+
if (_s.pageText) return { screen: _s.pageText.slice(0, 5000), state };
|
|
120
|
+
if (_s.currentUrl) return { screen: `加载中: ${_s.currentUrl}\n\n稍后再试「读」。`, state };
|
|
121
|
+
return { screen: "未打开页面。输入 URL。", state };
|
|
122
|
+
}
|
|
123
|
+
if (cmd.startsWith("搜索 ") || cmd.startsWith("search ")) {
|
|
124
|
+
const q = cmd.replace(/^(搜索 |search )/, "");
|
|
125
|
+
const result = await searchWeb(q);
|
|
126
|
+
recordHistory(personDir, `search: ${q}`);
|
|
127
|
+
return { screen: result.slice(0, 5000), state };
|
|
128
|
+
}
|
|
129
|
+
if (cmd.startsWith("http://") || cmd.startsWith("https://")) {
|
|
130
|
+
const t0 = Date.now();
|
|
131
|
+
const r = await bc("open", { url: cmd });
|
|
132
|
+
if (r.error) return { screen: `打开失败: ${r.error}`, state };
|
|
133
|
+
const title = (r.text || "").replace(/^已打开: /, "").split("\n")[0] || cmd;
|
|
134
|
+
_s.currentUrl = cmd; _s.currentTitle = title;
|
|
135
|
+
const [textR] = await Promise.all([bc("text", { limit: 10000 })]);
|
|
136
|
+
_s.pageText = textR?.text || "";
|
|
137
|
+
recordHistory(personDir, cmd);
|
|
138
|
+
const elapsed = ((Date.now() - t0) / 1000).toFixed(1);
|
|
139
|
+
return { screen: `已打开: ${title}\n${cmd}\n\n${_s.pageText.slice(0, 5000) || "(页面无文字)"}\n\n[${elapsed}s]`, state };
|
|
140
|
+
}
|
|
141
|
+
return { screen: "Safari\n URL | 搜索 xxx | 读 | 返回", state };
|
|
142
|
+
} catch (e: any) {
|
|
143
|
+
return { screen: "错误: " + e.message, state };
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
source: safari.ts @ 0db96e05
|
|
2
|
+
|
|
3
|
+
# Safari — 动态网页浏览器
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
通过 browser-service(playleft + headless Chrome)访问网页,支持 JS 动态内容渲染。不再用 curl/fetch 抓静态 HTML。
|
|
7
|
+
|
|
8
|
+
## 操作
|
|
9
|
+
- search_web: DuckDuckGo 搜索,浏览器渲染结果
|
|
10
|
+
- open_url/open: 打开任意 URL,返回渲染后文字
|
|
11
|
+
- read/text: 读当前页面文字
|
|
12
|
+
- links: 列出链接
|
|
13
|
+
- click: 点击元素
|
|
14
|
+
- search_page: 页面内搜索
|
|
15
|
+
- scroll: 滚动
|
|
16
|
+
- back: 后退
|
|
17
|
+
- 书签/历史: add_bookmark, query_bookmarks, query_history
|
|
18
|
+
|
|
19
|
+
## 依赖
|
|
20
|
+
browser-service (technology.server/browser-service.cjs) 必须运行。PI_BROWSER 环境变量指定地址(默认 localhost:9222)。
|
|
21
|
+
|
|
22
|
+
## 数据
|
|
23
|
+
书签: {personDir}/safari_bookmarks.json
|
|
24
|
+
历史: {personDir}/safari_history.json
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { asyncShSafe } from "#sh";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import type { PhoneApp } from "../../system.kernel/kernel.ts";
|
|
5
|
+
import { getRegion, setRegion } from "../../apps.preinstalled/calendar/holiday-calendar.ts";
|
|
6
|
+
|
|
7
|
+
// apps.system/settings/settings.ts — 系统设置
|
|
8
|
+
async function getPiVersion(): Promise<string> {
|
|
9
|
+
const raw = await asyncShSafe("node -e 'console.log(require(\"@earendil-works/pi-coding-agent/package.json\").version)'", 3000);
|
|
10
|
+
return raw.trim() || "?";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function loadCostTotal(personDir: string): { main: number; hippocampus: number; subconscious: number; total: number; sessions: number } {
|
|
14
|
+
const f = path.join(personDir, "cost_total.json");
|
|
15
|
+
try { return JSON.parse(fs.readFileSync(f, "utf8")); } catch { return { main: 0, hippocampus: 0, subconscious: 0, total: 0, sessions: 0 }; }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function loadCostCurrent(personDir: string, role: string): number {
|
|
19
|
+
try {
|
|
20
|
+
const d = JSON.parse(fs.readFileSync(path.join(personDir, `cost-${role}.json`), "utf8"));
|
|
21
|
+
return d.cost || 0;
|
|
22
|
+
} catch { return 0; }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function settingsCmd(args: any, _ctx: any, personDir: string): Promise<{ content: any[]; details: any }> {
|
|
26
|
+
const a = args.action || "";
|
|
27
|
+
if (a === "status") {
|
|
28
|
+
const piVer = await getPiVersion();
|
|
29
|
+
const costTotal = loadCostTotal(personDir);
|
|
30
|
+
const costCurr = {
|
|
31
|
+
main: loadCostCurrent(personDir, "main"),
|
|
32
|
+
hippocampus: loadCostCurrent(personDir, "hippocampus"),
|
|
33
|
+
subconscious: loadCostCurrent(personDir, "subconscious"),
|
|
34
|
+
};
|
|
35
|
+
costCurr.total = costCurr.main + costCurr.hippocampus + costCurr.subconscious;
|
|
36
|
+
|
|
37
|
+
const info = {
|
|
38
|
+
platform: process.platform,
|
|
39
|
+
arch: process.arch,
|
|
40
|
+
pi: piVer,
|
|
41
|
+
node: process.version,
|
|
42
|
+
cwd: process.cwd(),
|
|
43
|
+
uptime: Math.floor(process.uptime()),
|
|
44
|
+
costCurrent: costCurr,
|
|
45
|
+
costTotal,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const lines = [
|
|
49
|
+
`平台: ${info.platform}/${info.arch}`,
|
|
50
|
+
`pi: v${info.pi}`,
|
|
51
|
+
`Node: ${info.node}`,
|
|
52
|
+
`运行时间: ${info.uptime}s`,
|
|
53
|
+
``,
|
|
54
|
+
`--- 费用 ---`,
|
|
55
|
+
`当前会话: $${costCurr.total.toFixed(4)}`,
|
|
56
|
+
` 主意识: $${costCurr.main.toFixed(4)}`,
|
|
57
|
+
` 海马体: $${costCurr.hippocampus.toFixed(4)}`,
|
|
58
|
+
` 潜意识: $${costCurr.subconscious.toFixed(4)}`,
|
|
59
|
+
`累计(全部会话): $${costTotal.total.toFixed(4)} (${costTotal.sessions}次会话)`,
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
return { content: [{ type: "text", text: lines.join("\n") }], details: info };
|
|
63
|
+
}
|
|
64
|
+
if (a === "region" || a === "地区") {
|
|
65
|
+
const current = getRegion(personDir);
|
|
66
|
+
const lines = [
|
|
67
|
+
`**地区设置**`,
|
|
68
|
+
"",
|
|
69
|
+
`当前: ${current === "CN" ? "中国" : "美国"}`,
|
|
70
|
+
"",
|
|
71
|
+
"切换: 地区 中国 | 地区 美国",
|
|
72
|
+
"",
|
|
73
|
+
"地区决定日历中显示的节假日。",
|
|
74
|
+
"中国: 春节、清明、端午、中秋、国庆等",
|
|
75
|
+
"美国: New Year, Independence Day, Thanksgiving, Christmas 等",
|
|
76
|
+
];
|
|
77
|
+
return { content: [{ type: "text", text: lines.join("\n") }], details: {} };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (a === "地区 中国" || a === "region CN" || a === "region cn") {
|
|
81
|
+
setRegion(personDir, "CN");
|
|
82
|
+
return { content: [{ type: "text", text: "地区已切换为 **中国**。日历将显示中国节假日。" }], details: {} };
|
|
83
|
+
}
|
|
84
|
+
if (a === "地区 美国" || a === "region US" || a === "region us") {
|
|
85
|
+
setRegion(personDir, "US");
|
|
86
|
+
return { content: [{ type: "text", text: "地区已切换为 **美国**。日历将显示美国节假日。" }], details: {} };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return { content: [{ type: "text", text: `未知操作: ${a}。可用: status | 地区 | 地区 中国 | 地区 美国` }], details: {} };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ── PhoneApp ──────────────────────────────────────────────────
|
|
93
|
+
export const app: PhoneApp = {
|
|
94
|
+
name: "设置",
|
|
95
|
+
icon: "设置",
|
|
96
|
+
messageDescription: "系统设置与状态",
|
|
97
|
+
onOpen(_state, personDir) {
|
|
98
|
+
const region = getRegion(personDir);
|
|
99
|
+
const regionLabel = region === "US" ? "美国" : "中国";
|
|
100
|
+
return {
|
|
101
|
+
screen: [
|
|
102
|
+
"设置",
|
|
103
|
+
"",
|
|
104
|
+
`地区: ${regionLabel}`,
|
|
105
|
+
"",
|
|
106
|
+
"命令:",
|
|
107
|
+
" 状态 — 查看系统状态与费用",
|
|
108
|
+
" 地区 — 查看地区设置",
|
|
109
|
+
" 地区 中国 — 切换到中国节假日",
|
|
110
|
+
" 地区 美国 — 切换到美国节假日",
|
|
111
|
+
].join("\n"),
|
|
112
|
+
state: _state ?? {},
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
async onAction(input, state, personDir) {
|
|
116
|
+
const trimmed = input.trim();
|
|
117
|
+
let action = trimmed;
|
|
118
|
+
if (trimmed === "状态") action = "status";
|
|
119
|
+
else if (trimmed === "地区") action = "region";
|
|
120
|
+
else if (trimmed === "地区 中国" || trimmed === "地区中国") action = "地区 中国";
|
|
121
|
+
else if (trimmed === "地区 美国" || trimmed === "地区美国") action = "地区 美国";
|
|
122
|
+
|
|
123
|
+
const result = await settingsCmd({ action }, {}, personDir);
|
|
124
|
+
return { screen: result.content[0].text, state };
|
|
125
|
+
},
|
|
126
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
source: settings.ts @ 1a7c9b08
|
|
2
|
+
|
|
3
|
+
# Settings -- 系统设置与状态
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
查看系统运行状态和费用统计(当前会话 + 累计)。分主意识/海马体/潜意识三路统计。
|
|
7
|
+
|
|
8
|
+
## 操作
|
|
9
|
+
- `action: "status"` -- 显示平台/版本/运行时间/费用明细
|
|
10
|
+
- 其他 action 值 -- 返回"未知操作"
|
|
11
|
+
|
|
12
|
+
## 数据
|
|
13
|
+
- `{personDir}/cost_total.json` -- 累计费用(main/hippocampus/subconscious/total/sessions)
|
|
14
|
+
- `{personDir}/cost-{role}.json` -- 当前会话各角色费用
|
|
15
|
+
|
|
16
|
+
## 备注
|
|
17
|
+
pi 版本通过 shell 调用 `node -e` 读取 package.json 获取。仅只读查询,不修改设置。
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// apps.system/tips/tips.ts — tips tool (AI) — stub
|
|
2
|
+
import type { PhoneApp } from "../../system.kernel/kernel.ts";
|
|
3
|
+
|
|
4
|
+
export async function tipsCmd(args: any, _ctx: any, _personDir: string): Promise<{ content: any[]; details: any }> {
|
|
5
|
+
return { content: [{ type: "text", text: "tips 功能尚未实现" }], details: {} };
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// ── PhoneApp ──────────────────────────────────────────────────
|
|
9
|
+
export const app: PhoneApp = {
|
|
10
|
+
name: "Tips",
|
|
11
|
+
icon: "提示",
|
|
12
|
+
messageDescription: "使用技巧",
|
|
13
|
+
onOpen(_state, _personDir) {
|
|
14
|
+
return {
|
|
15
|
+
screen: "Tips\n\n功能开发中...",
|
|
16
|
+
state: _state ?? {},
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
onAction(_input, state, _personDir) {
|
|
20
|
+
return { screen: "Tips\n\n功能开发中...", state };
|
|
21
|
+
},
|
|
22
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// apps.thirdparty/alipay/alipay.ts — 支付宝 AI付
|
|
2
|
+
// 对接官方 @alipay/agent-payment MCP (alipay-bot CLI)
|
|
3
|
+
import type { PhoneApp } from "../../system.kernel/kernel.ts";
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
import { existsSync } from "fs";
|
|
6
|
+
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
const BOT = join(homedir(), ".local/bin/alipay-bot");
|
|
10
|
+
|
|
11
|
+
function bot(args: string): { ok: boolean; output: string } {
|
|
12
|
+
try {
|
|
13
|
+
const out = execSync(`${BOT} ${args}`, { timeout: 15000, encoding: "utf8" });
|
|
14
|
+
return { ok: true, output: out.trim() };
|
|
15
|
+
} catch (e: any) {
|
|
16
|
+
return { ok: false, output: e.stderr || e.message || String(e) };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isInstalled(): boolean {
|
|
21
|
+
return existsSync(BOT);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function genQR(url: string): string {
|
|
25
|
+
try {
|
|
26
|
+
return execSync(`python3 -c "
|
|
27
|
+
import qrcode
|
|
28
|
+
qr = qrcode.QRCode(border=2, box_size=1)
|
|
29
|
+
qr.add_data('${url}')
|
|
30
|
+
qr.make(fit=True)
|
|
31
|
+
qr.print_ascii(invert=True)
|
|
32
|
+
"`, { timeout: 5000, encoding: "utf8" });
|
|
33
|
+
} catch {
|
|
34
|
+
return "[QR码生成失败]";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ── PhoneApp ──────────────────────────────────────────────────
|
|
39
|
+
export const app: PhoneApp = {
|
|
40
|
+
name: "支付宝",
|
|
41
|
+
icon: "支付宝",
|
|
42
|
+
messageDescription: "支付宝AI付 — 智能体支付",
|
|
43
|
+
|
|
44
|
+
onOpen(_state) {
|
|
45
|
+
if (!isInstalled()) {
|
|
46
|
+
return {
|
|
47
|
+
screen: [
|
|
48
|
+
"═══ 支付宝 ═══",
|
|
49
|
+
"",
|
|
50
|
+
" WARN: 未安装支付宝 AI付",
|
|
51
|
+
" 请先运行: npx -y @alipay/agent-payment@latest install",
|
|
52
|
+
"",
|
|
53
|
+
" 返回 — 回主屏幕",
|
|
54
|
+
].join("\n"),
|
|
55
|
+
state: _state ?? {},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const wallet = bot("check-wallet");
|
|
60
|
+
const lines = [
|
|
61
|
+
"═══ 支付宝 AI付 ═══",
|
|
62
|
+
"",
|
|
63
|
+
wallet.ok ? ` ${wallet.output}` : " WARN: 钱包未开通 — 输入「开通钱包」",
|
|
64
|
+
"",
|
|
65
|
+
" 操作:",
|
|
66
|
+
" · 开通钱包 — 申请开通支付宝钱包",
|
|
67
|
+
" · 钱包状态 — 查看钱包详情",
|
|
68
|
+
" · 付款 <金额> <说明> — 发起支付",
|
|
69
|
+
" · 查单 <订单号> — 查询支付状态",
|
|
70
|
+
" · 开启支付 — 开启支付宝支付功能",
|
|
71
|
+
"",
|
|
72
|
+
" 返回 — 回主屏幕",
|
|
73
|
+
];
|
|
74
|
+
return { screen: lines.join("\n"), state: _state ?? {} };
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
onAction(input, state) {
|
|
78
|
+
const cmd = input.trim();
|
|
79
|
+
|
|
80
|
+
// 开通钱包
|
|
81
|
+
if (/^(开通钱包|apply)/i.test(cmd)) {
|
|
82
|
+
const r = bot("apply-wallet");
|
|
83
|
+
if (!r.ok) return { screen: `Error: ${r.output}`, state };
|
|
84
|
+
// extract URL from output and show QR
|
|
85
|
+
const urlMatch = r.output.match(/https:\/\/u\.alipay\.cn\/[^\s)]+/);
|
|
86
|
+
const url = urlMatch ? urlMatch[0] : "";
|
|
87
|
+
const qr = url ? genQR(url) : "";
|
|
88
|
+
return {
|
|
89
|
+
screen: [
|
|
90
|
+
`请用支付宝扫码授权`,
|
|
91
|
+
"",
|
|
92
|
+
qr,
|
|
93
|
+
"",
|
|
94
|
+
url ? `${url}` : "",
|
|
95
|
+
"",
|
|
96
|
+
"扫码后输入「bind <授权码>」完成绑定",
|
|
97
|
+
].filter(Boolean).join("\n"),
|
|
98
|
+
state,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 钱包状态
|
|
103
|
+
if (/^(钱包|状态|check|钱包状态)/i.test(cmd)) {
|
|
104
|
+
const r = bot("check-wallet");
|
|
105
|
+
return { screen: r.ok ? r.output : `Error: ${r.output}`, state };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 开启支付
|
|
109
|
+
if (/^(开启支付|开启支付宝)/i.test(cmd)) {
|
|
110
|
+
const lines = [
|
|
111
|
+
"开启支付宝支付功能",
|
|
112
|
+
"",
|
|
113
|
+
"请按以下步骤操作:",
|
|
114
|
+
"1. 打开支付宝 App 扫码授权",
|
|
115
|
+
"2. 获取授权指令后发给我",
|
|
116
|
+
"3. 我将调用 bind-wallet 完成绑定",
|
|
117
|
+
"",
|
|
118
|
+
"或输入「bind <授权码>」完成绑定",
|
|
119
|
+
];
|
|
120
|
+
return { screen: lines.join("\n"), state };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 绑定钱包
|
|
124
|
+
if (/^bind\s+(\S+)/i.test(cmd)) {
|
|
125
|
+
const code = cmd.match(/^bind\s+(\S+)/i)![1];
|
|
126
|
+
const r = bot(`bind-wallet ${code}`);
|
|
127
|
+
return { screen: r.ok ? `${r.output}` : `Error: ${r.output}`, state };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// 付款
|
|
131
|
+
const payMatch = cmd.match(/^(?:付款|pay)\s+(\d+(?:\.\d+)?)\s*(.+)?$/i);
|
|
132
|
+
if (payMatch) {
|
|
133
|
+
const amount = payMatch[1];
|
|
134
|
+
const desc = (payMatch[2] || "AI服务").replace(/["`$\\]/g, "");
|
|
135
|
+
const r = bot(`submit-payment --amount ${amount} --desc "${desc}"`);
|
|
136
|
+
return { screen: r.ok ? `${r.output}` : `Error: ${r.output}`, state };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// 查单
|
|
140
|
+
const queryMatch = cmd.match(/^(?:查单|query)\s+(\S+)$/i);
|
|
141
|
+
if (queryMatch) {
|
|
142
|
+
const r = bot(`query-payment-status ${queryMatch[1]}`);
|
|
143
|
+
return { screen: r.ok ? `${r.output}` : `Error: ${r.output}`, state };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return this.onOpen(state);
|
|
147
|
+
},
|
|
148
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// apps.thirdparty/bilibili/bilibili-app.ts — B站 Video App(PhoneApp 包装)
|
|
2
|
+
import type { PhoneApp } from "../../system.kernel/kernel.ts";
|
|
3
|
+
import { bilibiliCmd } from "./bilibili.ts";
|
|
4
|
+
|
|
5
|
+
export const app: PhoneApp = {
|
|
6
|
+
name: "B站",
|
|
7
|
+
icon: "B站",
|
|
8
|
+
messageDescription: "视频字幕/搜索/热门",
|
|
9
|
+
onOpen(state: any) {
|
|
10
|
+
return { screen: "B站\n\n输入 BV号 看字幕\n输入「搜索 关键词」搜视频\n输入「热门」看排行榜", state };
|
|
11
|
+
},
|
|
12
|
+
async onAction(input: string, state: any) {
|
|
13
|
+
const cmd = input.trim();
|
|
14
|
+
try {
|
|
15
|
+
if (cmd === "热门" || cmd === "popular") {
|
|
16
|
+
const r = await bilibiliCmd({ action: "popular" }, {}, "");
|
|
17
|
+
return { screen: r.content[0].text, state };
|
|
18
|
+
}
|
|
19
|
+
if (cmd.startsWith("搜索 ") || cmd.startsWith("search ")) {
|
|
20
|
+
const kw = cmd.replace(/^(搜索 |search )/, "");
|
|
21
|
+
const r = await bilibiliCmd({ action: "search", keyword: kw }, {}, "");
|
|
22
|
+
return { screen: r.content[0].text, state };
|
|
23
|
+
}
|
|
24
|
+
if (cmd.match(/^BV/i)) {
|
|
25
|
+
const r = await bilibiliCmd({ action: "subs", bvid: cmd }, {}, "");
|
|
26
|
+
return { screen: r.content[0].text.slice(0, 6000), state };
|
|
27
|
+
}
|
|
28
|
+
return { screen: "B站\n\n" + cmd.split("\n").slice(0, 10).join("\n") + "\n\n用法: BV号 | 搜索 xxx | 热门 | 返回", state };
|
|
29
|
+
} catch (e: any) {
|
|
30
|
+
return { screen: `Error: ${e.message}`, state };
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|