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.
Files changed (304) hide show
  1. package/README.md +50 -0
  2. package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py +80 -0
  3. package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py.CHANGELOG +1 -0
  4. package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py.SPEC +3 -0
  5. package/core/god.agent.capability/hands.dev.writeissue/issue.ts +209 -0
  6. package/core/god.agent.capability/hands.dev.writeissue/issue.ts.SPEC +26 -0
  7. package/core/god.agent.capability/hands.files.changewatcher/watcher.ts +44 -0
  8. package/core/god.agent.capability/hands.files.changewatcher/watcher.ts.SPEC +25 -0
  9. package/core/god.pi.mod/cli/pi-completion.zsh +21 -0
  10. package/core/god.pi.mod/cli/pi-completion.zsh.CHANGELOG +1 -0
  11. package/core/god.pi.mod/cli/pi-people.sh +264 -0
  12. package/core/god.pi.mod/cli/pi-people.sh.LESSON +10 -0
  13. package/core/god.pi.mod/cli/pi-people.sh.SPEC +31 -0
  14. package/core/god.pi.mod/paths.ts +47 -0
  15. package/core/god.pi.mod/tui.mods.blockrender/blockrender.js +90 -0
  16. package/core/god.pi.mod/tui.mods.blockrender/blockrender.js.SPEC +29 -0
  17. package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts +154 -0
  18. package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.CHANGELOG +10 -0
  19. package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.LESSON +12 -0
  20. package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.SPEC +26 -0
  21. package/core/god.pi.mod/tui.mods.footer.budget/footer-cny.CHANGELOG +39 -0
  22. package/core/god.pi.mod/tui.mods.viewmode/view_mode-thinking.patch +55 -0
  23. package/core/god.pi.mod/tui.mods.viewmode/view_mode-tools.patch +19 -0
  24. package/core/god.pi.mod/tui.mods.viewmode/view_mode-tools.patch.CHANGELOG +1 -0
  25. package/core/god.pi.mod/tui.mods.viewmode/view_mode.ts +50 -0
  26. package/core/god.pi.mod/tui.mods.viewmode/view_mode.ts.SPEC +12 -0
  27. package/core/god.pi.mod/tui.variants.userterminal/user_terminal.CHANGELOG +10 -0
  28. package/core/god.pi.mod/tui.variants.userterminal/user_terminal.ts +66 -0
  29. package/core/god.pi.mod/tui.variants.userterminal/user_terminal.ts.SPEC +31 -0
  30. package/core/index.ts +3 -0
  31. package/core/individual.bio.gene/dna.coded/coded.dna +257 -0
  32. package/core/individual.bio.gene/dna.coded/coded.dna.CHANGELOG +12 -0
  33. package/core/individual.bio.gene/dna.coded/coded.dna.SPEC +11 -0
  34. package/core/individual.bio.gene/dna.coded/core.dna +110 -0
  35. package/core/individual.bio.gene/dna.promotor/promotor.dna +117 -0
  36. package/core/individual.bio.gene/dna.promotor/promotor.dna.CHANGELOG +4 -0
  37. package/core/individual.bio.gene/dna.promotor/promotor.dna.SPEC +7 -0
  38. package/core/individual.bio.gene/dna.transpiler/transpiler.ts +395 -0
  39. package/core/individual.bio.gene/dna.transpiler/transpiler.ts.CHANGELOG +7 -0
  40. package/core/individual.bio.gene/dna.transpiler/transpiler.ts.SPEC +28 -0
  41. package/core/individual.bio.gene/gene.README +19 -0
  42. package/core/individual.bio.gene/rna/rna.json +536 -0
  43. package/core/individual.bio.gene/rna/rna.json.CHANGELOG +2 -0
  44. package/core/individual.bio.gene/rna/rna.json.SPEC +8 -0
  45. package/core/individual.bio.organs/blood.runtime/messages.ts +236 -0
  46. package/core/individual.bio.organs/blood.runtime/runtime.ts +173 -0
  47. package/core/individual.bio.organs/blood.runtime/runtime.ts.CHANGELOG +5 -0
  48. package/core/individual.bio.organs/blood.runtime/runtime.ts.SPEC +32 -0
  49. package/core/individual.bio.organs/brain.amygdala/amygdala.ts +25 -0
  50. package/core/individual.bio.organs/brain.amygdala/amygdala.ts.COMMENT +3 -0
  51. package/core/individual.bio.organs/brain.amygdala/amygdala.ts.SPEC +9 -0
  52. package/core/individual.bio.organs/brain.hippocampus/hippocampus-launcher.sh.template +108 -0
  53. package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts +166 -0
  54. package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.CHANGELOG +12 -0
  55. package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.LESSON +22 -0
  56. package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.SPEC +16 -0
  57. package/core/individual.bio.organs/brain.hippocampus/memory.ts +879 -0
  58. package/core/individual.bio.organs/brain.hippocampus/memory.ts.CHANGELOG +66 -0
  59. package/core/individual.bio.organs/brain.hippocampus/memory.ts.LESSON +25 -0
  60. package/core/individual.bio.organs/brain.hippocampus/memory.ts.SPEC +46 -0
  61. package/core/individual.bio.organs/brain.hippocampus/sleep.ts +139 -0
  62. package/core/individual.bio.organs/brain.hippocampus/sleep.ts.CHANGELOG +11 -0
  63. package/core/individual.bio.organs/brain.hippocampus/sleep.ts.SPEC +16 -0
  64. package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.SPEC +44 -0
  65. package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts +73 -0
  66. package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts.CHANGELOG +3 -0
  67. package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts.SPEC +24 -0
  68. package/core/individual.bio.organs/brain.prefrontal.drafting/index.ts.CHANGELOG +3 -0
  69. package/core/individual.bio.organs/brain.prefrontal.drafting/main.ts +13 -0
  70. package/core/individual.bio.organs/brain.prefrontal.drafting/main.ts.SPEC +17 -0
  71. package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts +94 -0
  72. package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts.LESSON +13 -0
  73. package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts.SPEC +20 -0
  74. package/core/individual.bio.organs/brain.senses.subconscious/feed-format.SPEC +56 -0
  75. package/core/individual.bio.organs/brain.senses.subconscious/index.ts.CHANGELOG +13 -0
  76. package/core/individual.bio.organs/brain.senses.subconscious/spawner.ts +130 -0
  77. package/core/individual.bio.organs/brain.senses.subconscious/spawner.ts.SPEC +13 -0
  78. package/core/individual.bio.organs/brain.senses.subconscious/subconscious.ts +280 -0
  79. package/core/individual.bio.organs/brain.senses.subconscious/subconscious.ts.CHANGELOG +7 -0
  80. package/core/individual.bio.organs/brain.senses.subconscious/tools.ts +180 -0
  81. package/core/individual.bio.organs/brain.senses.subconscious/tools.ts.SPEC +3 -0
  82. package/core/individual.bio.organs/ears.listen/config.json +9 -0
  83. package/core/individual.bio.organs/ears.listen/config.json.CHANGELOG +1 -0
  84. package/core/individual.bio.organs/ears.listen/config.json.SPEC +3 -0
  85. package/core/individual.bio.organs/ears.listen/ears.ts.CHANGELOG +48 -0
  86. package/core/individual.bio.organs/ears.listen/ears_recorder.py.CHANGELOG +6 -0
  87. package/core/individual.bio.organs/ears.listen/index.ts +1 -0
  88. package/core/individual.bio.organs/ears.listen/index.ts.SPEC +16 -0
  89. package/core/individual.bio.organs/ears.listen/listen.ts +208 -0
  90. package/core/individual.bio.organs/ears.listen/listen.ts.SPEC +3 -0
  91. package/core/individual.bio.organs/ears.listen/listen_recorder.py +445 -0
  92. package/core/individual.bio.organs/ears.listen/listen_recorder.py.SPEC +7 -0
  93. package/core/individual.bio.organs/ears.listen/python_protogen/__init__.py +0 -0
  94. package/core/individual.bio.organs/ears.listen/python_protogen/common/__init__.py +0 -0
  95. package/core/individual.bio.organs/ears.listen/python_protogen/common/events_pb2.py +38 -0
  96. package/core/individual.bio.organs/ears.listen/python_protogen/common/events_pb2_grpc.py +24 -0
  97. package/core/individual.bio.organs/ears.listen/python_protogen/common/rpcmeta_pb2.py +42 -0
  98. package/core/individual.bio.organs/ears.listen/python_protogen/common/rpcmeta_pb2_grpc.py +24 -0
  99. package/core/individual.bio.organs/ears.listen/python_protogen/products/__init__.py +0 -0
  100. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/__init__.py +0 -0
  101. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/__init__.py +0 -0
  102. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/ast_service_pb2.py +45 -0
  103. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/ast_service_pb2_grpc.py +97 -0
  104. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/__init__.py +0 -0
  105. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/au_base_pb2.py +80 -0
  106. package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/au_base_pb2_grpc.py +24 -0
  107. package/core/individual.bio.organs/hands.fileactions/authorize.TRUST +1 -0
  108. package/core/individual.bio.organs/hands.fileactions/authorize.ts +70 -0
  109. package/core/individual.bio.organs/hands.fileactions/authorize.ts.CHANGELOG +1 -0
  110. package/core/individual.bio.organs/hands.fileactions/authorize.ts.SPEC +3 -0
  111. package/core/individual.bio.organs/hands.fileactions/dir.README +13 -0
  112. package/core/individual.bio.organs/hands.fileactions/file_rules.json +23 -0
  113. package/core/individual.bio.organs/hands.fileactions/fileactions.README +12 -0
  114. package/core/individual.bio.organs/hands.fileactions/fileactions.ts +540 -0
  115. package/core/individual.bio.organs/hands.fileactions/fileactions.ts.CHANGELOG +25 -0
  116. package/core/individual.bio.organs/hands.fileactions/fileactions.ts.SPEC +30 -0
  117. package/core/individual.bio.organs/hands.fileactions/filewatch.ts +66 -0
  118. package/core/individual.bio.organs/hands.fileactions/filewatch.ts.SPEC +3 -0
  119. package/core/individual.bio.organs/hands.main/main.ts +18 -0
  120. package/core/individual.bio.organs/hands.main/main.ts.SPEC +20 -0
  121. package/core/individual.bio.organs/hands.sensitive/sensitive.ts +24 -0
  122. package/core/individual.bio.organs/hands.sensitive/sensitive.ts.CHANGELOG +2 -0
  123. package/core/individual.bio.organs/hands.sensitive/sensitive.ts.SPEC +3 -0
  124. package/core/individual.bio.organs/heart.interrupt/agent_start-loader-flicker.patch +13 -0
  125. package/core/individual.bio.organs/heart.interrupt/interactive-mode-loader.patch +11 -0
  126. package/core/individual.bio.organs/heart.interrupt/runner_esc.patch +10 -0
  127. package/core/individual.bio.organs/heart.interrupt/runner_esc.patch.SPEC +9 -0
  128. package/core/individual.bio.organs/heart.kernel/kernel.ts +253 -0
  129. package/core/individual.bio.organs/heart.kernel/kernel.ts.CHANGELOG +13 -0
  130. package/core/individual.bio.organs/heart.kernel/kernel.ts.SPEC +23 -0
  131. package/core/individual.bio.organs/heart.main/heart.main.CHANGELOG +43 -0
  132. package/core/individual.bio.organs/heart.main/heartbeat.ts +494 -0
  133. package/core/individual.bio.organs/heart.main/heartbeat.ts.LESSON +43 -0
  134. package/core/individual.bio.organs/heart.main/main.ts +8 -0
  135. package/core/individual.bio.organs/heart.main/main.ts.SPEC +19 -0
  136. package/core/individual.bio.organs/heart.main/process.ts +122 -0
  137. package/core/individual.bio.organs/heart.main/process.ts.CHANGELOG +2 -0
  138. package/core/individual.bio.organs/heart.main/process.ts.SPEC +24 -0
  139. package/core/individual.bio.organs/heart.main/remove_timeout.patch +110 -0
  140. package/core/individual.bio.organs/heart.main/stop.ts.CHANGELOG +3 -0
  141. package/core/individual.bio.organs/heart.main/stop.ts.SPEC +28 -0
  142. package/core/individual.bio.organs/mouth.speak/index.ts +1 -0
  143. package/core/individual.bio.organs/mouth.speak/index.ts.CHANGELOG +1 -0
  144. package/core/individual.bio.organs/mouth.speak/index.ts.SPEC +6 -0
  145. package/core/individual.bio.organs/mouth.speak/mouth.ts.CHANGELOG +15 -0
  146. package/core/individual.bio.organs/mouth.speak/mouth_recorder.py.CHANGELOG +1 -0
  147. package/core/individual.bio.organs/mouth.speak/speak.ts +180 -0
  148. package/core/individual.bio.organs/mouth.speak/speak.ts.SPEC +3 -0
  149. package/core/individual.bio.organs/mouth.speak/speak_recorder.py +35 -0
  150. package/core/individual.bio.organs/mouth.speak/speak_recorder.py.SPEC +3 -0
  151. package/core/individual.bio.organs/organs.README +110 -0
  152. package/core/package-lock.json +18 -0
  153. package/core/package.json +35 -0
  154. package/core/prompts/prompts.json +77 -0
  155. package/core/prompts/prompts.ts +44 -0
  156. package/core/prompts/prompts.ts.SPEC +9 -0
  157. package/core/society.world/.gitkeep +0 -0
  158. package/core/society.world/accessibility.claudecode/message-service.cjs +217 -0
  159. package/core/society.world/accessibility.claudecode/message-service.cjs.SPEC +7 -0
  160. package/core/society.world/accessibility.claudecode/send.ts +34 -0
  161. package/core/society.world/dollar.distribution.ubi/ubi.ts +55 -0
  162. package/core/society.world/dollar.main/dollar-service.cjs +185 -0
  163. package/core/society.world/dollar.main/main.ts +116 -0
  164. package/core/society.world/dollar.transaction/transaction.ts +71 -0
  165. package/core/society.world/space/space.ts +206 -0
  166. package/core/society.world/space/space.ts.SPEC +30 -0
  167. package/core/technology.laptop/#agent.macos.BLUEPRINT +278 -0
  168. package/core/technology.phone/apps.preinstalled/albums.FUTURE/albums.ts +69 -0
  169. package/core/technology.phone/apps.preinstalled/albums.FUTURE/albums.ts.SPEC +15 -0
  170. package/core/technology.phone/apps.preinstalled/calendar/calendar.ts +406 -0
  171. package/core/technology.phone/apps.preinstalled/calendar/calendar.ts.SPEC +22 -0
  172. package/core/technology.phone/apps.preinstalled/calendar/holiday-calendar.ts +529 -0
  173. package/core/technology.phone/apps.preinstalled/clock/clock.ts +132 -0
  174. package/core/technology.phone/apps.preinstalled/clock/clock.ts.SPEC +11 -0
  175. package/core/technology.phone/apps.preinstalled/contacts.FUTURE/contacts.ts +300 -0
  176. package/core/technology.phone/apps.preinstalled/contacts.FUTURE/contacts.ts.SPEC +22 -0
  177. package/core/technology.phone/apps.preinstalled/developer.FUTURE/developer.ts +22 -0
  178. package/core/technology.phone/apps.preinstalled/developer.FUTURE/developer.ts.SPEC +15 -0
  179. package/core/technology.phone/apps.preinstalled/notes/notes.ts +239 -0
  180. package/core/technology.phone/apps.preinstalled/notes/notes.ts.SPEC +21 -0
  181. package/core/technology.phone/apps.preinstalled/polymarket/polymarket.ts +261 -0
  182. package/core/technology.phone/apps.preinstalled/polymarket/polymarket.ts.SPEC +7 -0
  183. package/core/technology.phone/apps.preinstalled/reminder/reminder.ts +404 -0
  184. package/core/technology.phone/apps.preinstalled/reminder/reminder.ts.SPEC +25 -0
  185. package/core/technology.phone/apps.preinstalled/siri.FUTURE/siri.ts +22 -0
  186. package/core/technology.phone/apps.preinstalled/siri.FUTURE/siri.ts.SPEC +15 -0
  187. package/core/technology.phone/apps.preinstalled/spotlight/spotlight.ts +29 -0
  188. package/core/technology.phone/apps.preinstalled/spotlight/spotlight.ts.SPEC +7 -0
  189. package/core/technology.phone/apps.preinstalled/steam/chess.ts +230 -0
  190. package/core/technology.phone/apps.preinstalled/steam/snake.ts +100 -0
  191. package/core/technology.phone/apps.preinstalled/steam/snake.ts.SPEC +7 -0
  192. package/core/technology.phone/apps.preinstalled/steam/spy-cmd.ts +4 -0
  193. package/core/technology.phone/apps.preinstalled/steam/spy-tool.ts +56 -0
  194. package/core/technology.phone/apps.preinstalled/steam/spy.ts +302 -0
  195. package/core/technology.phone/apps.preinstalled/steam/steam.ts +299 -0
  196. package/core/technology.phone/apps.preinstalled/weather/weather.ts +50 -0
  197. package/core/technology.phone/apps.preinstalled/weather/weather.ts.SPEC +9 -0
  198. package/core/technology.phone/apps.preinstalled/wechat/imessage.ts +423 -0
  199. package/core/technology.phone/apps.preinstalled/wechat/imessage.ts.SPEC +24 -0
  200. package/core/technology.phone/apps.system/appstore/appstore.ts +22 -0
  201. package/core/technology.phone/apps.system/appstore/appstore.ts.SPEC +15 -0
  202. package/core/technology.phone/apps.system/finder.FUTURE/finder.ts +64 -0
  203. package/core/technology.phone/apps.system/finder.FUTURE/finder.ts.SPEC +8 -0
  204. package/core/technology.phone/apps.system/safari/safari-app.ts +146 -0
  205. package/core/technology.phone/apps.system/safari/safari.ts.SPEC +24 -0
  206. package/core/technology.phone/apps.system/settings/settings.ts +126 -0
  207. package/core/technology.phone/apps.system/settings/settings.ts.SPEC +17 -0
  208. package/core/technology.phone/apps.system/tips/tips.ts +22 -0
  209. package/core/technology.phone/apps.system/tips/tips.ts.SPEC +15 -0
  210. package/core/technology.phone/apps.thirdparty/alipay/alipay.ts +148 -0
  211. package/core/technology.phone/apps.thirdparty/alipay/alipay.ts.SPEC +7 -0
  212. package/core/technology.phone/apps.thirdparty/bilibili/bilibili-app.ts +33 -0
  213. package/core/technology.phone/apps.thirdparty/bilibili/bilibili.ts +142 -0
  214. package/core/technology.phone/apps.thirdparty/bilibili/bilibili.ts.SPEC +22 -0
  215. package/core/technology.phone/apps.thirdparty/wechatread/wechatread.ts +80 -0
  216. package/core/technology.phone/apps.thirdparty/wechatread/wechatread.ts.SPEC +15 -0
  217. package/core/technology.phone/index.ts +1 -0
  218. package/core/technology.phone/package.json +2 -0
  219. package/core/technology.phone/system.homepage/homepage.ts +247 -0
  220. package/core/technology.phone/system.homepage/homepage.ts.SPEC +22 -0
  221. package/core/technology.phone/system.kernel/kernel.ts +264 -0
  222. package/core/technology.phone/system.kernel/kernel.ts.SPEC +7 -0
  223. package/core/technology.phone/system.notifications/notifications.ts +87 -0
  224. package/core/technology.phone/system.notifications/notifications.ts.SPEC +7 -0
  225. package/core/technology.phone/system.share/share.ts +46 -0
  226. package/core/technology.phone/system.share/share.ts.SPEC +7 -0
  227. package/core/technology.server/browser-service.cjs +152 -0
  228. package/core/technology.server/data/cookies/arxiv.json +30 -0
  229. package/core/technology.server/data/cookies/bili.json +184 -0
  230. package/core/technology.server/data/cookies/default.json +30 -0
  231. package/core/technology.server/data/cookies/news.json +113 -0
  232. package/core/technology.server/data/cookies/s1.json +45 -0
  233. package/core/technology.server/data/cookies/safari.json +184 -0
  234. package/core/technology.server/data/cookies/safari2.json +1 -0
  235. package/core/technology.server/data/cookies/safaridbg.json +1 -0
  236. package/core/technology.server/data/cookies/search.json +45 -0
  237. package/core/technology.server/data/cookies/sw.json +30 -0
  238. package/core/technology.server/data/cookies/t1.json +1 -0
  239. package/core/technology.server/data/cookies/testread.json +1 -0
  240. package/core/technology.server/data/cookies/video1.json +113 -0
  241. package/core/technology.server/data/cookies/yt.json +170 -0
  242. package/core/technology.server/data/cookies/yt2.json +113 -0
  243. package/core/technology.server/pikipedia/#pikipedia.BLUEPRINT +106 -0
  244. package/core/technology.server/playleft.cjs +247 -0
  245. package/core/technology.server/search-proxy.py +76 -0
  246. package/core/technology.server/server.README +59 -0
  247. package/deploy/dist-overrides/cli/cli.js +18 -0
  248. package/deploy/dist-overrides/core/extensions/loader.js +518 -0
  249. package/deploy/dist-overrides/core/package-manager.js +2081 -0
  250. package/deploy/dist-overrides/core/system-prompt.js +109 -0
  251. package/deploy/dist-overrides/core/system-prompt.js.LESSON +17 -0
  252. package/deploy/dist-overrides/core/tools/bash.js +353 -0
  253. package/deploy/dist-overrides/core/tools/bash.js.CHANGELOG +2 -0
  254. package/deploy/dist-overrides/core/tools/edit-diff.js +345 -0
  255. package/deploy/dist-overrides/core/tools/edit.js +315 -0
  256. package/deploy/dist-overrides/core/tools/edit.js.CHANGELOG +1 -0
  257. package/deploy/dist-overrides/core/tools/file-mutation-queue.js +52 -0
  258. package/deploy/dist-overrides/core/tools/find.js +298 -0
  259. package/deploy/dist-overrides/core/tools/find.js.CHANGELOG +1 -0
  260. package/deploy/dist-overrides/core/tools/grep.js +305 -0
  261. package/deploy/dist-overrides/core/tools/grep.js.CHANGELOG +1 -0
  262. package/deploy/dist-overrides/core/tools/index.js +112 -0
  263. package/deploy/dist-overrides/core/tools/ls-guard.js +4 -0
  264. package/deploy/dist-overrides/core/tools/ls.js +170 -0
  265. package/deploy/dist-overrides/core/tools/ls.js.CHANGELOG +1 -0
  266. package/deploy/dist-overrides/core/tools/output-accumulator.js +184 -0
  267. package/deploy/dist-overrides/core/tools/path-utils.js +99 -0
  268. package/deploy/dist-overrides/core/tools/prompts-reader.js +53 -0
  269. package/deploy/dist-overrides/core/tools/read.js +392 -0
  270. package/deploy/dist-overrides/core/tools/read.js.CHANGELOG +1 -0
  271. package/deploy/dist-overrides/core/tools/render-utils.js +65 -0
  272. package/deploy/dist-overrides/core/tools/tool-definition-wrapper.js +34 -0
  273. package/deploy/dist-overrides/core/tools/truncate.js +215 -0
  274. package/deploy/dist-overrides/core/tools/write.js +203 -0
  275. package/deploy/dist-overrides/core/tools/write.js.CHANGELOG +1 -0
  276. package/deploy/dist-overrides/dist-overrides.README +18 -0
  277. package/deploy/dist-overrides/main.js +665 -0
  278. package/deploy/dist-overrides/modes/interactive/components/assistant-message.js +139 -0
  279. package/deploy/dist-overrides/modes/interactive/components/footer.js +326 -0
  280. package/deploy/dist-overrides/modes/interactive/components/model-selector.js +285 -0
  281. package/deploy/dist-overrides/modes/interactive/components/tool-execution.js +383 -0
  282. package/deploy/dist-overrides/modes/interactive/components/tool-execution.js.CHANGELOG +3 -0
  283. package/deploy/dist-overrides/modes/interactive/interactive-mode.js +4781 -0
  284. package/deploy/dist-overrides/pi-ai/providers/anthropic.js +931 -0
  285. package/deploy/dist-overrides/pi-ai/providers/openai-completions.js +1007 -0
  286. package/deploy/dist-overrides/pi-ai/providers/openai-completions.js.LESSON +15 -0
  287. package/deploy/dist-overrides/pi-tui/components/loader.js +69 -0
  288. package/deploy/dist-overrides/pi-tui/components/markdown.js +646 -0
  289. package/deploy/dist-overrides/pi-tui/components/text.js +92 -0
  290. package/deploy/dist-overrides/pi-tui/custom-message.js +75 -0
  291. package/deploy/dist-overrides/pi-tui/tui.js +1266 -0
  292. package/deploy/dist-overrides/pi-tui/utils.js +1060 -0
  293. package/deploy/dist-overrides/vendor.REMOVED/jiti/lib/jiti.mjs +3 -0
  294. package/deploy/install.sh +186 -0
  295. package/deploy/install.sh.CHANGELOG +6 -0
  296. package/deploy/lint/lint-naming.ts +202 -0
  297. package/deploy/scripts/apply.js +18 -0
  298. package/deploy/scripts/build-github.sh +219 -0
  299. package/deploy/scripts/build-phone.sh +24 -0
  300. package/deploy/scripts/check-deploy.sh +42 -0
  301. package/deploy/scripts/migrate-context.sh +72 -0
  302. package/deploy/scripts/patch-pi-dist.js +39 -0
  303. package/deploy/scripts/uninstall.sh +34 -0
  304. 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,7 @@
1
+ source: snake.ts, chess.ts, spy-cmd.ts
2
+
3
+ # steam — Steam 平台小游戏
4
+
5
+ ## 职责
6
+ Steam 平台上的小游戏(贪吃蛇、国际象棋、Spy 命令)。
7
+ 作为 pi-coding-master 的休闲/测试组件。
@@ -0,0 +1,4 @@
1
+ // spy-cmd.ts — minimal
2
+ export async function spyCmd(args: any, _ctx: any, _personDir: string): Promise<{ content: any[]; details: any }> {
3
+ return { content: [{ type: "text", text: "谁是卧底" }], details: {} };
4
+ }
@@ -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
+ }