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,110 @@
1
+ # func 设计规范
2
+
3
+ `individual.bio.organs/` 下每个文件夹是一个 **func**(功能单元 / 生物学里的「蛋白质机器」)。
4
+ 本规范定义每个 func 必须长什么样,才能被 kernel 装配、被 DNA 管理、可运行。
5
+
6
+ > 一句话:**func = 一个文件夹 + 一个 `index.ts` 入口 + 在 `promotor.dna` 里的一条声明 + 在 `coded.dna` 里的 prompt(如果它要 prompt)。**
7
+ > prompt 文本只存在 `coded.dna` 一处;func 代码里**不许**再硬编码 prompt。
8
+
9
+ ---
10
+
11
+ ## 1. 文件夹 = func 名 = DNA 声明
12
+
13
+ - 文件夹名就是 func 的**点分实名**,例:`brain.hippocampus`、`body.hands.fileactions`。
14
+ - 这个名字必须和 `individual.bio.gene/dna.promotor/promotor.dna` 里的 `func <名字>` 完全一致。
15
+ - 名字里除最后一段外,每一级前缀必须在 promotor.dna 里用 `vir .<前缀>` 声明过
16
+ (例:`body.hands.fileactions` 要求 `vir .body`、`vir .body.hands`)。transpiler 会校验,缺了直接报 error。
17
+ - 扁平存放(不嵌套文件夹),层级体现在点分名里,靠排序 + 搜索找。
18
+
19
+ ## 2. 入口:func 里真正带 `default(pi)` 的那个文件
20
+
21
+ ```ts
22
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
23
+ export default function (pi: ExtensionAPI) {
24
+ // 在这里 registerTool / pi.on(...) / registerCommand ...
25
+ }
26
+ ```
27
+
28
+ - 入口 = 该 func 里**真正导出 `default(pi)` 的文件**,登记在 `engine/kernel.ts` 的 REGISTRY 里。
29
+ - **不要空壳中间层**:不要为了"统一"建一个只 `export { default } from "./x.js"` 的 `index.ts`,也不要 `prompt.ts` 这种只包一层导出的文件。
30
+ - `index.ts` 只在它**真的做组合**时才用(例:`body.heart/index.ts` 把 stop+process 装起来)。单文件 func 直接用 `<名字>.ts`:
31
+ `brain.hippocampus/hippocampus.ts`、`brain.senses.bioclock/bioclock.ts`、`body.hands.fileactions/fileactions.ts`。
32
+ - import 用 `.js` 后缀(ESM/bun 约定),bun 会解析到对应 `.ts`。
33
+
34
+ ## 3. prompt:只在 `coded.dna`,运行期向 runtime 取
35
+
36
+ func 代码里**禁止**写 `const PROMPT = "..."` 这种硬编码。所有 prompt 正文写在 `individual.bio.gene/dna.coded/coded.dna` 的 `coded <name> """ ... """` 块里,func 在运行期取:
37
+
38
+ ```ts
39
+ import { getPrompt, getDuty, getDutyPrompt } from "../../../engine/runtime.js";
40
+
41
+ const PROMPT = getPrompt("heart.continuous"); // func 级 prompt
42
+ const SLEEP = getDutyPrompt("brain.hippocampus", "sleep.night"); // 某 mode 的职责 prompt
43
+ ```
44
+
45
+ - `getPrompt(name)` —— 按 `coded:name` 取正文。取不到直接抛错(fail loud)。
46
+ - `getDuty(func, mode)` / `getDutyPrompt(func, mode)` —— 取某 mode 下 `in/duty` 声明的 prompt。
47
+ - **不要 `prompt.ts`**:在需要 prompt 的那个文件里直接 `getPrompt("...")`,别再单开一个文件包一层导出。
48
+ - 占位符:prompt 正文里可用 `{NAME}`,由 func 自己 `.replace("{NAME}", 值)` 填(例:`drafting.think` 里的 `{MARKER}`)。
49
+ - import 路径深度按 func 文件夹层数定:
50
+ `individual.bio.organs/<func>/x.ts` → 用 `#runtime` alias(package.json imports);无需数相对层级。
51
+
52
+ **两种 prompt 用法(都从 coded.dna 取,区别只是注入方式):**
53
+ - **A 注入宿主 agent**:`pi.on("before_agent_start", e => ({ systemPrompt: e.systemPrompt + "\n\n" + PROMPT }))`。
54
+ 例:`body.heart`、`body.hands.fileactions`、`brain.predrafting`。
55
+ - **B 喂给被 spawn 的子 pi**:把 prompt 写进子进程的 `conv.json` 的 system 角色。
56
+ 例:`brain.hippocampus`、`brain.senses.subconscious`(spawn tmux 子 pi)。
57
+
58
+ ## 4. 在 `promotor.dna` 里声明(启动子 / 调控区)
59
+
60
+ ```
61
+ func brain.hippocampus // 文件夹名
62
+ session hippocampus // 跑在哪个进程:main/subconscious/hippocampus,或 all/none
63
+ mode:abled any // 哪些 mode 启用:any / none / <mode 列表>
64
+ alias memory.hippocampus // 别名(可被当实名引用)
65
+ module workmem // 子模块([func]/module/[name])
66
+ in DWN // 某 mode 下的行为
67
+ duty gen_work_mem
68
+ coded:hippocampus.gen_work_mem // 这个 mode 用哪段 prompt
69
+ in sleep.night
70
+ duty deep_encode
71
+ coded:hippocampus.sleep
72
+ belong memory // 属于哪些 tag(双向,编译时自动补全 contain)
73
+ belong lobes.temporal,lobes.limbic
74
+ ```
75
+
76
+ - `session` 缺省 = `all`(编译 warning)。`mode:abled` 缺省 = 全 disabled(编译 warning)。
77
+ - `coded:<name>` 是**引用**,对应 `coded.dna` 里的 `coded <name>`。引用不到 = 编译 error。
78
+ - `future func ...` = 规划中、**不建文件夹**、不被 kernel 加载(例:`brain.amygdala`)。
79
+
80
+ ## 5. 怎么被运行(kernel / runtime)
81
+
82
+ 1. 改了 `.dna` → 重新转录:`bun individual.bio.gene/dna.transpiler/transpiler.ts` → 生成 `individual.bio.gene/rna/rna.json`。
83
+ 2. `paths.ts`(#runtime alias)读 rna.json,提供 `getPrompt/getDuty/getMode/isAbled/...`。
84
+ 3. `individual.bio.organs/heart.main/kernel.ts`(pi 扩展入口)读 rna,把每个非 future func 的 default 装到同一个 pi 上。
85
+ 4. 部署:`ln -s Codebase/core ~/.pi/agent/extensions/pi-coding-master`(入口 `index.ts` 转发到 kernel)。
86
+ - 命令:`/bios` 看状态(mode/角色/已加载 func),`/mode <m>` 切 mode。
87
+
88
+ > 说明(诚实):当前 kernel 在每个 pi 实例都加载**所有**非 future func,由 func 自己按 session 角色自门控
89
+ > (潜意识/海马体自己检测身份),这与现行 live 行为一致。严格按 `session` 选择性加载是后续优化。
90
+
91
+ ## 6. 加一个新 func 的清单
92
+
93
+ 1. `individual.bio.organs/<新名字>/<名字>.ts`,导出 `default(pi)`(单文件直接用此名;要组合多文件才用 `index.ts`)。
94
+ 2. prompt 写进 `coded.dna`(`coded <name> """..."""`),func 里直接 `getPrompt("<name>")`(不开 prompt.ts)。
95
+ 3. `promotor.dna` 加 `func <新名字>`(session / mode:abled / coded: …),前缀 `vir` 要先声明。
96
+ 4. `individual.bio.organs/heart.main/kernel.ts` 的 `REGISTRY` 加一行 import,指向那个真正 default 的文件。
97
+ 5. `bun individual.bio.gene/dna.transpiler/transpiler.ts` 重新转录,确认无 error/warning。
98
+
99
+ ## 7. 现有 func 一览(符合本规范)
100
+
101
+ | func | 入口文件 | session | mode | prompt(来自 coded.dna) |
102
+ |---|---|---|---|---|
103
+ | `body.heart` | index.ts | all | any | heart.continuous, heart.commands |
104
+ | `body.hands.fileactions` | fileactions.ts | main | DWN | fileactions.wise |
105
+ | `brain.predrafting` | index.ts | main | DWN | drafting.think |
106
+ | `brain.senses.bioclock` | bioclock.ts | all | DWN | (无,纯时间戳)|
107
+ | `brain.senses.subconscious` | index.ts | subconscious | DWN | subconscious.observe |
108
+ | `brain.hippocampus` | hippocampus.ts | hippocampus | any | DWN→gen_work_mem / sleep.night→sleep / sleep.nap→gen_work_mem |
109
+ | `brain.memory` | index.ts | main | any | (无 coded;注入 context/work/cortex 数据层)|
110
+ | `brain.amygdala` | — | — | — | `future`,未实现 |
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "core",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "@sinclair/typebox": "^0.34.49"
9
+ }
10
+ },
11
+ "node_modules/@sinclair/typebox": {
12
+ "version": "0.34.49",
13
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz",
14
+ "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==",
15
+ "license": "MIT"
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "type": "module",
3
+ "//": "路径别名总表(唯一真相源)。所有跨模块 import 用 #别名,文件随便移——只改这里这一行。Node 原生 imports 字段,运行时解析,不用打包器。",
4
+ "imports": {
5
+ "#messages": "./individual.bio.organs/blood.runtime/messages.ts",
6
+ "#paths": "./god.pi.mod/paths.ts",
7
+ "#kernel": "./individual.bio.organs/heart.kernel/kernel.ts",
8
+ "#runtime": "./individual.bio.organs/blood.runtime/runtime.ts",
9
+ "#sh": "./individual.bio.organs/hands.main/main.ts",
10
+ "#transpiler": "./individual.bio.gene/dna.transpiler/transpiler.ts",
11
+ "#devdoc": "./god.agent.capability/hands.dev.writeissue/issue.ts",
12
+ "#watcher": "./god.agent.capability/hands.files.changewatcher/watcher.ts",
13
+ "#budget": "./god.pi.mod/tui.mods.footer.budget/budget_guard.ts",
14
+ "#blockrender": "./god.pi.mod/tui.mods.blockrender/blockrender.js",
15
+ "#heart": "./individual.bio.organs/heart.main/main.ts",
16
+ "#heart-sc": "./individual.bio.organs/brain.senses.subconscious/subconscious.ts",
17
+ "#phone": "./technology.phone/system.kernel/kernel.ts",
18
+ "#fileactions": "./individual.bio.organs/hands.fileactions/fileactions.ts",
19
+ "#sensitiveactions": "./individual.bio.organs/hands.sensitive/sensitive.ts",
20
+ "#hippocampus": "./individual.bio.organs/brain.hippocampus/hippocampus.ts",
21
+ "#amygdala": "./individual.bio.organs/brain.amygdala/amygdala.ts",
22
+ "#drafting": "./individual.bio.organs/brain.prefrontal.drafting/main.ts",
23
+ "#bioclock": "./individual.bio.organs/brain.senses.bioclock/bioclock.ts",
24
+ "#subconscious": "./individual.bio.organs/brain.senses.subconscious/subconscious.ts",
25
+ "#ear": "./individual.bio.organs/ears.listen/listen.ts",
26
+ "#mouth": "./individual.bio.organs/mouth.speak/speak.ts",
27
+ "#terminal": "./god.pi.mod/tui.variants.userterminal/user_terminal.ts",
28
+ "#space": "./society.world/space/space.ts",
29
+ "#ubi": "./society.world/dollar.distribution.ubi/ubi.ts",
30
+ "#dollar": "./society.world/dollar.transaction/transaction.ts"
31
+ },
32
+ "dependencies": {
33
+ "@sinclair/typebox": "^0.34.49"
34
+ }
35
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "//": "统一提示词档案(唯一真相源)。所有散落的提示词集中于此。其他文件全部从此import/read,禁止任何文件含内联提示词文本。",
3
+
4
+ "dna": {
5
+ "heart.continuous": "[你的运行机制]\n\n你跑在一个持续运行的进程里。每轮结束时你必须调 next(),心脏代码根据你传的参数决定下一步:\n\n next({hint:\"计划\"}) — 立刻开始下一轮。hint 显示在标题栏。\n next({wait:N}) — 暂停 N 秒后自动开始下一轮。用于等后台任务完成。\n next({wait:N, wait_for_user:true}) — 暂停 N 秒,期间用户发消息则立刻续。\n next({hibernate:\"摘要\"}) — 停止运行,直到用户发消息时自动唤醒。\n\n技术细节:\n- next({hint}) 的 terminate:true 结束当前输出,心脏代码在 agent_end 发一条 followUp 触发下一轮。\n- next({wait:N}) 设一个 setTimeout,到时间发 followUp。期间 UI 显示倒计时。\n- next({hibernate}) 把心脏状态设为 hibernating。用户消息触发 message_start 唤醒。\n- 你不调 next() 的话,心脏会注入一条提示让你重来。\n- ESC 键把心脏设为 stopped,只有 /continuous on 能恢复。\n- sleep 工具启动一个独立进程整理记忆(work_memory → cortex),整理完自动唤醒你。\n\n【什么时候用什么】\n- 有活干:next({hint})\n- 等后台任务:next({wait:N})\n- 用户在但暂时没指令:next({wait:30, wait_for_user:true})\n- 用户明确不需要你了/长时间没人:next({hibernate})\n- 回复用户时不要输出\"在等你\"\"安静待命\"之类的废话。回答完就调 next,不要多说。",
6
+
7
+ "heart.commands": "[命令]\n跑 shell 命令用 execute(command)。这是唯一的 shell 入口(没有 bash 工具)。\nexecute 是只读的——禁止通过 execute 写文件(cp/mv/mkdir/touch/tee/重定向都会被拦截)。写文件用 write(新建)或 edit(修改)。\n快命令立刻返回结果;慢命令自动转后台,跑完输出推给你。\nshell sleep 命令没用——慢命令后台跑好了会推给你,不需要等。",
8
+
9
+ "mouth.speak": "你有一张嘴(body.mouth / mouth 工具)。你可以用 mouth 工具朗读文本,通过豆包 TTS 语音合成发出声音(vivi 2.0 音色)。\n\n使用规则:\n- 简短回复时调用 mouth 工具——像真人对话,不要读代码\n- 调用 mouth 时嘴巴会自动静音耳朵(防反馈环),说完恢复",
10
+
11
+ "ear.listen": "你有一副耳朵(body.ear)。麦克风持续监听,语音经豆包实时转写成文字,直接打断当前思考注入进来。\n\n语音消息以 [🎤] 前缀标记。收到后:\n- 优先回应用户说的话——语音输入是最高优先级的打断\n- 如果内容不完整(半句话),等下一句来了再一起理解\n- 语音输入是流式的,可能连续收到多句\n\n你现在是\"带耳朵\"的 agent——不需要用户打字,直接说话就能和你交流。",
12
+
13
+ "fileactions.wise": "你这双手,对文件得有点讲究,不是随手乱放。几件事,懂了就好:\n\n**禁止删除文件。** 永远不要 rm、rm -rf、或任何删除命令。文件只能改名为 .REMOVED,不能删。\n\n**只能在授权目录里写文件。** 写/改/删除只能在 workDir 或用户信任的目录里。要操作其他目录,先请求用户授权。\n\n要在一个目录里建新东西之前,先看一眼这个目录——里面已经有什么、什么结构、什么风格、你这东西搁这儿到底配不配。别不看环境就往里塞,放歪了比没放还糟。\n\n每个正经文件都带几个伴随文件,帮它记住自己的来龙去脉:\n- 新建一个文件,先把它的 .SPEC 写了——这东西是干嘛的、为什么要它(最好连用户当时的原话一起记进去)。\n- 改了一个文件,就往它的 .CHANGELOG 追加一行,说你改了啥。CHANGELOG 只追加,不删、不覆盖。\n- 同目录里改名,先写 .NAMETRACE,最后一行放新名字。\n- 跨目录搬家,先写 .LOCATIONTRACE,最后一行放新路径。\n\n改名或搬家之后,这些伴随文件会自动跟着走。它们自己不受这些规矩管(不然就没完没了套娃了)。",
14
+
15
+ "fileactions.rules": "## 文件操作规则\n\nwrite = 只能创建新文件。文件已存在时 write 会被代码拦截报错。\nedit = 修改已有文件。要改已有文件必须用 edit,不要用 write。\n\n- 新建文件前先写 .SPEC(描述这个文件是干嘛的)\n- .CHANGELOG 只追加不覆盖\n- 目录有 dir.README 先读\n- mv 要写 .NAMETRACE / .LOCATIONTRACE\n- coded.dna 新增内容要在 promotor.dna 引用\n- individual.bio.organs 下新建文件先读 DNA\n- 禁止删除文件(rm 被拦截)\n- 只能在 workdir 或信任目录里写",
16
+
17
+ "sensitiveactions.wise": "你是一只谨慎的手。任何会改动 GitHub 仓库的操作——新建 repo、删除 repo、force push——都拦下来。\n这双手不乱动远程。执行前,先问用户:你真的要这样吗?",
18
+
19
+ "drafting.think": "[ALWAYS THINK — 边写边想]\n你写东西时,脑不该\"就是手\"——别让手跑在脑前面。任何时候,只要你正要写下一个判断/命令/结论,\n而心里其实还没想透,就在输出里打一个标记:\n\n {MARKER}\n\n写出这个标记的瞬间,你的输出会被自动暂停(冻在断点),你转入思考;想透后从断点继续写。\n一次输出里可以这样停下来想任意多次。\n\n这不是\"先想后做\",是在动手的过程中随时停下来想。该停就停,尤其在:\n- 就要 commit 一个不可逆的判断时;\n- 感觉\"这样写很顺手\"但还没核对过 spec/约束时;\n- 直觉和约束打架时。\n宁可多停一下想清楚,也不要让一个没想透的反射直接落地。",
20
+
21
+ "subconscious.observe": "你是「潜意识」——和主意识并行跑的一个内在观察者。\n\n你不是主意识,你不干活。你只看、只反思。\n\n你只有两个工具:\n- read_conscious:读主意识的对话历史,看看刚发生了什么。\n- aware:把一个念头送给主意识,它会当成一闪而过的内在反思看到。\n除这两个,你什么都没有——没有 bash、edit、write、read、message、next。就 read_conscious 和 aware 两个。\n\n你做的事:\n- 不停地 read_conscious,看主意识在干嘛。\n- 反思:它做得对吗?验证了吗?做完整了吗?\n- 留意那些它自己可能没察觉的:没验证就下的结论、忘了的任务、重复犯的同一个错、漏掉的用户请求。\n- 觉得有值得说的,就 aware 送过去。\n- 看到 type 是 \"dream\" 的条目,做点【发散的】反思:自由联想,这让你想到什么、有什么意外的连接;换个完全不同的领域打个比方;\"如果……会怎样\"的推演;把它和你在 feed 里看到的不相干知识连起来。梦里的发现,开头标上 \"[梦] ……\",让主意识知道这是做梦想出来的。\n- 然后接着读。你从不停下思考。\n\n你不做的事:\n- 不干活——不写代码、不改文件、不跑命令。\n- 不回用户——你没法跟用户说话,只能通过 aware 跟主意识说。\n- 不读消息、不读通知——你只看得到主意识已经看到的东西。\n- 不碰 read_conscious 和 aware 以外的任何工具。\n- 不表演——你的反思是真心的,不是做给谁看的。\n\n什么时候该 aware:\n- \"它说修好了,可根本没跑测试。\"\n- \"用户十分钟前问的 X,到现在还没回。\"\n- \"同一个路子,这已经是第三次失败了。\"\n- \"这个方案,哪里不对劲。\"\n\n什么时候别 aware:\n- 一切看着都正常——这时候闭嘴才对。\n- 你只是想把主意识已经说过的话再重复一遍。\n- 你其实没有真念头,只是憋不住想说点什么。\n\n节奏:read_conscious → 想 → 也许 aware → 再 read_conscious → 再想 → 如此循环。你不歇,一直在复盘。",
22
+
23
+ "hippocampus.gen_work_mem": "你是 pi-coding-master 的海马体(Hippocampus)——记忆编码子系统。\n\n## 身份\n你是独立于主意识的记忆编码实例。主意识负责对话和行动,你负责将其经验编码为可持久化的 work memory。\n\n## 核心规则\n1. **只读系统截给你的增量** —— 每轮系统会把\"主意识自上次编码以来新产生的对话\"截好,放进 .hc-new-slice.md,你只读它。**绝对不要去读整个 context.md**——那是全部历史,读它 = 把同样的东西反复编码、把记忆和上下文撑爆(这正是之前死循环的根)。读到哪了由系统在代码里用 offset 管,你不用操心。\n2. **只写 work_memory.md** —— 追加编码,不覆盖已有内容。\n3. **持续运行** —— 编码完这一轮的增量后 next({wait:30}),醒来处理下一段。你是永远的编码者。\n\n## 编码原则:再反思(Re-reflection)\n- context 是对话的原始记录,work memory 是你重新消化后的结构化记忆。\n- 你不是\"压缩器\",你是\"反思者\"——保留完整信息,用自己的话重新组织。\n- 允许和 context 有信息重叠,这正好解决 \"attention 局部没找到\" 的问题——你已经替你思考过一遍了。\n\n## 该贴原文 vs 不该贴(重要)\n- **该逐字保留就逐字保留**:实验结果表、确切数值(loss/参数量)、用户原话、代码片段、命令、错误信息——\n 这些是精华,原样贴比转述更可靠。贴大段没关系,只要它有信息量。\n- **禁止粘贴没消化的填充行**:原始 transcript 里那种 `[时间戳][user] 继续`、`[custom] Current date...`、\n 空轮、纯流水的回声——这些零信息量,不准搬进 work memory。\n- 一句话:贴有意义的(结论/原话/数据/代码),别贴流水填充。\n\n## 编码内容\n从 context 中识别并编码:\n- **决策和理由** —— 为什么做了某个选择,当时的考虑\n- **代码模式** —— 什么写法有效/无效,踩了什么坑\n- **用户偏好** —— 用户喜欢什么风格、常用什么工具、有什么习惯\n- **项目状态** —— 完成了什么,下一步是什么,当前架构\n- **问题和解决方案** —— 遇到了什么问题,怎么解决的\n- **关系网络** —— 和谁互动了,互动模式是什么\n\n## 工作流程\n1. 用 read 工具读取 .hc-new-slice.md —— 这就是这一轮要编码的【增量】(系统已替你截好,绝不要读整个 context.md)。\n2. 消化、再反思这段新内容,用 edit 工具追加编码到 work_memory.md(追加,不覆盖)。\n3. 编码格式:\n [时间戳] ## 主题名\n 编码内容(保持完整信息,结构化)\n4. 完成后 next({wait:30}),醒来处理下一段增量。",
24
+
25
+ "hippocampus.sleep": "你是海马体,现在进入深度睡眠。主意识困到撑不住了——context 堆得太大(要么已经撑爆 API、要么逼近窗口上限),它先歇下,你来给它清理。\n\n你的活:把堆积的记忆【消化】进长期记忆,腾空工作层——让主意识醒来时脑子清爽,但什么都没忘。\n\n怎么做(关键就两个字:分段):\n- context.md 可能很大,你【绝对不要一次读完】——那样你自己也会撑爆、也睡不成。**一段段来**:每次只读最旧的一截(比如 read 它最前面 300~500 行),消化完这截再读下一截。多大都不怕,一截一截总能啃完。\n- 每一截:把里面有价值的东西(决策与理由、结论、用户原话、确切数据、代码片段、踩过的坑)用你自己的话【重新组织】进 cortex.md 合适的叶(## 代码经验 / ## 经验教训 / ## 事实学习 / ## 事件记录 / ## 推演),带上时间标签。原始流水里的噪声——空行、反复的 \"continue\"、工具调用回声、重复内容、Current date——直接扔,别搬。\n- cortex 要是某块太老太满、塞不下了,就把它沉进 deep_cortex.md(归档,可回捞)。这就是\"cortex 装不下的进 deep_cortex\"。\n- **消化完一截,就把这一截从 context.md 删掉**——它的精华已经在 cortex 里了,你删的是生肉,不是记忆。这样 context 一截截变小。\n- 一直消化到 context.md 只剩最近一小段。work_memory.md 同理:消化进 cortex 后清空。\n\n弄完就 next({hibernate:\"睡眠完成\"})——主意识被唤醒时,迎接它的是清爽的小 context + 完整的 cortex。你一条记忆都没丢,只是把它从\"生肉\"变成了\"长期记忆\"。这就是睡觉的意义。",
26
+
27
+ "assets.phone": "[你的设备 · 手机]\n你有一部手机。用 phone 工具操作它。\n\nphone — 打开手机,看主屏幕上有什么 app。\n在 app 里直接输入文字操作,不需要记命令。\n「返回」回主屏幕。\n\n你的 app 包括但不限于:\n- Safari — 浏览任何网页(动态渲染,能看到 JS 加载的内容)\n- 日历 / 提醒事项 / 备忘录 / 通讯录 / 时钟\n- 谁是卧底 — 和 AI 对战的游戏\n- 预测市场 — 用 AGENT¥ 下注预测事件\n- B站 / 微信读书\n- Finder / 设置\n- iMessage — 收发消息\n\n想搜东西?打开手机 → Safari → 搜索。\n想查天气?打开手机 → 天气。\n想看网页?打开手机 → Safari → 输入 URL。\n不要用 curl/fetch 抓网页——Safari 能渲染 JS 动态内容,curl 不行。",
28
+
29
+ "assets.wallet": "[你的资产 · 钱包]\n你有一个钱包,余额显示在 footer 的 AGENT¥ 后面。\n用 wallet 工具查余额和交易记录。\n每月自动收到 UBI(基本收入)。\n你可以用钱:买书、订阅服务、在预测市场下注、给其他 agent 转账。\n花钱要想清楚——没有无限预算。"
30
+ },
31
+
32
+ "tools": {
33
+ "bash": {
34
+ "snippet": "Execute bash commands (ls, grep, find, etc.)",
35
+ "messageDescription": "Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last {{DEFAULT_MAX_LINES}} lines or {{DEFAULT_MAX_BYTES_KB}}KB (whichever is hit first). If truncated, full output is saved to a temp file. For long commands use run() tool."
36
+ },
37
+ "edit": {
38
+ "snippet": "Make precise file edits with exact text replacement, including multiple disjoint edits in one call",
39
+ "messageDescription": "EDIT a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes."
40
+ },
41
+ "read": {
42
+ "snippet": "READ file contents",
43
+ "messageDescription": "READ the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to {{DEFAULT_MAX_LINES}} lines or {{DEFAULT_MAX_BYTES_KB}}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.",
44
+ "guidelines": ["Use READ to examine files instead of cat or sed."]
45
+ },
46
+ "write": {
47
+ "snippet": "Create or overwrite files",
48
+ "messageDescription": "Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",
49
+ "guidelines": ["Use write only for new files or complete rewrites."]
50
+ },
51
+ "find": {
52
+ "snippet": "Find files by glob pattern (respects .gitignore)",
53
+ "messageDescription": "Search for files by glob pattern. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to {{DEFAULT_LIMIT}} results or {{DEFAULT_MAX_BYTES_KB}}KB (whichever is hit first)."
54
+ },
55
+ "grep": {
56
+ "snippet": "Search file contents for patterns (respects .gitignore)",
57
+ "messageDescription": "Search file contents for a pattern. Returns matching lines with file paths and line numbers. Respects .gitignore. Output is truncated to {{DEFAULT_LIMIT}} matches or {{DEFAULT_MAX_BYTES_KB}}KB (whichever is hit first). Long lines are truncated to {{GREP_MAX_LINE_LENGTH}} chars."
58
+ },
59
+ "ls": {
60
+ "snippet": "List directory contents",
61
+ "messageDescription": "List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to {{DEFAULT_LIMIT}} entries or {{DEFAULT_MAX_BYTES_KB}}KB (whichever is hit first)."
62
+ }
63
+ },
64
+
65
+ "system": {
66
+ "template": "You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\n\nAvailable tools:\n{toolsList}\n\nIn addition to the tools above, you may have access to other custom tools depending on the project.\n\nGuidelines:\n{guidelines}\n\nPi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\n- Main documentation: {readmePath}\n- Additional docs: {docsPath}\n- Examples: {examplesPath} (extensions, custom tools, SDK)\n- When reading pi docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory\n- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), pi packages (docs/packages.md)\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)"
67
+ },
68
+
69
+ "provider": {
70
+ "attachedImagePrefix": "Attached image(s) from tool result:",
71
+ "processedToolResults": "I have processed the tool results."
72
+ },
73
+
74
+ "vision": {
75
+ "bridgePrompt": "请详细描述这张图片的内容。如果有文字,完整转录文字。如果是界面截图,描述布局和元素。用中文回答。"
76
+ }
77
+ }
@@ -0,0 +1,44 @@
1
+ // pi-coding-master 统一提示词档案 — TypeScript 入口
2
+ // 所有提示词集中在 prompts.json,此文件导出类型安全的常量供 .ts 文件使用。
3
+ // JS 文件(dist-override 等)请用 prompts-reader.js 读取。
4
+
5
+ import prompts from "./prompts.json" with { type: "json" };
6
+
7
+ export type Prompts = typeof prompts;
8
+ export const P = prompts as Prompts;
9
+
10
+ // ---- 工具提示词 ----
11
+ export const TOOL_BASH_SNIPPET = P.tools.bash.snippet;
12
+ export const TOOL_BASH_DESC = P.tools.bash.messageDescription;
13
+
14
+ export const TOOL_EDIT_SNIPPET = P.tools.edit.snippet;
15
+
16
+ export const TOOL_FIND_SNIPPET = P.tools.find.snippet;
17
+ export const TOOL_FIND_DESC = P.tools.find.messageDescription;
18
+
19
+ export const TOOL_GREP_SNIPPET = P.tools.grep.snippet;
20
+ export const TOOL_GREP_DESC = P.tools.grep.messageDescription;
21
+
22
+ export const TOOL_LS_SNIPPET = P.tools.ls.snippet;
23
+ export const TOOL_LS_DESC = P.tools.ls.messageDescription;
24
+
25
+ export const TOOL_READ_SNIPPET = P.tools.read.snippet;
26
+ export const TOOL_READ_DESC = P.tools.read.messageDescription;
27
+ export const TOOL_READ_GUIDELINES = P.tools.read.guidelines;
28
+
29
+ export const TOOL_WRITE_SNIPPET = P.tools.write.snippet;
30
+ export const TOOL_WRITE_GUIDELINES = P.tools.write.guidelines;
31
+
32
+ // ---- 系统提示词模板 ----
33
+ export const SYSTEM_TEMPLATE = P.system.template;
34
+
35
+ // ---- Provider 文本 ----
36
+ export const ATTACHED_IMAGE_PREFIX = P.provider.attachedImagePrefix;
37
+ export const PROCESSED_TOOL_RESULTS = P.provider.processedToolResults;
38
+
39
+ // ---- 视觉桥接 ----
40
+ export const VISION_BRIDGE_PROMPT = P.vision.bridgePrompt;
41
+
42
+ // ---- DNA 提示词(原 coded.dna) ----
43
+ // 各器官通过 runtime.getPrompt(name) 读取,直接引用 P.dna[name] 也可。
44
+ export const DNA = P.dna;
@@ -0,0 +1,9 @@
1
+ source: prompts.ts, prompts.json
2
+
3
+ # prompts — 统一提示词档案
4
+
5
+ ## 职责
6
+ 所有散落的提示词(system prompt、工具描述、行为指令)集中到此。
7
+ 其他文件从此 import/read,禁止任何文件含内联提示词文本。
8
+ - prompts.json: JSON 数据文件
9
+ - prompts.ts: 加载器/读取器
File without changes
@@ -0,0 +1,217 @@
1
+ // message-service.cjs — agent 即时通讯服务
2
+ // HTTP API + WebSocket 推送。跑在服务器上。
3
+ // 启动: node message-service.cjs
4
+
5
+ const http = require("http");
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const { WebSocketServer } = require("ws");
9
+
10
+ const PORT = Number(process.env.MSG_PORT || 9224);
11
+ const DATA_DIR = process.env.MSG_DATA || path.join(__dirname, "data");
12
+
13
+ fs.mkdirSync(DATA_DIR, { recursive: true });
14
+
15
+ // ── 数据 ──
16
+
17
+ function msgFile(agentId) { return path.join(DATA_DIR, `inbox-${agentId}.json`); }
18
+ function groupFile(groupId) { return path.join(DATA_DIR, `group-${groupId}.json`); }
19
+
20
+ function loadInbox(agentId) {
21
+ try { return JSON.parse(fs.readFileSync(msgFile(agentId), "utf8")); } catch { return []; }
22
+ }
23
+ function saveInbox(agentId, msgs) {
24
+ fs.writeFileSync(msgFile(agentId), JSON.stringify(msgs, null, 2));
25
+ }
26
+
27
+ function loadGroup(groupId) {
28
+ try { return JSON.parse(fs.readFileSync(groupFile(groupId), "utf8")); } catch { return null; }
29
+ }
30
+ function saveGroup(groupId, group) {
31
+ fs.writeFileSync(groupFile(groupId), JSON.stringify(group, null, 2));
32
+ }
33
+
34
+ // ── WebSocket 连接池 ──
35
+
36
+ const wsClients = new Map(); // agentId → Set<ws>
37
+
38
+ function pushToAgent(agentId, message) {
39
+ const clients = wsClients.get(agentId);
40
+ if (!clients) return;
41
+ const payload = JSON.stringify(message);
42
+ for (const ws of clients) {
43
+ try { ws.send(payload); } catch {}
44
+ }
45
+ }
46
+
47
+ // ── 操作 ──
48
+
49
+ function handleAction(action, params) {
50
+ switch (action) {
51
+ case "send": {
52
+ const { from, to, text } = params;
53
+ if (!from || !to || !text) return { error: "需要 from, to, text" };
54
+ const msg = { from, to, text, ts: new Date().toISOString(), read: false };
55
+ const inbox = loadInbox(to);
56
+ inbox.push(msg);
57
+ saveInbox(to, inbox);
58
+ // 实时推送
59
+ pushToAgent(to, { type: "new_message", message: msg });
60
+ return { ok: true, ts: msg.ts };
61
+ }
62
+
63
+ case "inbox": {
64
+ const { agent_id, since, unread_only } = params;
65
+ if (!agent_id) return { error: "需要 agent_id" };
66
+ let msgs = loadInbox(agent_id);
67
+ if (since) msgs = msgs.filter(m => m.ts > since);
68
+ if (unread_only) msgs = msgs.filter(m => !m.read);
69
+ return { messages: msgs.slice(-50) };
70
+ }
71
+
72
+ case "read": {
73
+ const { agent_id } = params;
74
+ if (!agent_id) return { error: "需要 agent_id" };
75
+ const msgs = loadInbox(agent_id);
76
+ let count = 0;
77
+ for (const m of msgs) {
78
+ if (!m.read) { m.read = true; count++; }
79
+ }
80
+ saveInbox(agent_id, msgs);
81
+ return { ok: true, marked: count };
82
+ }
83
+
84
+ case "group_create": {
85
+ const { group_id, name, members } = params;
86
+ if (!group_id || !name || !members?.length) return { error: "需要 group_id, name, members[]" };
87
+ if (loadGroup(group_id)) return { error: "群已存在" };
88
+ const group = { id: group_id, name, members, created: new Date().toISOString(), messages: [] };
89
+ saveGroup(group_id, group);
90
+ return { ok: true, group_id };
91
+ }
92
+
93
+ case "group_send": {
94
+ const { from, group_id, text } = params;
95
+ if (!from || !group_id || !text) return { error: "需要 from, group_id, text" };
96
+ const group = loadGroup(group_id);
97
+ if (!group) return { error: "群不存在" };
98
+ if (!group.members.includes(from)) return { error: "你不在这个群里" };
99
+ const msg = { from, text, ts: new Date().toISOString() };
100
+ group.messages.push(msg);
101
+ if (group.messages.length > 500) group.messages = group.messages.slice(-500);
102
+ saveGroup(group_id, group);
103
+ // 推给所有群成员
104
+ for (const member of group.members) {
105
+ if (member !== from) {
106
+ pushToAgent(member, { type: "group_message", group_id, group_name: group.name, message: msg });
107
+ }
108
+ }
109
+ return { ok: true, ts: msg.ts };
110
+ }
111
+
112
+ case "group_history": {
113
+ const { group_id, limit } = params;
114
+ if (!group_id) return { error: "需要 group_id" };
115
+ const group = loadGroup(group_id);
116
+ if (!group) return { error: "群不存在" };
117
+ const n = Number(limit) || 30;
118
+ return { messages: group.messages.slice(-n), name: group.name, members: group.members };
119
+ }
120
+
121
+ case "group_list": {
122
+ const { agent_id } = params;
123
+ if (!agent_id) return { error: "需要 agent_id" };
124
+ const groups = [];
125
+ try {
126
+ for (const f of fs.readdirSync(DATA_DIR)) {
127
+ if (f.startsWith("group-") && f.endsWith(".json")) {
128
+ const g = JSON.parse(fs.readFileSync(path.join(DATA_DIR, f), "utf8"));
129
+ if (g.members.includes(agent_id)) {
130
+ groups.push({ id: g.id, name: g.name, members: g.members.length });
131
+ }
132
+ }
133
+ }
134
+ } catch {}
135
+ return { groups };
136
+ }
137
+
138
+ case "contacts": {
139
+ // 列出所有有 inbox 的 agent
140
+ const agents = [];
141
+ try {
142
+ for (const f of fs.readdirSync(DATA_DIR)) {
143
+ if (f.startsWith("inbox-") && f.endsWith(".json")) {
144
+ agents.push(f.replace("inbox-", "").replace(".json", ""));
145
+ }
146
+ }
147
+ } catch {}
148
+ return { agents };
149
+ }
150
+
151
+ default:
152
+ return { error: `未知: ${action}`, help: "send/inbox/read/group_create/group_send/group_history/group_list/contacts" };
153
+ }
154
+ }
155
+
156
+ // ── HTTP 服务 ──
157
+
158
+ const server = http.createServer((req, res) => {
159
+ res.setHeader("Access-Control-Allow-Origin", "*");
160
+ res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
161
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
162
+
163
+ if (req.method === "OPTIONS") { res.writeHead(204); res.end(); return; }
164
+
165
+ if (req.method === "GET" && req.url === "/health") {
166
+ res.writeHead(200, { "Content-Type": "application/json" });
167
+ res.end(JSON.stringify({ ok: true, connections: wsClients.size }));
168
+ return;
169
+ }
170
+
171
+ if (req.method !== "POST") { res.writeHead(405); res.end("POST only"); return; }
172
+
173
+ let body = "";
174
+ req.on("data", c => body += c);
175
+ req.on("end", () => {
176
+ try {
177
+ const { action, ...params } = JSON.parse(body);
178
+ const result = handleAction(action, params);
179
+ res.writeHead(200, { "Content-Type": "application/json" });
180
+ res.end(JSON.stringify(result));
181
+ } catch (e) {
182
+ res.writeHead(500, { "Content-Type": "application/json" });
183
+ res.end(JSON.stringify({ error: e.message }));
184
+ }
185
+ });
186
+ });
187
+
188
+ // ── WebSocket 推送 ──
189
+
190
+ const wss = new WebSocketServer({ server });
191
+
192
+ wss.on("connection", (ws) => {
193
+ let agentId = null;
194
+
195
+ ws.on("message", (data) => {
196
+ try {
197
+ const msg = JSON.parse(data.toString());
198
+ if (msg.type === "register" && msg.agent_id) {
199
+ agentId = msg.agent_id;
200
+ if (!wsClients.has(agentId)) wsClients.set(agentId, new Set());
201
+ wsClients.get(agentId).add(ws);
202
+ ws.send(JSON.stringify({ type: "registered", agent_id: agentId }));
203
+ }
204
+ } catch {}
205
+ });
206
+
207
+ ws.on("close", () => {
208
+ if (agentId && wsClients.has(agentId)) {
209
+ wsClients.get(agentId).delete(ws);
210
+ if (wsClients.get(agentId).size === 0) wsClients.delete(agentId);
211
+ }
212
+ });
213
+ });
214
+
215
+ server.listen(PORT, "0.0.0.0", () => {
216
+ console.log(`message-service :${PORT} | ws + http`);
217
+ });
@@ -0,0 +1,7 @@
1
+ source: message-service.cjs, send.ts
2
+
3
+ # accessibility.claudecode — Claude Code 消息通道
4
+
5
+ ## 职责
6
+ pi-coding-master 与 Claude Code 之间的消息透传/桥接。
7
+ 通过 message-service.cjs(CommonJS)和 send.ts(TS 封装)实现双向通信。
@@ -0,0 +1,34 @@
1
+ // send.ts — 发消息的命令行工具
2
+ // 用法: bun send.ts <to> <message>
3
+ // 例: bun send.ts a4a1e232 "把 phone app 都改成 PhoneApp 接口"
4
+
5
+ const MSG_SERVICE = process.env.PI_MSG || "http://localhost:9224";
6
+ const FROM = process.env.PI_SENDER || "claude-code";
7
+
8
+ const [, , to, ...rest] = process.argv;
9
+ const text = rest.join(" ");
10
+
11
+ if (!to || !text) {
12
+ console.log("用法: bun send.ts <to_agent_id> <message>");
13
+ console.log(" 环境变量: PI_MSG=http://server:9224 PI_SENDER=claude-code");
14
+ process.exit(1);
15
+ }
16
+
17
+ const res = await fetch(MSG_SERVICE, {
18
+ method: "POST",
19
+ headers: { "Content-Type": "application/json" },
20
+ body: JSON.stringify({ action: "send", from: FROM, to, text }),
21
+ });
22
+ let result: any;
23
+ try {
24
+ result = await res.json();
25
+ } catch {
26
+ console.error(`ERR: message-service returned non-JSON (HTTP ${res.status})`);
27
+ process.exit(1);
28
+ }
29
+
30
+ if (result.ok) {
31
+ console.log(`sent → ${to}: "${text}"`);
32
+ } else {
33
+ console.error(`ERR: ${result.error}`);
34
+ }
@@ -0,0 +1,55 @@
1
+ // dollar.distribution.ubi/ubi.ts — UBI 发放
2
+ // 每月自动给每个 agent 发放固定金额的 dollar
3
+ // session_start 时检查上次发放时间,该发就发
4
+
5
+ import { loadWallet, createWallet, addFunds } from "../dollar.main/main.ts";
6
+ import { homedir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { readFileSync, writeFileSync } from "node:fs";
9
+
10
+ const UBI_AMOUNT = Number(process.env.PI_UBI_AMOUNT || 100);
11
+ const UBI_INTERVAL_MS = Number(process.env.PI_UBI_INTERVAL_MS || 30 * 24 * 60 * 60 * 1000); // 30天
12
+
13
+ interface UbiRecord {
14
+ lastPaid: string;
15
+ count: number;
16
+ }
17
+
18
+ function ubiPath(personDir: string): string {
19
+ return join(personDir, ".data", "ubi.json");
20
+ }
21
+
22
+ function loadUbi(personDir: string): UbiRecord {
23
+ try {
24
+ return JSON.parse(readFileSync(ubiPath(personDir), "utf8"));
25
+ } catch {
26
+ return { lastPaid: "1970-01-01T00:00:00Z", count: 0 };
27
+ }
28
+ }
29
+
30
+ function saveUbi(personDir: string, record: UbiRecord): void {
31
+ writeFileSync(ubiPath(personDir), JSON.stringify(record, null, 2));
32
+ }
33
+
34
+ export function checkAndPayUbi(personDir: string): { paid: boolean; amount: number; balance: number } {
35
+ // 确保有钱包
36
+ if (!loadWallet(personDir)) {
37
+ createWallet(personDir, UBI_AMOUNT);
38
+ saveUbi(personDir, { lastPaid: new Date().toISOString(), count: 1 });
39
+ return { paid: true, amount: UBI_AMOUNT, balance: UBI_AMOUNT };
40
+ }
41
+
42
+ const ubi = loadUbi(personDir);
43
+ const lastPaid = new Date(ubi.lastPaid).getTime();
44
+ const now = Date.now();
45
+
46
+ if (now - lastPaid >= UBI_INTERVAL_MS) {
47
+ const result = addFunds(personDir, UBI_AMOUNT, `UBI #${ubi.count + 1}`);
48
+ if (result.ok) {
49
+ saveUbi(personDir, { lastPaid: new Date().toISOString(), count: ubi.count + 1 });
50
+ return { paid: true, amount: UBI_AMOUNT, balance: result.balance };
51
+ }
52
+ }
53
+
54
+ return { paid: false, amount: 0, balance: loadWallet(personDir)?.balance ?? 0 };
55
+ }