Skip to content

Commit 2746152

Browse files
committed
fix(release): finalize v1.18.0
1 parent 95127a1 commit 2746152

10 files changed

Lines changed: 89 additions & 35 deletions

File tree

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,12 +594,12 @@ jobs:
594594
find "$bundle_dir" -maxdepth 4 -type f | sort
595595
done
596596
597-
- name: Fail when macOS notarized build is unavailable
597+
- name: Fail when macOS release build is unavailable
598598
if: startsWith(matrix.platform, 'macos') && steps.build_macos_primary.outcome == 'failure' && steps.build_macos_retry.outcome == 'failure'
599599
shell: bash
600600
run: |
601601
set -euo pipefail
602-
echo "::error::macOS notarization failed twice. Blocking release instead of publishing a signed-only artifact."
602+
echo "::error::macOS release build failed twice before a notarized artifact became available. See the previous build attempt logs for the actual error."
603603
exit 1
604604
605605
- name: Resolve macOS bundle dir

RELEASE_NOTES.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
- 本次发布目标 tag 为 `v1.18.0`
88
- 本说明按当前待递交工作树重新整理,覆盖这次准备一起递交的版本同步、Rust/runtime、前端工作台、SceneApp、Memory、automation、bridge、roadmap 文档与 Playwright 复盘材料,不再沿用旧版“只写版本号”的简化摘要。
9-
- 截至本次整理,待递交范围包含 `154` 个已跟踪文件改动、`27` 个未跟踪新增项,总计 `16506` 行新增、`1787` 行删除
9+
- 本次重新发布还补充纳入了聊天空态、技能入口、图片预览容错,以及 macOS release workflow 诊断文案修正,确保 `v1.18.0` 对外指向的是当前完整提交状态
1010

1111
### 递交范围
1212

@@ -23,6 +23,13 @@
2323

2424
### 重点更新
2525

26+
#### 0. 补充收口:发布前端构建阻断与 release 诊断信息校正
27+
28+
- `src/components/agent/chat/components/{EmptyState,ImageTaskViewer}.tsx``src/components/agent/chat/skill-selection/{CharacterMentionPanel,inputCapabilitySections}.ts` 与配套测试继续收口聊天空态、技能入口和图片预览体验。
29+
- `src/components/provider-pool/api-key/ProviderModelList.tsx` 修正 provider 模型来源判断的类型收窄问题,避免 release 构建因前端 TypeScript 报错提前中断。
30+
- `ImageTaskViewer.tsx` 为补图预览和弹窗预览统一补齐 `RenderableTaskImage` 的 fallback 渲染,避免新 props 约束下的构建失败。
31+
- `.github/workflows/release.yml` 将原先误导性的 “macOS notarization failed twice” 兜底报错改成“release build failed before notarized artifact became available”,方便后续直接定位真实前序构建错误,而不是被公证文案误导。
32+
2633
#### 1. Agent runtime、任务层与模型层主线继续 current 化
2734

2835
- `src-tauri/crates/agent/src/session_execution_runtime.rs``protocol.rs``provider_safety.rs``credential_bridge.rs`,以及 `src-tauri/src/commands/aster_agent_cmd/{request_model_resolution,runtime_turn,dto,subagent_runtime}.rs` 继续扩展 runtime 路由、任务画像、provider 安全边界、会话上下文与事件投影。

docs/exec-plans/limenext-progress.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5842,3 +5842,23 @@
58425842
- `vitest` 通过:`3 files / 43 tests passed`
58435843
- `eslint` 通过
58445844
- `verify:gui-smoke` 通过:`workspace-ready / browser-runtime / site-adapters / agent-service-skill-entry / agent-runtime-tool-surface / agent-runtime-tool-surface-page`
5845+
- 首页 `EmptyState` 与 slash 首屏当前又继续前推了一刀,避免 `我的方法` 页已经收成前台起手层,但首页推荐 shelf 和 `/` 首屏里还残留 `围绕最近成果 / 围绕最近复盘 / 结果模板 / 我的方法` 这类 badge-first 呈现:
5846+
- `EmptyState` 当前已把结果卡和续接卡的 badge 降为可选辅助字段;默认不再把 `结果模板 / 我的方法 / 围绕最近...` 顶在卡头
5847+
- 首页推荐卡当前继续保留“为什么推荐这条”,但这层信息已退回正文 `meta / contextSummary`,不再用 badge 抢标题层
5848+
- slash `先拿结果` 当前已把 curated task 行项目右侧 `kindLabel` 收掉;分组标题负责解释“这是结果模板”,行内只保留标题和合同描述
5849+
- slash 里的最近复盘横幅当前也已去掉 badge pill,只保留 `最近复盘已更新`、摘要和 `继续去...` 动作
5850+
- 因此用户当前沿着 `首页 -> 结果入口` 和 `slash -> 先拿结果` 两条主链时,看到的更接近“为什么现在该从这条开始”,而不是“这是哪个标签下的哪个对象”:
5851+
- 首页结果入口当前会先展示动作对象与推荐原因
5852+
- slash 首屏当前会先展示结果模板本身与启动合同,不再把标签塞到标题右侧
5853+
- 最近复盘 / 当前参考 / 最近成果这些高价值信号当前仍保留,但统一退到了正文说明层
5854+
- 这一步继续遵守 P1 / P2 的 current 边界:
5855+
- 不新增首页专属推荐状态机
5856+
- 不新增 slash 首屏第二套结果模板协议
5857+
- 不改结果模板排序、launcher、`onSelectCuratedTask` 与现有 route 主链,只做前台呈现减法
5858+
- 这次子改动的定向验证当前已通过:
5859+
- `npm exec vitest run "src/components/agent/chat/components/EmptyState.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx" "src/components/agent/chat/skill-selection/inputCapabilitySections.test.ts"`
5860+
- `npx eslint "src/components/agent/chat/components/EmptyState.tsx" "src/components/agent/chat/components/EmptyState.test.tsx" "src/components/agent/chat/skill-selection/inputCapabilitySections.ts" "src/components/agent/chat/skill-selection/inputCapabilitySections.test.ts" "src/components/agent/chat/skill-selection/CharacterMentionPanel.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx"`
5861+
- `npm run verify:gui-smoke -- --timeout-ms 180000`
5862+
- `vitest` 通过:`3 files / 140 tests passed`
5863+
- `eslint` 通过
5864+
- `verify:gui-smoke` 通过:`workspace-ready / browser-runtime / site-adapters / agent-service-skill-entry / agent-runtime-tool-surface / agent-runtime-tool-surface-page`

src/components/agent/chat/components/EmptyState.test.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -592,10 +592,9 @@ describe("EmptyState", () => {
592592
);
593593

594594
expect(reviewCard?.textContent).toContain("复盘这个账号/项目");
595-
expect(reviewCard?.textContent).toContain("围绕最近复盘");
596595
expect(reviewCard?.textContent).toContain("复盘:短视频编排");
597596
expect(breakdownCard?.textContent).toContain("拆解一条爆款内容");
598-
expect(breakdownCard?.textContent).toContain("围绕最近复盘");
597+
expect(breakdownCard?.textContent).toContain("复盘:短视频编排");
599598
expect(reviewBanner?.textContent).toContain("最近复盘已更新");
600599
expect(reviewBanner?.textContent).toContain("短视频编排 · 补证据");
601600
expect(reviewBanner?.textContent).toContain("这轮结果还缺证据");
@@ -2156,7 +2155,7 @@ describe("EmptyState", () => {
21562155
await Promise.resolve();
21572156
});
21582157

2159-
expect(container.textContent).toContain("围绕当前参考");
2158+
expect(container.textContent).toContain("参考:品牌风格样本");
21602159
expect(container.textContent).toContain("内容主稿生成");
21612160
});
21622161

@@ -2221,7 +2220,7 @@ describe("EmptyState", () => {
22212220
await Promise.resolve();
22222221
});
22232222

2224-
expect(container.textContent).toContain("围绕最近成果");
2223+
expect(container.textContent).toContain("成果:账号复盘结论");
22252224
expect(container.textContent).toContain("复盘这个账号/项目");
22262225
});
22272226

src/components/agent/chat/components/EmptyState.tsx

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ type RecommendationShelfItem =
559559
key: string;
560560
title: string;
561561
summary: string;
562-
badge: string;
562+
badge?: string;
563563
hint: string;
564564
meta: string;
565565
contextSummary?: string;
@@ -573,7 +573,7 @@ type RecommendationShelfItem =
573573
key: string;
574574
title: string;
575575
summary: string;
576-
badge: string;
576+
badge?: string;
577577
hint: string;
578578
meta: string;
579579
contextSummary?: string;
@@ -587,7 +587,7 @@ interface ContinuationShelfItem {
587587
key: string;
588588
title: string;
589589
summary: string;
590-
badge: string;
590+
badge?: string;
591591
usedAt: number;
592592
testId: string;
593593
onSelect: () => void;
@@ -1309,7 +1309,6 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
13091309
key: template.id,
13101310
title: template.title,
13111311
summary: template.summary,
1312-
badge: featured.badgeLabel,
13131312
hint: template.outputHint,
13141313
meta: `${metaPrefix}${buildCuratedTaskCapabilityDescription(template, {
13151314
includeSummary: false,
@@ -1489,7 +1488,6 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
14891488
]
14901489
.filter((segment) => segment.length > 0)
14911490
.join(" · "),
1492-
badge: "结果模板",
14931491
usedAt: template.recentUsedAt as number,
14941492
testId: `entry-continuation-solution-${template.id}`,
14951493
onSelect: () =>
@@ -1525,7 +1523,6 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
15251523
]
15261524
.filter((segment) => segment.length > 0)
15271525
.join(" · "),
1528-
badge: "我的方法",
15291526
usedAt,
15301527
testId: `entry-continuation-method-${skill.key}`,
15311528
onSelect: () => {
@@ -1572,7 +1569,6 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
15721569
]
15731570
.filter((segment) => segment.length > 0)
15741571
.join(" · "),
1575-
badge: "我的方法",
15761572
usedAt,
15771573
testId: `entry-continuation-method-${skill.id}`,
15781574
onSelect: () => {
@@ -1815,7 +1811,6 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
18151811
{reviewFeedbackBanner ? (
18161812
<RecommendationSignalBanner data-testid="entry-review-feedback-banner">
18171813
<RecommendationSignalBannerHeader>
1818-
<RecommendationShelfBadge>围绕最近复盘</RecommendationShelfBadge>
18191814
<RecommendationSignalBannerTitle>
18201815
最近复盘已更新:{reviewFeedbackBanner.title}
18211816
</RecommendationSignalBannerTitle>
@@ -1847,7 +1842,9 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
18471842
<RecommendationLeadCard
18481843
type="button"
18491844
data-testid={leadRecommendationItem.testId}
1850-
title={`${leadRecommendationItem.badge} · ${leadRecommendationItem.summary} · ${leadRecommendationItem.meta}`}
1845+
title={[leadRecommendationItem.summary, leadRecommendationItem.meta]
1846+
.filter((segment) => segment.trim().length > 0)
1847+
.join(" · ")}
18511848
onClick={() => {
18521849
leadRecommendationItem.onSelect();
18531850
}}
@@ -1856,9 +1853,11 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
18561853
<RecommendationLeadEyebrow>
18571854
{resolveLeadRecommendationEyebrow(creationReplaySurface)}
18581855
</RecommendationLeadEyebrow>
1859-
<RecommendationShelfInlineBadge>
1860-
{leadRecommendationItem.badge}
1861-
</RecommendationShelfInlineBadge>
1856+
{leadRecommendationItem.badge ? (
1857+
<RecommendationShelfInlineBadge>
1858+
{leadRecommendationItem.badge}
1859+
</RecommendationShelfInlineBadge>
1860+
) : null}
18621861
</RecommendationLeadEyebrowRow>
18631862
<RecommendationLeadTitle>
18641863
{leadRecommendationItem.title}
@@ -1897,7 +1896,9 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
18971896
key={item.key}
18981897
type="button"
18991898
data-testid={item.testId}
1900-
title={`${item.badge} · ${item.summary} · ${item.meta}`}
1899+
title={[item.summary, item.meta]
1900+
.filter((segment) => segment.trim().length > 0)
1901+
.join(" · ")}
19011902
onClick={() => {
19021903
item.onSelect();
19031904
}}
@@ -1906,9 +1907,11 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
19061907
<RecommendationAssistCardTitle>
19071908
{item.title}
19081909
</RecommendationAssistCardTitle>
1909-
<RecommendationShelfInlineBadge>
1910-
{item.badge}
1911-
</RecommendationShelfInlineBadge>
1910+
{item.badge ? (
1911+
<RecommendationShelfInlineBadge>
1912+
{item.badge}
1913+
</RecommendationShelfInlineBadge>
1914+
) : null}
19121915
</RecommendationAssistCardHeader>
19131916
<RecommendationAssistCardSummary>
19141917
{item.contextSummary
@@ -1934,7 +1937,7 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
19341937
key={item.key}
19351938
type="button"
19361939
data-testid={item.testId}
1937-
title={`${item.badge} · ${item.summary}`}
1940+
title={item.summary}
19381941
onClick={() => {
19391942
item.onSelect();
19401943
}}
@@ -1943,7 +1946,9 @@ export const EmptyState: React.FC<EmptyStateProps> = ({
19431946
<RecommendationAssistCardTitle>
19441947
{item.title}
19451948
</RecommendationAssistCardTitle>
1946-
<RecommendationShelfBadge>{item.badge}</RecommendationShelfBadge>
1949+
{item.badge ? (
1950+
<RecommendationShelfBadge>{item.badge}</RecommendationShelfBadge>
1951+
) : null}
19471952
</RecommendationAssistCardHeader>
19481953
<RecommendationAssistCardSummary>
19491954
{item.summary}

src/components/agent/chat/components/ImageTaskViewer.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,21 @@ export function ImageTaskViewer({
846846
src={selectedOutput.url}
847847
alt={selectedOutput.prompt || "图片任务结果"}
848848
className="h-full w-full object-contain"
849+
renderFallback={(reason) => (
850+
<div className="flex h-full min-h-[320px] items-center justify-center px-6 text-center">
851+
<div className="max-w-sm space-y-3">
852+
<Sparkles className="mx-auto h-8 w-8 text-slate-400" />
853+
<div className="text-sm font-semibold text-slate-900">
854+
{reason === "error" ? "预览加载失败" : "暂无可预览图片"}
855+
</div>
856+
<div className="text-sm leading-6 text-slate-500">
857+
{reason === "error"
858+
? "这张图片暂时无法在预览窗口中展示,请稍后重试或在新窗口打开。"
859+
: "当前没有可展示的图片结果。"}
860+
</div>
861+
</div>
862+
</div>
863+
)}
849864
/>
850865
) : null}
851866
{selectedTaskOutputs.length > 1 ? (
@@ -926,6 +941,18 @@ export function ImageTaskViewer({
926941
"w-full object-cover",
927942
resolveOutputTileAspectClass(selectedTask?.layoutHint),
928943
)}
944+
renderFallback={() => (
945+
<div
946+
className={cn(
947+
"flex w-full items-center justify-center bg-slate-50 px-3 text-center text-[11px] font-medium text-slate-400",
948+
resolveOutputTileAspectClass(
949+
selectedTask?.layoutHint,
950+
),
951+
)}
952+
>
953+
预览失败
954+
</div>
955+
)}
929956
/>
930957
<span className="absolute left-2 top-2 inline-flex h-6 min-w-6 items-center justify-center rounded-full border border-slate-200/80 bg-white/95 px-1.5 text-[11px] font-semibold text-slate-700 shadow-sm shadow-slate-950/5">
931958
{resolveOutputDisplayIndex(index, output.slotIndex)}

src/components/agent/chat/skill-selection/CharacterMention.test.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2707,7 +2707,6 @@ describe("CharacterMention", () => {
27072707

27082708
await typeSlashAndWait(textarea);
27092709

2710-
expect(document.body.textContent).toContain("围绕最近成果");
27112710
expect(document.body.textContent).toContain("成果:本周账号复盘线索");
27122711

27132712
const resultTemplateSection = Array.from(
@@ -2757,7 +2756,6 @@ describe("CharacterMention", () => {
27572756
const banner = document.body.querySelector(
27582757
'[data-testid="input-capability-section-banner-result-templates"]',
27592758
);
2760-
expect(banner?.textContent).toContain("围绕最近复盘");
27612759
expect(banner?.textContent).toContain("最近复盘已更新:短视频编排 · 补证据");
27622760
expect(banner?.textContent).toContain("这轮结果还缺证据");
27632761
expect(banner?.textContent).toContain("这轮复盘更建议优先回到");

src/components/agent/chat/skill-selection/CharacterMentionPanel.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,11 @@ export const CharacterMentionPanel: React.FC<CharacterMentionPanelProps> = ({
333333
<div className="flex flex-wrap items-start justify-between gap-2">
334334
<div className="min-w-0 flex-1">
335335
<div className="flex flex-wrap items-center gap-2">
336-
<span className="rounded-full border border-emerald-200 bg-emerald-50 px-2 py-0.5 text-[10px] font-medium text-emerald-700">
337-
{section.banner.badge}
338-
</span>
336+
{section.banner.badge ? (
337+
<span className="rounded-full border border-emerald-200 bg-emerald-50 px-2 py-0.5 text-[10px] font-medium text-emerald-700">
338+
{section.banner.badge}
339+
</span>
340+
) : null}
339341
<div className="text-xs font-semibold leading-5 text-slate-900">
340342
{section.banner.title}
341343
</div>

src/components/agent/chat/skill-selection/inputCapabilitySections.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export interface InputCapabilitySection {
110110
heading: string;
111111
items: InputCapabilityDescriptor[];
112112
banner?: {
113-
badge: string;
113+
badge?: string;
114114
title: string;
115115
summary: string;
116116
footnote?: string;
@@ -1276,8 +1276,6 @@ function buildSlashCapabilitySections(
12761276
}),
12771277
icon: "sparkles" as const,
12781278
iconClassName: "mr-2 h-4 w-4 text-amber-600",
1279-
kindLabel:
1280-
featuredCuratedTaskTemplateMap.get(task.id)?.badgeLabel ?? task.badge,
12811279
task,
12821280
launchInputValues: launchContext.launchPrefill?.inputValues,
12831281
referenceMemoryIds: launchContext.mergedReferenceMemoryIds,
@@ -1311,7 +1309,6 @@ function buildSlashCapabilitySections(
13111309
null;
13121310

13131311
return {
1314-
badge: "围绕最近复盘",
13151312
title: `最近复盘已更新:${latestReviewSignal.title}`,
13161313
summary: truncateSectionBannerText(
13171314
[

src/components/provider-pool/api-key/ProviderModelList.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,6 @@ export const ProviderModelList: React.FC<ProviderModelListProps> = ({
593593
preservesCurrentProviderCustomModels ||
594594
(!autoFetchCapability.requiresLiveModelTruth &&
595595
(normalizedSource === "Catalog" ||
596-
normalizedSource === "CustomModels" ||
597596
normalizedSource === "LocalFallback"));
598597

599598
if (result && result.models) {

0 commit comments

Comments
 (0)