Implement per-app open_id storage via user_feishu_open_ids table with
union_id-based cross-app user identification. WS handlers now auto-capture
open_id+union_id and resolve/associate user accounts. Schedule notifications
route through the correct bot's open_id instead of always falling back to 苹果.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When datetime.utcnow() (naive) was passed as after=, astimezone() treated
it as system-local time (Beijing), causing next_run_at to be calculated
incorrectly. Now naive datetimes are explicitly localized to UTC first.
Also replaced deprecated datetime.utcnow() with aware UTC equivalent.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Timezone: compute_next_run now correctly interprets cron in the schedule's
configured timezone (e.g., "0 8 * * *" with Asia/Shanghai = 8AM Beijing, not UTC)
- Notifications: agent_tasks now reuses pre-created execution records and calls
notify_schedule_result on completion, so non-workflow agent schedules get
DB notifications + Feishu webhook + Feishu app messages
- Duplicate execution: execute_agent_task accepts optional execution_id to reuse
the record created by schedule_service instead of creating a second one
- Celery Beat: added to restart_backend_celery.ps1, stop_aiagent.ps1, and
docker-compose.dev.yml; fixed repo-root path resolution in all PS1 scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 4.1 Fallback chain: LLM fallback_llm config in AgentLLMConfig, retry with alternate model on API failure; Agent fallback_agent in DAG nodes
- 4.2 Knowledge sharing: GlobalKnowledge model with embedding-based semantic search, auto-extraction of tool names as tags after execution
- 4.3 Async execution: execute_agent_task fully implemented with AgentRuntime, scheduler dual-path for workflow/non-workflow agents
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>