yee88 0.7.0__tar.gz → 0.7.1__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 (271) hide show
  1. {yee88-0.7.0 → yee88-0.7.1}/PKG-INFO +1 -1
  2. {yee88-0.7.0 → yee88-0.7.1}/changelog.md +30 -3
  3. {yee88-0.7.0 → yee88-0.7.1}/docs/user-guide-zh.md +90 -1
  4. {yee88-0.7.0 → yee88-0.7.1}/pyproject.toml +1 -1
  5. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/handoff.py +2 -0
  6. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/ids.py +1 -1
  7. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/skills/yee88/SKILL.md +26 -0
  8. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/handlers.py +2 -0
  9. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/menu.py +4 -1
  10. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/topics.py +82 -0
  11. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/loop.py +10 -0
  12. {yee88-0.7.0 → yee88-0.7.1}/uv.lock +1 -1
  13. {yee88-0.7.0 → yee88-0.7.1}/.codex/AGENTS.md +0 -0
  14. {yee88-0.7.0 → yee88-0.7.1}/.github/workflows/ci.yml +0 -0
  15. {yee88-0.7.0 → yee88-0.7.1}/.github/workflows/release.yml +0 -0
  16. {yee88-0.7.0 → yee88-0.7.1}/.gitignore +0 -0
  17. {yee88-0.7.0 → yee88-0.7.1}/Justfile +0 -0
  18. {yee88-0.7.0 → yee88-0.7.1}/LICENSE +0 -0
  19. {yee88-0.7.0 → yee88-0.7.1}/README.md +0 -0
  20. {yee88-0.7.0 → yee88-0.7.1}/docs/assets/favicon.svg +0 -0
  21. {yee88-0.7.0 → yee88-0.7.1}/docs/assets/logo.svg +0 -0
  22. {yee88-0.7.0 → yee88-0.7.1}/docs/assets/og-image.jpg +0 -0
  23. {yee88-0.7.0 → yee88-0.7.1}/docs/assets/takopi.svg +0 -0
  24. {yee88-0.7.0 → yee88-0.7.1}/docs/developing.md +0 -0
  25. {yee88-0.7.0 → yee88-0.7.1}/docs/explanation/architecture.md +0 -0
  26. {yee88-0.7.0 → yee88-0.7.1}/docs/explanation/index.md +0 -0
  27. {yee88-0.7.0 → yee88-0.7.1}/docs/explanation/module-map.md +0 -0
  28. {yee88-0.7.0 → yee88-0.7.1}/docs/explanation/plugin-system.md +0 -0
  29. {yee88-0.7.0 → yee88-0.7.1}/docs/explanation/routing-and-sessions.md +0 -0
  30. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/add-a-runner.md +0 -0
  31. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/chat-sessions.md +0 -0
  32. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/dev-setup.md +0 -0
  33. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/file-transfer.md +0 -0
  34. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/index.md +0 -0
  35. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/projects.md +0 -0
  36. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/route-by-chat.md +0 -0
  37. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/schedule-tasks.md +0 -0
  38. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/switch-engines.md +0 -0
  39. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/topics.md +0 -0
  40. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/troubleshooting.md +0 -0
  41. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/voice-notes.md +0 -0
  42. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/worktrees.md +0 -0
  43. {yee88-0.7.0 → yee88-0.7.1}/docs/how-to/write-a-plugin.md +0 -0
  44. {yee88-0.7.0 → yee88-0.7.1}/docs/index.md +0 -0
  45. {yee88-0.7.0 → yee88-0.7.1}/docs/javascripts/hero-chat.js +0 -0
  46. {yee88-0.7.0 → yee88-0.7.1}/docs/overrides/.icons/takopi/takopi.svg +0 -0
  47. {yee88-0.7.0 → yee88-0.7.1}/docs/overrides/main.html +0 -0
  48. {yee88-0.7.0 → yee88-0.7.1}/docs/plugins.md +0 -0
  49. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/agents/index.md +0 -0
  50. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/agents/invariants.md +0 -0
  51. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/agents/repo-map.md +0 -0
  52. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/commands-and-directives.md +0 -0
  53. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/config.md +0 -0
  54. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/context-resolution.md +0 -0
  55. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/env-vars.md +0 -0
  56. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/index.md +0 -0
  57. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/plugin-api.md +0 -0
  58. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/plugins.md +0 -0
  59. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/claude/runner.md +0 -0
  60. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/claude/stream-json-cheatsheet.md +0 -0
  61. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/claude/takopi-events.md +0 -0
  62. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/codex/exec-json-cheatsheet.md +0 -0
  63. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/codex/takopi-events.md +0 -0
  64. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/index.md +0 -0
  65. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/opencode/runner.md +0 -0
  66. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/opencode/stream-json-cheatsheet.md +0 -0
  67. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/opencode/takopi-events.md +0 -0
  68. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/pi/runner.md +0 -0
  69. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/pi/stream-json-cheatsheet.md +0 -0
  70. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/runners/pi/takopi-events.md +0 -0
  71. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/specification.md +0 -0
  72. {yee88-0.7.0 → yee88-0.7.1}/docs/reference/transports/telegram.md +0 -0
  73. {yee88-0.7.0 → yee88-0.7.1}/docs/stylesheets/admonitions.css +0 -0
  74. {yee88-0.7.0 → yee88-0.7.1}/docs/stylesheets/hero-chat.css +0 -0
  75. {yee88-0.7.0 → yee88-0.7.1}/docs/stylesheets/workflow-preview.css +0 -0
  76. {yee88-0.7.0 → yee88-0.7.1}/docs/tutorials/conversation-modes.md +0 -0
  77. {yee88-0.7.0 → yee88-0.7.1}/docs/tutorials/first-run.md +0 -0
  78. {yee88-0.7.0 → yee88-0.7.1}/docs/tutorials/index.md +0 -0
  79. {yee88-0.7.0 → yee88-0.7.1}/docs/tutorials/install.md +0 -0
  80. {yee88-0.7.0 → yee88-0.7.1}/docs/tutorials/multi-engine.md +0 -0
  81. {yee88-0.7.0 → yee88-0.7.1}/docs/tutorials/projects-and-branches.md +0 -0
  82. {yee88-0.7.0 → yee88-0.7.1}/docs/user-guide.md +0 -0
  83. {yee88-0.7.0 → yee88-0.7.1}/readme.md +0 -0
  84. {yee88-0.7.0 → yee88-0.7.1}/scripts/commit_notify.py +0 -0
  85. {yee88-0.7.0 → yee88-0.7.1}/scripts/docs_build_cf.sh +0 -0
  86. {yee88-0.7.0 → yee88-0.7.1}/scripts/docs_prebuild.py +0 -0
  87. {yee88-0.7.0 → yee88-0.7.1}/scripts/onboarding_preview.py +0 -0
  88. {yee88-0.7.0 → yee88-0.7.1}/scripts/release_notify.py +0 -0
  89. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/__init__.py +0 -0
  90. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/api.py +0 -0
  91. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/backends.py +0 -0
  92. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/backends_helpers.py +0 -0
  93. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/__init__.py +0 -0
  94. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/config.py +0 -0
  95. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/cron.py +0 -0
  96. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/doctor.py +0 -0
  97. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/init.py +0 -0
  98. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/onboarding_cmd.py +0 -0
  99. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/plugins.py +0 -0
  100. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/reload.py +0 -0
  101. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/run.py +0 -0
  102. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cli/topic.py +0 -0
  103. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/commands.py +0 -0
  104. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/config.py +0 -0
  105. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/config_migrations.py +0 -0
  106. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/config_watch.py +0 -0
  107. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/context.py +0 -0
  108. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cron/__init__.py +0 -0
  109. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cron/manager.py +0 -0
  110. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cron/models.py +0 -0
  111. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/cron/scheduler.py +0 -0
  112. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/directives.py +0 -0
  113. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/engines.py +0 -0
  114. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/events.py +0 -0
  115. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/lockfile.py +0 -0
  116. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/logging.py +0 -0
  117. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/markdown.py +0 -0
  118. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/model.py +0 -0
  119. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/plugins.py +0 -0
  120. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/presenter.py +0 -0
  121. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/progress.py +0 -0
  122. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/router.py +0 -0
  123. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runner.py +0 -0
  124. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runner_bridge.py +0 -0
  125. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/__init__.py +0 -0
  126. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/claude.py +0 -0
  127. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/codex.py +0 -0
  128. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/mock.py +0 -0
  129. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/opencode.py +0 -0
  130. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/pi.py +0 -0
  131. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/run_options.py +0 -0
  132. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runners/tool_actions.py +0 -0
  133. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/runtime_loader.py +0 -0
  134. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/scheduler.py +0 -0
  135. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/schemas/__init__.py +0 -0
  136. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/schemas/claude.py +0 -0
  137. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/schemas/codex.py +0 -0
  138. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/schemas/opencode.py +0 -0
  139. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/schemas/pi.py +0 -0
  140. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/settings.py +0 -0
  141. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/__init__.py +0 -0
  142. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/api_models.py +0 -0
  143. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/api_schemas.py +0 -0
  144. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/backend.py +0 -0
  145. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/bridge.py +0 -0
  146. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/chat_prefs.py +0 -0
  147. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/chat_sessions.py +0 -0
  148. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/client.py +0 -0
  149. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/client_api.py +0 -0
  150. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/__init__.py +0 -0
  151. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/agent.py +0 -0
  152. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/cancel.py +0 -0
  153. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/dispatch.py +0 -0
  154. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/executor.py +0 -0
  155. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/file_transfer.py +0 -0
  156. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/media.py +0 -0
  157. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/model.py +0 -0
  158. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/overrides.py +0 -0
  159. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/parse.py +0 -0
  160. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/plan.py +0 -0
  161. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/reasoning.py +0 -0
  162. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/reply.py +0 -0
  163. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/commands/trigger.py +0 -0
  164. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/context.py +0 -0
  165. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/engine_defaults.py +0 -0
  166. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/engine_overrides.py +0 -0
  167. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/files.py +0 -0
  168. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/onboarding.py +0 -0
  169. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/outbox.py +0 -0
  170. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/parsing.py +0 -0
  171. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/render.py +0 -0
  172. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/state_store.py +0 -0
  173. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/topic_state.py +0 -0
  174. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/topics.py +0 -0
  175. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/trigger_mode.py +0 -0
  176. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/types.py +0 -0
  177. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/telegram/voice.py +0 -0
  178. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/transport.py +0 -0
  179. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/transport_runtime.py +0 -0
  180. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/transports.py +0 -0
  181. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/utils/__init__.py +0 -0
  182. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/utils/git.py +0 -0
  183. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/utils/json_state.py +0 -0
  184. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/utils/paths.py +0 -0
  185. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/utils/streams.py +0 -0
  186. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/utils/subprocess.py +0 -0
  187. {yee88-0.7.0 → yee88-0.7.1}/src/yee88/worktrees.py +0 -0
  188. {yee88-0.7.0 → yee88-0.7.1}/tests/__init__.py +0 -0
  189. {yee88-0.7.0 → yee88-0.7.1}/tests/conftest.py +0 -0
  190. {yee88-0.7.0 → yee88-0.7.1}/tests/factories.py +0 -0
  191. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/claude_stream_json_session.jsonl +0 -0
  192. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/codex_exec_json_all_formats.jsonl +0 -0
  193. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/codex_exec_json_all_formats.txt +0 -0
  194. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/opencode_run_json.jsonl +0 -0
  195. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/opencode_stream_error.jsonl +0 -0
  196. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/opencode_stream_success.jsonl +0 -0
  197. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/opencode_stream_success_no_reason.jsonl +0 -0
  198. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/pi_print_mode_events.jsonl +0 -0
  199. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/pi_stream_error.jsonl +0 -0
  200. {yee88-0.7.0 → yee88-0.7.1}/tests/fixtures/pi_stream_success.jsonl +0 -0
  201. {yee88-0.7.0 → yee88-0.7.1}/tests/plugin_fixtures.py +0 -0
  202. {yee88-0.7.0 → yee88-0.7.1}/tests/telegram_fakes.py +0 -0
  203. {yee88-0.7.0 → yee88-0.7.1}/tests/test_api_exports.py +0 -0
  204. {yee88-0.7.0 → yee88-0.7.1}/tests/test_auto_router.py +0 -0
  205. {yee88-0.7.0 → yee88-0.7.1}/tests/test_claude_runner.py +0 -0
  206. {yee88-0.7.0 → yee88-0.7.1}/tests/test_claude_schema.py +0 -0
  207. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cli_auto_router.py +0 -0
  208. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cli_chat_id.py +0 -0
  209. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cli_commands.py +0 -0
  210. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cli_config.py +0 -0
  211. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cli_doctor.py +0 -0
  212. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cli_helpers.py +0 -0
  213. {yee88-0.7.0 → yee88-0.7.1}/tests/test_codex_runner_helpers.py +0 -0
  214. {yee88-0.7.0 → yee88-0.7.1}/tests/test_codex_schema.py +0 -0
  215. {yee88-0.7.0 → yee88-0.7.1}/tests/test_codex_tool_result_summary.py +0 -0
  216. {yee88-0.7.0 → yee88-0.7.1}/tests/test_command_registry.py +0 -0
  217. {yee88-0.7.0 → yee88-0.7.1}/tests/test_config_store.py +0 -0
  218. {yee88-0.7.0 → yee88-0.7.1}/tests/test_config_watch.py +0 -0
  219. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cron_manager.py +0 -0
  220. {yee88-0.7.0 → yee88-0.7.1}/tests/test_cron_scheduler.py +0 -0
  221. {yee88-0.7.0 → yee88-0.7.1}/tests/test_engine_discovery.py +0 -0
  222. {yee88-0.7.0 → yee88-0.7.1}/tests/test_exec_bridge.py +0 -0
  223. {yee88-0.7.0 → yee88-0.7.1}/tests/test_exec_render.py +0 -0
  224. {yee88-0.7.0 → yee88-0.7.1}/tests/test_exec_runner.py +0 -0
  225. {yee88-0.7.0 → yee88-0.7.1}/tests/test_git_utils.py +0 -0
  226. {yee88-0.7.0 → yee88-0.7.1}/tests/test_lockfile.py +0 -0
  227. {yee88-0.7.0 → yee88-0.7.1}/tests/test_onboarding.py +0 -0
  228. {yee88-0.7.0 → yee88-0.7.1}/tests/test_onboarding_helpers.py +0 -0
  229. {yee88-0.7.0 → yee88-0.7.1}/tests/test_onboarding_interactive.py +0 -0
  230. {yee88-0.7.0 → yee88-0.7.1}/tests/test_opencode_runner.py +0 -0
  231. {yee88-0.7.0 → yee88-0.7.1}/tests/test_opencode_schema.py +0 -0
  232. {yee88-0.7.0 → yee88-0.7.1}/tests/test_paths.py +0 -0
  233. {yee88-0.7.0 → yee88-0.7.1}/tests/test_pi_runner.py +0 -0
  234. {yee88-0.7.0 → yee88-0.7.1}/tests/test_pi_schema.py +0 -0
  235. {yee88-0.7.0 → yee88-0.7.1}/tests/test_plugins.py +0 -0
  236. {yee88-0.7.0 → yee88-0.7.1}/tests/test_projects_config.py +0 -0
  237. {yee88-0.7.0 → yee88-0.7.1}/tests/test_rendering.py +0 -0
  238. {yee88-0.7.0 → yee88-0.7.1}/tests/test_runner_contract.py +0 -0
  239. {yee88-0.7.0 → yee88-0.7.1}/tests/test_runner_run_options.py +0 -0
  240. {yee88-0.7.0 → yee88-0.7.1}/tests/test_runner_utils.py +0 -0
  241. {yee88-0.7.0 → yee88-0.7.1}/tests/test_runtime_loader.py +0 -0
  242. {yee88-0.7.0 → yee88-0.7.1}/tests/test_settings.py +0 -0
  243. {yee88-0.7.0 → yee88-0.7.1}/tests/test_settings_contract.py +0 -0
  244. {yee88-0.7.0 → yee88-0.7.1}/tests/test_subprocess.py +0 -0
  245. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_agent_trigger_commands.py +0 -0
  246. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_backend.py +0 -0
  247. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_bridge.py +0 -0
  248. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_chat_prefs.py +0 -0
  249. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_chat_sessions.py +0 -0
  250. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_client.py +0 -0
  251. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_client_api.py +0 -0
  252. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_context_helpers.py +0 -0
  253. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_engine_defaults.py +0 -0
  254. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_engine_overrides.py +0 -0
  255. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_file_transfer_helpers.py +0 -0
  256. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_files.py +0 -0
  257. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_incoming.py +0 -0
  258. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_media_command.py +0 -0
  259. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_polling.py +0 -0
  260. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_queue.py +0 -0
  261. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_topic_state.py +0 -0
  262. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_topics_command.py +0 -0
  263. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_topics_helpers.py +0 -0
  264. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_trigger_mode.py +0 -0
  265. {yee88-0.7.0 → yee88-0.7.1}/tests/test_telegram_voice.py +0 -0
  266. {yee88-0.7.0 → yee88-0.7.1}/tests/test_tool_actions.py +0 -0
  267. {yee88-0.7.0 → yee88-0.7.1}/tests/test_transport.py +0 -0
  268. {yee88-0.7.0 → yee88-0.7.1}/tests/test_transport_registry.py +0 -0
  269. {yee88-0.7.0 → yee88-0.7.1}/tests/test_transport_runtime.py +0 -0
  270. {yee88-0.7.0 → yee88-0.7.1}/tests/test_worktrees.py +0 -0
  271. {yee88-0.7.0 → yee88-0.7.1}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yee88
3
- Version: 0.7.0
3
+ Version: 0.7.1
4
4
  Summary: Telegram bridge for Codex, Claude Code, and other agent CLIs.
5
5
  Project-URL: Homepage, https://github.com/banteg/yee88
6
6
  Project-URL: Documentation, https://yee88.dev/
@@ -1,16 +1,38 @@
1
1
  # changelog
2
2
 
3
+ ## v0.7.0 (2026-02-01)
4
+
5
+ ### features
6
+
7
+ - add `/handoff` command to transfer desktop session to mobile seamlessly
8
+
9
+ ### fixes
10
+
11
+ - fix scheduled task trigger issues in cron scheduler
12
+
13
+ ## v0.6.3 (2026-02-01)
14
+
15
+ ### features
16
+
17
+ - add `/model reset` subcommand to clear model overrides
18
+
3
19
  ## v0.6.2 (2026-01-31)
4
20
 
5
21
  ### changes
6
22
 
7
23
  - optimize system_prompt handling: only prepend on first run to save tokens
8
24
 
25
+ ## v0.6.1 (2026-01-31)
26
+
27
+ ### fixes
28
+
29
+ - correct system_prompt syntax error in settings
30
+
9
31
  ## v0.6.0 (2026-01-31)
10
32
 
11
33
  ### features
12
34
 
13
- - add one-time task execution support in cron
35
+ - add one-time task execution support in cron scheduler
14
36
 
15
37
  ### docs
16
38
 
@@ -20,11 +42,16 @@
20
42
 
21
43
  - update system prompt wording
22
44
 
23
- ## v0.2.0 (2026-01-30)
45
+ ## v0.5.0 (2026-01-31)
24
46
 
25
47
  ### changes
26
48
 
27
- - rename startup message from "yee88 is ready" to "yee88 is ready"
49
+ - fork baseline from upstream v0.21.4
50
+ - minor fixes and improvements
51
+
52
+ ---
53
+
54
+ ## upstream changelog (v0.21.4 and earlier)
28
55
 
29
56
  ## v0.21.4 (2026-01-22)
30
57
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  yee88 是一个 Telegram 桥接工具,让你可以通过 Telegram 聊天界面来运行 AI 编程助手(Codex、Claude Code、OpenCode、Pi)。
4
4
 
5
+ **当前版本: v0.7.1**
6
+
5
7
  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
6
8
 
7
9
  ## 📦 一、安装与初始化(💻 电脑侧)
@@ -440,7 +442,77 @@ show_resume_line = true # 始终显示恢复行
440
442
 
441
443
  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
442
444
 
443
- ## 📝 十二、使用技巧
445
+ ## 📲 十二、会话接力(Handoff)
446
+
447
+ 将电脑端的 OpenCode 会话上下文发送到 Telegram,方便在手机上继续对话。
448
+
449
+ ### 使用方法(💻 电脑侧)
450
+
451
+ ```bash
452
+ yee88 handoff
453
+ ```
454
+
455
+ ### 工作流程
456
+
457
+ 1. 自动列出当前项目的最近会话(带话题名称)
458
+ 2. 选择要接力的会话
459
+ 3. 自动创建新的 Telegram Topic
460
+ 4. 将会话上下文和最近消息发送到 Topic
461
+ 5. 在 Telegram 中直接继续对话
462
+
463
+ ### 选项
464
+
465
+ | 选项 | 说明 |
466
+ |------|------|
467
+ | `--session, -s` | 指定会话 ID(默认交互选择) |
468
+ | `--limit, -n` | 包含的消息数量(默认 3) |
469
+ | `--project, -p` | 项目名称 |
470
+
471
+ ### 示例
472
+
473
+ ```bash
474
+ # 交互式选择会话
475
+ yee88 handoff
476
+
477
+ # 指定会话和消息数量
478
+ yee88 handoff -s ses_abc123 -n 5
479
+ ```
480
+
481
+ ### 前置条件
482
+
483
+ - 需要启用 Topics 模式:`yee88 config set transports.telegram.topics.enabled true`
484
+ - 需要配置 Telegram bot_token 和 chat_id
485
+
486
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
487
+
488
+ ## 🔀 十三、话题分叉(Fork)
489
+
490
+ 在 Telegram Topics 模式下,将当前话题的上下文和会话状态分叉到一个新话题。
491
+
492
+ ### 使用方法
493
+
494
+ 在任意话题中发送:
495
+
496
+ ```
497
+ /fork
498
+ ```
499
+
500
+ ### 功能说明
501
+
502
+ - 自动创建新话题,标题格式:`原话题 (fork #1)`
503
+ - 支持多次分叉,自动递增编号:`原话题 (fork #2)`、`原话题 (fork #3)`...
504
+ - 复制原话题的上下文和会话状态到新话题
505
+ - 在新话题中继续对话,不影响原话题
506
+
507
+ ### 使用场景
508
+
509
+ - 从当前对话中派生新的探索方向
510
+ - 保存当前状态,尝试不同的解决方案
511
+ - 多人协作时创建个人工作分支
512
+
513
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
514
+
515
+ ## 📝 十四、使用技巧
444
516
 
445
517
  ### 1. 快速切换上下文
446
518
 
@@ -479,3 +551,20 @@ codex resume <token>
479
551
  /claude 优化代码结构
480
552
  /opencode 添加测试
481
553
  ```
554
+
555
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
556
+
557
+ ## 📋 版本历史
558
+
559
+ ### v0.7.1 (2025-02-01)
560
+
561
+ **新功能**
562
+ - ✨ **话题分叉 (`/fork`)**: 在 Topics 模式下将当前话题上下文分叉到新话题,支持多次分叉自动编号
563
+ - ✨ **会话接力 (`yee88 handoff`)**: 将电脑端 OpenCode 会话发送到 Telegram 继续对话
564
+
565
+ **改进**
566
+ - 优化 handoff 命令的输出提示信息
567
+
568
+ ### v0.7.0
569
+
570
+ - 初始版本发布
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "yee88"
3
3
  authors = [{name = "yee.wang"}]
4
- version = "0.7.0"
4
+ version = "0.7.1"
5
5
  description = "Telegram bridge for Codex, Claude Code, and other agent CLIs."
6
6
  readme = "README.md"
7
7
  license = { file = "LICENSE" }
@@ -223,6 +223,8 @@ def send(
223
223
  typer.echo("❌ 未找到 OpenCode 会话", err=True)
224
224
  raise typer.Exit(1)
225
225
 
226
+ typer.echo("\n📲 会话接力 - 将电脑端会话发送到 Telegram 继续对话")
227
+ typer.echo("━" * 50)
226
228
  typer.echo("\n📋 最近的会话:\n")
227
229
  for i, s in enumerate(sessions[:10], 1):
228
230
  title_display = s.title[:40] if s.title else s.project_name
@@ -7,7 +7,7 @@ _ID_RE = re.compile(ID_PATTERN)
7
7
 
8
8
  RESERVED_CLI_COMMANDS = frozenset({"config", "doctor", "init", "plugins"})
9
9
  RESERVED_CHAT_COMMANDS = frozenset(
10
- {"cancel", "file", "new", "agent", "model", "reasoning", "trigger", "topic", "ctx"}
10
+ {"cancel", "file", "new", "fork", "agent", "model", "reasoning", "trigger", "topic", "ctx"}
11
11
  )
12
12
  RESERVED_ENGINE_IDS = RESERVED_CLI_COMMANDS | RESERVED_CHAT_COMMANDS
13
13
  RESERVED_COMMAND_IDS = RESERVED_CLI_COMMANDS | RESERVED_CHAT_COMMANDS
@@ -525,12 +525,38 @@ yee88 cron run <task-id>
525
525
  - 执行后自动从列表中删除
526
526
  - 无法对一次性任务使用 enable/disable(执行前自动删除)
527
527
 
528
+ ### 10. 会话接力(Handoff)
529
+
530
+ 将当前 OpenCode 会话上下文发送到 Telegram,方便在手机上继续对话。
531
+
532
+ ```bash
533
+ yee88 handoff
534
+ ```
535
+
536
+ 功能:
537
+ - 自动列出当前项目的最近会话(带话题名称)
538
+ - 选择会话后,创建新的 Telegram Topic
539
+ - 将会话上下文和最近消息发送到 Topic
540
+ - 在 Telegram 中直接继续对话
541
+
542
+ 选项:
543
+ - `--session, -s`: 指定会话 ID(默认交互选择)
544
+ - `--limit, -n`: 包含的消息数量(默认 3)
545
+ - `--project, -p`: 项目名称
546
+
547
+ 示例:
548
+ ```bash
549
+ yee88 handoff
550
+ yee88 handoff -s ses_abc123 -n 5
551
+ ```
552
+
528
553
  ## 完整命令速查表
529
554
 
530
555
  | 命令 | 说明 |
531
556
  |------|------|
532
557
  | `yee88` | 启动 yee88 |
533
558
  | `yee88 init <alias>` | 注册项目 |
559
+ | `yee88 handoff` | 会话接力到 Telegram |
534
560
  | `yee88 config path` | 查看配置路径 |
535
561
  | `yee88 config list` | 列出配置 |
536
562
  | `yee88 config get <key>` | 获取配置项 |
@@ -18,6 +18,7 @@ from .reasoning import _handle_reasoning_command as handle_reasoning_command
18
18
  from .topics import _handle_chat_new_command as handle_chat_new_command
19
19
  from .topics import _handle_chat_ctx_command as handle_chat_ctx_command
20
20
  from .topics import _handle_ctx_command as handle_ctx_command
21
+ from .topics import _handle_fork_command as handle_fork_command
21
22
  from .topics import _handle_new_command as handle_new_command
22
23
  from .topics import _handle_topic_command as handle_topic_command
23
24
  from .trigger import _handle_trigger_command as handle_trigger_command
@@ -31,6 +32,7 @@ __all__ = [
31
32
  "handle_ctx_command",
32
33
  "handle_file_command",
33
34
  "handle_file_put_default",
35
+ "handle_fork_command",
34
36
  "handle_media_group",
35
37
  "handle_model_command",
36
38
  "handle_new_command",
@@ -83,7 +83,10 @@ def build_bot_commands(
83
83
  commands.append({"command": cmd, "description": description})
84
84
  seen.add(cmd)
85
85
  if include_topics:
86
- for cmd, description in [("topic", "create or bind a topic")]:
86
+ for cmd, description in [
87
+ ("topic", "create or bind a topic"),
88
+ ("fork", "fork current topic to new topic"),
89
+ ]:
87
90
  if cmd in seen:
88
91
  continue
89
92
  commands.append({"command": cmd, "description": description})
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re as _re
3
4
  from typing import TYPE_CHECKING
4
5
 
5
6
  from ...context import RunContext
@@ -340,3 +341,84 @@ async def _handle_topic_command(
340
341
  message=RenderedMessage(text=rendered_text, extra={"entities": entities}),
341
342
  options=SendOptions(thread_id=thread_id),
342
343
  )
344
+
345
+
346
+ _FORK_TITLE_PATTERN = _re.compile(r"^(.+) \(fork #(\d+)\)$")
347
+
348
+
349
+ def _get_forked_title(title: str | None) -> str:
350
+ if title is None:
351
+ return "topic (fork #1)"
352
+ match = _FORK_TITLE_PATTERN.match(title)
353
+ if match:
354
+ base = match.group(1)
355
+ num = int(match.group(2))
356
+ return f"{base} (fork #{num + 1})"
357
+ return f"{title} (fork #1)"
358
+
359
+
360
+ async def _handle_fork_command(
361
+ cfg: TelegramBridgeConfig,
362
+ msg: TelegramIncomingMessage,
363
+ store: TopicStateStore,
364
+ *,
365
+ resolved_scope: str | None = None,
366
+ scope_chat_ids: frozenset[int] | None = None,
367
+ ) -> None:
368
+ from ...model import ResumeToken
369
+
370
+ reply = make_reply(cfg, msg)
371
+ error = _topics_command_error(
372
+ cfg,
373
+ msg.chat_id,
374
+ resolved_scope=resolved_scope,
375
+ scope_chat_ids=scope_chat_ids,
376
+ )
377
+ if error is not None:
378
+ await reply(text=error)
379
+ return
380
+ tkey = _topic_key(msg, cfg, scope_chat_ids=scope_chat_ids)
381
+ if tkey is None:
382
+ await reply(text="this command only works inside a topic.")
383
+ return
384
+
385
+ snapshot = await store.get_thread(*tkey)
386
+ current_title = snapshot.topic_title if snapshot else None
387
+ forked_title = _get_forked_title(current_title)
388
+
389
+ created = await cfg.bot.create_forum_topic(msg.chat_id, forked_title)
390
+ if created is None:
391
+ await reply(text="failed to create forked topic.")
392
+ return
393
+
394
+ new_thread_id = created.message_thread_id
395
+
396
+ if snapshot and snapshot.context:
397
+ await store.set_context(
398
+ msg.chat_id,
399
+ new_thread_id,
400
+ snapshot.context,
401
+ topic_title=forked_title,
402
+ )
403
+
404
+ if snapshot and snapshot.sessions:
405
+ for engine, resume_value in snapshot.sessions.items():
406
+ token = ResumeToken(engine=engine, value=resume_value)
407
+ await store.set_session_resume(msg.chat_id, new_thread_id, token)
408
+
409
+ await reply(text=f"forked to new topic `{forked_title}`.")
410
+
411
+ context_label = _format_context(cfg.runtime, snapshot.context) if snapshot and snapshot.context else "none"
412
+ sessions_label = ", ".join(sorted(snapshot.sessions.keys())) if snapshot and snapshot.sessions else "none"
413
+ welcome_text = (
414
+ f"forked from previous topic\n\n"
415
+ f"context: `{context_label}`\n"
416
+ f"sessions: {sessions_label}\n\n"
417
+ "continue your conversation here!"
418
+ )
419
+ rendered_text, entities = prepare_telegram(MarkdownParts(header=welcome_text))
420
+ await cfg.exec_cfg.transport.send(
421
+ channel_id=msg.chat_id,
422
+ message=RenderedMessage(text=rendered_text, extra={"entities": entities}),
423
+ options=SendOptions(thread_id=new_thread_id),
424
+ )
@@ -44,6 +44,7 @@ from .commands.handlers import (
44
44
  handle_ctx_command,
45
45
  handle_file_command,
46
46
  handle_file_put_default,
47
+ handle_fork_command,
47
48
  handle_media_group,
48
49
  handle_model_command,
49
50
  handle_new_command,
@@ -224,6 +225,15 @@ def _dispatch_builtin_command(
224
225
  resolved_scope=resolved_scope,
225
226
  scope_chat_ids=scope_chat_ids,
226
227
  )
228
+ elif command_id == "fork":
229
+ handler = partial(
230
+ handle_fork_command,
231
+ cfg,
232
+ msg,
233
+ topic_store,
234
+ resolved_scope=resolved_scope,
235
+ scope_chat_ids=scope_chat_ids,
236
+ )
227
237
  elif command_id == "topic":
228
238
  handler = partial(
229
239
  handle_topic_command,
@@ -1125,7 +1125,7 @@ wheels = [
1125
1125
 
1126
1126
  [[package]]
1127
1127
  name = "yee88"
1128
- version = "0.6.3"
1128
+ version = "0.7.0"
1129
1129
  source = { editable = "." }
1130
1130
  dependencies = [
1131
1131
  { name = "anyio" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes