+ {reviewPeriod.error ?? t(period === 'range' ? 'supervisor.dateRangeHelp' : 'supervisor.customDaysHelp')}
+
}
{confirmReanalyze && { if (event.key === 'Escape') setConfirmReanalyze(false) }}>
{t('supervisor.reanalyzeTitle')}
{t('supervisor.reanalyzeHint', { scope: projectId === 'global' ? t('center.scope.global')
- : projects.find(project => project.id === projectId)?.name ?? '', period: t('supervisor.days', { count: days }) })}
+ : projects.find(project => project.id === projectId)?.name ?? '', period: reviewPeriod.label })}
-
+
}
>
diff --git a/src/renderer/src/i18n/locales/en-US/heartbeat.ts b/src/renderer/src/i18n/locales/en-US/heartbeat.ts
index 98bed983..df5e2b01 100644
--- a/src/renderer/src/i18n/locales/en-US/heartbeat.ts
+++ b/src/renderer/src/i18n/locales/en-US/heartbeat.ts
@@ -120,7 +120,12 @@ export const heartbeat = {
newReview: 'New review', summary: 'Work summary', changes: 'Changes', runningHint: 'A new review is running. The existing result remains available to read.',
empty: 'No successful review yet', emptyHint: 'You can review current progress manually even without an heartbeat plan.', run: 'Review', running: 'Reviewing…',
more: 'More review actions', reanalyze: 'Reanalyze…', reanalyzeTitle: 'Reanalyze this period?', reanalyzeConfirm: 'Reanalyze',
- reanalyzeHint: 'All content in {{scope}} from the last {{period}} will be analyzed again, which may use more model tokens. Confirmed content and heartbeat progress are not affected.', retryRun: 'Retry review', dismiss: 'Dismiss',
+ reanalyzeHint: 'All content in {{scope}} for {{period}} will be analyzed again, which may use more model tokens. Confirmed content and heartbeat progress are not affected.', retryRun: 'Retry review', dismiss: 'Dismiss',
+ customDays: 'Custom days', dateRange: 'Date range', dayCount: 'Number of days', startDate: 'Start date', endDate: 'End date',
+ recentDays: 'the last {{count}} days', dateRangeLabel: '{{from}} through {{to}} (local dates, through now if ending today)',
+ customDaysHelp: 'Counts back from now in 24-hour days.', dateRangeHelp: 'Local dates, including the end day. If ending today, includes content through now.',
+ invalidDays: 'Enter a positive whole number of days that produces a date in year 1 or later.',
+ invalidDates: 'Enter valid start and end dates.', futureDates: 'Dates cannot be in the future.', reversedDates: 'Start date must be on or before end date.',
graphScope: 'Graph scope', graphEmpty: 'No story events in this scope', legend: 'Solid lines show event impact on entities; dashed lines show entity relations. Time runs counter-clockwise with a visible gap.', start: 'Start', end: 'End',
listTabs: { event: 'Events', entity: 'Entities', relation: 'Relations', story: 'Stories', experience: 'Experiences' },
experiences: {
diff --git a/src/renderer/src/i18n/locales/zh-CN/heartbeat.ts b/src/renderer/src/i18n/locales/zh-CN/heartbeat.ts
index 3e7de5dc..7098ec71 100644
--- a/src/renderer/src/i18n/locales/zh-CN/heartbeat.ts
+++ b/src/renderer/src/i18n/locales/zh-CN/heartbeat.ts
@@ -117,7 +117,12 @@ export const heartbeat = {
newReview: '新回顾', summary: '工作总结', changes: '本次变化', runningHint: '新回顾正在整理,已有结果仍可阅读。',
empty: '还没有成功回顾', emptyHint: '即使没有心跳计划,也可以手动回顾当前进展。', run: '回顾', running: '回顾整理中…',
more: '更多回顾操作', reanalyze: '重新整理…', reanalyzeTitle: '重新整理这段时间?', reanalyzeConfirm: '重新整理',
- reanalyzeHint: '将重新分析{{scope}}最近 {{period}}的全部内容,可能产生较多模型用量。已确认的内容和心跳处理进度不受影响。', retryRun: '重试回顾', dismiss: '关闭提示',
+ reanalyzeHint: '将重新分析{{scope}}在{{period}}内的全部内容,可能产生较多模型用量。已确认的内容和心跳处理进度不受影响。', retryRun: '重试回顾', dismiss: '关闭提示',
+ customDays: '自定义天数', dateRange: '指定日期', dayCount: '天数', startDate: '开始日期', endDate: '结束日期',
+ recentDays: '最近 {{count}} 天', dateRangeLabel: '{{from}} 至 {{to}}(本地日期,结束日期为今天时截至当前)',
+ customDaysHelp: '从当前时刻向前计算,每天按 24 小时计。', dateRangeHelp: '按本地日期计算,包含结束日期当天;结束日期为今天时截至当前时刻。',
+ invalidDays: '请输入正整数天数,且起始时间不能早于公元 1 年。',
+ invalidDates: '请输入有效的开始和结束日期。', futureDates: '日期不能晚于今天。', reversedDates: '开始日期不能晚于结束日期。',
graphScope: '图谱范围', graphEmpty: '当前范围没有故事线事件', legend: '实线表示事件影响实体,虚线表示实体关系。时间轴逆时针排列,起止之间保留缺口。', start: '起点', end: '终点',
listTabs: { event: '事件', entity: '实体', relation: '关系', story: '故事', experience: '经验' },
experiences: {
diff --git a/src/renderer/src/supervisor-workspace.css b/src/renderer/src/supervisor-workspace.css
index 32f3eb94..892c8e39 100644
--- a/src/renderer/src/supervisor-workspace.css
+++ b/src/renderer/src/supervisor-workspace.css
@@ -362,6 +362,31 @@
flex: 1;
min-width: 0;
}
+.supervisor-workspace__date-range {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-3);
+ max-width: 100%;
+ min-width: 0;
+ grid-column: 1 / -1;
+}
+.supervisor-workspace__toolbar .field-control {
+ width: 100%;
+ min-width: 0;
+ box-sizing: border-box;
+}
+.supervisor-workspace__period-field {
+ grid-column: 1 / -1;
+}
+.supervisor-workspace__period-help {
+ flex-basis: 100%;
+ grid-column: 1 / -1;
+ margin: 0;
+ color: var(--text-secondary);
+}
+.supervisor-workspace__period-help[role='alert'] {
+ color: var(--danger);
+}
.supervisor-workspace__history-menu [role="menuitemradio"] > span {
flex: 1;
min-width: 0;