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,139 @@
1
+ import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
2
+ import { getMarkdownTheme, theme } from "../theme/theme.js";
3
+ // pi-coding-master 统一块渲染引擎(源:god.pi.mod/tui.mods.blockrender/blockrender.js,install.sh 部署到此目录)
4
+ import { markdownBullet, GUTTER } from "./blockrender.js";
5
+ const OSC133_ZONE_START = "\x1b]133;A\x07";
6
+ const OSC133_ZONE_END = "\x1b]133;B\x07";
7
+ const OSC133_ZONE_FINAL = "\x1b]133;C\x07";
8
+ /**
9
+ * Component that renders a complete assistant message
10
+ */
11
+ export class AssistantMessageComponent extends Container {
12
+ contentContainer;
13
+ hideThinkingBlock;
14
+ markdownTheme;
15
+ hiddenThinkingLabel;
16
+ lastMessage;
17
+ hasToolCalls = false;
18
+ errorShown = false;
19
+ constructor(message, hideThinkingBlock = false, markdownTheme = getMarkdownTheme(), hiddenThinkingLabel = "Thinking...") {
20
+ super();
21
+ this.hideThinkingBlock = hideThinkingBlock;
22
+ this.markdownTheme = markdownTheme;
23
+ this.hiddenThinkingLabel = hiddenThinkingLabel;
24
+ // Container for text/thinking content
25
+ this.contentContainer = new Container();
26
+ this.addChild(this.contentContainer);
27
+ if (message) {
28
+ this.updateContent(message);
29
+ }
30
+ }
31
+ invalidate() {
32
+ super.invalidate();
33
+ if (this.lastMessage) {
34
+ this.updateContent(this.lastMessage);
35
+ }
36
+ }
37
+ setHideThinkingBlock(hide) {
38
+ this.hideThinkingBlock = hide;
39
+ if (this.lastMessage) {
40
+ this.updateContent(this.lastMessage);
41
+ }
42
+ }
43
+ setHiddenThinkingLabel(label) {
44
+ this.hiddenThinkingLabel = label;
45
+ if (this.lastMessage) {
46
+ this.updateContent(this.lastMessage);
47
+ }
48
+ }
49
+ render(width) {
50
+ const lines = super.render(width);
51
+ if (this.hasToolCalls || lines.length === 0) {
52
+ return lines;
53
+ }
54
+ lines[0] = OSC133_ZONE_START + lines[0];
55
+ lines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];
56
+ return lines;
57
+ }
58
+ updateContent(message) {
59
+ this.lastMessage = message;
60
+ // Clear content container
61
+ this.contentContainer.clear();
62
+ this.errorShown = false;
63
+ const hasVisibleContent = message.content.some((c) => (c.type === "text" && c.text?.trim()) || (c.type === "thinking" && (c.thinking || "").trim()));
64
+ if (hasVisibleContent) {
65
+ this.contentContainer.addChild(new Spacer(1));
66
+ }
67
+ // Render content in order
68
+ for (let i = 0; i < message.content.length; i++) {
69
+ const content = message.content[i];
70
+ if (content.type === "text" && content.text.trim()) {
71
+ // Strip leaked XML tags (model hallucination)
72
+ const cleaned = content.text.trim().replace(/<\/?(?:parameter|function_calls|antml:[a-z_]+)[^>]*>/g, "").trim();
73
+ if (!cleaned) continue;
74
+ const md = new Markdown(cleaned, GUTTER, 0, this.markdownTheme);
75
+ this.contentContainer.addChild({
76
+ render: (w) => markdownBullet(md, theme.fg("text", "●"), w),
77
+ invalidate: () => { if (md.invalidate) md.invalidate(); },
78
+ });
79
+ }
80
+ else if (content.type === "thinking" && (content.thinking || "").trim()) {
81
+ const viewMode = globalThis.__piViewMode || "full";
82
+ if (viewMode === "clean") continue;
83
+ // Add spacing only when another visible assistant content block follows.
84
+ // This avoids a superfluous blank line before separately-rendered tool execution blocks.
85
+ const hasVisibleContentAfter = message.content
86
+ .slice(i + 1)
87
+ .some((c) => (c.type === "text" && c.text.trim()) || (c.type === "thinking" && c.thinking.trim()));
88
+ if (viewMode === "fold" || this.hideThinkingBlock) {
89
+ // Fold mode: skip thinking — no "Thinking..." label either
90
+ // Only add spacing if there's visible content after
91
+ if (hasVisibleContentAfter) {
92
+ this.contentContainer.addChild(new Spacer(1));
93
+ }
94
+ }
95
+ else {
96
+ // Thinking traces — 灰点 + 思考内容,同样走 blockrender 统一对齐。
97
+ const md = new Markdown((content.thinking || "").trim(), GUTTER, 0, this.markdownTheme, {
98
+ color: (text) => theme.fg("thinkingText", text),
99
+ });
100
+ this.contentContainer.addChild({
101
+ render: (w) => markdownBullet(md, theme.fg("thinkingText", "●"), w),
102
+ invalidate: () => { if (md.invalidate) md.invalidate(); },
103
+ });
104
+ if (hasVisibleContentAfter) {
105
+ this.contentContainer.addChild(new Spacer(1));
106
+ }
107
+ }
108
+ }
109
+ }
110
+ // Check if aborted - show after partial content
111
+ // But only if there are no tool calls (tool execution components will show the error)
112
+ const hasToolCalls = message.content.some((c) => c.type === "toolCall");
113
+ this.hasToolCalls = hasToolCalls;
114
+ if (!hasToolCalls) {
115
+ // pi-coding-master: suppress "Operation aborted" display. Steer/voice-driven aborts are normal in continuous agent mode.
116
+ if (false && message.stopReason === "aborted") {
117
+ const abortMessage = message.errorMessage && message.errorMessage !== "Request was aborted"
118
+ ? message.errorMessage
119
+ : "Operation aborted";
120
+ if (hasVisibleContent) {
121
+ this.contentContainer.addChild(new Spacer(1));
122
+ }
123
+ else {
124
+ this.contentContainer.addChild(new Spacer(1));
125
+ }
126
+ this.contentContainer.addChild(new Text(theme.fg("error", abortMessage), 1, 0));
127
+ }
128
+ else if (message.stopReason === "error") {
129
+ if (!this.errorShown) {
130
+ this.errorShown = true;
131
+ const errorMsg = message.errorMessage || "Unknown error";
132
+ this.contentContainer.addChild(new Spacer(1));
133
+ this.contentContainer.addChild(new Text(theme.fg("error", `Error: ${errorMsg}`), 1, 0));
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ //# sourceMappingURL=assistant-message.js.map
@@ -0,0 +1,326 @@
1
+ import { isAbsolute, relative, resolve, sep } from "node:path";
2
+ import { readFileSync } from "node:fs"; // pi-coding-master: 读余额硬闸写的文件
3
+ import { execSync } from "node:child_process"; // pi-coding-master: sc/hc 状态检测
4
+ import { homedir } from "node:os"; // pi-coding-master
5
+ import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
6
+ import { theme } from "../theme/theme.js";
7
+ // pi-coding-master: footer.render() 流式时每帧都被调用;下面这些文件(work_memory/cortex/cost-*/balance)变化很慢,
8
+ // 不该每帧同步读盘(原来每帧 ~6 次 readFileSync = 渲染路径里的磁盘 I/O,拖慢每帧、加重弱终端的渲染压力)。
9
+ // 1 秒缓存:把每帧的多次读盘降到至多每秒一轮。读不到返回 ""(行为同原来的 try/catch 兜底)。
10
+ // pi-coding-master: sc/hc tmux session 状态(2秒缓存,不每帧 execSync)
11
+ let __scHcCache = { ts: 0, sc: false, hc: false, pid: "" };
12
+ function getScHcStatus(personId) {
13
+ const now = Date.now();
14
+ if (now - __scHcCache.ts < 2000 && __scHcCache.pid === personId) return __scHcCache;
15
+ let sc = false, hc = false;
16
+ if (personId) {
17
+ try { execSync(`tmux has-session -t sc-${personId} 2>/dev/null`); sc = true; } catch {}
18
+ try { execSync(`tmux has-session -t hc-${personId} 2>/dev/null`); hc = true; } catch {}
19
+ }
20
+ __scHcCache = { ts: now, sc, hc, pid: personId };
21
+ return __scHcCache;
22
+ }
23
+ const __rcCache = new Map(); // path -> { ts, data }
24
+ function cachedReadFile(p) {
25
+ const now = Date.now();
26
+ const hit = __rcCache.get(p);
27
+ if (hit && now - hit.ts < 1000)
28
+ return hit.data;
29
+ let data = "";
30
+ try { data = readFileSync(p, "utf8"); } catch { data = ""; }
31
+ __rcCache.set(p, { ts: now, data });
32
+ return data;
33
+ }
34
+ /**
35
+ * Sanitize text for display in a single-line status.
36
+ * Removes newlines, tabs, carriage returns, and other control characters.
37
+ */
38
+ function sanitizeStatusText(text) {
39
+ // Replace newlines, tabs, carriage returns with space, then collapse multiple spaces
40
+ return text
41
+ .replace(/[\r\n\t]/g, " ")
42
+ .replace(/ +/g, " ")
43
+ .trim();
44
+ }
45
+ /**
46
+ * Format token counts for compact footer display.
47
+ */
48
+ function formatTokens(count) {
49
+ if (count < 1000)
50
+ return count.toString();
51
+ if (count < 10000)
52
+ return `${(count / 1000).toFixed(1)}k`;
53
+ if (count < 1000000)
54
+ return `${Math.round(count / 1000)}k`;
55
+ if (count < 10000000)
56
+ return `${(count / 1000000).toFixed(1)}M`;
57
+ return `${Math.round(count / 1000000)}M`;
58
+ }
59
+ export function formatCwdForFooter(cwd, home) {
60
+ if (!home)
61
+ return cwd;
62
+ const resolvedCwd = resolve(cwd);
63
+ const resolvedHome = resolve(home);
64
+ const relativeToHome = relative(resolvedHome, resolvedCwd);
65
+ const isInsideHome = relativeToHome === "" ||
66
+ (relativeToHome !== ".." && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));
67
+ if (!isInsideHome)
68
+ return cwd;
69
+ return relativeToHome === "" ? "~" : `~${sep}${relativeToHome}`;
70
+ }
71
+ /**
72
+ * Footer component that shows pwd, token stats, and context usage.
73
+ * Computes token/context stats from session, gets git branch and extension statuses from provider.
74
+ */
75
+ export class FooterComponent {
76
+ autoCompactEnabled = true;
77
+ session;
78
+ footerData;
79
+ constructor(session, footerData) {
80
+ this.session = session;
81
+ this.footerData = footerData;
82
+ }
83
+ setSession(session) {
84
+ this.session = session;
85
+ }
86
+ setAutoCompactEnabled(enabled) {
87
+ this.autoCompactEnabled = enabled;
88
+ }
89
+ /**
90
+ * No-op: git branch caching now handled by provider.
91
+ * Kept for compatibility with existing call sites in interactive-mode.
92
+ */
93
+ invalidate() {
94
+ // No-op: git branch is cached/invalidated by provider
95
+ }
96
+ /**
97
+ * Clean up resources.
98
+ * Git watcher cleanup now handled by provider.
99
+ */
100
+ dispose() {
101
+ // Git watcher cleanup handled by provider
102
+ }
103
+ render(width) {
104
+ const state = this.session.state;
105
+ // Calculate cumulative usage from ALL session entries (not just post-compaction messages)
106
+ let totalInput = 0;
107
+ let totalOutput = 0;
108
+ let totalCacheRead = 0;
109
+ let totalCacheWrite = 0;
110
+ let totalCost = 0;
111
+ let latestCacheHitRate;
112
+ for (const entry of this.session.sessionManager.getEntries()) {
113
+ if (entry.type === "message" && entry.message.role === "assistant") {
114
+ totalInput += entry.message.usage.input;
115
+ totalOutput += entry.message.usage.output;
116
+ totalCacheRead += entry.message.usage.cacheRead;
117
+ totalCacheWrite += entry.message.usage.cacheWrite;
118
+ totalCost += entry.message.usage.cost.total;
119
+ const latestPromptTokens = entry.message.usage.input + entry.message.usage.cacheRead + entry.message.usage.cacheWrite;
120
+ latestCacheHitRate =
121
+ latestPromptTokens > 0 ? (entry.message.usage.cacheRead / latestPromptTokens) * 100 : undefined;
122
+ }
123
+ }
124
+ // Calculate context usage from session (handles compaction correctly).
125
+ // After compaction, tokens are unknown until the next LLM response.
126
+ // 从磁盘读 context/work_memory/cortex,统一 CJK 估算法(同 memory.ts 容量警告一致)
127
+ let diskTokens = { ctx: 0, work: 0, cx: 0 };
128
+ try {
129
+ const sf = this.session.sessionManager.getSessionFile?.();
130
+ const pid = sf && sf.match(/\.pi\/memory\/([a-f0-9]+)\//);
131
+ if (pid) {
132
+ const base = `${homedir()}/.pi/memory/${pid[1]}/.data`;
133
+ const ctxTxt = cachedReadFile(`${base}/context.md`);
134
+ const wmTxt = cachedReadFile(`${base}/work_memory.md`);
135
+ const cxTxt = cachedReadFile(`${base}/cortex.md`);
136
+ const est = (t) => { let cjk=0; for(let i=0;i<t.length;i++){const c=t.charCodeAt(i);if((c>=0x3400&&c<=0x9fff)||(c>=0xf900&&c<=0xfaff)||(c>=0x3000&&c<=0x30ff)||(c>=0xff00&&c<=0xffef))cjk++} return Math.round(cjk*1.8+(t.length-cjk)*0.25); };
137
+ diskTokens = { ctx: est(ctxTxt), work: est(wmTxt), cx: est(cxTxt) };
138
+ }
139
+ } catch {}
140
+ const contextWindow = state.model?.contextWindow ?? 200000;
141
+ const totalTokens = diskTokens.ctx + diskTokens.work + diskTokens.cx;
142
+ const totalPercent = contextWindow > 0 ? Math.min(100, (totalTokens / contextWindow) * 100) : 0;
143
+ const ctxPct = contextWindow > 0 ? ((diskTokens.ctx / contextWindow) * 100).toFixed(1) : "0";
144
+ const workPct = contextWindow > 0 && diskTokens.work > 0 ? ((diskTokens.work / contextWindow) * 100).toFixed(1) : "0";
145
+ const cxPct = contextWindow > 0 && diskTokens.cx > 0 ? ((diskTokens.cx / contextWindow) * 100).toFixed(1) : "0";
146
+ // Replace home directory with ~
147
+ let pwd = formatCwdForFooter(this.session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);
148
+ // Add git branch if available
149
+ const branch = this.footerData.getGitBranch();
150
+ if (branch) {
151
+ pwd = `${pwd} (${branch})`;
152
+ }
153
+ // Add session name if set
154
+ const sessionName = this.session.sessionManager.getSessionName();
155
+ if (sessionName) {
156
+ pwd = `${pwd} • ${sessionName}`;
157
+ }
158
+ // ── pi-coding-master footer: 身份 │ 钱 │ 记忆 ──
159
+ // 从 plist.json 读 person name
160
+ let personName = "";
161
+ let personShortId = "";
162
+ try {
163
+ const sf = this.session.sessionManager.getSessionFile?.();
164
+ const pid = sf && sf.match(/\.pi\/memory\/([a-f0-9]+)\//);
165
+ if (pid) {
166
+ personShortId = pid[1].slice(0, 4);
167
+ try {
168
+ const plist = JSON.parse(cachedReadFile(`${homedir()}/.pi/memory/plist.json`) || "[]");
169
+ const person = plist.find(p => p.id === pid[1]);
170
+ if (person?.name) personName = person.name;
171
+ } catch {}
172
+ }
173
+ } catch {}
174
+
175
+ const statsParts = [];
176
+
177
+ // 区域1: 身份
178
+ if (personName) {
179
+ statsParts.push(`${personName} #${personShortId}`);
180
+ } else if (personShortId) {
181
+ statsParts.push(`#${personShortId}`);
182
+ }
183
+
184
+ // 区域2: 钱(PI_SHOW_WALLET=1 启用,默认关)
185
+ if (process.env.PI_SHOW_WALLET === "1") {
186
+ try {
187
+ const sf = this.session.sessionManager.getSessionFile?.();
188
+ const pid = sf && sf.match(/\.pi\/memory\/([a-f0-9]+)\//);
189
+ let agentDollar = "";
190
+ if (pid) {
191
+ const walletData = cachedReadFile(`${homedir()}/.pi/memory/${pid[1]}/.data/wallet.json`);
192
+ if (walletData) {
193
+ const w = JSON.parse(walletData);
194
+ if (typeof w.balance === "number") agentDollar = `AGENT¥${Math.round(w.balance)}`;
195
+ }
196
+ }
197
+ const rc = (role) => { try { return JSON.parse(cachedReadFile(`${homedir()}/.pi/memory/${pid[1]}/.data/cost-${role}.json`) || "{}").cost || 0; } catch { return 0; } };
198
+ const bal = JSON.parse(cachedReadFile(`${homedir()}/.pi/agent/.pi-coding-master-balance.json`) || "{}");
199
+ const balStr = typeof bal.balance === "number" ? `¥${bal.balance.toFixed(2)}` : "";
200
+ let sessionCost = "";
201
+ if (pid) {
202
+ const main = totalCost || 0, hc = rc("hippocampus"), sc = rc("subconscious"), sl = rc("sleep");
203
+ const total = main + hc + sc + sl;
204
+ if (total > 0) sessionCost = ` (-¥${total.toFixed(2)})`;
205
+ }
206
+ const walletParts = [agentDollar, balStr + sessionCost].filter(Boolean).join(" ");
207
+ if (walletParts) statsParts.push(walletParts);
208
+ } catch {}
209
+ }
210
+
211
+ // 区域3: 记忆占比
212
+ const ctxWindowStr = `${formatTokens(contextWindow)}`;
213
+ let memStr;
214
+ if (diskTokens.work > 0 || diskTokens.cx > 0) {
215
+ const tp = totalPercent.toFixed(1);
216
+ memStr = `记忆${tp}% [对话${ctxPct} 工作${workPct} 皮层${cxPct}]/${ctxWindowStr}`;
217
+ } else if (ctxPct !== "?") {
218
+ memStr = `记忆${ctxPct}%/${ctxWindowStr}`;
219
+ } else {
220
+ memStr = `记忆?/${ctxWindowStr}`;
221
+ }
222
+ if (totalPercent > 90) {
223
+ memStr = theme.fg("error", memStr);
224
+ } else if (totalPercent > 70) {
225
+ memStr = theme.fg("warning", memStr);
226
+ }
227
+ statsParts.push(memStr);
228
+ let statsLeft = statsParts.join(" ");
229
+ // Add model name on the right side, plus thinking level if model supports it
230
+ const modelName = state.model?.id || "no-model";
231
+ let statsLeftWidth = visibleWidth(statsLeft);
232
+ // If statsLeft is too wide, truncate it
233
+ if (statsLeftWidth > width) {
234
+ statsLeft = truncateToWidth(statsLeft, width, "...");
235
+ statsLeftWidth = visibleWidth(statsLeft);
236
+ }
237
+ // Calculate available space for padding (minimum 2 spaces between stats and model)
238
+ const minPadding = 2;
239
+ // Add thinking level indicator if model supports reasoning
240
+ let rightSideWithoutProvider = modelName;
241
+ if (state.model?.reasoning) {
242
+ const thinkingLevel = state.thinkingLevel || "off";
243
+ rightSideWithoutProvider =
244
+ thinkingLevel === "off" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;
245
+ }
246
+ // Prepend the provider in parentheses if there are multiple providers and there's enough room
247
+ let rightSide = rightSideWithoutProvider;
248
+ if (this.footerData.getAvailableProviderCount() > 1 && state.model) {
249
+ rightSide = `(${state.model.provider}) ${rightSideWithoutProvider}`;
250
+ if (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {
251
+ // Too wide, fall back
252
+ rightSide = rightSideWithoutProvider;
253
+ }
254
+ }
255
+ const rightSideWidth = visibleWidth(rightSide);
256
+ const totalNeeded = statsLeftWidth + minPadding + rightSideWidth;
257
+ let statsLine;
258
+ if (totalNeeded <= width) {
259
+ // Both fit - add padding to right-align model
260
+ const padding = " ".repeat(width - statsLeftWidth - rightSideWidth);
261
+ statsLine = statsLeft + padding + rightSide;
262
+ }
263
+ else {
264
+ // Need to truncate right side
265
+ const availableForRight = width - statsLeftWidth - minPadding;
266
+ if (availableForRight > 0) {
267
+ const truncatedRight = truncateToWidth(rightSide, availableForRight, "");
268
+ const truncatedRightWidth = visibleWidth(truncatedRight);
269
+ const padding = " ".repeat(Math.max(0, width - statsLeftWidth - truncatedRightWidth));
270
+ statsLine = statsLeft + padding + truncatedRight;
271
+ }
272
+ else {
273
+ // Not enough space for right side at all
274
+ statsLine = statsLeft;
275
+ }
276
+ }
277
+ let fullPid = "";
278
+ try {
279
+ const sf = this.session.sessionManager.getSessionFile?.();
280
+ const m = sf && sf.match(/\.pi\/memory\/([a-f0-9]+)\//);
281
+ if (m) fullPid = m[1];
282
+ } catch {}
283
+ const scHc = getScHcStatus(fullPid);
284
+ const scDot = scHc.sc ? theme.fg("success", "●") : theme.fg("error", "●");
285
+ const hcDot = scHc.hc ? theme.fg("success", "●") : theme.fg("error", "●");
286
+ const scLabel = scHc.sc ? theme.fg("success", "●") + "潜意识" : theme.fg("error", "●") + "潜意识";
287
+ const hcLabel = scHc.hc ? theme.fg("success", "●") + "海马体" : theme.fg("error", "●") + "海马体";
288
+ const dimMem = theme.fg("dim", memStr);
289
+ const leftPart = theme.fg("dim", `${scLabel} ${hcLabel}`) + " " + dimMem;
290
+ const leftW = visibleWidth(leftPart);
291
+ // line1: 状态灯
292
+ const statusPart = theme.fg("dim", `${scLabel} ${hcLabel}`);
293
+ const statusW = visibleWidth(statusPart);
294
+ let line1 = statusPart + " ".repeat(Math.max(0, width - statusW));
295
+
296
+ // line2: 名字+模型名(左) + 记忆(右)
297
+ const statsNoMem = statsParts.filter(s => s !== memStr).join(" ");
298
+ const statsNoMemW = visibleWidth(statsNoMem);
299
+ const memW = visibleWidth(memStr);
300
+ const midPadding = 4;
301
+ const line2Needed = statsNoMemW + midPadding + memW;
302
+ let line2;
303
+ if (line2Needed <= width) {
304
+ line2 = theme.fg("dim", statsNoMem) + " ".repeat(width - statsNoMemW - memW) + theme.fg("dim", memStr);
305
+ } else if (width > memW + 10) {
306
+ // 截断名字部分,保留记忆完整
307
+ const maxNameWidth = width - memW - midPadding;
308
+ const truncatedName = truncateToWidth(statsNoMem, maxNameWidth, "...");
309
+ line2 = theme.fg("dim", truncatedName) + " ".repeat(width - visibleWidth(truncatedName) - memW) + theme.fg("dim", memStr);
310
+ } else {
311
+ // 空间太小,只显示记忆
312
+ line2 = " ".repeat(Math.max(0, width - memW)) + theme.fg("dim", memStr);
313
+ }
314
+ const lines = [line1, line2];
315
+ const extensionStatuses = this.footerData.getExtensionStatuses();
316
+ if (extensionStatuses.size > 0) {
317
+ const sortedStatuses = Array.from(extensionStatuses.entries())
318
+ .sort(([a], [b]) => a.localeCompare(b))
319
+ .map(([, text]) => sanitizeStatusText(text));
320
+ const statusLine = sortedStatuses.join(" ");
321
+ lines.push(truncateToWidth(statusLine, width, theme.fg("dim", "...")));
322
+ }
323
+ return lines;
324
+ }
325
+ }
326
+ //# sourceMappingURL=footer.js.map