yee88 0.7.1__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.
- yee88-0.9.0/.coverage +0 -0
- yee88-0.9.0/.git +1 -0
- yee88-0.9.0/.sisyphus/drafts/cron-system-fix.md +55 -0
- yee88-0.9.0/.sisyphus/plans/cron-system-full-fix.md +960 -0
- {yee88-0.7.1 → yee88-0.9.0}/PKG-INFO +1 -1
- {yee88-0.7.1 → yee88-0.9.0}/docs/user-guide-zh.md +119 -2
- {yee88-0.7.1 → yee88-0.9.0}/pyproject.toml +1 -1
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cron/manager.py +12 -18
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cron/models.py +3 -0
- yee88-0.9.0/src/yee88/cron/scheduler.py +150 -0
- yee88-0.9.0/src/yee88/cron/watch.py +54 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/loop.py +81 -9
- {yee88-0.7.1 → yee88-0.9.0}/uv.lock +1 -1
- yee88-0.7.1/src/yee88/cron/scheduler.py +0 -57
- {yee88-0.7.1 → yee88-0.9.0}/.codex/AGENTS.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/.github/workflows/ci.yml +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/.github/workflows/release.yml +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/.gitignore +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/Justfile +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/LICENSE +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/README.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/changelog.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/assets/favicon.svg +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/assets/logo.svg +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/assets/og-image.jpg +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/assets/takopi.svg +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/developing.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/explanation/architecture.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/explanation/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/explanation/module-map.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/explanation/plugin-system.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/explanation/routing-and-sessions.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/add-a-runner.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/chat-sessions.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/dev-setup.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/file-transfer.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/projects.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/route-by-chat.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/schedule-tasks.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/switch-engines.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/topics.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/troubleshooting.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/voice-notes.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/worktrees.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/how-to/write-a-plugin.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/javascripts/hero-chat.js +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/overrides/.icons/takopi/takopi.svg +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/overrides/main.html +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/plugins.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/agents/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/agents/invariants.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/agents/repo-map.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/commands-and-directives.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/config.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/context-resolution.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/env-vars.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/plugin-api.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/plugins.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/claude/runner.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/claude/stream-json-cheatsheet.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/claude/takopi-events.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/codex/exec-json-cheatsheet.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/codex/takopi-events.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/opencode/runner.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/opencode/stream-json-cheatsheet.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/opencode/takopi-events.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/pi/runner.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/pi/stream-json-cheatsheet.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/runners/pi/takopi-events.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/specification.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/reference/transports/telegram.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/stylesheets/admonitions.css +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/stylesheets/hero-chat.css +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/stylesheets/workflow-preview.css +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/tutorials/conversation-modes.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/tutorials/first-run.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/tutorials/index.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/tutorials/install.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/tutorials/multi-engine.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/tutorials/projects-and-branches.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/docs/user-guide.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/readme.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/scripts/commit_notify.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/scripts/docs_build_cf.sh +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/scripts/docs_prebuild.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/scripts/onboarding_preview.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/scripts/release_notify.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/api.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/backends.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/backends_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/config.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/cron.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/doctor.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/handoff.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/init.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/onboarding_cmd.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/plugins.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/reload.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/run.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cli/topic.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/commands.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/config.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/config_migrations.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/config_watch.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/context.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/cron/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/directives.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/engines.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/events.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/ids.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/lockfile.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/logging.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/markdown.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/model.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/plugins.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/presenter.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/progress.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/router.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runner.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runner_bridge.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/claude.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/codex.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/mock.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/opencode.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/pi.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/run_options.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runners/tool_actions.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/runtime_loader.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/scheduler.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/schemas/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/schemas/claude.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/schemas/codex.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/schemas/opencode.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/schemas/pi.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/settings.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/skills/yee88/SKILL.md +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/api_models.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/api_schemas.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/backend.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/bridge.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/chat_prefs.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/chat_sessions.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/client.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/client_api.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/agent.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/cancel.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/dispatch.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/executor.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/file_transfer.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/handlers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/media.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/menu.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/model.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/overrides.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/parse.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/plan.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/reasoning.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/reply.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/topics.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/commands/trigger.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/context.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/engine_defaults.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/engine_overrides.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/files.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/onboarding.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/outbox.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/parsing.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/render.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/state_store.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/topic_state.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/topics.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/trigger_mode.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/types.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/telegram/voice.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/transport.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/transport_runtime.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/transports.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/utils/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/utils/git.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/utils/json_state.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/utils/paths.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/utils/streams.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/utils/subprocess.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/src/yee88/worktrees.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/__init__.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/conftest.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/factories.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/claude_stream_json_session.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/codex_exec_json_all_formats.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/codex_exec_json_all_formats.txt +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/opencode_run_json.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/opencode_stream_error.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/opencode_stream_success.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/opencode_stream_success_no_reason.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/pi_print_mode_events.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/pi_stream_error.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/fixtures/pi_stream_success.jsonl +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/plugin_fixtures.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/telegram_fakes.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_api_exports.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_auto_router.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_claude_runner.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_claude_schema.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cli_auto_router.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cli_chat_id.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cli_commands.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cli_config.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cli_doctor.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cli_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_codex_runner_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_codex_schema.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_codex_tool_result_summary.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_command_registry.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_config_store.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_config_watch.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cron_manager.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_cron_scheduler.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_engine_discovery.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_exec_bridge.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_exec_render.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_exec_runner.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_git_utils.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_lockfile.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_onboarding.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_onboarding_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_onboarding_interactive.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_opencode_runner.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_opencode_schema.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_paths.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_pi_runner.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_pi_schema.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_plugins.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_projects_config.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_rendering.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_runner_contract.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_runner_run_options.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_runner_utils.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_runtime_loader.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_settings.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_settings_contract.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_subprocess.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_agent_trigger_commands.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_backend.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_bridge.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_chat_prefs.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_chat_sessions.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_client.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_client_api.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_context_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_engine_defaults.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_engine_overrides.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_file_transfer_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_files.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_incoming.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_media_command.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_polling.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_queue.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_topic_state.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_topics_command.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_topics_helpers.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_trigger_mode.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_telegram_voice.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_tool_actions.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_transport.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_transport_registry.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_transport_runtime.py +0 -0
- {yee88-0.7.1 → yee88-0.9.0}/tests/test_worktrees.py +0 -0
- {yee88-0.7.1 → 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
|
+
然后制定详细的工作计划。
|