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,665 @@
1
+ /**
2
+ * Main entry point for the coding agent CLI.
3
+ *
4
+ * This file handles CLI argument parsing and translates them into
5
+ * createAgentSession() options. The SDK does the heavy lifting.
6
+ */
7
+ import { createInterface } from "node:readline";
8
+ import { modelsAreEqual } from "@earendil-works/pi-ai";
9
+ import chalk from "chalk";
10
+ import { parseArgs, printHelp } from "./cli/args.js";
11
+ import { processFileArguments } from "./cli/file-processor.js";
12
+ import { buildInitialMessage } from "./cli/initial-message.js";
13
+ import { listModels } from "./cli/list-models.js";
14
+ import { createProjectTrustContext } from "./cli/project-trust.js";
15
+ import { selectSession } from "./cli/session-picker.js";
16
+ import { showStartupSelector } from "./cli/startup-ui.js";
17
+ import { ENV_SESSION_DIR, expandTildePath, getAgentDir, getPackageDir, VERSION } from "./config.js";
18
+ import { createAgentSessionRuntime } from "./core/agent-session-runtime.js";
19
+ import { createAgentSessionFromServices, createAgentSessionServices, } from "./core/agent-session-services.js";
20
+ import { formatNoModelsAvailableMessage } from "./core/auth-guidance.js";
21
+ import { AuthStorage } from "./core/auth-storage.js";
22
+ import { exportFromFile } from "./core/export-html/index.js";
23
+ import { configureHttpDispatcher } from "./core/http-dispatcher.js";
24
+ import { resolveCliModel, resolveModelScope } from "./core/model-resolver.js";
25
+ import { restoreStdout, takeOverStdout } from "./core/output-guard.js";
26
+ import { resolveProjectTrusted } from "./core/project-trust.js";
27
+ import { formatMissingSessionCwdPrompt, getMissingSessionCwdIssue, MissingSessionCwdError, } from "./core/session-cwd.js";
28
+ import { assertValidSessionId, SessionManager } from "./core/session-manager.js";
29
+ import { SettingsManager } from "./core/settings-manager.js";
30
+ import { printTimings, resetTimings, time } from "./core/timings.js";
31
+ import { hasTrustRequiringProjectResources as hasProjectTrustInputs, ProjectTrustStore } from "./core/trust-manager.js";
32
+ import { runMigrations, showDeprecationWarnings } from "./migrations.js";
33
+ import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index.js";
34
+ import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme.js";
35
+ import { handleConfigCommand, handlePackageCommand } from "./package-manager-cli.js";
36
+ import { isLocalPath, normalizePath, resolvePath } from "./utils/paths.js";
37
+ import { cleanupWindowsSelfUpdateQuarantine } from "./utils/windows-self-update.js";
38
+ /**
39
+ * Read all content from piped stdin.
40
+ * Returns undefined if stdin is a TTY (interactive terminal).
41
+ */
42
+ async function readPipedStdin() {
43
+ // If stdin is a TTY, we're running interactively - don't read stdin
44
+ if (process.stdin.isTTY) {
45
+ return undefined;
46
+ }
47
+ return new Promise((resolve) => {
48
+ let data = "";
49
+ process.stdin.setEncoding("utf8");
50
+ process.stdin.on("data", (chunk) => {
51
+ data += chunk;
52
+ });
53
+ process.stdin.on("end", () => {
54
+ resolve(data.trim() || undefined);
55
+ });
56
+ process.stdin.resume();
57
+ });
58
+ }
59
+ function collectSettingsDiagnostics(settingsManager, context) {
60
+ return settingsManager.drainErrors().map(({ scope, error }) => ({
61
+ type: "warning",
62
+ message: `(${context}, ${scope} settings) ${error.message}`,
63
+ }));
64
+ }
65
+ function reportDiagnostics(diagnostics) {
66
+ for (const diagnostic of diagnostics) {
67
+ const color = diagnostic.type === "error" ? chalk.red : diagnostic.type === "warning" ? chalk.yellow : chalk.dim;
68
+ const prefix = diagnostic.type === "error" ? "Error: " : diagnostic.type === "warning" ? "Warning: " : "";
69
+ console.error(color(`${prefix}${diagnostic.message}`));
70
+ }
71
+ }
72
+ function isTruthyEnvFlag(value) {
73
+ if (!value)
74
+ return false;
75
+ return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
76
+ }
77
+ function resolveAppMode(parsed, stdinIsTTY, stdoutIsTTY) {
78
+ if (parsed.mode === "rpc") {
79
+ return "rpc";
80
+ }
81
+ if (parsed.mode === "json") {
82
+ return "json";
83
+ }
84
+ if (parsed.print || !stdinIsTTY || !stdoutIsTTY) {
85
+ return "print";
86
+ }
87
+ return "interactive";
88
+ }
89
+ function toPrintOutputMode(appMode) {
90
+ return appMode === "json" ? "json" : "text";
91
+ }
92
+ function isPlainRuntimeMetadataCommand(parsed) {
93
+ return !parsed.print && parsed.mode === undefined && (parsed.help === true || parsed.listModels !== undefined);
94
+ }
95
+ async function prepareInitialMessage(parsed, autoResizeImages, stdinContent) {
96
+ if (parsed.fileArgs.length === 0) {
97
+ return buildInitialMessage({ parsed, stdinContent });
98
+ }
99
+ const { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });
100
+ return buildInitialMessage({
101
+ parsed,
102
+ fileText: text,
103
+ fileImages: images,
104
+ stdinContent,
105
+ });
106
+ }
107
+ /**
108
+ * Resolve a session argument to a file path.
109
+ * If it looks like a path, use as-is. Otherwise try to match as session ID prefix.
110
+ */
111
+ async function findLocalSessionByExactId(sessionId, cwd, sessionDir) {
112
+ const localSessions = await SessionManager.list(cwd, sessionDir);
113
+ const localMatch = localSessions.find((s) => s.id === sessionId);
114
+ return localMatch ? { type: "local", path: localMatch.path } : undefined;
115
+ }
116
+ async function resolveSessionPath(sessionArg, cwd, sessionDir) {
117
+ // If it looks like a file path, resolve it before handing it to the session manager.
118
+ if (sessionArg.includes("/") || sessionArg.includes("\\") || sessionArg.endsWith(".jsonl")) {
119
+ return { type: "path", path: resolvePath(sessionArg, cwd) };
120
+ }
121
+ // Try to match as session ID in current project first
122
+ const localSessions = await SessionManager.list(cwd, sessionDir);
123
+ const localMatch = localSessions.find((s) => s.id === sessionArg) ?? localSessions.find((s) => s.id.startsWith(sessionArg));
124
+ if (localMatch) {
125
+ return { type: "local", path: localMatch.path };
126
+ }
127
+ // Try global search across all projects
128
+ const allSessions = await SessionManager.listAll(sessionDir);
129
+ const globalMatch = allSessions.find((s) => s.id === sessionArg) ?? allSessions.find((s) => s.id.startsWith(sessionArg));
130
+ if (globalMatch) {
131
+ return { type: "global", path: globalMatch.path, cwd: globalMatch.cwd };
132
+ }
133
+ // Not found anywhere
134
+ return { type: "not_found", arg: sessionArg };
135
+ }
136
+ /** Prompt user for yes/no confirmation */
137
+ async function promptConfirm(message) {
138
+ return new Promise((resolve) => {
139
+ const rl = createInterface({
140
+ input: process.stdin,
141
+ output: process.stdout,
142
+ });
143
+ rl.question(`${message} [y/N] `, (answer) => {
144
+ rl.close();
145
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
146
+ });
147
+ });
148
+ }
149
+ function validateForkFlags(parsed) {
150
+ if (!parsed.fork)
151
+ return;
152
+ const conflictingFlags = [
153
+ parsed.session ? "--session" : undefined,
154
+ parsed.continue ? "--continue" : undefined,
155
+ parsed.resume ? "--resume" : undefined,
156
+ parsed.noSession ? "--no-session" : undefined,
157
+ ].filter((flag) => flag !== undefined);
158
+ if (conflictingFlags.length > 0) {
159
+ console.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`));
160
+ process.exit(1);
161
+ }
162
+ }
163
+ function validateSessionIdFlags(parsed) {
164
+ if (parsed.sessionId === undefined)
165
+ return;
166
+ const conflictingFlags = [
167
+ parsed.session ? "--session" : undefined,
168
+ parsed.continue ? "--continue" : undefined,
169
+ parsed.resume ? "--resume" : undefined,
170
+ parsed.noSession ? "--no-session" : undefined,
171
+ ].filter((flag) => flag !== undefined);
172
+ if (conflictingFlags.length > 0) {
173
+ console.error(chalk.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`));
174
+ process.exit(1);
175
+ }
176
+ try {
177
+ assertValidSessionId(parsed.sessionId);
178
+ }
179
+ catch (error) {
180
+ const message = error instanceof Error ? error.message : String(error);
181
+ console.error(chalk.red(`Error: ${message}`));
182
+ process.exit(1);
183
+ }
184
+ }
185
+ function forkSessionOrExit(sourcePath, cwd, sessionDir, sessionId) {
186
+ try {
187
+ return SessionManager.forkFrom(sourcePath, cwd, sessionDir, { id: sessionId });
188
+ }
189
+ catch (error) {
190
+ const message = error instanceof Error ? error.message : String(error);
191
+ console.error(chalk.red(`Error: ${message}`));
192
+ process.exit(1);
193
+ }
194
+ }
195
+ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
196
+ if (parsed.noSession || parsed.help || parsed.listModels !== undefined) {
197
+ return SessionManager.inMemory(cwd);
198
+ }
199
+ if (parsed.fork) {
200
+ if (parsed.sessionId) {
201
+ const existingTarget = await findLocalSessionByExactId(parsed.sessionId, cwd, sessionDir);
202
+ if (existingTarget) {
203
+ console.error(chalk.red(`Session already exists with id '${parsed.sessionId}'`));
204
+ process.exit(1);
205
+ }
206
+ }
207
+ const resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);
208
+ switch (resolved.type) {
209
+ case "path":
210
+ case "local":
211
+ case "global":
212
+ return forkSessionOrExit(resolved.path, cwd, sessionDir, parsed.sessionId);
213
+ case "not_found":
214
+ console.error(chalk.red(`No session found matching '${resolved.arg}'`));
215
+ process.exit(1);
216
+ }
217
+ }
218
+ if (parsed.session) {
219
+ const resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);
220
+ switch (resolved.type) {
221
+ case "path":
222
+ case "local":
223
+ return SessionManager.open(resolved.path, sessionDir);
224
+ case "global": {
225
+ console.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));
226
+ const shouldFork = await promptConfirm("Fork this session into current directory?");
227
+ if (!shouldFork) {
228
+ console.log(chalk.dim("Aborted."));
229
+ process.exit(0);
230
+ }
231
+ return forkSessionOrExit(resolved.path, cwd, sessionDir);
232
+ }
233
+ case "not_found":
234
+ console.error(chalk.red(`No session found matching '${resolved.arg}'`));
235
+ process.exit(1);
236
+ }
237
+ }
238
+ if (parsed.resume) {
239
+ initTheme(settingsManager.getTheme(), true);
240
+ try {
241
+ const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), (onProgress) => SessionManager.listAll(sessionDir, onProgress));
242
+ if (!selectedPath) {
243
+ console.log(chalk.dim("No session selected"));
244
+ process.exit(0);
245
+ }
246
+ return SessionManager.open(selectedPath, sessionDir);
247
+ }
248
+ finally {
249
+ stopThemeWatcher();
250
+ }
251
+ }
252
+ if (parsed.continue) {
253
+ return SessionManager.continueRecent(cwd, sessionDir);
254
+ }
255
+ if (parsed.sessionId) {
256
+ const existingSession = await findLocalSessionByExactId(parsed.sessionId, cwd, sessionDir);
257
+ if (existingSession) {
258
+ return SessionManager.open(existingSession.path, sessionDir);
259
+ }
260
+ }
261
+ return SessionManager.create(cwd, sessionDir, { id: parsed.sessionId });
262
+ }
263
+ function buildSessionOptions(parsed, scopedModels, hasExistingSession, modelRegistry, settingsManager) {
264
+ const options = {};
265
+ const diagnostics = [];
266
+ let cliThinkingFromModel = false;
267
+ // Model from CLI
268
+ // - supports --provider <name> --model <pattern>
269
+ // - supports --model <provider>/<pattern>
270
+ if (parsed.model) {
271
+ const resolved = resolveCliModel({
272
+ cliProvider: parsed.provider,
273
+ cliModel: parsed.model,
274
+ modelRegistry,
275
+ });
276
+ if (resolved.warning) {
277
+ diagnostics.push({ type: "warning", message: resolved.warning });
278
+ }
279
+ if (resolved.error) {
280
+ diagnostics.push({ type: "error", message: resolved.error });
281
+ }
282
+ if (resolved.model) {
283
+ options.model = resolved.model;
284
+ // Allow "--model <pattern>:<thinking>" as a shorthand.
285
+ // Explicit --thinking still takes precedence (applied later).
286
+ if (!parsed.thinking && resolved.thinkingLevel) {
287
+ options.thinkingLevel = resolved.thinkingLevel;
288
+ cliThinkingFromModel = true;
289
+ }
290
+ }
291
+ }
292
+ if (!options.model && scopedModels.length > 0 && !hasExistingSession) {
293
+ // Check if saved default is in scoped models - use it if so, otherwise first scoped model
294
+ const savedProvider = settingsManager.getDefaultProvider();
295
+ const savedModelId = settingsManager.getDefaultModel();
296
+ const savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;
297
+ const savedInScope = savedModel ? scopedModels.find((sm) => modelsAreEqual(sm.model, savedModel)) : undefined;
298
+ if (savedInScope) {
299
+ options.model = savedInScope.model;
300
+ // Use thinking level from scoped model config if explicitly set
301
+ if (!parsed.thinking && savedInScope.thinkingLevel) {
302
+ options.thinkingLevel = savedInScope.thinkingLevel;
303
+ }
304
+ }
305
+ else {
306
+ options.model = scopedModels[0].model;
307
+ // Use thinking level from first scoped model if explicitly set
308
+ if (!parsed.thinking && scopedModels[0].thinkingLevel) {
309
+ options.thinkingLevel = scopedModels[0].thinkingLevel;
310
+ }
311
+ }
312
+ }
313
+ // Thinking level from CLI (takes precedence over scoped model thinking levels set above)
314
+ if (parsed.thinking) {
315
+ options.thinkingLevel = parsed.thinking;
316
+ }
317
+ // Scoped models for Ctrl+P cycling
318
+ // Keep thinking level undefined when not explicitly set in the model pattern.
319
+ // Undefined means "inherit current session thinking level" during cycling.
320
+ if (scopedModels.length > 0) {
321
+ options.scopedModels = scopedModels.map((sm) => ({
322
+ model: sm.model,
323
+ thinkingLevel: sm.thinkingLevel,
324
+ }));
325
+ }
326
+ // API key from CLI - set in authStorage
327
+ // (handled by caller before createAgentSession)
328
+ // Tools
329
+ if (parsed.noTools) {
330
+ options.noTools = "all";
331
+ }
332
+ else if (parsed.noBuiltinTools) {
333
+ options.noTools = "builtin";
334
+ }
335
+ if (parsed.tools) {
336
+ options.tools = [...parsed.tools];
337
+ }
338
+ if (parsed.excludeTools) {
339
+ options.excludeTools = [...parsed.excludeTools];
340
+ }
341
+ return { options, cliThinkingFromModel, diagnostics };
342
+ }
343
+ function resolveCliPaths(cwd, paths) {
344
+ return paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : value));
345
+ }
346
+ async function promptForMissingSessionCwd(issue, settingsManager) {
347
+ return showStartupSelector(settingsManager, formatMissingSessionCwdPrompt(issue), [
348
+ { label: "Continue", value: issue.fallbackCwd },
349
+ { label: "Cancel", value: undefined },
350
+ ]);
351
+ }
352
+ export async function main(args, options) {
353
+ resetTimings();
354
+ const offlineMode = args.includes("--offline") || isTruthyEnvFlag(process.env.PI_OFFLINE);
355
+ if (offlineMode) {
356
+ process.env.PI_OFFLINE = "1";
357
+ process.env.PI_SKIP_VERSION_CHECK = "1";
358
+ }
359
+ if (process.platform === "win32") {
360
+ cleanupWindowsSelfUpdateQuarantine(getPackageDir());
361
+ }
362
+ if (await handlePackageCommand(args, { extensionFactories: options?.extensionFactories })) {
363
+ return;
364
+ }
365
+ if (await handleConfigCommand(args, { extensionFactories: options?.extensionFactories })) {
366
+ return;
367
+ }
368
+ const parsed = parseArgs(args);
369
+ if (parsed.diagnostics.length > 0) {
370
+ for (const d of parsed.diagnostics) {
371
+ const color = d.type === "error" ? chalk.red : chalk.yellow;
372
+ console.error(color(`${d.type === "error" ? "Error" : "Warning"}: ${d.message}`));
373
+ }
374
+ if (parsed.diagnostics.some((d) => d.type === "error")) {
375
+ process.exit(1);
376
+ }
377
+ }
378
+ time("parseArgs");
379
+ if (parsed.version) {
380
+ console.log(VERSION);
381
+ process.exit(0);
382
+ }
383
+ if (parsed.export) {
384
+ let result;
385
+ try {
386
+ const outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;
387
+ result = await exportFromFile(parsed.export, outputPath);
388
+ }
389
+ catch (error) {
390
+ const message = error instanceof Error ? error.message : "Failed to export session";
391
+ console.error(chalk.red(`Error: ${message}`));
392
+ process.exit(1);
393
+ }
394
+ console.log(`Exported to: ${result}`);
395
+ process.exit(0);
396
+ }
397
+ let appMode = resolveAppMode(parsed, process.stdin.isTTY, process.stdout.isTTY);
398
+ const shouldTakeOverStdout = appMode !== "interactive" && !isPlainRuntimeMetadataCommand(parsed);
399
+ if (shouldTakeOverStdout) {
400
+ takeOverStdout();
401
+ }
402
+ if (parsed.mode === "rpc" && parsed.fileArgs.length > 0) {
403
+ console.error(chalk.red("Error: @file arguments are not supported in RPC mode"));
404
+ process.exit(1);
405
+ }
406
+ validateForkFlags(parsed);
407
+ validateSessionIdFlags(parsed);
408
+ // Run migrations (pass cwd for project-local migrations)
409
+ const { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());
410
+ time("runMigrations");
411
+ const cwd = process.cwd();
412
+ const agentDir = getAgentDir();
413
+ const startupSettingsManager = SettingsManager.create(cwd, agentDir);
414
+ reportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, "startup session lookup"));
415
+ // Decide the final runtime cwd before creating cwd-bound runtime services.
416
+ // --session and --resume may select a session from another project, so project-local
417
+ // settings, resources, provider registrations, and models must be resolved only after
418
+ // the target session cwd is known. The startup-cwd settings manager is used only for
419
+ // sessionDir lookup during session selection.
420
+ const envSessionDir = process.env[ENV_SESSION_DIR];
421
+ const sessionDir = (parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??
422
+ (envSessionDir ? expandTildePath(envSessionDir) : undefined) ??
423
+ startupSettingsManager.getSessionDir();
424
+ let sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager);
425
+ const missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);
426
+ if (missingSessionCwdIssue) {
427
+ if (appMode === "interactive") {
428
+ const selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);
429
+ if (!selectedCwd) {
430
+ process.exit(0);
431
+ }
432
+ sessionManager = SessionManager.open(missingSessionCwdIssue.sessionFile, sessionDir, selectedCwd);
433
+ }
434
+ else {
435
+ console.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));
436
+ process.exit(1);
437
+ }
438
+ }
439
+ if (parsed.name !== undefined) {
440
+ const name = parsed.name.trim();
441
+ if (!name) {
442
+ console.error(chalk.red("Error: --name requires a non-empty value"));
443
+ process.exit(1);
444
+ }
445
+ sessionManager.appendSessionInfo(name);
446
+ }
447
+ time("createSessionManager");
448
+ const trustStore = new ProjectTrustStore(agentDir);
449
+ const sessionCwd = sessionManager.getCwd();
450
+ const autoTrustOnReloadCwd = parsed.projectTrustOverride === undefined && !hasProjectTrustInputs(sessionCwd) ? sessionCwd : undefined;
451
+ const trustPromptMode = parsed.help || parsed.listModels !== undefined ? "print" : appMode;
452
+ const projectTrustByCwd = new Map();
453
+ const resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);
454
+ const resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);
455
+ const resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);
456
+ const resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);
457
+ const authStorage = AuthStorage.create();
458
+ const createRuntime = async ({ cwd, agentDir, sessionManager, sessionStartEvent, projectTrustContext, }) => {
459
+ const isInitialRuntime = sessionStartEvent === undefined;
460
+ const projectTrustDiagnostics = [];
461
+ const cachedProjectTrust = projectTrustByCwd.get(cwd);
462
+ const hasTrustInputs = hasProjectTrustInputs(cwd);
463
+ const shouldResolveProjectTrust = parsed.projectTrustOverride === undefined && cachedProjectTrust === undefined && hasTrustInputs;
464
+ const projectTrusted = shouldResolveProjectTrust
465
+ ? false
466
+ : (cachedProjectTrust ?? parsed.projectTrustOverride ?? (!hasTrustInputs || trustStore.get(cwd) === true));
467
+ const runtimeSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted });
468
+ const services = await createAgentSessionServices({
469
+ cwd,
470
+ agentDir,
471
+ authStorage,
472
+ settingsManager: runtimeSettingsManager,
473
+ extensionFlagValues: parsed.unknownFlags,
474
+ resourceLoaderReloadOptions: shouldResolveProjectTrust
475
+ ? {
476
+ resolveProjectTrust: async ({ extensionsResult }) => {
477
+ const trusted = await resolveProjectTrusted({
478
+ cwd,
479
+ trustStore,
480
+ trustOverride: parsed.projectTrustOverride,
481
+ defaultProjectTrust: startupSettingsManager.getDefaultProjectTrust(),
482
+ extensionsResult,
483
+ projectTrustContext: projectTrustContext ??
484
+ createProjectTrustContext({
485
+ cwd,
486
+ mode: isInitialRuntime ? trustPromptMode : appMode,
487
+ settingsManager: startupSettingsManager,
488
+ hasUI: isInitialRuntime && trustPromptMode === "interactive",
489
+ }),
490
+ onExtensionError: (message) => projectTrustDiagnostics.push({ type: "warning", message }),
491
+ });
492
+ projectTrustByCwd.set(cwd, trusted);
493
+ return trusted;
494
+ },
495
+ }
496
+ : undefined,
497
+ resourceLoaderOptions: {
498
+ additionalExtensionPaths: resolvedExtensionPaths,
499
+ additionalSkillPaths: resolvedSkillPaths,
500
+ additionalPromptTemplatePaths: resolvedPromptTemplatePaths,
501
+ additionalThemePaths: resolvedThemePaths,
502
+ noExtensions: parsed.noExtensions,
503
+ noSkills: parsed.noSkills,
504
+ noPromptTemplates: parsed.noPromptTemplates,
505
+ noThemes: parsed.noThemes,
506
+ noContextFiles: parsed.noContextFiles,
507
+ systemPrompt: parsed.systemPrompt,
508
+ appendSystemPrompt: parsed.appendSystemPrompt,
509
+ extensionFactories: options?.extensionFactories,
510
+ },
511
+ });
512
+ const { settingsManager, modelRegistry, resourceLoader } = services;
513
+ const diagnostics = [
514
+ ...projectTrustDiagnostics,
515
+ ...services.diagnostics,
516
+ ...collectSettingsDiagnostics(settingsManager, "runtime creation"),
517
+ ...resourceLoader.getExtensions().errors.map(({ path, error }) => ({
518
+ type: "error",
519
+ message: `Failed to load extension "${path}": ${error}`,
520
+ })),
521
+ ];
522
+ const modelPatterns = parsed.models ?? settingsManager.getEnabledModels();
523
+ const scopedModels = modelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];
524
+ const { options: sessionOptions, cliThinkingFromModel, diagnostics: sessionOptionDiagnostics, } = buildSessionOptions(parsed, scopedModels, sessionManager.buildSessionContext().messages.length > 0, modelRegistry, settingsManager);
525
+ diagnostics.push(...sessionOptionDiagnostics);
526
+ if (parsed.apiKey) {
527
+ if (!sessionOptions.model) {
528
+ diagnostics.push({
529
+ type: "error",
530
+ message: "--api-key requires a model to be specified via --model, --provider/--model, or --models",
531
+ });
532
+ }
533
+ else {
534
+ authStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);
535
+ }
536
+ }
537
+ const created = await createAgentSessionFromServices({
538
+ services,
539
+ sessionManager,
540
+ sessionStartEvent,
541
+ model: sessionOptions.model,
542
+ thinkingLevel: sessionOptions.thinkingLevel,
543
+ scopedModels: sessionOptions.scopedModels,
544
+ tools: sessionOptions.tools,
545
+ excludeTools: sessionOptions.excludeTools,
546
+ noTools: sessionOptions.noTools,
547
+ customTools: sessionOptions.customTools,
548
+ });
549
+ const cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;
550
+ if (created.session.model && cliThinkingOverride) {
551
+ created.session.setThinkingLevel(created.session.thinkingLevel);
552
+ }
553
+ return {
554
+ ...created,
555
+ services,
556
+ diagnostics,
557
+ };
558
+ };
559
+ time("createRuntime");
560
+ const runtime = await createAgentSessionRuntime(createRuntime, {
561
+ cwd: sessionManager.getCwd(),
562
+ agentDir,
563
+ sessionManager,
564
+ });
565
+ time("createAgentSessionRuntime");
566
+ const { services, session, modelFallbackMessage } = runtime;
567
+ const { settingsManager, modelRegistry, resourceLoader } = services;
568
+ configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());
569
+ if (parsed.help) {
570
+ const extensionFlags = resourceLoader
571
+ .getExtensions()
572
+ .extensions.flatMap((extension) => Array.from(extension.flags.values()));
573
+ printHelp(extensionFlags);
574
+ process.exit(0);
575
+ }
576
+ if (parsed.listModels !== undefined) {
577
+ const searchPattern = typeof parsed.listModels === "string" ? parsed.listModels : undefined;
578
+ await listModels(modelRegistry, searchPattern);
579
+ process.exit(0);
580
+ }
581
+ // Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
582
+ let stdinContent;
583
+ if (appMode !== "rpc") {
584
+ stdinContent = await readPipedStdin();
585
+ if (stdinContent !== undefined && appMode === "interactive") {
586
+ appMode = "print";
587
+ }
588
+ }
589
+ time("readPipedStdin");
590
+ const { initialMessage, initialImages } = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize(), stdinContent);
591
+ time("prepareInitialMessage");
592
+ initTheme(settingsManager.getTheme(), appMode === "interactive");
593
+ time("initTheme");
594
+ // Show deprecation warnings in interactive mode
595
+ if (appMode === "interactive" && deprecationWarnings.length > 0) {
596
+ await showDeprecationWarnings(deprecationWarnings);
597
+ }
598
+ time("resolveModelScope");
599
+ reportDiagnostics(runtime.diagnostics);
600
+ // ── pi-coding-master 自修复引擎 · 扩展加载边界 ──────────────────────────────────────
601
+ // 单个扩展(器官)加载失败【不该杀掉整个 pi】(用户原话:"不想再因为一两行问题进不去了")。
602
+ // loader 已逐扩展 try/catch 隔离(收集 error、继续加载其余),这里把"扩展加载失败"从【致命 exit】
603
+ // 降为【红字报错但继续启动】—— pi 带着能用的器官照常起来,agent 看到"X 器官坏了:<error>"自己去修。
604
+ // 非扩展类 error(模型/配置等真致命的)仍然 exit(1)。
605
+ if (runtime.diagnostics.some((diagnostic) => diagnostic.type === "error" && !/Failed to load extension/.test(diagnostic.message))) {
606
+ process.exit(1);
607
+ }
608
+ time("createAgentSession");
609
+ if (appMode !== "interactive" && !session.model) {
610
+ console.error(chalk.red(formatNoModelsAvailableMessage()));
611
+ process.exit(1);
612
+ }
613
+ const startupBenchmark = isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK);
614
+ if (startupBenchmark && appMode !== "interactive") {
615
+ console.error(chalk.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode"));
616
+ process.exit(1);
617
+ }
618
+ if (appMode === "rpc") {
619
+ printTimings();
620
+ await runRpcMode(runtime);
621
+ }
622
+ else if (appMode === "interactive") {
623
+ const interactiveMode = new InteractiveMode(runtime, {
624
+ migratedProviders,
625
+ modelFallbackMessage,
626
+ autoTrustOnReloadCwd,
627
+ initialMessage,
628
+ initialImages,
629
+ initialMessages: parsed.messages,
630
+ verbose: parsed.verbose,
631
+ });
632
+ if (startupBenchmark) {
633
+ await interactiveMode.init();
634
+ time("interactiveMode.init");
635
+ printTimings();
636
+ interactiveMode.stop();
637
+ stopThemeWatcher();
638
+ if (process.stdout.writableLength > 0) {
639
+ await new Promise((resolve) => process.stdout.once("drain", resolve));
640
+ }
641
+ if (process.stderr.writableLength > 0) {
642
+ await new Promise((resolve) => process.stderr.once("drain", resolve));
643
+ }
644
+ return;
645
+ }
646
+ printTimings();
647
+ await interactiveMode.run();
648
+ }
649
+ else {
650
+ printTimings();
651
+ const exitCode = await runPrintMode(runtime, {
652
+ mode: toPrintOutputMode(appMode),
653
+ messages: parsed.messages,
654
+ initialMessage,
655
+ initialImages,
656
+ });
657
+ stopThemeWatcher();
658
+ restoreStdout();
659
+ if (exitCode !== 0) {
660
+ process.exitCode = exitCode;
661
+ }
662
+ return;
663
+ }
664
+ }
665
+ //# sourceMappingURL=main.js.map