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,529 @@
1
+ // calendar/holiday-calendar.ts — 节假日数据 + 阴历换算
2
+ // Apple Calendar 级别的中美节假日,支持阴历节日
3
+ // Lunar data: 1901-2099, auto-generated by cnlunar (196 years)
4
+ // Leap months handled correctly via leapIdx
5
+
6
+ import * as fs from "fs";
7
+ import * as path from "path";
8
+
9
+ // ── Region ────────────────────────────────────────────────────
10
+ export type Region = "CN" | "US";
11
+
12
+ export function getRegion(personDir: string): Region {
13
+ try {
14
+ const raw = JSON.parse(fs.readFileSync(path.join(personDir, "settings.json"), "utf8"));
15
+ return raw.region === "US" ? "US" : "CN";
16
+ } catch {
17
+ return "CN";
18
+ }
19
+ }
20
+
21
+ export function setRegion(personDir: string, region: Region) {
22
+ let settings: any = {};
23
+ try {
24
+ settings = JSON.parse(fs.readFileSync(path.join(personDir, "settings.json"), "utf8"));
25
+ } catch {}
26
+ settings.region = region;
27
+ fs.writeFileSync(path.join(personDir, "settings.json"), JSON.stringify(settings, null, 2));
28
+ }
29
+
30
+ // ── Holiday type ──────────────────────────────────────────────
31
+ export interface Holiday {
32
+ date: string; // YYYY-MM-DD
33
+ name: string;
34
+ emoji: string;
35
+ type: "public" | "observance" | "traditional";
36
+ lunar?: string;
37
+ }
38
+
39
+ // ── Helpers ───────────────────────────────────────────────────
40
+ function nthWeekdayOf(year: number, month: number, weekday: number, n: number): string {
41
+ const d = new Date(year, month - 1, 1);
42
+ while (d.getDay() !== weekday) d.setDate(d.getDate() + 1);
43
+ d.setDate(d.getDate() + (n - 1) * 7);
44
+ return d.toISOString().slice(0, 10);
45
+ }
46
+ function lastWeekdayOf(year: number, month: number, weekday: number): string {
47
+ const d = new Date(year, month, 0);
48
+ while (d.getDay() !== weekday) d.setDate(d.getDate() - 1);
49
+ return d.toISOString().slice(0, 10);
50
+ }
51
+
52
+ // ── US Holidays (Federal + observances, matching Apple Calendar) ──
53
+ function usHolidays(year: number): Holiday[] {
54
+ const h: Holiday[] = [
55
+ { date: `${year}-01-01`, name: "New Year's Day", emoji: "", type: "public" },
56
+ { date: nthWeekdayOf(year, 1, 1, 3), name: "Martin Luther King Jr. Day", emoji: "", type: "public" },
57
+ { date: nthWeekdayOf(year, 2, 1, 3), name: "Presidents' Day", emoji: "", type: "public" },
58
+ { date: lastWeekdayOf(year, 5, 1), name: "Memorial Day", emoji: "", type: "public" },
59
+ { date: `${year}-06-19`, name: "Juneteenth", emoji: "", type: "public" },
60
+ { date: `${year}-07-04`, name: "Independence Day", emoji: "", type: "public" },
61
+ { date: nthWeekdayOf(year, 9, 1, 1), name: "Labor Day", emoji: "", type: "public" },
62
+ { date: nthWeekdayOf(year, 10, 1, 2), name: "Columbus Day", emoji: "", type: "public" },
63
+ { date: `${year}-11-11`, name: "Veterans Day", emoji: "", type: "public" },
64
+ { date: nthWeekdayOf(year, 11, 4, 4), name: "Thanksgiving", emoji: "", type: "public" },
65
+ { date: `${year}-12-25`, name: "Christmas Day", emoji: "", type: "public" },
66
+ ];
67
+ h.push(
68
+ { date: `${year}-02-14`, name: "Valentine's Day", emoji: "", type: "observance" },
69
+ { date: `${year}-03-17`, name: "St. Patrick's Day", emoji: "", type: "observance" },
70
+ { date: `${year}-10-31`, name: "Halloween", emoji: "", type: "observance" },
71
+ { date: `${year}-12-24`, name: "Christmas Eve", emoji: "", type: "observance" },
72
+ { date: `${year}-12-31`, name: "New Year's Eve", emoji: "", type: "observance" },
73
+ );
74
+ // Easter (Gauss algorithm)
75
+ const a = year % 19, b = Math.floor(year / 100), c = year % 100;
76
+ const d = Math.floor(b / 4), e = b % 4, f = Math.floor((b + 8) / 25);
77
+ const g = Math.floor((b - f + 1) / 3);
78
+ const hh = (19 * a + b - d - g + 15) % 30;
79
+ const i = Math.floor(c / 4), k = c % 4;
80
+ const l = (32 + 2 * e + 2 * i - hh - k) % 7;
81
+ const m = Math.floor((a + 11 * hh + 22 * l) / 451);
82
+ const mo = Math.floor((hh + l - 7 * m + 114) / 31);
83
+ const da = ((hh + l - 7 * m + 114) % 31) + 1;
84
+ const easter = `${year}-${String(mo).padStart(2, "0")}-${String(da).padStart(2, "0")}`;
85
+ h.push({ date: easter, name: "Easter", emoji: "", type: "observance" });
86
+ const ed = new Date(easter + "T00:00:00");
87
+ ed.setDate(ed.getDate() - 2);
88
+ h.push({ date: ed.toISOString().slice(0, 10), name: "Good Friday", emoji: "", type: "observance" });
89
+ h.push({ date: nthWeekdayOf(year, 5, 0, 2), name: "Mother's Day", emoji: "", type: "observance" });
90
+ h.push({ date: nthWeekdayOf(year, 6, 0, 3), name: "Father's Day", emoji: "", type: "observance" });
91
+ return h;
92
+ }
93
+
94
+ // ── Lunar calendar data (1901-2099) ──────────────────────────
95
+ // cny: Chinese New Year solar date
96
+ // leapIdx: 0-based index of leap month (null if none)
97
+ // lengths: 12 (normal) or 13 (leap) entries of 29 or 30 days
98
+
99
+ const LUNAR_DATA: Record<number, {
100
+ cny: string;
101
+ leapIdx: number | null;
102
+ lengths: number[];
103
+ }> = {
104
+ 1901: { cny: '1901-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,30,29] },
105
+ 1902: { cny: '1902-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,29,30,30,30] },
106
+ 1903: { cny: '1903-01-29', leapIdx: 4, lengths: [29,30,29,30,29,29,30,29,29,30,30,29,30] },
107
+ 1904: { cny: '1904-02-16', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,30,29] },
108
+ 1905: { cny: '1905-02-04', leapIdx: null, lengths: [30,30,29,30,30,29,29,30,29,30,29,30] },
109
+ 1906: { cny: '1906-01-25', leapIdx: 3, lengths: [29,30,30,29,30,29,30,29,30,29,30,29,30] },
110
+ 1907: { cny: '1907-02-13', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
111
+ 1908: { cny: '1908-02-02', leapIdx: null, lengths: [30,29,29,30,30,29,30,29,30,30,29,30] },
112
+ 1909: { cny: '1909-01-22', leapIdx: 1, lengths: [29,30,29,29,30,29,30,29,30,30,30,29,30] },
113
+ 1910: { cny: '1910-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,30,29] },
114
+ 1911: { cny: '1911-01-30', leapIdx: 5, lengths: [30,29,30,29,29,30,29,29,30,30,29,30,30] },
115
+ 1912: { cny: '1912-02-18', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,29,30] },
116
+ 1913: { cny: '1913-02-06', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,29,30] },
117
+ 1914: { cny: '1914-01-26', leapIdx: 4, lengths: [30,30,29,30,29,30,29,30,29,29,30,29,30] },
118
+ 1915: { cny: '1915-02-14', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,29] },
119
+ 1916: { cny: '1916-02-03', leapIdx: null, lengths: [30,30,29,30,29,30,30,29,30,29,30,29] },
120
+ 1917: { cny: '1917-01-23', leapIdx: 1, lengths: [30,29,29,30,29,30,30,29,30,30,29,30,29] },
121
+ 1918: { cny: '1918-02-11', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,30,29,30,30] },
122
+ 1919: { cny: '1919-02-01', leapIdx: 6, lengths: [29,30,29,29,30,29,29,30,30,29,30,30,30] },
123
+ 1920: { cny: '1920-02-20', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
124
+ 1921: { cny: '1921-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,29,30,30] },
125
+ 1922: { cny: '1922-01-28', leapIdx: 4, lengths: [30,29,30,30,29,29,30,29,29,30,29,30,30] },
126
+ 1923: { cny: '1923-02-16', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,29,30,29,30] },
127
+ 1924: { cny: '1924-02-05', leapIdx: null, lengths: [29,30,30,29,30,30,29,30,29,30,29,29] },
128
+ 1925: { cny: '1925-01-24', leapIdx: 3, lengths: [30,29,30,29,30,30,29,30,30,29,30,29,30] },
129
+ 1926: { cny: '1926-02-13', leapIdx: null, lengths: [29,29,30,29,30,29,30,30,29,30,30,29] },
130
+ 1927: { cny: '1927-02-02', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,29,30,30,30] },
131
+ 1928: { cny: '1928-01-23', leapIdx: 1, lengths: [29,30,29,29,30,29,29,30,29,30,30,30,30] },
132
+ 1929: { cny: '1929-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
133
+ 1930: { cny: '1930-01-30', leapIdx: 5, lengths: [29,30,30,29,29,30,29,29,30,29,30,30,29] },
134
+ 1931: { cny: '1931-02-17', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
135
+ 1932: { cny: '1932-02-06', leapIdx: null, lengths: [30,30,30,29,30,29,30,29,29,30,29,30] },
136
+ 1933: { cny: '1933-01-26', leapIdx: 4, lengths: [29,30,30,29,30,30,29,30,29,30,29,29,30] },
137
+ 1934: { cny: '1934-02-14', leapIdx: null, lengths: [29,30,29,30,30,29,30,29,30,30,29,30] },
138
+ 1935: { cny: '1935-02-04', leapIdx: null, lengths: [29,29,30,29,30,29,30,30,29,30,30,29] },
139
+ 1936: { cny: '1936-01-24', leapIdx: 2, lengths: [30,29,29,30,29,29,30,30,29,30,30,30,29] },
140
+ 1937: { cny: '1937-02-11', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,30,29] },
141
+ 1938: { cny: '1938-01-31', leapIdx: 6, lengths: [30,30,29,29,30,29,29,30,29,30,30,29,30] },
142
+ 1939: { cny: '1939-02-19', leapIdx: null, lengths: [30,30,29,29,30,29,29,30,29,30,29,30] },
143
+ 1940: { cny: '1940-02-08', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
144
+ 1941: { cny: '1941-01-27', leapIdx: 5, lengths: [30,30,29,30,30,29,30,29,29,30,29,30,29] },
145
+ 1942: { cny: '1942-02-15', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,30] },
146
+ 1943: { cny: '1943-02-05', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
147
+ 1944: { cny: '1944-01-25', leapIdx: 3, lengths: [30,29,30,29,30,29,30,29,30,30,29,30,30] },
148
+ 1945: { cny: '1945-02-13', leapIdx: null, lengths: [29,29,30,29,29,30,29,30,30,30,29,30] },
149
+ 1946: { cny: '1946-02-02', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,29,30] },
150
+ 1947: { cny: '1947-01-22', leapIdx: 1, lengths: [30,30,29,29,30,29,29,30,29,30,29,30,30] },
151
+ 1948: { cny: '1948-02-10', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,30,29,30] },
152
+ 1949: { cny: '1949-01-29', leapIdx: 6, lengths: [30,29,30,30,29,30,29,29,30,29,30,29,30] },
153
+ 1950: { cny: '1950-02-17', leapIdx: null, lengths: [29,30,30,29,30,30,29,29,30,29,30,29] },
154
+ 1951: { cny: '1951-02-06', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,30] },
155
+ 1952: { cny: '1952-01-27', leapIdx: 4, lengths: [29,30,29,30,29,30,29,30,30,29,30,29,30] },
156
+ 1953: { cny: '1953-02-14', leapIdx: null, lengths: [29,30,29,29,30,30,29,30,30,29,30,29] },
157
+ 1954: { cny: '1954-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,30,29,30,30] },
158
+ 1955: { cny: '1955-01-24', leapIdx: 2, lengths: [29,30,29,30,29,29,30,29,30,29,30,30,30] },
159
+ 1956: { cny: '1956-02-12', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,29,30,30] },
160
+ 1957: { cny: '1957-01-31', leapIdx: 7, lengths: [30,29,30,29,30,29,29,30,29,30,29,30,29] },
161
+ 1958: { cny: '1958-02-18', leapIdx: null, lengths: [30,30,30,29,30,29,29,30,29,30,29,30] },
162
+ 1959: { cny: '1959-02-08', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
163
+ 1960: { cny: '1960-01-28', leapIdx: 5, lengths: [30,29,30,29,30,30,29,30,29,30,29,30,29] },
164
+ 1961: { cny: '1961-02-15', leapIdx: null, lengths: [30,29,30,29,30,29,30,30,29,30,29,30] },
165
+ 1962: { cny: '1962-02-05', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,29,30,30,29] },
166
+ 1963: { cny: '1963-01-25', leapIdx: 3, lengths: [30,29,30,29,29,30,29,30,29,30,30,30,29] },
167
+ 1964: { cny: '1964-02-13', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,29,30,30,30] },
168
+ 1965: { cny: '1965-02-02', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,29,30,30,29] },
169
+ 1966: { cny: '1966-01-21', leapIdx: 2, lengths: [30,30,30,29,30,29,29,30,29,29,30,30,29] },
170
+ 1967: { cny: '1967-02-09', leapIdx: null, lengths: [30,30,29,30,30,29,29,30,29,30,29,30] },
171
+ 1968: { cny: '1968-01-30', leapIdx: 6, lengths: [29,30,29,30,30,29,30,29,30,29,30,29,30] },
172
+ 1969: { cny: '1969-02-17', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
173
+ 1970: { cny: '1970-02-06', leapIdx: null, lengths: [30,29,29,30,29,30,30,29,30,30,29,30] },
174
+ 1971: { cny: '1971-01-27', leapIdx: 4, lengths: [29,30,29,29,30,29,30,29,30,30,30,29,30] },
175
+ 1972: { cny: '1972-02-15', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,29,30] },
176
+ 1973: { cny: '1973-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,29,30] },
177
+ 1974: { cny: '1974-01-23', leapIdx: 3, lengths: [30,30,29,30,29,29,30,29,29,30,30,29,30] },
178
+ 1975: { cny: '1975-02-11', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,29,30] },
179
+ 1976: { cny: '1976-01-31', leapIdx: 7, lengths: [30,30,29,30,29,30,29,30,29,29,30,29,30] },
180
+ 1977: { cny: '1977-02-18', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,29] },
181
+ 1978: { cny: '1978-02-07', leapIdx: null, lengths: [30,29,30,30,29,30,30,29,30,29,30,29] },
182
+ 1979: { cny: '1979-01-28', leapIdx: 5, lengths: [30,29,29,30,29,30,30,29,30,30,29,30,29] },
183
+ 1980: { cny: '1980-02-16', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,30,29,30,30] },
184
+ 1981: { cny: '1981-02-05', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,30,29,30,30] },
185
+ 1982: { cny: '1982-01-25', leapIdx: 3, lengths: [30,29,30,29,29,30,29,29,30,29,30,30,30] },
186
+ 1983: { cny: '1983-02-13', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,29,30,30] },
187
+ 1984: { cny: '1984-02-02', leapIdx: 9, lengths: [30,29,30,30,29,29,30,29,29,30,29,30,30] },
188
+ 1985: { cny: '1985-02-20', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,29,30,29,30] },
189
+ 1986: { cny: '1986-02-09', leapIdx: null, lengths: [29,30,30,29,30,30,29,30,29,30,29,29] },
190
+ 1987: { cny: '1987-01-29', leapIdx: 5, lengths: [30,29,30,29,30,30,29,30,30,29,30,29,29] },
191
+ 1988: { cny: '1988-02-17', leapIdx: null, lengths: [30,29,30,29,30,29,30,30,29,30,30,29] },
192
+ 1989: { cny: '1989-02-06', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,29,30,30,30] },
193
+ 1990: { cny: '1990-01-27', leapIdx: 4, lengths: [29,30,29,29,30,29,29,30,29,30,30,30,30] },
194
+ 1991: { cny: '1991-02-15', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
195
+ 1992: { cny: '1992-02-04', leapIdx: null, lengths: [29,30,30,29,29,30,29,29,30,29,30,30] },
196
+ 1993: { cny: '1993-01-23', leapIdx: 2, lengths: [29,30,30,29,30,29,30,29,29,30,29,30,29] },
197
+ 1994: { cny: '1994-02-10', leapIdx: null, lengths: [30,30,30,29,30,29,30,29,29,30,29,30] },
198
+ 1995: { cny: '1995-01-31', leapIdx: 7, lengths: [29,30,30,29,30,29,30,30,29,29,30,29,30] },
199
+ 1996: { cny: '1996-02-19', leapIdx: null, lengths: [29,30,29,30,30,29,30,29,30,30,29,29] },
200
+ 1997: { cny: '1997-02-07', leapIdx: null, lengths: [30,29,30,29,30,29,30,30,29,30,30,29] },
201
+ 1998: { cny: '1998-01-28', leapIdx: 4, lengths: [30,29,29,30,29,29,30,30,29,30,30,29,30] },
202
+ 1999: { cny: '1999-02-16', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,30,29] },
203
+ 2000: { cny: '2000-02-05', leapIdx: null, lengths: [30,30,29,29,30,29,29,30,29,30,30,29] },
204
+ 2001: { cny: '2001-01-24', leapIdx: 3, lengths: [30,30,29,30,29,30,29,29,30,29,30,29,30] },
205
+ 2002: { cny: '2002-02-12', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
206
+ 2003: { cny: '2003-02-01', leapIdx: null, lengths: [30,30,29,30,30,29,30,29,29,30,29,30] },
207
+ 2004: { cny: '2004-01-22', leapIdx: 1, lengths: [29,30,29,30,30,29,30,29,30,29,30,29,30] },
208
+ 2005: { cny: '2005-02-09', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
209
+ 2006: { cny: '2006-01-29', leapIdx: 6, lengths: [30,29,30,29,30,29,30,29,30,30,29,30,30] },
210
+ 2007: { cny: '2007-02-18', leapIdx: null, lengths: [29,29,30,29,29,30,29,30,30,30,29,30] },
211
+ 2008: { cny: '2008-02-07', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,29,30] },
212
+ 2009: { cny: '2009-01-26', leapIdx: 4, lengths: [30,30,29,29,30,29,29,30,29,30,29,30,30] },
213
+ 2010: { cny: '2010-02-14', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,30,29,30] },
214
+ 2011: { cny: '2011-02-03', leapIdx: null, lengths: [30,29,30,30,29,30,29,29,30,29,30,29] },
215
+ 2012: { cny: '2012-01-23', leapIdx: 3, lengths: [30,29,30,30,29,30,29,30,29,30,29,30,29] },
216
+ 2013: { cny: '2013-02-10', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
217
+ 2014: { cny: '2014-01-31', leapIdx: 8, lengths: [29,30,29,30,29,30,29,30,30,29,30,29,30] },
218
+ 2015: { cny: '2015-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,30,29,30,29] },
219
+ 2016: { cny: '2016-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,30,29,30,30] },
220
+ 2017: { cny: '2017-01-28', leapIdx: 5, lengths: [29,30,29,30,29,29,30,29,30,29,30,30,30] },
221
+ 2018: { cny: '2018-02-16', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,29,30,30] },
222
+ 2019: { cny: '2019-02-05', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,29,30,30] },
223
+ 2020: { cny: '2020-01-25', leapIdx: 3, lengths: [29,30,30,30,29,30,29,29,30,29,30,29,30] },
224
+ 2021: { cny: '2021-02-12', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
225
+ 2022: { cny: '2022-02-01', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
226
+ 2023: { cny: '2023-01-22', leapIdx: 1, lengths: [29,30,29,29,30,30,29,30,30,29,30,29,30] },
227
+ 2024: { cny: '2024-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,29,30,30,29] },
228
+ 2025: { cny: '2025-01-29', leapIdx: 5, lengths: [30,29,30,29,29,30,29,30,29,30,30,30,29] },
229
+ 2026: { cny: '2026-02-17', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,30,29] },
230
+ 2027: { cny: '2027-02-06', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,30,29] },
231
+ 2028: { cny: '2028-01-26', leapIdx: 4, lengths: [30,30,30,29,30,29,29,30,29,29,30,30,29] },
232
+ 2029: { cny: '2029-02-13', leapIdx: null, lengths: [30,30,29,30,29,30,29,30,29,29,30,30] },
233
+ 2030: { cny: '2030-02-03', leapIdx: null, lengths: [29,30,29,30,30,29,30,29,30,29,30,29] },
234
+ 2031: { cny: '2031-01-23', leapIdx: 2, lengths: [29,30,30,29,30,29,30,30,29,30,29,30,29] },
235
+ 2032: { cny: '2032-02-11', leapIdx: null, lengths: [30,29,29,30,29,30,30,29,30,30,29,30] },
236
+ 2033: { cny: '2033-01-31', leapIdx: 10, lengths: [29,30,29,29,30,29,30,29,30,30,30,29,30] },
237
+ 2034: { cny: '2034-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,29,30] },
238
+ 2035: { cny: '2035-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,29,30] },
239
+ 2036: { cny: '2036-01-28', leapIdx: 5, lengths: [30,30,29,30,29,29,30,29,29,30,29,30,30] },
240
+ 2037: { cny: '2037-02-15', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,29,30] },
241
+ 2038: { cny: '2038-02-04', leapIdx: null, lengths: [30,30,29,30,29,30,29,30,29,29,30,29] },
242
+ 2039: { cny: '2039-01-24', leapIdx: 4, lengths: [30,30,29,30,30,29,30,29,30,29,30,29,29] },
243
+ 2040: { cny: '2040-02-12', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,30,29,30,29] },
244
+ 2041: { cny: '2041-02-01', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,30,29,30] },
245
+ 2042: { cny: '2042-01-22', leapIdx: 1, lengths: [29,30,29,29,30,29,30,29,30,30,29,30,30] },
246
+ 2043: { cny: '2043-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,30,29,30,30] },
247
+ 2044: { cny: '2044-01-30', leapIdx: 6, lengths: [30,29,30,29,29,30,29,29,30,29,30,30,30] },
248
+ 2045: { cny: '2045-02-17', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,29,30,30] },
249
+ 2046: { cny: '2046-02-06', leapIdx: null, lengths: [30,29,30,29,30,29,30,29,29,30,29,30] },
250
+ 2047: { cny: '2047-01-26', leapIdx: 4, lengths: [30,29,30,30,29,30,29,30,29,29,30,29,30] },
251
+ 2048: { cny: '2048-02-14', leapIdx: null, lengths: [29,30,30,29,30,30,29,30,29,29,30,29] },
252
+ 2049: { cny: '2049-02-02', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,30,29,30,29] },
253
+ 2050: { cny: '2050-01-23', leapIdx: 2, lengths: [29,30,29,30,29,30,29,30,30,29,30,30,29] },
254
+ 2051: { cny: '2051-02-11', leapIdx: null, lengths: [30,29,29,30,29,29,30,30,29,30,30,30] },
255
+ 2052: { cny: '2052-02-01', leapIdx: 7, lengths: [29,30,29,29,30,29,29,30,29,30,30,30,30] },
256
+ 2053: { cny: '2053-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
257
+ 2054: { cny: '2054-02-08', leapIdx: null, lengths: [29,30,30,29,29,30,29,29,30,29,30,30] },
258
+ 2055: { cny: '2055-01-28', leapIdx: 5, lengths: [29,30,30,29,30,29,30,29,29,30,29,30,29] },
259
+ 2056: { cny: '2056-02-15', leapIdx: null, lengths: [30,30,30,29,30,29,30,29,29,30,29,30] },
260
+ 2057: { cny: '2057-02-04', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
261
+ 2058: { cny: '2058-01-24', leapIdx: 3, lengths: [30,29,30,29,30,29,30,30,29,30,30,29,29] },
262
+ 2059: { cny: '2059-02-12', leapIdx: null, lengths: [30,29,30,29,30,29,30,29,30,30,30,29] },
263
+ 2060: { cny: '2060-02-02', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,30,29] },
264
+ 2061: { cny: '2061-01-21', leapIdx: 2, lengths: [30,30,29,29,30,29,29,30,29,30,30,30,29] },
265
+ 2062: { cny: '2062-02-09', leapIdx: null, lengths: [30,30,29,29,30,29,29,30,29,30,30,29] },
266
+ 2063: { cny: '2063-01-29', leapIdx: 6, lengths: [30,30,29,30,29,30,29,29,30,29,30,29,30] },
267
+ 2064: { cny: '2064-02-17', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
268
+ 2065: { cny: '2065-02-05', leapIdx: null, lengths: [30,30,29,30,30,29,30,29,29,30,29,30] },
269
+ 2066: { cny: '2066-01-26', leapIdx: 4, lengths: [29,30,29,30,30,29,30,29,30,29,30,29,30] },
270
+ 2067: { cny: '2067-02-14', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
271
+ 2068: { cny: '2068-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,30,29,30,30,29,30] },
272
+ 2069: { cny: '2069-01-23', leapIdx: 3, lengths: [29,30,29,30,29,29,30,29,30,30,30,29,30] },
273
+ 2070: { cny: '2070-02-11', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,30,29,30] },
274
+ 2071: { cny: '2071-01-31', leapIdx: 7, lengths: [30,29,30,29,30,29,29,30,29,30,29,30,30] },
275
+ 2072: { cny: '2072-02-19', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,30,29,30] },
276
+ 2073: { cny: '2073-02-07', leapIdx: null, lengths: [30,29,30,30,29,30,29,29,30,29,30,29] },
277
+ 2074: { cny: '2074-01-27', leapIdx: 5, lengths: [30,29,30,30,29,30,29,30,29,30,29,30,29] },
278
+ 2075: { cny: '2075-02-15', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
279
+ 2076: { cny: '2076-02-05', leapIdx: null, lengths: [29,30,29,30,29,30,29,30,30,29,30,29] },
280
+ 2077: { cny: '2077-01-24', leapIdx: 3, lengths: [30,29,30,29,29,30,29,30,30,30,29,30,29] },
281
+ 2078: { cny: '2078-02-12', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,30,29,30,30] },
282
+ 2079: { cny: '2079-02-02', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,29,30,30] },
283
+ 2080: { cny: '2080-01-22', leapIdx: 2, lengths: [30,29,30,29,30,29,29,30,29,29,30,30,30] },
284
+ 2081: { cny: '2081-02-09', leapIdx: null, lengths: [29,30,30,29,30,29,29,30,29,29,30,30] },
285
+ 2082: { cny: '2082-01-29', leapIdx: 6, lengths: [29,30,30,30,29,29,30,29,30,29,29,30,30] },
286
+ 2083: { cny: '2083-02-17', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
287
+ 2084: { cny: '2084-02-06', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
288
+ 2085: { cny: '2085-01-26', leapIdx: 4, lengths: [29,30,29,29,30,30,29,30,30,29,30,29,30] },
289
+ 2086: { cny: '2086-02-14', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,29,30,30,29] },
290
+ 2087: { cny: '2087-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,29,30,30,30] },
291
+ 2088: { cny: '2088-01-24', leapIdx: 3, lengths: [29,30,29,30,29,29,30,29,29,30,30,30,29] },
292
+ 2089: { cny: '2089-02-10', leapIdx: null, lengths: [30,30,29,30,29,29,29,30,29,30,30,29] },
293
+ 2090: { cny: '2090-01-30', leapIdx: 7, lengths: [30,30,30,29,30,29,29,30,29,29,30,30,29] },
294
+ 2091: { cny: '2091-02-18', leapIdx: null, lengths: [30,30,29,30,29,30,29,30,29,29,30,29] },
295
+ 2092: { cny: '2092-02-07', leapIdx: null, lengths: [30,30,29,30,30,29,30,29,30,29,30,29] },
296
+ 2093: { cny: '2093-01-27', leapIdx: 5, lengths: [29,30,30,29,30,29,30,30,29,30,29,30,29] },
297
+ 2094: { cny: '2094-02-15', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,30,29,30] },
298
+ 2095: { cny: '2095-02-05', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,30,29] },
299
+ 2096: { cny: '2096-01-25', leapIdx: 3, lengths: [30,29,30,29,29,30,29,29,30,30,30,29,30] },
300
+ 2097: { cny: '2097-02-12', leapIdx: null, lengths: [30,29,30,29,29,29,30,29,30,30,29,30] },
301
+ 2098: { cny: '2098-02-01', leapIdx: null, lengths: [30,30,29,30,29,29,29,30,29,30,29,30] },
302
+ 2099: { cny: '2099-01-21', leapIdx: 1, lengths: [30,30,29,30,30,29,29,30,29,29,30,29,30] },
303
+ };
304
+
305
+ // ── Lunar calendar names ─────────────────────────────────────
306
+ const LUNAR_MONTH = ["正","二","三","四","五","六","七","八","九","十","冬","腊"];
307
+ const LUNAR_DAY = ["初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"];
308
+
309
+ // ── solarToLunar: Convert solar date to lunar date ───────────
310
+ export interface LunarDate {
311
+ lunarYear: number;
312
+ lunarMonth: number; // 1-12
313
+ lunarDay: number; // 1-30
314
+ isLeap: boolean;
315
+ monthName: string; // e.g. "六" or "闰六"
316
+ dayName: string; // e.g. "初五"
317
+ }
318
+
319
+ export function solarToLunar(solarDate: string): LunarDate | null {
320
+ const d = new Date(solarDate + "T00:00:00");
321
+ if (isNaN(d.getTime())) return null;
322
+
323
+ // Find the lunar year this date belongs to
324
+ // A date belongs to lunar year Y if it is >= CNY of Y and < CNY of Y+1
325
+ let lunarYear = d.getFullYear();
326
+
327
+ // Check if date is before CNY of this solar year
328
+ const thisYearData = LUNAR_DATA[lunarYear];
329
+ if (thisYearData) {
330
+ const cnyThis = new Date(thisYearData.cny + "T00:00:00");
331
+ if (d < cnyThis) {
332
+ lunarYear--;
333
+ }
334
+ }
335
+
336
+ // Verify: check if date >= CNY of next year
337
+ const nextYearData = LUNAR_DATA[lunarYear + 1];
338
+ if (nextYearData) {
339
+ const cnyNext = new Date(nextYearData.cny + "T00:00:00");
340
+ if (d >= cnyNext) {
341
+ lunarYear++;
342
+ }
343
+ }
344
+
345
+ const data = LUNAR_DATA[lunarYear];
346
+ if (!data) return null;
347
+
348
+ // Iterate through months to find the right one
349
+ const cny = new Date(data.cny + "T00:00:00");
350
+ let cursor = new Date(cny);
351
+ const totalMonths = data.lengths.length;
352
+
353
+ for (let i = 0; i < totalMonths; i++) {
354
+ const monthLen = data.lengths[i];
355
+ const nextCursor = new Date(cursor);
356
+ nextCursor.setDate(nextCursor.getDate() + monthLen);
357
+
358
+ if (d >= cursor && d < nextCursor) {
359
+ const dayOffset = Math.floor((d.getTime() - cursor.getTime()) / 86400000);
360
+ const lunarDay = dayOffset + 1;
361
+
362
+ // Determine month number and leap status
363
+ // leapIdx points to the REGULAR month; leap month is at leapIdx+1
364
+ let lunarMonth: number;
365
+ let isLeap = false;
366
+
367
+ if (data.leapIdx === null) {
368
+ lunarMonth = i + 1;
369
+ } else if (i === data.leapIdx + 1) {
370
+ lunarMonth = data.leapIdx + 1;
371
+ isLeap = true;
372
+ } else if (i > data.leapIdx + 1) {
373
+ lunarMonth = i; // shift: leap month takes one slot
374
+ } else {
375
+ lunarMonth = i + 1;
376
+ }
377
+
378
+ const monthIdx = lunarMonth - 1;
379
+ const monthName = isLeap ? `闰${LUNAR_MONTH[monthIdx]}` : LUNAR_MONTH[monthIdx];
380
+ const dayName = LUNAR_DAY[lunarDay - 1] || String(lunarDay);
381
+
382
+ return {
383
+ lunarYear,
384
+ lunarMonth,
385
+ lunarDay,
386
+ isLeap,
387
+ monthName,
388
+ dayName,
389
+ };
390
+ }
391
+
392
+ cursor = nextCursor;
393
+ }
394
+
395
+ return null;
396
+ }
397
+
398
+ // ── lunarDate: Convert lunar date to solar date ──────────────
399
+ export function lunarDate(lunarYear: number, lunarMonth: number, lunarDay: number, isLeap = false): string {
400
+ const data = LUNAR_DATA[lunarYear];
401
+ if (!data) return "";
402
+
403
+ // Calculate the target month index in the lengths array
404
+ // leapIdx points to REGULAR month, leap month is at leapIdx+1
405
+ let targetIdx: number;
406
+ if (data.leapIdx === null) {
407
+ targetIdx = lunarMonth - 1;
408
+ } else if (isLeap && lunarMonth === data.leapIdx + 1) {
409
+ targetIdx = data.leapIdx + 1; // leap month is right after its regular counterpart
410
+ } else if (lunarMonth > data.leapIdx + 1) {
411
+ targetIdx = lunarMonth; // months after leap shift by 1
412
+ } else {
413
+ targetIdx = lunarMonth - 1;
414
+ }
415
+
416
+ if (targetIdx < 0 || targetIdx >= data.lengths.length) return "";
417
+
418
+ // Sum days from CNY to the target month start
419
+ const cny = new Date(data.cny + "T00:00:00");
420
+ let days = 0;
421
+ for (let i = 0; i < targetIdx; i++) {
422
+ days += data.lengths[i];
423
+ }
424
+ days += lunarDay - 1;
425
+
426
+ const result = new Date(cny);
427
+ result.setDate(result.getDate() + days);
428
+ return result.toISOString().slice(0, 10);
429
+ }
430
+
431
+ // ── 清明节: 太阳黄经15° ──────────────────────────────────────
432
+ // Accurate algorithm instead of hardcoded table
433
+ function qingmingDate(year: number): string {
434
+ // Qingming is around April 4-6 each year
435
+ // Using the formula: 清明日期 = (Y*D+C)-L
436
+ // Y = year % 100, D = 0.2422, C = 4.81 (for 20th century) or 5.59 (for 21st century)
437
+ // L = Math.floor(Y/4)
438
+ const Y = year % 100;
439
+ const D = 0.2422;
440
+ const C = year < 2000 ? 4.81 : (year < 2100 ? 5.59 : 5.59); // simplified
441
+ const L = Math.floor(Y / 4);
442
+ const day = Math.floor(Y * D + C) - L;
443
+ return `${year}-04-${String(day).padStart(2, "0")}`;
444
+ }
445
+
446
+ // ── China Holidays (法定节假日 + 传统节日) ──
447
+ function cnHolidays(year: number): Holiday[] {
448
+ const h: Holiday[] = [];
449
+
450
+ h.push({ date: `${year}-01-01`, name: "元旦", emoji: "", type: "public" });
451
+
452
+ // 春节 (正月初一 + 除夕 + 初二 + 初三)
453
+ const sf = lunarDate(year, 1, 1);
454
+ if (sf) {
455
+ const eve = new Date(sf + "T00:00:00"); eve.setDate(eve.getDate() - 1);
456
+ // Get correct lunar label for 除夕
457
+ const eveLunar = solarToLunar(eve.toISOString().slice(0, 10));
458
+ const eveLabel = eveLunar ? `${eveLunar.monthName}月${eveLunar.dayName}` : "腊月三十";
459
+ h.push({ date: eve.toISOString().slice(0, 10), name: "除夕", emoji: "", type: "traditional", lunar: eveLabel });
460
+
461
+ const d2 = new Date(sf + "T00:00:00"); d2.setDate(d2.getDate() + 1);
462
+ const d3 = new Date(sf + "T00:00:00"); d3.setDate(d3.getDate() + 2);
463
+ h.push({ date: sf, name: "春节", emoji: "", type: "public", lunar: "正月初一" });
464
+ h.push({ date: d2.toISOString().slice(0, 10), name: "春节·初二", emoji: "", type: "public" });
465
+ h.push({ date: d3.toISOString().slice(0, 10), name: "春节·初三", emoji: "", type: "public" });
466
+ }
467
+
468
+ // 元宵节 (正月十五)
469
+ const yx = lunarDate(year, 1, 15);
470
+ if (yx) h.push({ date: yx, name: "元宵节", emoji: "", type: "traditional", lunar: "正月十五" });
471
+
472
+ // 清明节
473
+ h.push({ date: qingmingDate(year), name: "清明节", emoji: "", type: "public" });
474
+
475
+ // 劳动节
476
+ h.push({ date: `${year}-05-01`, name: "劳动节", emoji: "", type: "public" });
477
+
478
+ // 端午节 (五月初五)
479
+ const db = lunarDate(year, 5, 5);
480
+ if (db) h.push({ date: db, name: "端午节", emoji: "", type: "public", lunar: "五月初五" });
481
+
482
+ // 七夕 (七月初七)
483
+ const qx = lunarDate(year, 7, 7);
484
+ if (qx) h.push({ date: qx, name: "七夕", emoji: "", type: "traditional", lunar: "七月初七" });
485
+
486
+ // 中元节 (七月十五)
487
+ const zy = lunarDate(year, 7, 15);
488
+ if (zy) h.push({ date: zy, name: "中元节", emoji: "", type: "traditional", lunar: "七月十五" });
489
+
490
+ // 中秋节 (八月十五)
491
+ const ma = lunarDate(year, 8, 15);
492
+ if (ma) h.push({ date: ma, name: "中秋节", emoji: "", type: "public", lunar: "八月十五" });
493
+
494
+ // 重阳节 (九月初九)
495
+ const cy = lunarDate(year, 9, 9);
496
+ if (cy) h.push({ date: cy, name: "重阳节", emoji: "", type: "traditional", lunar: "九月初九" });
497
+
498
+ // 国庆
499
+ h.push({ date: `${year}-10-01`, name: "国庆节", emoji: "", type: "public" });
500
+ h.push({ date: `${year}-10-02`, name: "国庆节·第2天", emoji: "", type: "public" });
501
+ h.push({ date: `${year}-10-03`, name: "国庆节·第3天", emoji: "", type: "public" });
502
+
503
+ // 腊八 (腊月初八)
504
+ const lb = lunarDate(year, 12, 8);
505
+ if (lb) h.push({ date: lb, name: "腊八节", emoji: "", type: "traditional", lunar: "腊月初八" });
506
+
507
+ // 小年 (腊月廿三)
508
+ const xn = lunarDate(year, 12, 23);
509
+ if (xn) h.push({ date: xn, name: "小年", emoji: "", type: "traditional", lunar: "腊月廿三" });
510
+
511
+ return h;
512
+ }
513
+
514
+ // ── Public API ────────────────────────────────────────────────
515
+ export function getHolidays(region: Region, year: number): Holiday[] {
516
+ return region === "US" ? usHolidays(year) : cnHolidays(year);
517
+ }
518
+
519
+ export function getHolidaysForDate(region: Region, date: string): Holiday[] {
520
+ const year = parseInt(date.slice(0, 4));
521
+ return getHolidays(region, year).filter(h => h.date === date);
522
+ }
523
+
524
+ export function getHolidaysForRange(region: Region, start: string, end: string): Holiday[] {
525
+ const sy = parseInt(start.slice(0, 4)), ey = parseInt(end.slice(0, 4));
526
+ const all: Holiday[] = [];
527
+ for (let y = sy; y <= ey; y++) all.push(...getHolidays(region, y));
528
+ return all.filter(h => h.date >= start && h.date <= end);
529
+ }