mateclaw/mateclaw-ui/src
matevip 977e181949 feat(cron): unify output, add reminder task type, in-flight progress UI
Three layers landed together because they share the same routing /
lifecycle plumbing:

1. Cron output unification
   - New CronConversationResolver routes web-origin jobs to the per-workspace
     tasks_<wsId> conversation; IM-bound jobs go to the channel session
     conversation when one exists (matched by senderId then targetId);
     legacy cron_<id> remains as the fallback.
   - CronJobLifecycleService inserts a system-role header divider when a
     run starts so users browsing the unified tasks_<wsId> view can tell
     which job started a run. BaseAgent.sanitizeForLlm filters these
     headers so they never reach the model.
   - WorkspaceService seeds tasks_<wsId> on workspace creation; V65
     migration backfills existing workspaces.
   - DeliveryConfig gains a userId field so IM session lookup can match
     by senderId (replyToken-based targetId is not stable across runs).
   - ConversationVO recognizes tasks_/cron_ underscore prefix as cron
     source. MessageList renders the system header as a labeled divider.
   - ChatConsole pins tasks_* conversations and tracks per-conversation
     read state so new cron output gets a visible unread dot.

2. Reminder task type
   - New task_type='reminder' in CronJobEntity + service validation.
   - CronJobRunner short-circuits 'reminder' jobs: hands trigger_message
     to finishRunAndPublish verbatim, no LLM call. Fixes a regression
     where reminders were rephrased into echoed wrappers.
   - New create_reminder tool alongside create_cron_job, with descriptions
     tightened so the model picks the right one (verbatim push vs LLM
     query that needs computation).
   - CronJobs.vue gets a third radio option + dedicated reminder field.

3. In-flight progress placeholder
   - Cron uses non-streaming chat()/execute(); tool-heavy ReAct loops
     can run 1-5 minutes between start and finish with no visible
     state, looking hung.
   - New GET /api/v1/cron-jobs/active-runs returns runs in status=running
     for a conversation. ChatConsole polls it on the existing 4s tick
     (and on conversation switch) and shows a spinner bar with elapsed
     time. When run count drops to zero, it refetches messages so the
     assistant bubble appears within ~1s of finish.
2026-04-30 15:01:24 +08:00
..
api feat(cron): unify output, add reminder task type, in-flight progress UI 2026-04-30 15:01:24 +08:00
assets fix(ui): code-block light-mode theme + cap header height at 38px 2026-04-26 19:09:10 +08:00
components feat(cron): unify output, add reminder task type, in-flight progress UI 2026-04-30 15:01:24 +08:00
composables fix(channels): close QR loading dead-window for feishu and dingtalk register flows 2026-04-28 11:14:14 +08:00
i18n feat(cron): unify output, add reminder task type, in-flight progress UI 2026-04-30 15:01:24 +08:00
router perf(channels): split Channels.vue, lazy-load modal, async locales, keep-alive route 2026-04-28 11:08:36 +08:00
stores feat(wiki): PR-8 frontend protection badges + delete-button gating 2026-04-25 19:02:32 +08:00
types feat(cron): unify output, add reminder task type, in-flight progress UI 2026-04-30 15:01:24 +08:00
utils refactor(ui): split useProviders into 5 single-responsibility composables 2026-04-28 15:01:14 +08:00
views feat(cron): unify output, add reminder task type, in-flight progress UI 2026-04-30 15:01:24 +08:00
App.vue fix(i18n): dynamically set window title from language pack instead of hardcoding 2026-04-05 16:34:15 +08:00
main.ts fix(security): login rate limiting, SQL injection fix, error boundary 2026-04-11 18:31:51 +08:00
vite-env.d.ts Initial commit: MateClaw — Java + Vue 3 AI Assistant System 2026-04-04 19:03:49 +08:00