yee88 0.8.0__tar.gz → 0.9.0__tar.gz

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 (277) hide show
  1. yee88-0.9.0/.coverage +0 -0
  2. yee88-0.9.0/.git +1 -0
  3. yee88-0.9.0/.sisyphus/drafts/cron-system-fix.md +55 -0
  4. yee88-0.9.0/.sisyphus/plans/cron-system-full-fix.md +960 -0
  5. {yee88-0.8.0 → yee88-0.9.0}/PKG-INFO +1 -1
  6. {yee88-0.8.0 → yee88-0.9.0}/docs/user-guide-zh.md +119 -2
  7. {yee88-0.8.0 → yee88-0.9.0}/pyproject.toml +1 -1
  8. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cron/manager.py +12 -20
  9. yee88-0.9.0/src/yee88/cron/scheduler.py +150 -0
  10. yee88-0.9.0/src/yee88/cron/watch.py +54 -0
  11. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/loop.py +61 -8
  12. {yee88-0.8.0 → yee88-0.9.0}/uv.lock +1 -1
  13. yee88-0.8.0/src/yee88/cron/scheduler.py +0 -57
  14. {yee88-0.8.0 → yee88-0.9.0}/.codex/AGENTS.md +0 -0
  15. {yee88-0.8.0 → yee88-0.9.0}/.github/workflows/ci.yml +0 -0
  16. {yee88-0.8.0 → yee88-0.9.0}/.github/workflows/release.yml +0 -0
  17. {yee88-0.8.0 → yee88-0.9.0}/.gitignore +0 -0
  18. {yee88-0.8.0 → yee88-0.9.0}/Justfile +0 -0
  19. {yee88-0.8.0 → yee88-0.9.0}/LICENSE +0 -0
  20. {yee88-0.8.0 → yee88-0.9.0}/README.md +0 -0
  21. {yee88-0.8.0 → yee88-0.9.0}/changelog.md +0 -0
  22. {yee88-0.8.0 → yee88-0.9.0}/docs/assets/favicon.svg +0 -0
  23. {yee88-0.8.0 → yee88-0.9.0}/docs/assets/logo.svg +0 -0
  24. {yee88-0.8.0 → yee88-0.9.0}/docs/assets/og-image.jpg +0 -0
  25. {yee88-0.8.0 → yee88-0.9.0}/docs/assets/takopi.svg +0 -0
  26. {yee88-0.8.0 → yee88-0.9.0}/docs/developing.md +0 -0
  27. {yee88-0.8.0 → yee88-0.9.0}/docs/explanation/architecture.md +0 -0
  28. {yee88-0.8.0 → yee88-0.9.0}/docs/explanation/index.md +0 -0
  29. {yee88-0.8.0 → yee88-0.9.0}/docs/explanation/module-map.md +0 -0
  30. {yee88-0.8.0 → yee88-0.9.0}/docs/explanation/plugin-system.md +0 -0
  31. {yee88-0.8.0 → yee88-0.9.0}/docs/explanation/routing-and-sessions.md +0 -0
  32. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/add-a-runner.md +0 -0
  33. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/chat-sessions.md +0 -0
  34. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/dev-setup.md +0 -0
  35. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/file-transfer.md +0 -0
  36. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/index.md +0 -0
  37. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/projects.md +0 -0
  38. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/route-by-chat.md +0 -0
  39. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/schedule-tasks.md +0 -0
  40. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/switch-engines.md +0 -0
  41. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/topics.md +0 -0
  42. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/troubleshooting.md +0 -0
  43. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/voice-notes.md +0 -0
  44. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/worktrees.md +0 -0
  45. {yee88-0.8.0 → yee88-0.9.0}/docs/how-to/write-a-plugin.md +0 -0
  46. {yee88-0.8.0 → yee88-0.9.0}/docs/index.md +0 -0
  47. {yee88-0.8.0 → yee88-0.9.0}/docs/javascripts/hero-chat.js +0 -0
  48. {yee88-0.8.0 → yee88-0.9.0}/docs/overrides/.icons/takopi/takopi.svg +0 -0
  49. {yee88-0.8.0 → yee88-0.9.0}/docs/overrides/main.html +0 -0
  50. {yee88-0.8.0 → yee88-0.9.0}/docs/plugins.md +0 -0
  51. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/agents/index.md +0 -0
  52. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/agents/invariants.md +0 -0
  53. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/agents/repo-map.md +0 -0
  54. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/commands-and-directives.md +0 -0
  55. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/config.md +0 -0
  56. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/context-resolution.md +0 -0
  57. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/env-vars.md +0 -0
  58. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/index.md +0 -0
  59. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/plugin-api.md +0 -0
  60. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/plugins.md +0 -0
  61. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/claude/runner.md +0 -0
  62. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/claude/stream-json-cheatsheet.md +0 -0
  63. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/claude/takopi-events.md +0 -0
  64. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/codex/exec-json-cheatsheet.md +0 -0
  65. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/codex/takopi-events.md +0 -0
  66. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/index.md +0 -0
  67. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/opencode/runner.md +0 -0
  68. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/opencode/stream-json-cheatsheet.md +0 -0
  69. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/opencode/takopi-events.md +0 -0
  70. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/pi/runner.md +0 -0
  71. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/pi/stream-json-cheatsheet.md +0 -0
  72. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/runners/pi/takopi-events.md +0 -0
  73. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/specification.md +0 -0
  74. {yee88-0.8.0 → yee88-0.9.0}/docs/reference/transports/telegram.md +0 -0
  75. {yee88-0.8.0 → yee88-0.9.0}/docs/stylesheets/admonitions.css +0 -0
  76. {yee88-0.8.0 → yee88-0.9.0}/docs/stylesheets/hero-chat.css +0 -0
  77. {yee88-0.8.0 → yee88-0.9.0}/docs/stylesheets/workflow-preview.css +0 -0
  78. {yee88-0.8.0 → yee88-0.9.0}/docs/tutorials/conversation-modes.md +0 -0
  79. {yee88-0.8.0 → yee88-0.9.0}/docs/tutorials/first-run.md +0 -0
  80. {yee88-0.8.0 → yee88-0.9.0}/docs/tutorials/index.md +0 -0
  81. {yee88-0.8.0 → yee88-0.9.0}/docs/tutorials/install.md +0 -0
  82. {yee88-0.8.0 → yee88-0.9.0}/docs/tutorials/multi-engine.md +0 -0
  83. {yee88-0.8.0 → yee88-0.9.0}/docs/tutorials/projects-and-branches.md +0 -0
  84. {yee88-0.8.0 → yee88-0.9.0}/docs/user-guide.md +0 -0
  85. {yee88-0.8.0 → yee88-0.9.0}/readme.md +0 -0
  86. {yee88-0.8.0 → yee88-0.9.0}/scripts/commit_notify.py +0 -0
  87. {yee88-0.8.0 → yee88-0.9.0}/scripts/docs_build_cf.sh +0 -0
  88. {yee88-0.8.0 → yee88-0.9.0}/scripts/docs_prebuild.py +0 -0
  89. {yee88-0.8.0 → yee88-0.9.0}/scripts/onboarding_preview.py +0 -0
  90. {yee88-0.8.0 → yee88-0.9.0}/scripts/release_notify.py +0 -0
  91. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/__init__.py +0 -0
  92. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/api.py +0 -0
  93. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/backends.py +0 -0
  94. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/backends_helpers.py +0 -0
  95. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/__init__.py +0 -0
  96. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/config.py +0 -0
  97. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/cron.py +0 -0
  98. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/doctor.py +0 -0
  99. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/handoff.py +0 -0
  100. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/init.py +0 -0
  101. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/onboarding_cmd.py +0 -0
  102. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/plugins.py +0 -0
  103. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/reload.py +0 -0
  104. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/run.py +0 -0
  105. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cli/topic.py +0 -0
  106. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/commands.py +0 -0
  107. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/config.py +0 -0
  108. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/config_migrations.py +0 -0
  109. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/config_watch.py +0 -0
  110. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/context.py +0 -0
  111. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cron/__init__.py +0 -0
  112. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/cron/models.py +0 -0
  113. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/directives.py +0 -0
  114. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/engines.py +0 -0
  115. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/events.py +0 -0
  116. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/ids.py +0 -0
  117. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/lockfile.py +0 -0
  118. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/logging.py +0 -0
  119. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/markdown.py +0 -0
  120. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/model.py +0 -0
  121. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/plugins.py +0 -0
  122. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/presenter.py +0 -0
  123. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/progress.py +0 -0
  124. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/router.py +0 -0
  125. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runner.py +0 -0
  126. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runner_bridge.py +0 -0
  127. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/__init__.py +0 -0
  128. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/claude.py +0 -0
  129. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/codex.py +0 -0
  130. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/mock.py +0 -0
  131. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/opencode.py +0 -0
  132. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/pi.py +0 -0
  133. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/run_options.py +0 -0
  134. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runners/tool_actions.py +0 -0
  135. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/runtime_loader.py +0 -0
  136. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/scheduler.py +0 -0
  137. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/schemas/__init__.py +0 -0
  138. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/schemas/claude.py +0 -0
  139. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/schemas/codex.py +0 -0
  140. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/schemas/opencode.py +0 -0
  141. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/schemas/pi.py +0 -0
  142. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/settings.py +0 -0
  143. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/skills/yee88/SKILL.md +0 -0
  144. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/__init__.py +0 -0
  145. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/api_models.py +0 -0
  146. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/api_schemas.py +0 -0
  147. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/backend.py +0 -0
  148. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/bridge.py +0 -0
  149. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/chat_prefs.py +0 -0
  150. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/chat_sessions.py +0 -0
  151. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/client.py +0 -0
  152. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/client_api.py +0 -0
  153. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/__init__.py +0 -0
  154. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/agent.py +0 -0
  155. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/cancel.py +0 -0
  156. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/dispatch.py +0 -0
  157. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/executor.py +0 -0
  158. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/file_transfer.py +0 -0
  159. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/handlers.py +0 -0
  160. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/media.py +0 -0
  161. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/menu.py +0 -0
  162. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/model.py +0 -0
  163. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/overrides.py +0 -0
  164. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/parse.py +0 -0
  165. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/plan.py +0 -0
  166. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/reasoning.py +0 -0
  167. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/reply.py +0 -0
  168. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/topics.py +0 -0
  169. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/commands/trigger.py +0 -0
  170. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/context.py +0 -0
  171. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/engine_defaults.py +0 -0
  172. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/engine_overrides.py +0 -0
  173. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/files.py +0 -0
  174. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/onboarding.py +0 -0
  175. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/outbox.py +0 -0
  176. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/parsing.py +0 -0
  177. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/render.py +0 -0
  178. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/state_store.py +0 -0
  179. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/topic_state.py +0 -0
  180. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/topics.py +0 -0
  181. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/trigger_mode.py +0 -0
  182. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/types.py +0 -0
  183. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/telegram/voice.py +0 -0
  184. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/transport.py +0 -0
  185. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/transport_runtime.py +0 -0
  186. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/transports.py +0 -0
  187. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/utils/__init__.py +0 -0
  188. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/utils/git.py +0 -0
  189. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/utils/json_state.py +0 -0
  190. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/utils/paths.py +0 -0
  191. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/utils/streams.py +0 -0
  192. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/utils/subprocess.py +0 -0
  193. {yee88-0.8.0 → yee88-0.9.0}/src/yee88/worktrees.py +0 -0
  194. {yee88-0.8.0 → yee88-0.9.0}/tests/__init__.py +0 -0
  195. {yee88-0.8.0 → yee88-0.9.0}/tests/conftest.py +0 -0
  196. {yee88-0.8.0 → yee88-0.9.0}/tests/factories.py +0 -0
  197. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/claude_stream_json_session.jsonl +0 -0
  198. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/codex_exec_json_all_formats.jsonl +0 -0
  199. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/codex_exec_json_all_formats.txt +0 -0
  200. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/opencode_run_json.jsonl +0 -0
  201. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/opencode_stream_error.jsonl +0 -0
  202. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/opencode_stream_success.jsonl +0 -0
  203. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/opencode_stream_success_no_reason.jsonl +0 -0
  204. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/pi_print_mode_events.jsonl +0 -0
  205. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/pi_stream_error.jsonl +0 -0
  206. {yee88-0.8.0 → yee88-0.9.0}/tests/fixtures/pi_stream_success.jsonl +0 -0
  207. {yee88-0.8.0 → yee88-0.9.0}/tests/plugin_fixtures.py +0 -0
  208. {yee88-0.8.0 → yee88-0.9.0}/tests/telegram_fakes.py +0 -0
  209. {yee88-0.8.0 → yee88-0.9.0}/tests/test_api_exports.py +0 -0
  210. {yee88-0.8.0 → yee88-0.9.0}/tests/test_auto_router.py +0 -0
  211. {yee88-0.8.0 → yee88-0.9.0}/tests/test_claude_runner.py +0 -0
  212. {yee88-0.8.0 → yee88-0.9.0}/tests/test_claude_schema.py +0 -0
  213. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cli_auto_router.py +0 -0
  214. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cli_chat_id.py +0 -0
  215. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cli_commands.py +0 -0
  216. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cli_config.py +0 -0
  217. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cli_doctor.py +0 -0
  218. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cli_helpers.py +0 -0
  219. {yee88-0.8.0 → yee88-0.9.0}/tests/test_codex_runner_helpers.py +0 -0
  220. {yee88-0.8.0 → yee88-0.9.0}/tests/test_codex_schema.py +0 -0
  221. {yee88-0.8.0 → yee88-0.9.0}/tests/test_codex_tool_result_summary.py +0 -0
  222. {yee88-0.8.0 → yee88-0.9.0}/tests/test_command_registry.py +0 -0
  223. {yee88-0.8.0 → yee88-0.9.0}/tests/test_config_store.py +0 -0
  224. {yee88-0.8.0 → yee88-0.9.0}/tests/test_config_watch.py +0 -0
  225. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cron_manager.py +0 -0
  226. {yee88-0.8.0 → yee88-0.9.0}/tests/test_cron_scheduler.py +0 -0
  227. {yee88-0.8.0 → yee88-0.9.0}/tests/test_engine_discovery.py +0 -0
  228. {yee88-0.8.0 → yee88-0.9.0}/tests/test_exec_bridge.py +0 -0
  229. {yee88-0.8.0 → yee88-0.9.0}/tests/test_exec_render.py +0 -0
  230. {yee88-0.8.0 → yee88-0.9.0}/tests/test_exec_runner.py +0 -0
  231. {yee88-0.8.0 → yee88-0.9.0}/tests/test_git_utils.py +0 -0
  232. {yee88-0.8.0 → yee88-0.9.0}/tests/test_lockfile.py +0 -0
  233. {yee88-0.8.0 → yee88-0.9.0}/tests/test_onboarding.py +0 -0
  234. {yee88-0.8.0 → yee88-0.9.0}/tests/test_onboarding_helpers.py +0 -0
  235. {yee88-0.8.0 → yee88-0.9.0}/tests/test_onboarding_interactive.py +0 -0
  236. {yee88-0.8.0 → yee88-0.9.0}/tests/test_opencode_runner.py +0 -0
  237. {yee88-0.8.0 → yee88-0.9.0}/tests/test_opencode_schema.py +0 -0
  238. {yee88-0.8.0 → yee88-0.9.0}/tests/test_paths.py +0 -0
  239. {yee88-0.8.0 → yee88-0.9.0}/tests/test_pi_runner.py +0 -0
  240. {yee88-0.8.0 → yee88-0.9.0}/tests/test_pi_schema.py +0 -0
  241. {yee88-0.8.0 → yee88-0.9.0}/tests/test_plugins.py +0 -0
  242. {yee88-0.8.0 → yee88-0.9.0}/tests/test_projects_config.py +0 -0
  243. {yee88-0.8.0 → yee88-0.9.0}/tests/test_rendering.py +0 -0
  244. {yee88-0.8.0 → yee88-0.9.0}/tests/test_runner_contract.py +0 -0
  245. {yee88-0.8.0 → yee88-0.9.0}/tests/test_runner_run_options.py +0 -0
  246. {yee88-0.8.0 → yee88-0.9.0}/tests/test_runner_utils.py +0 -0
  247. {yee88-0.8.0 → yee88-0.9.0}/tests/test_runtime_loader.py +0 -0
  248. {yee88-0.8.0 → yee88-0.9.0}/tests/test_settings.py +0 -0
  249. {yee88-0.8.0 → yee88-0.9.0}/tests/test_settings_contract.py +0 -0
  250. {yee88-0.8.0 → yee88-0.9.0}/tests/test_subprocess.py +0 -0
  251. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_agent_trigger_commands.py +0 -0
  252. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_backend.py +0 -0
  253. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_bridge.py +0 -0
  254. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_chat_prefs.py +0 -0
  255. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_chat_sessions.py +0 -0
  256. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_client.py +0 -0
  257. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_client_api.py +0 -0
  258. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_context_helpers.py +0 -0
  259. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_engine_defaults.py +0 -0
  260. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_engine_overrides.py +0 -0
  261. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_file_transfer_helpers.py +0 -0
  262. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_files.py +0 -0
  263. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_incoming.py +0 -0
  264. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_media_command.py +0 -0
  265. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_polling.py +0 -0
  266. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_queue.py +0 -0
  267. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_topic_state.py +0 -0
  268. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_topics_command.py +0 -0
  269. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_topics_helpers.py +0 -0
  270. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_trigger_mode.py +0 -0
  271. {yee88-0.8.0 → yee88-0.9.0}/tests/test_telegram_voice.py +0 -0
  272. {yee88-0.8.0 → yee88-0.9.0}/tests/test_tool_actions.py +0 -0
  273. {yee88-0.8.0 → yee88-0.9.0}/tests/test_transport.py +0 -0
  274. {yee88-0.8.0 → yee88-0.9.0}/tests/test_transport_registry.py +0 -0
  275. {yee88-0.8.0 → yee88-0.9.0}/tests/test_transport_runtime.py +0 -0
  276. {yee88-0.8.0 → yee88-0.9.0}/tests/test_worktrees.py +0 -0
  277. {yee88-0.8.0 → yee88-0.9.0}/zensical.toml +0 -0
yee88-0.9.0/.coverage ADDED
Binary file
yee88-0.9.0/.git ADDED
@@ -0,0 +1 @@
1
+ gitdir: /Users/yee.wang/Code/github/takopi/.git/worktrees/add-topic
@@ -0,0 +1,55 @@
1
+ # Draft: yee88 Cron 定时任务系统修复
2
+
3
+ ## 初始需求
4
+ 修复 Python Telegram Bridge 工具 (yee88) 中的 cron 定时任务系统
5
+
6
+ ## 待修复的问题清单 (优先级从高到低)
7
+
8
+ ### P0 - 错过执行补偿机制缺失 (manager.py)
9
+ - 问题:进程重启后会跳过应该执行的定时任务
10
+ - 示例:每天9:00执行的任务,若8:59崩溃、9:30重启,9:00的任务会被跳过
11
+ - 解决方案:使用 croniter.get_prev() 检测错过的执行并补偿
12
+
13
+ ### P0 - 任务重叠保护缺失 (scheduler.py)
14
+ - 问题:如果任务执行时间超过调度间隔,会导致同一个任务同时运行多次
15
+ - 解决方案:添加 anyio.Lock 和 running_jobs 集合来防止重叠
16
+
17
+ ### P1 - 轮询间隔过大且固定 (scheduler.py)
18
+ - 问题:当前固定60秒轮询,对于每5分钟执行的任务,最大延迟可达60秒
19
+ - 解决方案:实现智能计算下次检查时间,基于最近的任务调度
20
+
21
+ ### P1 - 任务执行无超时保护 (scheduler.py)
22
+ - 问题:如果 callback 永远挂起,会占用任务槽位
23
+ - 解决方案:使用 anyio.move_on_after() 添加3分钟超时
24
+
25
+ ### P1 - 配置热更新不彻底 (loop.py 和 scheduler.py)
26
+ - 问题:虽然使用了 watchfiles 监视主配置,但 cron 还是轮询式加载
27
+ - 解决方案:整合 watchfiles 的事件驱动机制到 cron 系统中
28
+
29
+ ### P2 - 日志增强 (scheduler.py, manager.py)
30
+ - 添加 missed_executions 统计日志
31
+
32
+ ## 文件结构
33
+ - src/yee88/cron/manager.py (186行) - CronManager 类
34
+ - src/yee88/cron/scheduler.py (58行) - CronScheduler 类
35
+ - src/yee88/cron/models.py (17行) - CronJob dataclass
36
+ - src/yee88/telegram/loop.py (~1500行) - run_main_loop()
37
+ - tests/test_cron_manager.py (422行)
38
+ - tests/test_cron_scheduler.py (143行)
39
+
40
+ ## 依赖
41
+ - croniter >= 2.0.0
42
+ - watchfiles
43
+ - anyio
44
+ - tomllib/tomli_w
45
+
46
+ ## 背景代理任务
47
+ - bg_5ea72908: Explore cron system codebase (状态: running - 29s, last tool: read)
48
+ - bg_ae7a8aef: Research cron best practices (状态: running - 27s, last tool: codesearch)
49
+
50
+ ## 下一步
51
+ 等待两个背景代理完成,获取:
52
+ 1. 现有代码的详细分析(尤其是 get_due_jobs() 和 start() 方法的实现)
53
+ 2. 最佳实践研究(croniter.get_prev(), anyio.Lock 等模式)
54
+
55
+ 然后制定详细的工作计划。