From d2c56ba41888b43b23be5beddffa9de98a802053 Mon Sep 17 00:00:00 2001 From: coso Date: Wed, 8 Apr 2026 00:38:05 +0800 Subject: [PATCH] chore: release v1.5.0 --- RELEASE_NOTES.md | 48 +- docs/aiprompts/command-runtime.md | 17 +- docs/aiprompts/commands.md | 61 +- docs/aiprompts/playwright-e2e.md | 41 +- docs/aiprompts/quality-workflow.md | 113 +- docs/prd/skills/async-image-skill-task-prd.md | 5 +- extensions/lime-chrome/background.js | 2 +- extensions/lime-chrome/content_script.js | 14 +- .../site_adapter_runners.generated.js | 1050 ++++++++ package.json | 14 +- packages/lime-cli-npm/README.md | 10 +- packages/lime-cli-npm/package.json | 2 +- ...enerate-extension-site-adapter-runners.mjs | 114 + src-tauri/Cargo.lock | 47 +- src-tauri/Cargo.toml | 8 +- src-tauri/crates/agent/src/event_converter.rs | 1 + src-tauri/crates/agent/src/protocol.rs | 2 + src-tauri/crates/agent/src/session_store.rs | 169 ++ src-tauri/crates/agent/src/tool_io_offload.rs | 3 + .../crates/agent/src/turn_input_envelope.rs | 3 + src-tauri/crates/core/src/agent/types.rs | 3 + .../src/database/agent_session_repository.rs | 10 + .../crates/core/src/database/dao/agent.rs | 100 +- .../migration/general_chat_migration.rs | 8 +- src-tauri/crates/core/src/database/schema.rs | 10 + src-tauri/crates/core/src/models/mod.rs | 6 +- .../crates/core/src/models/skill_model.rs | 10 +- src-tauri/crates/lime-cli/Cargo.toml | 2 + src-tauri/crates/lime-cli/src/catalog.rs | 31 +- src-tauri/crates/lime-cli/src/main.rs | 514 +++- src-tauri/crates/media-runtime/Cargo.toml | 3 + src-tauri/crates/media-runtime/src/lib.rs | 627 ++++- .../services/src/session_context_service.rs | 2 + .../default-skills/form_generate/SKILL.md | 72 + .../default-skills/image_generate/SKILL.md | 15 +- .../presentation_generate/SKILL.md | 68 + .../default-skills/site_search/SKILL.md | 4 +- .../site_search/references/adapter-catalog.md | 2 + .../default-skills/webpage_generate/SKILL.md | 54 + .../site-adapters/bundled/index.json | 24 + .../bundled/scripts/x-article-export.js | 398 +++ src-tauri/src/agent_tools/inventory.rs | 5 +- .../aster_agent_cmd/analysis_skill_launch.rs | 84 + .../aster_agent_cmd/broadcast_skill_launch.rs | 87 + .../aster_agent_cmd/cover_skill_launch.rs | 87 + .../deep_search_skill_launch.rs | 85 + .../aster_agent_cmd/form_skill_launch.rs | 274 +++ .../aster_agent_cmd/image_skill_launch.rs | 89 + src-tauri/src/commands/aster_agent_cmd/mod.rs | 70 +- .../aster_agent_cmd/pdf_read_skill_launch.rs | 83 + .../presentation_skill_launch.rs | 280 +++ .../aster_agent_cmd/report_skill_launch.rs | 85 + .../aster_agent_cmd/research_skill_launch.rs | 85 + .../resource_search_skill_launch.rs | 87 + .../commands/aster_agent_cmd/runtime_turn.rs | 84 +- .../site_search_skill_launch.rs | 104 + .../aster_agent_cmd/summary_skill_launch.rs | 84 + .../src/commands/aster_agent_cmd/tests.rs | 2176 ++++++++++++++++- .../commands/aster_agent_cmd/tool_runtime.rs | 86 + .../tool_runtime/creation_tools.rs | 365 ++- .../tool_runtime/media_cli_bridge.rs | 62 + .../tool_runtime/site_tools.rs | 6 + .../transcription_skill_launch.rs | 87 + .../translation_skill_launch.rs | 84 + .../typesetting_skill_launch.rs | 87 + .../aster_agent_cmd/url_parse_skill_launch.rs | 87 + .../aster_agent_cmd/video_skill_launch.rs | 87 + .../aster_agent_cmd/webpage_skill_launch.rs | 260 ++ src-tauri/src/commands/media_task_cmd.rs | 326 +-- .../src/dev_bridge/dispatcher/media_tasks.rs | 17 +- .../src/services/browser_connector_service.rs | 134 +- .../src/services/chat_history_service.rs | 4 +- .../conversation_statistics_service.rs | 4 +- .../src/services/site_adapter_registry.rs | 64 + .../src/services/site_capability_service.rs | 1196 ++++++++- src-tauri/src/skills/default_skills.rs | 48 +- src-tauri/tauri.conf.headless.json | 2 +- src-tauri/tauri.conf.json | 2 +- src/App.tsx | 6 +- .../capability-agent-teams-lime.png | Bin 0 -> 444577 bytes .../capability-automations-lime.png | Bin 0 -> 405544 bytes .../capability-browser-assist-lime.png | Bin 0 -> 503828 bytes .../entry-surface/capability-skills-lime.png | Bin 0 -> 466116 bytes src/components/AppSidebar.test.tsx | 13 +- src/components/AppSidebar.tsx | 63 +- .../agent/chat/AgentChatWorkspace.tsx | 421 +++- .../agent/chat/commands/executor.ts | 8 + src/components/agent/chat/commands/types.ts | 1 + .../components/AgentThreadTimeline.test.tsx | 16 + .../chat/components/AgentThreadTimeline.tsx | 10 +- .../agent/chat/components/ChatNavbar.test.tsx | 25 + .../agent/chat/components/ChatNavbar.tsx | 25 + .../chat/components/ChatSidebar.test.tsx | 65 + .../agent/chat/components/ChatSidebar.tsx | 81 +- .../agent/chat/components/EmptyState.test.tsx | 58 +- .../agent/chat/components/EmptyState.tsx | 281 ++- .../agent/chat/components/EmptyStateHero.tsx | 446 ++-- .../chat/components/ImageTaskViewer.test.tsx | 18 + .../agent/chat/components/ImageTaskViewer.tsx | 145 +- .../ImageWorkbenchMessagePreview.tsx | 277 +-- .../Inputbar/components/InputbarCore.test.tsx | 10 + .../Inputbar/components/InputbarCore.tsx | 7 +- .../components/InputbarModelExtra.tsx | 5 + .../Inputbar/hooks/useInputbarDictation.ts | 19 +- .../agent/chat/components/Inputbar/styles.ts | 48 +- .../chat/components/MessageList.test.tsx | 239 +- .../agent/chat/components/MessageList.tsx | 69 +- .../chat/components/TaskMessagePreview.tsx | 209 +- .../components/TokenUsageDisplay.test.tsx | 78 + .../chat/components/TokenUsageDisplay.tsx | 37 +- .../chat/components/ToolCallDisplay.test.tsx | 15 + .../agent/chat/components/ToolCallDisplay.tsx | 95 +- .../components/emptyStateSurfaceTokens.ts | 10 +- .../agent/chat/hooks/agentChatHistory.test.ts | 224 ++ .../agent/chat/hooks/agentChatHistory.ts | 343 ++- .../chat/hooks/agentChatSendMessage.test.ts | 19 +- .../agent/chat/hooks/agentChatSendMessage.ts | 11 + .../agent/chat/hooks/agentChatShared.ts | 2 + .../chat/hooks/agentStreamEventProcessor.ts | 32 + .../hooks/agentStreamRuntimeHandler.test.ts | 85 + .../chat/hooks/agentStreamRuntimeHandler.ts | 27 +- .../agentStreamSlashSkillPreflight.test.ts | 128 + .../hooks/agentStreamSlashSkillPreflight.ts | 30 + .../chat/hooks/agentStreamSubmitFailure.ts | 8 +- src/components/agent/chat/hooks/index.ts | 2 + .../agent/chat/hooks/skillCommand.test.ts | 49 + .../agent/chat/hooks/skillCommand.ts | 10 +- .../agent/chat/hooks/useAgentSession.ts | 113 +- .../chat/hooks/useAsterAgentChat.test.tsx | 184 ++ .../agent/chat/hooks/useAsterAgentChat.ts | 4 + .../useGeneralWorkbenchSendBoundary.test.tsx | 2 +- .../agent/chat/hooks/useLimeSkills.test.tsx | 11 +- .../agent/chat/hooks/useLimeSkills.ts | 41 +- .../agent/chat/hooks/useTrayModelShortcuts.ts | 14 +- .../chat/hooks/useWechatRuntimeModelSync.ts | 9 +- src/components/agent/chat/index.test.tsx | 28 + .../agent/chat/service-skills/types.ts | 2 + .../service-skills/useServiceSkills.test.tsx | 7 +- .../chat/service-skills/useServiceSkills.ts | 34 +- .../skill-selection/CharacterMention.test.tsx | 525 +++- .../chat/skill-selection/CharacterMention.tsx | 211 +- .../skill-selection/CharacterMentionPanel.tsx | 551 ++++- .../chat/skill-selection/mentionEntryUsage.ts | 125 + .../chat/skill-selection/slashEntryUsage.ts | 111 + .../agentRuntimeErrorPresentation.test.ts | 38 + .../utils/agentRuntimeErrorPresentation.ts | 101 + .../agent/chat/utils/agentRuntimeStatus.ts | 4 +- .../chat/utils/codeWorkbenchCommand.test.ts | 45 + .../agent/chat/utils/codeWorkbenchCommand.ts | 168 ++ .../chat/utils/formWorkbenchCommand.test.ts | 47 + .../agent/chat/utils/formWorkbenchCommand.ts | 236 ++ .../utils/internalArtifactVisibility.test.ts | 27 + .../chat/utils/internalArtifactVisibility.ts | 17 + .../agent/chat/utils/messageArtifacts.test.ts | 59 + .../agent/chat/utils/messageArtifacts.ts | 65 +- .../presentationWorkbenchCommand.test.ts | 47 + .../utils/presentationWorkbenchCommand.ts | 245 ++ .../utils/publishWorkbenchCommand.test.ts | 46 + .../chat/utils/publishWorkbenchCommand.ts | 138 ++ .../utils/taskPreviewFromToolResult.test.ts | 179 ++ .../chat/utils/taskPreviewFromToolResult.ts | 102 +- .../chat/utils/topicProjectResolution.test.ts | 11 + .../chat/utils/topicProjectResolution.ts | 14 +- .../utils/webpageWorkbenchCommand.test.ts | 46 + .../chat/utils/webpageWorkbenchCommand.ts | 168 ++ .../ServiceSkillExecutionCard.test.tsx | 15 + .../workspace/ServiceSkillExecutionCard.tsx | 23 + .../workspace/WorkspaceConversationScene.tsx | 3 + .../chat/workspace/WorkspaceShellScene.tsx | 3 + .../agent/chat/workspace/chatSurfaceProps.ts | 11 + .../workspace/serviceSkillSceneLaunch.test.ts | 247 +- .../chat/workspace/serviceSkillSceneLaunch.ts | 245 +- .../useWorkspaceArtifactPreviewActions.ts | 7 +- .../useWorkspaceBrowserAssistRuntime.ts | 11 +- .../useWorkspaceCanvasLayoutRuntime.test.tsx | 51 + .../useWorkspaceCanvasLayoutRuntime.ts | 12 +- ...eWorkspaceConversationSceneRuntime.test.ts | 11 + .../useWorkspaceConversationSceneRuntime.tsx | 6 + ...WorkspaceConversationShellSceneRuntime.tsx | 3 + ...eWorkspaceImageTaskPreviewRuntime.test.tsx | 272 ++- .../useWorkspaceImageTaskPreviewRuntime.ts | 340 ++- ...kspaceImageWorkbenchActionRuntime.test.tsx | 22 +- ...useWorkspaceImageWorkbenchActionRuntime.ts | 63 +- .../useWorkspaceSendActions.test.tsx | 608 ++++- .../chat/workspace/useWorkspaceSendActions.ts | 805 +++++- ...WorkspaceServiceSkillEntryActions.test.tsx | 42 + .../useWorkspaceServiceSkillEntryActions.ts | 76 +- .../useWorkspaceShellSceneRuntime.tsx | 3 + ...seWorkspaceVideoTaskActionRuntime.test.tsx | 250 ++ .../useWorkspaceVideoTaskActionRuntime.ts | 254 ++ ...eWorkspaceVideoTaskPreviewRuntime.test.tsx | 51 + .../useWorkspaceVideoTaskPreviewRuntime.ts | 120 +- .../useWorkspaceWriteFileAction.test.tsx | 52 + .../workspace/useWorkspaceWriteFileAction.ts | 73 +- .../chat/workspace/videoTaskPreviewState.ts | 105 + .../chat/workspace/workspaceSendHelpers.ts | 39 +- src/components/agent/chat/workspaceEntry.ts | 8 +- src/components/channels/ImConfigPage.test.tsx | 4 +- src/components/channels/ImConfigPage.tsx | 7 +- src/components/image-gen/useImageGen.ts | 35 +- src/components/memory/MemoryPage.test.tsx | 10 +- src/components/memory/MemoryPage.tsx | 168 +- .../resources/ResourcesPage.test.tsx | 4 +- src/components/resources/ResourcesPage.tsx | 9 +- .../settings-v2/agent/image-gen/index.tsx | 70 +- .../agent/providers/index.test.tsx | 15 +- .../settings-v2/agent/providers/index.tsx | 4 +- .../general/appearance/index.test.tsx | 28 +- .../skills/SkillsWorkspacePage.test.tsx | 8 +- src/components/skills/SkillsWorkspacePage.tsx | 37 +- .../workspace/video/VideoWorkspace.tsx | 501 +++- .../video/VideoWorkspaceSelection.test.tsx | 190 ++ src/components/workspace/video/types.ts | 2 + src/hooks/useAppStartupEffects.ts | 4 + src/hooks/useGlobalTrayModelSync.ts | 8 +- src/hooks/useOemLimeHubProviderSync.test.tsx | 4 + src/hooks/useOemLimeHubProviderSync.ts | 20 +- src/hooks/useProjects.test.tsx | 219 ++ src/hooks/useProjects.ts | 101 +- src/hooks/useRelayRegistry.ts | 16 +- src/lib/api/agentProtocol.ts | 1 + src/lib/api/frontendDebug.test.ts | 17 +- src/lib/api/frontendDebug.ts | 6 +- src/lib/api/serviceSkills.test.ts | 32 +- src/lib/api/serviceSkills.ts | 145 +- src/lib/api/skillCatalog.test.ts | 54 +- src/lib/api/skillCatalog.ts | 261 +- src/lib/artifact-protocol/index.test.ts | 32 + src/lib/artifact-protocol/index.ts | 101 +- src/lib/dev-bridge/http-client.test.ts | 157 +- src/lib/dev-bridge/http-client.ts | 144 +- src/lib/governance/legacySurfaceCatalog.json | 25 + src/lib/navigation/sidebarNav.ts | 24 +- src/lib/tauri-mock/core.ts | 16 + .../scheduleMinimumDelayIdleTask.test.ts | 52 + src/lib/utils/scheduleMinimumDelayIdleTask.ts | 52 + src/lib/videoWorkbenchEvents.ts | 62 + src/lib/webview-api.ts | 6 + 238 files changed, 22104 insertions(+), 2467 deletions(-) create mode 100644 extensions/lime-chrome/site_adapter_runners.generated.js create mode 100644 scripts/generate-extension-site-adapter-runners.mjs create mode 100644 src-tauri/resources/default-skills/form_generate/SKILL.md create mode 100644 src-tauri/resources/default-skills/presentation_generate/SKILL.md create mode 100644 src-tauri/resources/default-skills/webpage_generate/SKILL.md create mode 100644 src-tauri/resources/site-adapters/bundled/scripts/x-article-export.js create mode 100644 src-tauri/src/commands/aster_agent_cmd/form_skill_launch.rs create mode 100644 src-tauri/src/commands/aster_agent_cmd/presentation_skill_launch.rs create mode 100644 src-tauri/src/commands/aster_agent_cmd/webpage_skill_launch.rs create mode 100644 src/assets/entry-surface/capability-agent-teams-lime.png create mode 100644 src/assets/entry-surface/capability-automations-lime.png create mode 100644 src/assets/entry-surface/capability-browser-assist-lime.png create mode 100644 src/assets/entry-surface/capability-skills-lime.png create mode 100644 src/components/agent/chat/components/TokenUsageDisplay.test.tsx create mode 100644 src/components/agent/chat/hooks/agentStreamRuntimeHandler.test.ts create mode 100644 src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.test.ts create mode 100644 src/components/agent/chat/skill-selection/mentionEntryUsage.ts create mode 100644 src/components/agent/chat/skill-selection/slashEntryUsage.ts create mode 100644 src/components/agent/chat/utils/agentRuntimeErrorPresentation.test.ts create mode 100644 src/components/agent/chat/utils/agentRuntimeErrorPresentation.ts create mode 100644 src/components/agent/chat/utils/codeWorkbenchCommand.test.ts create mode 100644 src/components/agent/chat/utils/codeWorkbenchCommand.ts create mode 100644 src/components/agent/chat/utils/formWorkbenchCommand.test.ts create mode 100644 src/components/agent/chat/utils/formWorkbenchCommand.ts create mode 100644 src/components/agent/chat/utils/internalArtifactVisibility.test.ts create mode 100644 src/components/agent/chat/utils/internalArtifactVisibility.ts create mode 100644 src/components/agent/chat/utils/presentationWorkbenchCommand.test.ts create mode 100644 src/components/agent/chat/utils/presentationWorkbenchCommand.ts create mode 100644 src/components/agent/chat/utils/publishWorkbenchCommand.test.ts create mode 100644 src/components/agent/chat/utils/publishWorkbenchCommand.ts create mode 100644 src/components/agent/chat/utils/taskPreviewFromToolResult.test.ts create mode 100644 src/components/agent/chat/utils/webpageWorkbenchCommand.test.ts create mode 100644 src/components/agent/chat/utils/webpageWorkbenchCommand.ts create mode 100644 src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.test.tsx create mode 100644 src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.ts create mode 100644 src/components/agent/chat/workspace/videoTaskPreviewState.ts create mode 100644 src/components/workspace/video/VideoWorkspaceSelection.test.tsx create mode 100644 src/hooks/useProjects.test.tsx create mode 100644 src/lib/utils/scheduleMinimumDelayIdleTask.test.ts create mode 100644 src/lib/utils/scheduleMinimumDelayIdleTask.ts create mode 100644 src/lib/videoWorkbenchEvents.ts diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 63ac456e6..347fb2801 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,52 +1,52 @@ -## Lime v1.4.0 +## Lime v1.5.0 ### ✨ 主要更新 -- **通用工作台成为当前主壳**:Agent 聊天工作区继续从旧 `ThemeWorkbench*` 表面收口到 `GeneralWorkbench*` 主链,侧边栏、上下文面板、执行日志、工作流面板、输入区启动边界与任务预览统一落到新的通用工作台运行时;一批旧 `ThemeWorkbench` 组件、hook 与 compat 状态层退出 current 主路径 -- **服务技能与命令运行时扩容**:前后端围绕 `analysis`、`summary`、`translation`、`pdf_read`、`report_generate`、`research`、`site_search`、`broadcast_generate`、`typesetting`、`modal_resource_search` 等技能补齐 `*_skill_launch` 主链,原始用户输入继续保留进入 Agent turn,启动 metadata、prompt context、runtime turn 和 tool runtime 的事实源进一步收口 -- **站点技能与工作台协议继续收敛**:`service_skill_launch` 继续统一站点技能启动语义,站点技能预执行结果、站点适配器上下文、Team 运行时偏好、artifact metadata 与工作台上下文同步链路一起补齐;浏览器 compat 工具前缀在相关场景下继续被隔离,避免回流旧边界 -- **文档与治理目录同步更新**:`docs/aiprompts/command-runtime.md`、`commands.md`、`quality-workflow.md`、`playwright-e2e.md`、`overview.md` 等工程文档已围绕当前服务技能主链与通用工作台事实源完成更新,默认技能目录新增并收口 `analysis / pdf_read / report_generate / summary / translation` -- **版本与依赖面同步发版**:Lime 应用与 `@limecloud/lime-cli` 升级到 `1.4.0`,Rust workspace crate 版本快照、Tauri 配置与 CLI README 示例同步更新;`aster-rust` Git tag 升级到 `v0.27.0` +- **创建型工作台技能继续扩容**:在现有 `analysis / summary / translation / pdf_read / report_generate / research / site_search / image / cover / video / broadcast / url_parse / typesetting` 主链基础上,新增并收口 `form_generate`、`presentation_generate`、`webpage_generate`;前后端围绕 `*_skill_launch`、tool runtime、artifact 输出、任务预览和权限边界继续统一到当前 harness 主路径 +- **Agent 聊天工作台进一步收口到当前主链**:`AgentChatWorkspace`、`MessageList`、`EmptyState`、`Inputbar`、`CharacterMention`、`WorkspaceConversationScene`、`useWorkspaceSendActions`、`useAsterAgentChat`、`serviceSkillSceneLaunch` 等界面与运行时继续围绕通用工作台和服务技能入口收拢;消息预览、任务时间线、视频工作台、Token 使用展示与 slash / mention 入口同步增强 +- **站点适配器与浏览器运行时增强**:bundled site adapter 目录新增 `x/article-export`,站点能力选择、现有浏览器会话复用、保存到当前内容/项目、导入外部 YAML 适配器、server-synced catalog 回落策略与推荐链路进一步完善;扩展侧同步新增 site adapter runner 生成入口 +- **运行时状态与协议事实源继续收敛**:Agent session store、turn input envelope、tool io offload、runtime turn metadata、team / subagent 偏好、site capability、chat history、service skill catalog、artifact protocol 与 DevBridge HTTP client 一批边界继续补齐 current 语义和回归测试 +- **文档与治理目录同步更新**:`docs/aiprompts/command-runtime.md`、`commands.md`、`playwright-e2e.md`、`quality-workflow.md` 等工程文档已围绕当前服务技能、site adapter、GUI smoke 与运行时事实源刷新;默认技能目录同步纳入 `form / presentation / webpage / x article export` 相关说明 ### ⚠️ 发布与兼容性说明 -- 本次发布 tag 为 `v1.4.0`,应用内版本号保持为 `1.4.0` -- `@limecloud/lime-cli@1.4.0` 要求 `Node >= 18`,支持 `darwin / linux / win32` 与 `x64 / arm64` -- 当前 Agent GUI 主路径以 `GeneralWorkbench*` 为准;旧 `ThemeWorkbench*` 相关组件、壳层和一批 compat hook 已继续退出,不应再作为 current surface 扩展 -- 当前默认技能目录已包含 `analysis`、`broadcast_generate`、`modal_resource_search`、`pdf_read`、`report_generate`、`research`、`site_search`、`summary`、`translation`、`typesetting` 等服务技能主链 -- `aster-rust` 依赖已固定到远程 tag `v0.27.0`;本地 `.cargo/config.toml` patch override 仍仅作为开发联调手段,不属于发布事实源 +- 本次发布 tag 为 `v1.5.0`,应用内版本号保持为 `1.5.0` +- `@limecloud/lime-cli@1.5.0` 要求 `Node >= 18`,支持 `darwin / linux / win32` 与 `x64 / arm64` +- 当前 Agent GUI 主路径继续以 `GeneralWorkbench*` 与服务技能启动边界为准;旧表面不应再作为 current surface 扩展 +- 当前默认技能目录已覆盖 `analysis`、`broadcast_generate`、`form_generate`、`image_generate`、`modal_resource_search`、`pdf_read`、`presentation_generate`、`report_generate`、`research`、`site_search`、`summary`、`translation`、`typesetting`、`url_parse`、`video_generate`、`webpage_generate` +- `aster-rust` 依赖已固定到远程 tag `v0.27.1`;本地 `.cargo/config.toml` patch override 仍仅用于开发联调,不属于发布事实源 ### 🔗 依赖与版本同步 -- 应用版本已同步提升到 `1.4.0`,覆盖 `package.json`、`src-tauri/Cargo.toml`、`src-tauri/tauri.conf.json`、`src-tauri/tauri.conf.headless.json` -- `packages/lime-cli-npm/package.json` 与 README 发布示例已同步更新到 `1.4.0` -- `src-tauri/Cargo.lock` 已刷新:工作区内部 crate 版本快照已对齐到 `1.4.0`,`aster-core` / `aster-models` 已对齐到 `0.27.0` -- `package-lock.json` 已同步根应用版本号到 `1.4.0` +- 应用版本已同步提升到 `1.5.0`,覆盖 `package.json`、`package-lock.json`、`src-tauri/Cargo.toml`、`src-tauri/tauri.conf.json`、`src-tauri/tauri.conf.headless.json` +- `packages/lime-cli-npm/package.json` 与 README 发布示例已同步更新到 `1.5.0` +- `src-tauri/Cargo.lock` 已刷新:工作区内部 crate 版本快照已对齐到 `1.5.0`,`aster-core` / `aster-models` 已对齐到 `0.27.1` ### 🧪 发布前校验 - `npm run verify:app-version` - `cargo fmt --manifest-path src-tauri/Cargo.toml --all` +- `CARGO_TARGET_DIR=src-tauri/target/codex-v1_5_0 cargo test --manifest-path src-tauri/Cargo.toml` +- `CARGO_TARGET_DIR=src-tauri/target/codex-v1_5_0 cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets -- -D warnings` - `npm run lint` - `npm run test:contracts` -- `CARGO_TARGET_DIR=src-tauri/target/codex-verify CARGO_INCREMENTAL=0 cargo test --manifest-path src-tauri/Cargo.toml` -- `CARGO_TARGET_DIR=src-tauri/target/codex-verify CARGO_INCREMENTAL=0 cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets -- -D warnings` -- `CARGO_TARGET_DIR=src-tauri/target/codex-verify npm run verify:gui-smoke` +- `CARGO_TARGET_DIR=src-tauri/target/codex-v1_5_0 npm run verify:gui-smoke` - 当前结果: - `npm run verify:app-version`:通过 - `cargo fmt --manifest-path src-tauri/Cargo.toml --all`:通过 + - `cargo test --manifest-path src-tauri/Cargo.toml`:通过,`852` 个单测全部通过,2 个真实联网 smoke 用例按预期忽略 + - `cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets -- -D warnings`:通过 - `npm run lint`:通过 - `npm run test:contracts`:通过 - - `cargo test --manifest-path src-tauri/Cargo.toml`:通过 - - `cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets -- -D warnings`:通过 - `npm run verify:gui-smoke`:通过 + - 说明:首次复用现有 headless 环境时,`browser-runtime` smoke 出现一次 CDP 标签页读取瞬时失败;单独重跑 `smoke:browser-runtime` 后通过,随后整条 `verify:gui-smoke` 复跑通过,未见持续性故障 ### 📝 文档同步 -- 发布说明已切换到当前这次 `v1.4.0` 稳定版发布内容,可直接作为 GitHub Release note 使用 -- 服务技能主链、命令运行时、GUI 续测与工程质量文档已与当前实现同步 -- 通用工作台命名、默认技能目录与命令运行时事实源已围绕当前实现完成收口 +- 发布说明已切换到当前这次 `v1.5.0` 稳定版发布内容,可直接作为 GitHub Release note 使用 +- 默认技能目录、site adapter catalog 与运行时事实源文档已同步到当前实现 +- 服务技能主链、站点能力主链、GUI smoke 与契约边界文档均已围绕当前实现刷新 --- -**完整变更**: `v1.3.0` -> `v1.4.0` +**完整变更**: `v1.4.0` -> `v1.5.0` diff --git a/docs/aiprompts/command-runtime.md b/docs/aiprompts/command-runtime.md index b2a4e63b8..7ff642cc1 100644 --- a/docs/aiprompts/command-runtime.md +++ b/docs/aiprompts/command-runtime.md @@ -69,7 +69,16 @@ Lime 的命令体系固定按以下关系理解: 对图片任务再补一条固定约束: -`@配图/@修图/@重绘` 原始文本必须先进入 Agent turn,再由 `harness.image_skill_launch` 辅助首刀 `Skill(image_generate)`;文稿 inline 配图、封面位、图片工作台编辑/变体这类显式图片动作也一样,必须先组装 `image_task` 上下文后再复用统一发送主线。不要把 current 主链重新改回前端预翻 slash skill、前端直建任务或“按钮直调 task API”。 +`@配图/@修图/@重绘` 原始文本必须先进入 Agent turn,再由 `harness.image_skill_launch` 辅助首刀 `Skill(image_generate)`;文稿 inline 配图、封面位、图片工作台编辑/变体这类显式图片动作也一样,必须先组装 `image_task` 上下文后再复用统一发送主线。不要把 current 主链重新改回前端预翻 slash skill、前端直建任务或“按钮直调 task API”。图片 launch 还必须显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用偏航工具,并在必要时直接从当前 session tool surface 移除这些 detour tools,避免模型在“搜技能目录”里空转或把权限错误暴露给用户。默认 `Bash -> lime media image generate --json` 入口也必须把 task file 真正推进到完成态;兼容入口 `lime task create image --json` 现在也必须复用同一条图片执行链,不能再只停在“任务已创建 / pending_submit”。即使退回 compat 的 `lime_create_image_generation_task`,也必须委托同一条 task artifact + worker 执行链,并禁止把任务改写到 `outputPath` / markdown 文稿。 +- 显式图片动作允许先在前端补 `image_skill_launch` metadata,但发送前的 `session_id` 绑定仍必须走统一发送边界;如果 metadata 里暂时还是本地 draft key,必须在真正发起 send 时替换成真实会话 ID,而不是在图片动作入口提前额外建一个图片专用会话。 +- `.lime/tasks/**/*.json` 继续作为图片主链的唯一恢复事实源,但它们属于内部任务快照,默认不应直接渲染成用户可见 artifact 卡片或时间线文件卡;用户面看到的应该是轻结果卡、工具过程和右侧查看。 + +图片结果进入 UI 时还必须遵守以下 viewer 收口规则: + +- 图片任务的主结果事实源是 `image task preview + 图片工作台 outputs`,不是通用文本 artifact +- 空内容的二进制图片文件(如 `output_image.jpg`)不能再镜像成通用 artifact 卡片,否则会出现“重复文件卡 + 点不开”的假结果 +- `tool_result` 产物在 general workspace 中默认后台入库,不自动选中、不自动展开右侧工作台;抢焦点只允许发生在用户显式点击或仍在流式写入的文档类产物上 +- 同一产物路径的 `basename / 相对路径 / 绝对路径` 必须在前端视为同一文件,避免一张图被重复挂成多份结果 不要再把命令能力直接叙述成: @@ -108,6 +117,11 @@ Lime 的命令体系固定按以下关系理解: - `lime_run_service_skill` 再根据当前 turn 绑定的 `serviceSkillId + OEM runtime` 发起服务端 run / 短轮询,保证 slash scene 也走 `Agent -> tool -> timeline` 主链 - 未命中统一目录的 slash 文本必须继续回到普通 slash 流程,不能被错误吞成“未找到本地 Skill” +如果 `scene` 绑定的是 `site_adapter / browser_assist` 型技能,还要额外遵守两条边界: + +- 用户可见入口继续以 `entries.kind=scene` 为准,不要求把底层 site skill 强行暴露成首页技能卡;但运行时解析 `scene -> linkedSkillId` 时,不能只依赖首页可见 skill 列表,必须能回退完整 `ServiceSkill` 目录做绑定解析,否则会出现“slash 菜单里能选、发送时却找不到 skill”的假入口 +- 参数补齐协议继续只落在 `slotSchema`;如果未来要在 slash 场景或技能入口里弹参数表单,可以在渲染层把 `slotSchema` 映射成 `a2ui`,但不要把 `a2ui` 结构写进 `SkillCatalog`、`request_metadata` 或 runtime 协议 + 一句话: > 目录发现要服务端优先,但体验稳定性必须由客户端 seeded/fallback 托底。 @@ -142,6 +156,7 @@ Lime 的命令体系固定按以下关系理解: - 文稿 inline 配图、封面位、图片工作台编辑/变体等显式动作也必须补成同构的 `harness.image_skill_launch`,而不是绕过 Agent 直建任务 - 前端只负责补 `harness.image_skill_launch` 这类结构化上下文,不负责预翻成 slash skill 或偷偷发起 task - Agent 首刀优先调用 `Skill(image_generate)`,再由 skill / CLI / task file 链路继续执行 +- 不要为了“找技能”再先走 `ToolSearch`;如果运行时发现 `@配图` 在 `ToolSearch / WebSearch / Read / Glob / Grep` 上空转,应视为图片主链断裂 - 聊天区轻卡与 viewer 只消费后端真实运行态,不伪造“已完成” `@素材` 在这个分型里是一个混合分流特例: diff --git a/docs/aiprompts/commands.md b/docs/aiprompts/commands.md index a245f8a4d..7de3daa32 100644 --- a/docs/aiprompts/commands.md +++ b/docs/aiprompts/commands.md @@ -88,7 +88,7 @@ - `CharacterMention`、`builtinCommands`、场景 slash 补全不得再各自维护一套业务命令静态常量 - 服务端尚未返回 `entries` 时,允许网关层从 legacy `items` 兼容投影出 `entries` -- 客户端必须保留 seeded fallback,不能因为服务端暂时不可用就让 `@配图`、`@搜索`、`@深搜`、`@研报`、`@站点搜索`、`@读PDF`、`@总结`、`@翻译`、`@分析`、`@转写` 这类主链入口失能 +- 客户端必须保留 seeded fallback,不能因为服务端暂时不可用就让 `@配图`、`@PPT`、`@表单`、`@网页`、`@代码`、`@发布`、`@搜索`、`@深搜`、`@研报`、`@站点搜索`、`@读PDF`、`@总结`、`@翻译`、`@分析`、`@转写` 这类主链入口失能 - `src/components/agent/chat/commands/catalog.ts` 只继续承接 Lime 本地 / Codex 原生命令;产品型 `/` 场景不应再长期硬编码在这里 - 若服务端下发的 `renderContract` 超出 Lime 当前支持范围,优先由服务端回退到已支持类型,客户端也必须退化到通用 timeline / artifact 展示 @@ -100,6 +100,8 @@ - `lime_run_service_skill` 负责基于当前 session / turn 上下文读取已绑定的 `serviceSkillId + OEM runtime`,再向 OEM Scene Runtime 发起 run / poll - slash scene 不应再在前端直接调用 `createServiceSkillRun(...)` 或其它云端 run API;客户端当前职责只剩 catalog 解析、metadata 注入与 seeded/fallback 托底 - 未命中统一 scene 目录的 slash 文本必须继续回到普通 slash / Codex 命令流,不能误报本地 Skill 不存在 +- 如果某个 scene 背后绑定的是 `site_adapter / browser_assist` 型技能,前端可以继续只暴露 `scene`,不必把底层 site skill 再平铺成首页目录项;但运行时解析 `scene -> linkedSkillId` 时必须能回退完整 `ServiceSkill` 目录,而不是只看首页可见 skill 列表,否则会出现目录可见但执行找不到 skill 的协议漂移 +- scene 或技能补参继续只声明 `slotSchema`;若后续要在 GUI 里补 `a2ui` 表单,也只能作为渲染层实现细节,不能把 `a2ui` 类型耦合进 `SkillCatalog`、`request_metadata.harness` 或 Tauri 命令契约 如果这轮改动触达了 `client/skills` 协议,不仅要改 Lime 前端 selector,还要同步检查 `limecore` 的: @@ -118,7 +120,10 @@ `Claw` 的图片任务当前已经收敛到同一条 current 主链: -- Agent 驱动的图片命令与显式图片动作:`@配图` / `@修图` / `@重绘` / `@image` / `/image`,以及文稿 inline 配图、封面位、图片工作台编辑/变体、带引用图或带参考图的动作,都必须先进入 Agent turn。纯文本入口由 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 保留原始用户文本发送;显式动作则由 `src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.ts` 组装同构的 `image_task` 上下文后,再复用统一发送主线。两类入口都会把结构化 `image_task` 写入 `request_metadata.harness.image_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/image_skill_launch.rs` 会物化 `skill-input-image://N` 引用,并给当前 turn 注入只允许首刀优先调用 `Skill(image_generate)` 的系统提示。后续默认 skill 继续优先走 `Bash -> lime media image generate --json`,CLI 不可用时再回退 `lime_create_image_generation_task`,最终仍只落到标准 task file。 +- Agent 驱动的图片命令与显式图片动作:`@配图` / `@修图` / `@重绘` / `@image` / `/image`,以及文稿 inline 配图、封面位、图片工作台编辑/变体、带引用图或带参考图的动作,都必须先进入 Agent turn。纯文本入口由 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 保留原始用户文本发送;显式动作则由 `src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.ts` 组装同构的 `image_task` 上下文后,再复用统一发送主线。两类入口都会把结构化 `image_task` 写入 `request_metadata.harness.image_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/image_skill_launch.rs` 会物化 `skill-input-image://N` 引用,并给当前 turn 注入只允许首刀优先调用 `Skill(image_generate)` 的系统提示。当前图片 launch 还会在 session permission 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类偏航工具,并在当前 session registry 中直接移除这些 detour tools,避免模型把 `@配图` 卡死在“先搜工具目录”或把权限报错直接暴露给用户。后续默认 skill 继续优先走 `Bash -> lime media image generate --json`;该 CLI 当前主链必须创建 task artifact 后同步推进到 `queued/running/succeeded|partial|failed`,而不是停在 `pending_submit`。兼容入口 `lime task create image --json` 也必须委托同一条执行链,不能再只写 task file 不执行。CLI 不可用时再回退 `lime_create_image_generation_task`,但 compat tool 也必须复用同一个 `image_generate` task artifact + worker 执行链,且忽略 `outputPath` 这类非标准落盘出口,最终仍只落到标准 task file。 +- 显式图片动作如果先在前端补好了 `image_skill_launch` metadata,也必须继续复用统一发送边界去绑定真实 `session_id`。不要在图片动作侧为了拿 `session_id` 再额外 `createFreshSession(...)`,否则一次 `@配图` 会被拆成两个对话;当前正确做法是允许 metadata 先带本地 draft key,再在发送前统一替换成真实会话 ID。 +- 图片结果展示固定继续走 `聊天轻卡 -> 图片工作台` 主链:通用 `tool_result` 只保留 timeline 与轻卡,不应把空内容的 `.jpg/.png/.webp` 二进制结果再镜像成通用 artifact 卡片;否则会出现重复 `output_image.jpg`、路径不一致导致去重失败、以及点击后无法在文本 workbench 打开的错误体验。 +- 通用 artifact 层对同一路径必须做等价归一:`basename / 相对路径 / 绝对路径` 在前端应视作同一文件;`tool_result` 来源的产物默认后台更新,不自动选中、不自动展开工作台,避免命令执行过程中抢焦点。 - 图片 task 控制面:`src/lib/api/mediaTasks.ts` 继续承接 task control / replay / recovery,而不是首发入口: - `create_image_generation_task_artifact` @@ -127,6 +132,7 @@ - `cancel_media_task_artifact` 无论入口来自纯文本命令、slash scene 组合还是显式图片动作,最终都只允许写入当前项目根目录下的标准 `image_generate` task file,并写入 `session_id / project_id / content_id / entry_source / mode` 等上下文。若当前来源是文稿 inline 配图,还会继续写入 `usage=document-inline`,并以 `relationships.slot_id` 作为正文占位块与后续任务回填的正式绑定字段;payload 中的 `slot_id` 仅保留兼容读取。若前端已经能推断目标小节,还应继续把 `anchor_section_title` 写入 task payload;若还能识别用户当前选中的具体段落,还应继续把裁剪后的 `anchor_text` 一并写入,用于正文占位图与最终图片的 paragraph 级原位落位。聊天区动态占位、正文占位替换、结果回填、刷新恢复都必须继续以 `.lime/tasks` 为唯一事实源,不允许重新回到前端直连图片服务。 +- `.lime/tasks/**/*.json` 本身是内部任务状态快照,不是面向用户的正式产物。聊天区 artifact 卡片、时间线 file artifact 与默认文件面板都应把这类 JSON 隐藏掉;它们只服务恢复、轮询、取消、重试和诊断,真正给用户看的应该是轻量结果卡、tool timeline 与右侧 viewer。 Workspace `Bash` 运行时在当前主链中应优先解析同名 `lime` 入口:开发态优先回落到 `cargo run -p lime-cli`,打包态优先使用随应用提供的 CLI 二进制。默认 skill 若已经切到 `Bash -> lime media ...`,仍应保留 compat tool 作为兜底,避免在 CLI 暂不可用时把用户流量打断。 @@ -140,64 +146,84 @@ Skill 执行链路同样遵循单一命令边界。当前前端入口为 `src/li `Claw` 的纯文本封面命令也应沿同一条 current 主链收敛: -- Agent 驱动的封面命令:`@封面` / `@cover` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `cover_task` 写入 `request_metadata.harness.cover_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/cover_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(cover_generate)` 的系统提示。后续默认 skill 继续优先走 `social_generate_cover_image + Bash -> lime task create cover --json`,CLI 不可用时再回退 `lime_create_cover_generation_task`,最终仍只允许落到标准 `cover_generate` task file。 +- Agent 驱动的封面命令:`@封面` / `@cover` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `cover_task` 写入 `request_metadata.harness.cover_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/cover_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(cover_generate)` 的系统提示;当前封面 launch 还会在 session permission 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类偏航工具,并在当前 session registry 中直接移除这些 detour tools,避免模型在 `@封面` 首刀前先去搜索工具目录。后续默认 skill 继续优先走 `social_generate_cover_image + Bash -> lime task create cover --json`,CLI 不可用时再回退 `lime_create_cover_generation_task`,最终仍只允许落到标准 `cover_generate` task file。 `Claw` 的纯文本视频命令也应沿相同心智收敛: -- Agent 驱动的视频命令:`@视频` / `@video` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `video_task` 写入 `request_metadata.harness.video_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/video_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(video_generate)` 的系统提示。后续默认 skill 继续优先走 `Bash -> lime media video generate --json`,CLI 不可用时再回退 `lime_create_video_generation_task` / `create_video_generation_task`,最终仍只允许落到标准 `video_generate` 任务主链。 +- Agent 驱动的视频命令:`@视频` / `@video` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `video_task` 写入 `request_metadata.harness.video_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/video_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(video_generate)` 的系统提示;当前视频 launch 还会在 session permission 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类偏航工具,并在当前 session registry 中直接移除这些 detour tools,避免模型在 `@视频` 首刀前先去搜索工具目录。后续默认 skill 继续优先走 `Bash -> lime media video generate --json`,CLI 不可用时再回退 `lime_create_video_generation_task` / `create_video_generation_task`,最终仍只允许落到标准 `video_generate` 任务主链。 - 前端消费层不再把 `@视频` 当成图片任务特判。当前聊天区通过统一 `taskPreview` 消费 `video_generate` 任务摘要,点击结果卡后直接复用现有 `VideoCanvas / VideoWorkspace` 打开右侧 viewer;运行中的视频任务则由 `useWorkspaceVideoTaskPreviewRuntime` 基于 `videoGenerationApi.getTask(...)` 轮询回流状态与结果 URL。 `Claw` 的纯文本播报命令也应沿同一条 current 主链收敛: -- Agent 驱动的播报命令:`@播报` / `@播客` / `@broadcast` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `broadcast_task` 写入 `request_metadata.harness.broadcast_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/broadcast_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(broadcast_generate)` 的系统提示。后续默认 skill 继续优先走 `Bash -> lime task create broadcast --json`,CLI 不可用时再回退 `lime_create_broadcast_generation_task`,最终仍只允许落到标准 `broadcast_generate` task file;若当前上下文缺少待整理原文,允许 Agent 最多追问 1 个关键问题,但不能伪造“播报已完成”。 +- Agent 驱动的播报命令:`@播报` / `@播客` / `@broadcast` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `broadcast_task` 写入 `request_metadata.harness.broadcast_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/broadcast_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(broadcast_generate)` 的系统提示;当前播报 launch 还会在 session permission 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类偏航工具,并在当前 session registry 中直接移除这些 detour tools,避免模型在 `@播报` 首刀前先去搜索工具目录。后续默认 skill 继续优先走 `Bash -> lime task create broadcast --json`,CLI 不可用时再回退 `lime_create_broadcast_generation_task`,最终仍只允许落到标准 `broadcast_generate` task file;若当前上下文缺少待整理原文,允许 Agent 最多追问 1 个关键问题,但不能伪造“播报已完成”。 `Claw` 的纯文本素材命令也应沿同一条 current 主链收敛: -- Agent 驱动的素材命令:`@素材` / `@资源` / `@resource` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `resource_search_task` 写入 `request_metadata.harness.resource_search_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/resource_search_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(modal_resource_search)` 的系统提示。若 `resource_type=image` 且 query 明确,默认 skill 必须优先调用 `lime_search_web_images`,直接复用现有“设置 -> 系统 -> 网络搜索 -> Pexels API Key”返回候选,并保留真实 tool timeline;只有 `Pexels API Key` 未配置、无结果,或用户明确要求继续异步追踪时,才回退 `Bash -> lime task create resource-search --json`。对 `bgm / sfx / video` 等非图片素材,仍优先走 `Bash -> lime task create resource-search --json`,CLI 不可用时再回退 `lime_create_modal_resource_search_task`,最终落到标准 `modal_resource_search` task file;若当前上下文缺少明确资源类型或检索关键词,允许 Agent 最多追问 1 个关键问题,但不能伪造“素材已检索完成”。 +- Agent 驱动的素材命令:`@素材` / `@资源` / `@resource` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `resource_search_task` 写入 `request_metadata.harness.resource_search_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/resource_search_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(modal_resource_search)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型卡在“先搜技能/工具目录”而不是立刻进素材技能主链。若 `resource_type=image` 且 query 明确,默认 skill 必须优先调用 `lime_search_web_images`,直接复用现有“设置 -> 系统 -> 网络搜索 -> Pexels API Key”返回候选,并保留真实 tool timeline;只有 `Pexels API Key` 未配置、无结果,或用户明确要求继续异步追踪时,才回退 `Bash -> lime task create resource-search --json`。对 `bgm / sfx / video` 等非图片素材,仍优先走 `Bash -> lime task create resource-search --json`,CLI 不可用时再回退 `lime_create_modal_resource_search_task`,最终落到标准 `modal_resource_search` task file;若当前上下文缺少明确资源类型或检索关键词,允许 Agent 最多追问 1 个关键问题,但不能伪造“素材已检索完成”。 `Claw` 的纯文本搜索命令也应沿同一条 current 主链收敛: -- Agent 驱动的搜索命令:`@搜索` / `@search` / `@research` / `@调研` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `research_request` 写入 `request_metadata.harness.research_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/research_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(research)` 的系统提示。后续默认 skill 必须沿 `research` prompt skill -> `search_query` 主链先真实联网检索,再输出结论、来源与建议;当前上下文缺少明确搜索主题时,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成搜索”,也不能直接凭记忆跳过检索。 +- Agent 驱动的搜索命令:`@搜索` / `@search` / `@research` / `@调研` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `research_request` 写入 `request_metadata.harness.research_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/research_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(research)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / Read / Glob / Grep` 这类“工具目录发现/本地文件偏航”工具,避免模型在 `@搜索` 首刀前先去查工具名或误读本地文件,但会保留真实联网检索主链。后续默认 skill 必须沿 `research` prompt skill -> `search_query` / `WebSearch` 主链先真实联网检索,再输出结论、来源与建议;当前上下文缺少明确搜索主题时,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成搜索”,也不能直接凭记忆跳过检索。 `Claw` 的纯文本深搜命令也应沿同一条 current 主链收敛: -- Agent 驱动的深搜命令:`@深搜` / `@deep` / `@deepsearch` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `deep_search_request` 写入 `request_metadata.harness.deep_search_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/deep_search_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(research)`、且至少执行多轮扩搜的系统提示。后续默认 skill 仍必须沿 `research` prompt skill -> `search_query` 主链先真实联网检索,再输出事实、推断与待确认项;当前上下文缺少明确搜索主题时,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成深搜”,也不能退化成只搜一次的普通搜索。 +- Agent 驱动的深搜命令:`@深搜` / `@deep` / `@deepsearch` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `deep_search_request` 写入 `request_metadata.harness.deep_search_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/deep_search_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(research)`、且至少执行多轮扩搜的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / Read / Glob / Grep` 这类“工具目录发现/本地文件偏航”工具,避免模型在 `@深搜` 首刀前先去查工具名或误读本地文件,但会保留真实联网检索主链。后续默认 skill 仍必须沿 `research` prompt skill -> `search_query` / `WebSearch` 主链先真实联网检索,再输出事实、推断与待确认项;当前上下文缺少明确搜索主题时,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成深搜”,也不能退化成只搜一次的普通搜索。 `Claw` 的纯文本研报命令也应沿同一条 current 主链收敛: -- Agent 驱动的研报命令:`@研报` / `@report` / `@research_report` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `report_request` 写入 `request_metadata.harness.report_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/report_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(report_generate)` 的系统提示。后续默认 skill 必须沿 `report_generate` prompt skill -> `search_query` 主链先真实联网检索,再写出结构化研究报告;当前上下文缺少明确研报主题时,允许 Agent 最多追问 1 个关键问题,但不能伪造“研报已完成”,也不能直接退回普通聊天长文。 +- Agent 驱动的研报命令:`@研报` / `@report` / `@research_report` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `report_request` 写入 `request_metadata.harness.report_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/report_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(report_generate)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / Read / Glob / Grep` 这类“工具目录发现/本地文件偏航”工具,避免模型在 `@研报` 首刀前先去查工具名或误读本地文件,但会保留真实联网检索主链。后续默认 skill 必须沿 `report_generate` prompt skill -> `search_query` / `WebSearch` 主链先真实联网检索,再写出结构化研究报告;当前上下文缺少明确研报主题时,允许 Agent 最多追问 1 个关键问题,但不能伪造“研报已完成”,也不能直接退回普通聊天长文。 `Claw` 的纯文本站点搜索命令也应沿同一条 current 主链收敛: -- Agent 驱动的站点搜索命令:`@站点搜索` / `@站点` / `@site_search` / `@site` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `site_search_request` 写入 `request_metadata.harness.site_search_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/site_search_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(site_search)` 的系统提示。后续默认 skill 必须沿 `site_search` prompt skill -> `lime_site_info / lime_site_run / lime_site_search` 主链先执行真实站点适配器,再输出摘要与来源;当前上下文缺少明确站点或检索关键词时,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成站点搜索”,也不能先退回 `research / WebSearch`。 +- Agent 驱动的站点搜索命令:`@站点搜索` / `@站点` / `@site_search` / `@site` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `site_search_request` 写入 `request_metadata.harness.site_search_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/site_search_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(site_search)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用搜索/本地文件偏航工具,同时拦住 `mcp__lime-browser__* / browser_* / mcp__playwright__*` 这类底层浏览器兼容面,避免模型在 `@站点搜索` 首刀前先去搜工具目录或退回浏览器底层执行。后续默认 skill 必须沿 `site_search` prompt skill -> `lime_site_info / lime_site_run / lime_site_search` 主链先执行真实站点适配器,再输出摘要与来源;当前上下文缺少明确站点或检索关键词时,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成站点搜索”,也不能先退回 `research / WebSearch`。 `Claw` 的纯文本读 PDF 命令也应沿同一条 current 主链收敛: -- Agent 驱动的读 PDF 命令:`@读PDF` / `@pdf` / `@read_pdf` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `pdf_read_request` 写入 `request_metadata.harness.pdf_read_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/pdf_read_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(pdf_read)` 的系统提示。后续默认 skill 必须沿 `pdf_read` prompt skill -> `list_directory / read_file` 主链先真实读取本地或工作区 PDF,再输出结构化解读结果;当前上下文只有远程 PDF URL 或缺少明确 PDF 来源时,允许 Agent 最多追问 1 个关键问题请求本地路径或导入路径,但不能伪造“PDF 已读完”,也不能退回普通聊天总结。 +- Agent 驱动的读 PDF 命令:`@读PDF` / `@pdf` / `@read_pdf` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `pdf_read_request` 写入 `request_metadata.harness.pdf_read_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/pdf_read_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(pdf_read)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Grep` 这类工具目录发现、联网搜索或内容检索偏航工具,但会保留 `Read / Glob` 这类本地 PDF 读取主链能力。后续默认 skill 必须沿 `pdf_read` prompt skill -> `list_directory / read_file` 主链先真实读取本地或工作区 PDF,再输出结构化解读结果;当前上下文只有远程 PDF URL 或缺少明确 PDF 来源时,允许 Agent 最多追问 1 个关键问题请求本地路径或导入路径,但不能伪造“PDF 已读完”,也不能退回普通聊天总结。 `Claw` 的纯文本总结命令也应沿同一条 current 主链收敛: -- Agent 驱动的总结命令:`@总结` / `@summary` / `@summarize` / `@摘要` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `summary_request` 写入 `request_metadata.harness.summary_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/summary_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(summary)` 的系统提示。后续默认 skill 必须沿 `summary` prompt skill 主链先总结显式正文或当前对话相关上下文;只有当用户显式给出本地路径或目录时,才允许最小化使用 `list_directory / read_file` 读取必要内容并保留真实 tool timeline。当前上下文缺少显式正文时,允许 Agent 优先总结当前对话;只有在显式正文和对话上下文都不足时,才最多追问 1 个关键问题,但不能伪造“已完成总结”,也不能在前端直接生成摘要绕过 skill。 +- Agent 驱动的总结命令:`@总结` / `@summary` / `@summarize` / `@摘要` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `summary_request` 写入 `request_metadata.harness.summary_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/summary_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(summary)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Grep` 这类工具目录发现、联网检索或内容检索 detour tools,但会保留 `Read / Glob` 这类显式路径读取主链能力。后续默认 skill 必须沿 `summary` prompt skill 主链先总结显式正文或当前对话相关上下文;只有当用户显式给出本地路径或目录时,才允许最小化使用 `list_directory / read_file` 读取必要内容并保留真实 tool timeline。当前上下文缺少显式正文时,允许 Agent 优先总结当前对话;只有在显式正文和对话上下文都不足时,才最多追问 1 个关键问题,但不能伪造“已完成总结”,也不能在前端直接生成摘要绕过 skill。 `Claw` 的纯文本翻译命令也应沿同一条 current 主链收敛: -- Agent 驱动的翻译命令:`@翻译` / `@translate` / `@translation` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `translation_request` 写入 `request_metadata.harness.translation_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/translation_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(translation)` 的系统提示。后续默认 skill 必须沿 `translation` prompt skill 主链先翻译显式正文或当前对话相关上下文;只有当用户显式给出本地路径或目录时,才允许最小化使用 `list_directory / read_file` 读取必要内容并保留真实 tool timeline。当前上下文缺少显式正文时,允许 Agent 优先翻译当前对话;只有在显式正文和对话上下文都不足时,才最多追问 1 个关键问题,但不能伪造“已完成翻译”,也不能在前端直接生成译文绕过 skill。 +- Agent 驱动的翻译命令:`@翻译` / `@translate` / `@translation` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `translation_request` 写入 `request_metadata.harness.translation_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/translation_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(translation)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Grep` 这类工具目录发现、联网检索或内容检索 detour tools,但会保留 `Read / Glob` 这类显式路径读取主链能力。后续默认 skill 必须沿 `translation` prompt skill 主链先翻译显式正文或当前对话相关上下文;只有当用户显式给出本地路径或目录时,才允许最小化使用 `list_directory / read_file` 读取必要内容并保留真实 tool timeline。当前上下文缺少显式正文时,允许 Agent 优先翻译当前对话;只有在显式正文和对话上下文都不足时,才最多追问 1 个关键问题,但不能伪造“已完成翻译”,也不能在前端直接生成译文绕过 skill。 `Claw` 的纯文本分析命令也应沿同一条 current 主链收敛: -- Agent 驱动的分析命令:`@分析` / `@analysis` / `@analyze` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `analysis_request` 写入 `request_metadata.harness.analysis_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/analysis_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(analysis)` 的系统提示。后续默认 skill 必须沿 `analysis` prompt skill 主链先分析显式正文或当前对话相关上下文;只有当用户显式给出本地路径或目录时,才允许最小化使用 `list_directory / read_file` 读取必要内容并保留真实 tool timeline。当前上下文缺少显式正文时,允许 Agent 优先分析当前对话;只有在显式正文和对话上下文都不足时,才最多追问 1 个关键问题,但不能伪造“已完成分析”,也不能在前端直接生成分析结论绕过 skill。 +- Agent 驱动的分析命令:`@分析` / `@analysis` / `@analyze` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `analysis_request` 写入 `request_metadata.harness.analysis_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/analysis_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(analysis)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Grep` 这类工具目录发现、联网检索或内容检索 detour tools,但会保留 `Read / Glob` 这类显式路径读取主链能力。后续默认 skill 必须沿 `analysis` prompt skill 主链先分析显式正文或当前对话相关上下文;只有当用户显式给出本地路径或目录时,才允许最小化使用 `list_directory / read_file` 读取必要内容并保留真实 tool timeline。当前上下文缺少显式正文时,允许 Agent 优先分析当前对话;只有在显式正文和对话上下文都不足时,才最多追问 1 个关键问题,但不能伪造“已完成分析”,也不能在前端直接生成分析结论绕过 skill。 `Claw` 的纯文本转写命令也应沿同一条 current 主链收敛: -- Agent 驱动的转写命令:`@转写` / `@transcribe` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `transcription_task` 写入 `request_metadata.harness.transcription_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/transcription_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(transcription_generate)` 的系统提示。后续默认 skill 继续优先走 `Bash -> lime task create transcription --json`,CLI 不可用时再回退 `lime_create_transcription_task`,最终仍只允许落到标准 `transcription_generate` task file;若当前上下文缺少 `source_url` / `source_path`,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成转写”。 +- Agent 驱动的转写命令:`@转写` / `@transcribe` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `transcription_task` 写入 `request_metadata.harness.transcription_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/transcription_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(transcription_generate)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型在 `@转写` 首刀前先去搜工具目录、联网检索或误读本地文件。后续默认 skill 继续优先走 `Bash -> lime task create transcription --json`,CLI 不可用时再回退 `lime_create_transcription_task`,最终仍只允许落到标准 `transcription_generate` task file;若当前上下文缺少 `source_url` / `source_path`,允许 Agent 最多追问 1 个关键问题,但不能伪造“已完成转写”。 `Claw` 的纯文本链接解析命令也应沿同一条 current 主链收敛: -- Agent 驱动的链接解析命令:`@链接解析` / `@链接` / `@url_parse` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `url_parse_task` 写入 `request_metadata.harness.url_parse_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/url_parse_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(url_parse)` 的系统提示。后续默认 skill 继续优先走 `Bash -> lime task create url-parse --json`,CLI 不可用时再回退 `lime_create_url_parse_task`,最终仍只允许落到标准 `url_parse` task file;若当前上下文缺少 URL,允许 Agent 最多追问 1 个关键问题,但不能伪造“链接已解析完成”。 +- Agent 驱动的链接解析命令:`@链接解析` / `@链接` / `@url_parse` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `url_parse_task` 写入 `request_metadata.harness.url_parse_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/url_parse_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(url_parse)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型在 `@链接解析` 首刀前先去搜工具目录、联网检索或误读本地文件。后续默认 skill 继续优先走 `Bash -> lime task create url-parse --json`,CLI 不可用时再回退 `lime_create_url_parse_task`,最终仍只允许落到标准 `url_parse` task file;若当前上下文缺少 URL,允许 Agent 最多追问 1 个关键问题,但不能伪造“链接已解析完成”。 `Claw` 的纯文本排版命令也应沿同一条 current 主链收敛: -- Agent 驱动的排版命令:`@排版` / `@typesetting` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `typesetting_task` 写入 `request_metadata.harness.typesetting_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/typesetting_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(typesetting)` 的系统提示。后续默认 skill 继续优先走 `Bash -> lime task create typesetting --json`,CLI 不可用时再回退 `lime_create_typesetting_task`,最终仍只允许落到标准 `typesetting` task file;若当前上下文缺少待排版正文,允许 Agent 最多追问 1 个关键问题,但不能伪造“排版已完成”。 +- Agent 驱动的排版命令:`@排版` / `@typesetting` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `typesetting_task` 写入 `request_metadata.harness.typesetting_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/typesetting_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(typesetting)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型在 `@排版` 首刀前先去搜工具目录、联网检索或误读本地文件。后续默认 skill 继续优先走 `Bash -> lime task create typesetting --json`,CLI 不可用时再回退 `lime_create_typesetting_task`,最终仍只允许落到标准 `typesetting` task file;若当前上下文缺少待排版正文,允许 Agent 最多追问 1 个关键问题,但不能伪造“排版已完成”。 + +`Claw` 的纯文本网页命令也应沿同一条 current 主链收敛: + +- Agent 驱动的网页命令:`@网页` / `@webpage` / `@landing` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `webpage_request` 写入 `request_metadata.harness.webpage_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/webpage_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(webpage_generate)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型在 `@网页` 首刀前先去搜工具目录、联网检索或误读本地文件。后续默认 skill 必须沿 `webpage_generate` prompt skill 主链直接产出单文件 HTML artifact,并通过 `` 落到工作区;当前上下文缺少明确网页目标时,允许 Agent 最多追问 1 个关键问题,但不能只给口头方案、不能伪造“网页已生成”却没有真实 `.html` 文件。 + +`Claw` 的纯文本 PPT 命令也应沿同一条 current 主链收敛: + +- Agent 驱动的演示稿命令:`@PPT` / `@ppt` / `@slides` / `@演示` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `presentation_request` 写入 `request_metadata.harness.presentation_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/presentation_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(presentation_generate)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型在 `@PPT` 首刀前先去搜工具目录、联网检索或误读本地文件。后续默认 skill 必须沿 `presentation_generate` prompt skill 主链直接产出单文件 Markdown 演示稿 artifact,并通过 `` 落到工作区;当前上下文缺少明确演示目标时,允许 Agent 最多追问 1 个关键问题,但不能只给口头提纲、不能伪造“PPT 已生成”却没有真实演示稿文件。 + +`Claw` 的纯文本表单命令也应沿同一条 current 主链收敛: + +- Agent 驱动的表单命令:`@表单` / `@form` / `@survey` / `@问卷` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `form_request` 写入 `request_metadata.harness.form_skill_launch`,同时打开 `request_metadata.harness.allow_model_skills = true`。Rust 侧 `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs` 与 `src-tauri/src/commands/aster_agent_cmd/form_skill_launch.rs` 会给当前 turn 注入只允许首刀优先调用 `Skill(form_generate)` 的系统提示,并在当前 session permission 与 registry 中显式压制 `ToolSearch / WebSearch / Read / Glob / Grep` 这类 detour tools,避免模型在 `@表单` 首刀前先去搜工具目录、联网检索或误读本地文件。后续默认 skill 必须沿 `form_generate` prompt skill 主链直接产出一份可被现有 A2UI parser 识别的 simple form JSON,并以 ` ```a2ui ` 代码块回到聊天流;current render contract 必须是 `form + json`,不能回退成单文件 HTML artifact,也不能再发明另一套表单 DSL。当前上下文缺少明确表单目标时,允许 Agent 最多追问 1 个关键问题,但不能只给口头字段建议、不能伪造“表单已生成”却没有真实 A2UI 表单结果。 + +`Claw` 的纯文本代码命令也应沿同一条 current 主链收敛: + +- Agent 驱动的代码命令:`@代码` / `@code` / `@coding` / `@开发` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本发送。聊天发送边界会把结构化 `code_command` 写入 `request_metadata.harness.code_command`,并把本次发送的 `execution_strategy` 强制切到 `code_orchestrated`,同时把 `request_metadata.harness.preferred_team_preset_id` 设为 `code-triage-team`,且把 `harness.preferences.task/subagent` 打开。当前主链不新增 prompt skill,也不新增 HTML / artifact 协议,而是直接复用现有 `code_orchestrated -> code_execution / tools / team runtime`。这意味着 `@代码` 首刀应优先进入真实代码工具与协作编排,而不是退回普通聊天、先做 `ToolSearch` 目录探索,或把代码任务伪装成一段口头建议;若当前上下文只够做解释或评审,允许 Agent 在同一主链中按 `code_command.kind` 调整策略,但不能绕回另一套命令体系。 + +`Claw` 的纯文本发布命令当前应收敛到现有发布工作流,而不是新开一条平行 runtime: + +- 工作流入口型命令:`@发布` / `@publish` / `@发文` / `@投稿` 在 `src/components/agent/chat/workspace/useWorkspaceSendActions.ts` 中保留原始用户文本展示,但把实际 dispatch 改写到现有 `/content_post_with_cover ...` 主链,并把结构化 `publish_command` 写入 `request_metadata.harness.publish_command`。当前实现优先复用已有 `content_post_with_cover` 发布工作流、`content-posts/*.md` / `*.publish-pack.json` 产物链,以及 `detectBrowserTaskRequirement(...)` 推导出的浏览器门禁,而不是再发明新的 `publish_task` 协议。若输入里已明确平台后台,如微信公众号后台,必须继续写入 `browser_requirement=required_with_user_step` 与平台 launch URL;若只是整理发布稿而未指定平台,则允许先在同一工作流里生成发布稿与发布前检查,不强行要求浏览器。后续若统一 agent/workflow runtime 成熟,可以把 `@发布` 从当前 slash workflow 迁走,但在那之前不得同时维护第二套发布入口真相。 这些命令除了 Tauri `generate_handler!` 之外,也必须继续保持 DevBridge dispatcher 已桥接,避免浏览器模式、headless smoke 或 Playwright 续测时回退成 unknown command。 @@ -450,6 +476,7 @@ npm run verify:local - **站点 Agent 工具主链**:继续收敛到 `lime_site_list / lime_site_recommend / lime_site_search / lime_site_info / lime_site_run` - **站点技能首页入口主链**:首页 / 工作区弹窗只负责补参数、组装 `initialUserPrompt + harness.service_skill_launch` 上下文并进入 `Claw`;真正执行统一收口到 `Claw` 首回合,不再由首页弹窗或工作区挂载副作用直接调用 `site_run_adapter` - **站点结果沉淀主线**:`site_run_adapter` / `lime_site_run` 优先透传 `content_id` 写回当前主稿;只有缺少 `content_id` 时,才回退到 `project_id` 新建结果文档 +- **`markdown_bundle` 落盘回传主线**:当站点结果是 `markdown_bundle` 时,`saved_content` 除了 `content_id / project_id / title`,还应继续回传 `project_root_path / markdown_relative_path / images_relative_dir / meta_relative_path / image_count`,让聊天轻卡与 tool timeline 都能直接说明 Markdown 和图片实际保存到哪里 - **Claw 站点直跑门禁主链**:`site_get_adapter_launch_readiness` 只负责检测“是否存在已附着的真实浏览器会话 + 目标站点上下文”;`site_run_adapter.require_attached_session = true` 时,后端必须拒绝 managed/default fallback,不能后台偷偷起 Chrome - **attached-session 执行主链**:真实浏览器附着场景下,Bridge `run_adapter` 只允许下发 `adapter_name + args`,禁止继续透传原始脚本文本到扩展 content script,以免触发站点 CSP 的 `unsafe-eval` - **站点运行失败语义**:`SiteAdapterRunResult` 至少统一输出 `auth_required / no_matching_context / adapter_runtime_error`,并在前端与 Agent 结果里保留 `report_hint` diff --git a/docs/aiprompts/playwright-e2e.md b/docs/aiprompts/playwright-e2e.md index 2c6c201fc..369d3132c 100644 --- a/docs/aiprompts/playwright-e2e.md +++ b/docs/aiprompts/playwright-e2e.md @@ -184,7 +184,7 @@ npm run test:contracts 1. 在 `Claw` 对话框输入 `@配图 生成 ...` 2. 确认聊天区先进入 skill 执行态,并能看到 `image_generate` 相关工具轨迹,而不是前端静默直接创建任务 -3. 如当前环境走 `Bash -> lime media image generate --json`,确认工具标题与结果摘要对应这条 CLI 主链;CLI 不可用时,才允许回退 `lime_create_image_generation_task` +3. 如当前环境走 `Bash -> lime media image generate --json`,确认工具标题与结果摘要对应这条 CLI 主链;若实际走到兼容入口 `lime task create image --json`,也要确认它继续推进到真实完成态,而不是只创建任务文件;CLI 不可用时,才允许回退 `lime_create_image_generation_task` 4. 等待 task file 回流后,确认同一条卡片被替换为成功或失败状态,而不是额外再插一条前端本地伪造结果 5. 刷新页面或切换会话再返回原话题,确认最近图片任务会从 `.lime/tasks` 恢复 6. 如手动打开右侧查看器,确认任务卡状态与聊天区一致,且不会自动展开独立图片画布 @@ -223,6 +223,42 @@ npm run test:contracts 4. 等待结果完成后,确认最终输出包含结论、来源、风险/待确认项与建议动作,而不是一段无来源的纯主观总结 5. 如果输入里没有明确主题,确认 Agent 最多只追问 1 个关键问题,而不是直接伪造研报完成态 +### Claw `@PPT` Prompt Skill 验证 + +1. 在 `Claw` 对话框输入 `@PPT 类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿` +2. 确认聊天区先进入 skill 执行态,并能看到 `presentation_generate` 相关工具轨迹,而不是前端本地直接伪造演示提纲 +3. 确认首刀不会卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,而是直接进入 `Skill(presentation_generate)` +4. 等待产物回流后,确认当前话题下出现一份真实演示稿 artifact,而不是只有文本解释 +5. 打开右侧查看区,确认演示稿能够作为 Markdown artifact 正常预览,并保留封面、目录、核心论点、案例和结论结构 +6. 刷新页面或切换会话后再返回原话题,确认演示稿 artifact 仍能恢复,不依赖前端内存态 + +### Claw `@表单` Prompt Skill 验证 + +1. 在 `Claw` 对话框输入 `@表单 类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表` +2. 确认聊天区先进入 skill 执行态,并能看到 `form_generate` 相关工具轨迹,而不是前端本地直接伪造字段列表 +3. 确认首刀不会卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,而是直接进入 `Skill(form_generate)` +4. 等待结果回流后,确认同一条对话消息里出现可渲染的 A2UI 表单,而不是单文件 HTML artifact 或一段纯文本建议 +5. 打开右侧查看区或表单详情时,确认结果仍然是 simple form JSON / A2UI 预览,不会切到另一套自定义表单 DSL +6. 刷新页面或切换会话后再返回原话题,确认表单结果仍能恢复,不依赖前端内存态 + +### Claw `@代码` 编排主链验证 + +1. 在 `Claw` 对话框输入 `@代码 修复消息历史切换后图片卡片丢失的问题,并补一个回归测试` +2. 确认聊天区先进入代码编排执行态,而不是普通聊天回答 +3. 确认真正出现代码工具或协作步骤时间线,且不会先卡在无意义的 `ToolSearch` +4. 确认执行策略切到 `code_orchestrated`,同时 `task/subagent` 偏好已被打开 +5. 如当前页面可查看运行时摘要或请求详情,确认 `preferred_team_preset_id=code-triage-team` 与 `code_command.kind` 已注入 +6. 刷新页面或切换会话后再返回原话题,确认代码任务对话仍保留在同一条消息主链,不会裂成另一套旁路会话 + +### Claw `@发布` 工作流验证 + +1. 在 `Claw` 对话框输入 `@发布 平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本` +2. 确认聊天区显示的仍是原始 `@发布 ...` 文本,而不是直接把 slash skill 暴露给用户 +3. 如页面可查看发送详情或运行时摘要,确认实际 dispatch 已导向 `content_post_with_cover`,且 `publish_command` 元数据存在 +4. 确认当前回合如果命中平台后台,会出现真实浏览器门禁提示,而不是直接退化成联网搜索或普通聊天 +5. 等待工作流继续推进后,确认产物仍落在现有 `content-posts/*.md` / `*.publish-pack.json` 主链,而不是另一套发布任务协议 +6. 刷新页面或切换会话后再返回原话题,确认发布稿与发布包仍可恢复 + ### Claw `@读PDF` Prompt Skill 验证 1. 在 `Claw` 对话框输入 `@读PDF /tmp/agent-report.pdf 提炼三点结论并标注关键证据` @@ -256,6 +292,9 @@ npm run test:contracts 4. 打开时间线,确认首个执行器是 `lime_run_service_skill`,而不是前端本地直接产出结果卡 5. 如当前 OEM 会话可用,确认工具结果会回流 run 状态或摘要;若当前会话缺失,确认聊天区明确提示需要登录或注入会话,而不是伪造成功 6. 未命中 scene 目录时,确认 `/unknown-scene ...` 仍回到普通 slash / Codex 流程,不会被误报为本地技能异常 +7. 如果当前 scene 绑定的是站点型 skill,例如 `/x文章转存 https://x.com/.../article/...`,确认 slash 菜单可见后仍能成功解析到底层 site skill,而不是因为首页未暴露 site skill 就在发送时失配 +8. 对 `markdown_bundle` 型站点场景,确认成功后项目目录里同时出现 `index.md`、`images/` 和 `meta.json`,且正文中的图片链接已经被改写为项目内相对路径,而不是继续指向远程图片 URL +9. 同时确认聊天轻卡或 tool timeline 会明确展示项目目录、Markdown 相对路径和图片数量,避免用户只能看到“已保存”却不知道文件实际落点 ### 开发者页站点来源导入验证 diff --git a/docs/aiprompts/quality-workflow.md b/docs/aiprompts/quality-workflow.md index 3628404ad..5a4068a22 100644 --- a/docs/aiprompts/quality-workflow.md +++ b/docs/aiprompts/quality-workflow.md @@ -183,19 +183,30 @@ npm run bridge:health -- --timeout-ms 120000 - 检查 harness metadata / execution runtime / 后端 request metadata 的关键字段是否漂移 - 检查浏览器桥接 / mock 优先路径是否同步 - 检查 `DevBridge` 是否可用 -- 检查纯文本 `Claw @配图` 是否已经走 `原始用户消息 -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task file` 主链,以及显式图片动作是否也已经走 `synthetic user message / displayContent -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task file`,而不是回流前端直连图片服务 -- 检查纯文本 `Claw @封面` 是否已经走 `原始用户消息 -> harness.cover_skill_launch -> Agent 首刀 Skill(cover_generate) -> task file` 主链,而不是回流成普通图片命令或前端本地伪造结果 -- 检查纯文本 `Claw @播报` 是否已经走 `原始用户消息 -> harness.broadcast_skill_launch -> Agent 首刀 Skill(broadcast_generate) -> task file` 主链,而不是退回普通聊天改写 -- 检查纯文本 `Claw @素材` 是否已经走 `原始用户消息 -> harness.resource_search_skill_launch -> Agent 首刀 Skill(modal_resource_search) -> task file` 主链,而不是回流到前端本地素材页逻辑 -- 检查纯文本 `Claw @搜索` 是否已经走 `原始用户消息 -> harness.research_skill_launch -> Agent 首刀 Skill(research) -> search_query / tool timeline` 主链,而不是直接凭模型记忆回答 -- 检查纯文本 `Claw @深搜` 是否已经走 `原始用户消息 -> harness.deep_search_skill_launch -> Agent 首刀 Skill(research) -> 多轮 search_query / tool timeline` 主链,而不是退化成一次普通搜索 -- 检查纯文本 `Claw @研报` 是否已经走 `原始用户消息 -> harness.report_skill_launch -> Agent 首刀 Skill(report_generate) -> search_query / tool timeline` 主链,而不是直接退回普通聊天长文 -- 检查纯文本 `Claw @站点搜索` 是否已经走 `原始用户消息 -> harness.site_search_skill_launch -> Agent 首刀 Skill(site_search) -> lime_site_* / tool timeline` 主链,而不是先退回 `research / WebSearch` -- 检查纯文本 `Claw @读PDF` 是否已经走 `原始用户消息 -> harness.pdf_read_skill_launch -> Agent 首刀 Skill(pdf_read) -> list_directory / read_file / tool timeline` 主链,而不是退回普通聊天总结或前端本地解析 -- 检查纯文本 `Claw @转写` 是否已经走 `原始用户消息 -> harness.transcription_skill_launch -> Agent 首刀 Skill(transcription_generate) -> task file` 主链,而不是回流到前端直连旧 ASR 接口 -- 检查纯文本 `Claw @链接解析` 是否已经走 `原始用户消息 -> harness.url_parse_skill_launch -> Agent 首刀 Skill(url_parse) -> task file` 主链,而不是退回普通聊天总结 -- 检查纯文本 `Claw @排版` 是否已经走 `原始用户消息 -> harness.typesetting_skill_launch -> Agent 首刀 Skill(typesetting) -> task file` 主链,而不是退回普通聊天润色 +- 检查纯文本 `Claw @配图` 是否已经走 `原始用户消息 -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> Bash/lime media image generate --json 或 lime_create_image_generation_task -> task/timeline` 主链,以及显式图片动作是否也已经走 `synthetic user message / displayContent -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task/timeline`,而不是回流前端直连图片服务、卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,或让 `lime media image generate --json` / `lime task create image --json` 只停在 `pending_submit` +- 检查纯文本 `Claw @封面` 是否已经走 `原始用户消息 -> harness.cover_skill_launch -> Agent 首刀 Skill(cover_generate) -> task file` 主链,而不是回流成普通图片命令、卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,或前端本地伪造结果 +- 检查纯文本 `Claw @视频` 是否已经走 `原始用户消息 -> harness.video_skill_launch -> Agent 首刀 Skill(video_generate) -> Bash/lime media video generate --json 或 create_video_generation_task -> task/timeline` 主链,而不是卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,或前端本地伪造结果 +- 检查纯文本 `Claw @播报` 是否已经走 `原始用户消息 -> harness.broadcast_skill_launch -> Agent 首刀 Skill(broadcast_generate) -> task file` 主链,而不是退回普通聊天改写、卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,或前端本地伪造结果 +- 检查纯文本 `Claw @素材` 是否已经走 `原始用户消息 -> harness.resource_search_skill_launch -> Agent 首刀 Skill(modal_resource_search) -> 图片直搜时优先 lime_search_web_images / 其余情况走 task file` 主链,而不是回流到前端本地素材页逻辑、卡在 `ToolSearch / WebSearch / Read / Glob / Grep`,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @搜索` 是否已经走 `原始用户消息 -> harness.research_skill_launch -> Agent 首刀 Skill(research) -> search_query / tool timeline` 主链,而不是直接凭模型记忆回答、卡在 `ToolSearch / Read / Glob / Grep` 这类工具目录/本地文件偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @深搜` 是否已经走 `原始用户消息 -> harness.deep_search_skill_launch -> Agent 首刀 Skill(research) -> 多轮 search_query / tool timeline` 主链,而不是退化成一次普通搜索、卡在 `ToolSearch / Read / Glob / Grep` 这类工具目录/本地文件偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @研报` 是否已经走 `原始用户消息 -> harness.report_skill_launch -> Agent 首刀 Skill(report_generate) -> search_query / tool timeline` 主链,而不是直接退回普通聊天长文、卡在 `ToolSearch / Read / Glob / Grep` 这类工具目录/本地文件偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @站点搜索` 是否已经走 `原始用户消息 -> harness.site_search_skill_launch -> Agent 首刀 Skill(site_search) -> lime_site_* / tool timeline` 主链,而不是先退回 `research / WebSearch`、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用搜索/本地文件偏航,或把浏览器兼容工具权限拒绝直接暴露给用户 +- 检查纯文本 `Claw @读PDF` 是否已经走 `原始用户消息 -> harness.pdf_read_skill_launch -> Agent 首刀 Skill(pdf_read) -> list_directory / read_file / tool timeline` 主链,而不是退回普通聊天总结或前端本地解析、卡在 `ToolSearch / WebSearch / Grep` 这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @总结` 是否已经走 `原始用户消息 -> harness.summary_skill_launch -> Agent 首刀 Skill(summary) -> 可选 list_directory / read_file / tool timeline` 主链,而不是退回普通聊天总结、卡在 `ToolSearch / WebSearch / Grep` 这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户;同时确认 `Read / Glob` 仍保留给显式路径场景 +- 检查纯文本 `Claw @翻译` 是否已经走 `原始用户消息 -> harness.translation_skill_launch -> Agent 首刀 Skill(translation) -> 可选 list_directory / read_file / tool timeline` 主链,而不是退回普通聊天翻译、卡在 `ToolSearch / WebSearch / Grep` 这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户;同时确认 `Read / Glob` 仍保留给显式路径场景 +- 检查纯文本 `Claw @分析` 是否已经走 `原始用户消息 -> harness.analysis_skill_launch -> Agent 首刀 Skill(analysis) -> 可选 list_directory / read_file / tool timeline` 主链,而不是退回普通聊天分析、卡在 `ToolSearch / WebSearch / Grep` 这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户;同时确认 `Read / Glob` 仍保留给显式路径场景 +- 检查纯文本 `Claw @转写` 是否已经走 `原始用户消息 -> harness.transcription_skill_launch -> Agent 首刀 Skill(transcription_generate) -> task file` 主链,而不是回流到前端直连旧 ASR 接口、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用工具偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @链接解析` 是否已经走 `原始用户消息 -> harness.url_parse_skill_launch -> Agent 首刀 Skill(url_parse) -> task file` 主链,而不是退回普通聊天总结、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用工具偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @排版` 是否已经走 `原始用户消息 -> harness.typesetting_skill_launch -> Agent 首刀 Skill(typesetting) -> task file` 主链,而不是退回普通聊天润色、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用工具偏航,或把 session permission 拒绝直接暴露给用户 +- 检查纯文本 `Claw @网页` 是否已经走 `原始用户消息 -> harness.webpage_skill_launch -> Agent 首刀 Skill(webpage_generate) -> write_file HTML artifact` 主链,而不是退回普通聊天口头方案、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用工具偏航,或没有真实 `.html` 文件就宣布完成 +- 检查纯文本 `Claw @PPT` 是否已经走 `原始用户消息 -> harness.presentation_skill_launch -> Agent 首刀 Skill(presentation_generate) -> write_file Markdown artifact` 主链,而不是退回普通聊天口头提纲、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用工具偏航,或没有真实演示稿文件就宣布完成 +- 检查纯文本 `Claw @表单` 是否已经走 `原始用户消息 -> harness.form_skill_launch -> Agent 首刀 Skill(form_generate) -> ```a2ui simple form JSON` 主链,而不是退回普通聊天字段建议、卡在 `ToolSearch / WebSearch / Read / Glob / Grep` 这类通用工具偏航,或回流成单文件 HTML 表单原型;同时确认 render contract 已收敛为 `form + json` +- 检查纯文本 `Claw @代码` 是否已经走 `原始用户消息 -> harness.code_command + preferred_team_preset_id -> code_orchestrated -> code_execution / tools / team runtime` 主链,而不是继续停留在普通聊天、没有打开 `task/subagent` 偏好,或把代码任务改写成另一套 prompt / workflow 旁路 +- 检查纯文本 `Claw @发布` 是否已经走 `原始用户消息 -> displayContent 保留 -> dispatch /content_post_with_cover -> content_post workflow` 主链,而不是直接把 `@发布` 文本原样当普通聊天发送,或重新造一套 `publish_task` 协议;同时确认平台后台类输入会继续触发 `browser_requirement` - 检查产品型 `/scene-key` 是否已经走 `原始用户消息 -> harness.service_scene_launch -> Agent 首刀 lime_run_service_skill -> OEM run/timeline` 主链,而不是前端直接调用云端 run API +- 如果某个 `/scene-key` 绑定的是 `site_adapter` 型技能,还要额外检查 `scene -> linkedSkillId -> 完整 ServiceSkill 目录 -> harness.service_skill_launch` 这条绑定链是否仍然成立,避免首页隐藏 site skill 后 slash scene 变成“目录可见但执行找不到 skill” +- 如果某个 `site_adapter` 结果开始返回 `markdown_bundle`,还要确认保存链会把 Markdown、图片和 `meta.json` 一起落到项目导出目录,并把重写后的相对图片路径写回内容 metadata;同时确认聊天轻卡或 tool timeline 能显示项目目录、Markdown 路径和图片数量,不能只把远程图片 URL 或临时 DOM 文本留在聊天结果里 高频场景: @@ -215,7 +226,7 @@ npm run bridge:health -- --timeout-ms 120000 - 修改浏览器资料 / 环境预设命令族,或调整它们在 `mockPriorityCommands` 里的优先级 - 修改浏览器连接器命令族,例如安装目录、启用状态、系统连接器、浏览器动作配置、扩展安装状态、打开 Chrome 扩展 / 远程调试页,或主动断开扩展连接 - 修改 `get_model_registry_provider_ids`、Provider 模型映射或 `src-tauri/resources/models/index.json` 真相源读取语义 -- 修改 `create_image_generation_task_artifact`、`get_media_task_artifact`、`list_media_task_artifacts`、`cancel_media_task_artifact`、`src/lib/api/mediaTasks.ts`、`src/lib/api/skill-execution.ts`、`useWorkspaceSendActions`、`useWorkspaceImageWorkbenchActionRuntime`、`runtime_turn`,或调整 `Claw @配图 -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task file` 的异步图片任务主链 +- 修改 `create_image_generation_task_artifact`、`get_media_task_artifact`、`list_media_task_artifacts`、`cancel_media_task_artifact`、`src/lib/api/mediaTasks.ts`、`src/lib/api/skill-execution.ts`、`useWorkspaceSendActions`、`useWorkspaceImageWorkbenchActionRuntime`、`runtime_turn`,或调整 `Claw @配图 -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task/timeline` 的异步图片任务主链 - 修改 `@封面` parser、`useWorkspaceSendActions`、`runtime_turn`、`cover_skill_launch`、`lime task create cover`、`cover_generate` skill 或 `lime_create_cover_generation_task`,尤其是调整 `Claw @封面 -> harness.cover_skill_launch -> Agent 首刀 Skill(cover_generate) -> task file` 主链 - 修改 `@播报` parser、`useWorkspaceSendActions`、`runtime_turn`、`broadcast_skill_launch`、`lime task create broadcast`、`broadcast_generate` skill 或 `lime_create_broadcast_generation_task`,尤其是调整 `Claw @播报 -> harness.broadcast_skill_launch -> Agent 首刀 Skill(broadcast_generate) -> task file` 主链 - 修改 `@素材` parser、`useWorkspaceSendActions`、`runtime_turn`、`resource_search_skill_launch`、`lime task create resource-search`、`modal_resource_search` skill 或 `lime_create_modal_resource_search_task`,尤其是调整 `Claw @素材 -> harness.resource_search_skill_launch -> Agent 首刀 Skill(modal_resource_search) -> task file` 主链 @@ -230,6 +241,10 @@ npm run bridge:health -- --timeout-ms 120000 - 修改 `@转写` parser、`useWorkspaceSendActions`、`runtime_turn`、`transcription_skill_launch`、`lime task create transcription`、`transcription_generate` skill 或 `lime_create_transcription_task`,尤其是调整 `Claw @转写 -> harness.transcription_skill_launch -> Agent 首刀 Skill(transcription_generate) -> task file` 主链 - 修改 `@链接解析` parser、`useWorkspaceSendActions`、`runtime_turn`、`url_parse_skill_launch`、`lime task create url-parse`、`url_parse` skill 或 `lime_create_url_parse_task`,尤其是调整 `Claw @链接解析 -> harness.url_parse_skill_launch -> Agent 首刀 Skill(url_parse) -> task file` 主链 - 修改 `@排版` parser、`useWorkspaceSendActions`、`runtime_turn`、`typesetting_skill_launch`、`lime task create typesetting`、`typesetting` skill 或 `lime_create_typesetting_task`,尤其是调整 `Claw @排版 -> harness.typesetting_skill_launch -> Agent 首刀 Skill(typesetting) -> task file` 主链 +- 修改 `@网页` parser、`useWorkspaceSendActions`、`runtime_turn`、`webpage_skill_launch`、`webpage_generate` skill 或 HTML artifact 预览链路,尤其是调整 `Claw @网页 -> harness.webpage_skill_launch -> Agent 首刀 Skill(webpage_generate) -> write_file HTML artifact` 主链 +- 修改 `@PPT` parser、`useWorkspaceSendActions`、`runtime_turn`、`presentation_skill_launch`、`presentation_generate` skill 或演示稿 artifact 预览链路,尤其是调整 `Claw @PPT -> harness.presentation_skill_launch -> Agent 首刀 Skill(presentation_generate) -> write_file Markdown artifact` 主链 +- 修改 `@代码` parser、`useWorkspaceSendActions`、mention builtin command 或 `code_orchestrated` 发送边界,尤其是调整 `Claw @代码 -> harness.code_command -> code_orchestrated -> tools / team runtime` 主链 +- 修改 `@发布` parser、`useWorkspaceSendActions`、content post workflow 入口或浏览器门禁推导,尤其是调整 `Claw @发布 -> displayContent/raw -> /content_post_with_cover -> publish workflow` 主链 - 修改 `/scene-key` 解析、`serviceSkillSceneLaunch`、`useWorkspaceSendActions`、`runtime_turn`、`prompt_context`、`lime_run_service_skill` 或 `client/skills` scene 目录协议,尤其是调整 `Claw /scene-key -> harness.service_scene_launch -> Agent 首刀 lime_run_service_skill -> OEM run/timeline` 主链 - 修改 `src/lib/dev-bridge/` - 修改 `src/lib/tauri-mock/` @@ -239,6 +254,8 @@ npm run bridge:health -- --timeout-ms 120000 如果本轮修改了 `Claw @配图` 或图片任务 artifact 回填语义,最低校验至少包含: - `npm run test:contracts` +- `cd src-tauri && cargo test test_merge_system_prompt_with_image_skill_launch_appends_prompt` +- `cd src-tauri && cargo test test_append_image_skill_launch_session_permissions_blocks_detour_tools` - `imageWorkbenchCommand`、`useWorkspaceSendActions`、受影响 skill / image task Hook 单测,以及 `aster_agent_cmd` 图片主链定向测试 - 如果本轮还改了显式图片动作入口,例如文稿 inline 配图、封面位或图片工作台编辑/重绘,额外覆盖 `useWorkspaceImageWorkbenchActionRuntime` 或对应发送桥接回归 - 若本轮还改了显式 `execute_skill` 的 `images / requestContext` 透传或 compat 续接,额外覆盖 `skillCommand` 回归 @@ -255,95 +272,137 @@ npm run bridge:health -- --timeout-ms 120000 如果本轮修改了 `Claw @封面` 或封面任务协议,最低校验至少包含: -- `coverWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 封面主链定向测试 +- `coverWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 封面主链 / detour tool 限制定向测试 - `lime-cli` 封面任务创建回归、受影响的默认 skill / tool catalog 测试 - `npm run test:contracts` - `npm run verify:gui-smoke` +如果本轮修改了 `Claw @视频` 或视频任务协议,最低校验至少包含: + +- `videoWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 视频主链 / detour tool 限制定向测试 +- `lime media video generate` 回归、受影响的默认 skill / tool catalog 测试 +- `npm run test:contracts` +- 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` + 如果本轮修改了 `Claw @播报` 或播报任务协议,最低校验至少包含: -- `broadcastWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 播报主链定向测试 +- `broadcastWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 播报主链 / detour tool 限制定向测试 - `lime-cli` 播报任务创建测试、受影响的默认 skill / tool catalog 测试 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @素材` 或素材检索任务协议,最低校验至少包含: -- `resourceSearchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 素材检索主链定向测试 +- `resourceSearchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 素材检索主链 / detour tool 限制定向测试 - `lime-cli` 资源检索任务创建测试、受影响的默认 skill / tool catalog 测试 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @搜索` 或搜索 prompt skill 协议,最低校验至少包含: -- `searchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 搜索主链定向测试 +- `searchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 搜索主链 / detour tool 限制定向测试 - `research` 默认 skill / tool catalog 相关回归 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @深搜` 或深搜 prompt skill 协议,最低校验至少包含: -- `deepSearchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 深搜主链定向测试 +- `deepSearchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 深搜主链 / detour tool 限制定向测试 - `research` 默认 skill / tool catalog 相关回归,且要确认没有退化成只执行一轮浅搜 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @研报` 或研报 prompt skill 协议,最低校验至少包含: -- `reportWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 研报主链定向测试 +- `reportWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 研报主链 / detour tool 限制定向测试 - `report_generate` 默认 skill / `skillCatalog` 相关回归,且要确认没有退回普通聊天长文或跳过真实 `search_query` - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @站点搜索` 或站点搜索 prompt skill 协议,最低校验至少包含: -- `siteSearchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 站点搜索主链定向测试 +- `siteSearchWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 站点搜索主链 / detour tool 限制定向测试 - `site_search` 默认 skill / `lime_site_*` tool catalog 相关回归 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` +如果本轮修改了 `Claw @读PDF` 或读 PDF prompt skill 协议,最低校验至少包含: + +- `pdfWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 读 PDF 主链 / detour tool 限制定向测试 +- `pdf_read` 默认 skill / `skillCatalog` 相关回归;若支持相对路径,还要确认没有跳过真实 `list_directory / read_file` timeline +- `npm run test:contracts` +- 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` + 如果本轮修改了 `Claw @总结` 或总结 prompt skill 协议,最低校验至少包含: -- `summaryWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 总结主链定向测试 +- `summaryWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 总结主链 / detour tool 限制定向测试 - `summary` 默认 skill / `skillCatalog` 相关回归;若支持文件路径总结,还要确认没有跳过真实 `list_directory / read_file` timeline - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @翻译` 或翻译 prompt skill 协议,最低校验至少包含: -- `translationWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 翻译主链定向测试 +- `translationWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 翻译主链 / detour tool 限制定向测试 - `translation` 默认 skill / `skillCatalog` 相关回归;若支持文件路径翻译,还要确认没有跳过真实 `list_directory / read_file` timeline - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @分析` 或分析 prompt skill 协议,最低校验至少包含: -- `analysisWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 分析主链定向测试 +- `analysisWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 分析主链 / detour tool 限制定向测试 - `analysis` 默认 skill / `skillCatalog` 相关回归;若支持文件路径分析,还要确认没有跳过真实 `list_directory / read_file` timeline - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @转写` 或转写任务协议,最低校验至少包含: -- `transcriptionWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 转写主链定向测试 +- `transcriptionWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 转写主链 / detour tool 限制定向测试 - `lime-cli` 转写任务创建测试、`media-runtime` 任务类型回归、受影响的默认 skill / tool catalog 测试 - `npm run test:contracts` -- `npm run verify:gui-smoke` +- 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @链接解析` 或链接解析任务协议,最低校验至少包含: -- `urlParseWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 链接解析主链定向测试 +- `urlParseWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 链接解析主链 / detour tool 限制定向测试 - `lime-cli` 链接解析任务创建测试、受影响的默认 skill / tool catalog 测试 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` 如果本轮修改了 `Claw @排版` 或排版任务协议,最低校验至少包含: -- `typesettingWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 排版主链定向测试 +- `typesettingWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 排版主链 / detour tool 限制定向测试 - `lime-cli` 排版任务创建测试、受影响的默认 skill / tool catalog 测试 - `npm run test:contracts` - 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` +如果本轮修改了 `Claw @网页` 或网页生成协议,最低校验至少包含: + +- `webpageWorkbenchCommand`、`useWorkspaceSendActions`、提及面板 builtin command 回归,以及 `aster_agent_cmd` 网页主链 / detour tool 限制定向测试 +- `webpage_generate` 默认 skill、默认 skill 安装或 `lime-cli skill show webpage_generate` 相关回归 + +如果本轮修改了 `Claw @PPT` 或演示稿生成协议,最低校验至少包含: + +- `npx vitest run "src/components/agent/chat/utils/presentationWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx"` +- `cargo test presentation_skill_launch` +- `cargo test -p lime-cli skill_show_presentation_generate_returns_builtin_skill` +- `presentation_generate` 默认 skill、默认 skill 安装或 `lime-cli skill show presentation_generate` 相关回归 +- `npm run test:contracts` +- 若 HTML artifact 预览主路径受影响,再补 `npm run verify:gui-smoke` + +如果本轮修改了 `Claw @代码` 或代码编排发送协议,最低校验至少包含: + +- `npx vitest run "src/components/agent/chat/utils/codeWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx" "src/lib/api/skillCatalog.test.ts"` +- 如有改动扩散到 runtime/team/tool 协议,再补对应 `agentStream*` / runtime team / tool display 定向回归 +- 若命令边界或 harness 协议继续扩散,再补 `npm run test:contracts` +- 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` + +如果本轮修改了 `Claw @发布` 或发布工作流接线,最低校验至少包含: + +- `npx vitest run "src/components/agent/chat/utils/publishWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx" "src/lib/api/skillCatalog.test.ts"` +- 如有改动扩散到 `content_post_with_cover` slash skill 或写文件回流,再补 `skillCommand` / `MessageList` / general workbench 相关定向回归 +- 若浏览器门禁或 harness 协议继续扩散,再补 `npm run test:contracts` +- 若 GUI 主路径受影响,再补 `npm run verify:gui-smoke` + 如果本轮修改了 Provider 模型真相源或设置页中的“支持的模型”展示逻辑,还应额外确认: - 资源索引损坏时,GUI 会明确提示“模型真相源异常” diff --git a/docs/prd/skills/async-image-skill-task-prd.md b/docs/prd/skills/async-image-skill-task-prd.md index 14a418944..0bdc2d595 100644 --- a/docs/prd/skills/async-image-skill-task-prd.md +++ b/docs/prd/skills/async-image-skill-task-prd.md @@ -295,7 +295,8 @@ skill 输出的语义是: 标准 CLI 主链: -- `lime task create image --json` +- `lime media image generate --json` +- `lime task create image --json`(兼容入口,但必须复用同一条执行链) - `lime task status ` - `lime task result ` - `lime task retry ` @@ -522,7 +523,7 @@ skill 输出的语义是: ### 11.2 协议验收 1. `image_generate` skill 输出稳定任务字段。 -2. `lime task create image --json` 返回稳定 JSON。 +2. `lime media image generate --json` 与 `lime task create image --json` 都返回稳定 JSON,且共享同一条图片执行链。 3. `lime task status` 能读到标准状态。 4. `lime task result` 能读到标准结果结构。 5. `retry / cancel / list` 行为符合任务协议。 diff --git a/extensions/lime-chrome/background.js b/extensions/lime-chrome/background.js index f499a2975..cde137d91 100644 --- a/extensions/lime-chrome/background.js +++ b/extensions/lime-chrome/background.js @@ -1179,7 +1179,7 @@ async function injectContentScript(tabId) { await ensureCapturableTab(tabId); await chrome.scripting.executeScript({ target: { tabId }, - files: ["content_script.js"], + files: ["site_adapter_runners.generated.js", "content_script.js"], }); } diff --git a/extensions/lime-chrome/content_script.js b/extensions/lime-chrome/content_script.js index b0d291f4a..aa997e0ef 100644 --- a/extensions/lime-chrome/content_script.js +++ b/extensions/lime-chrome/content_script.js @@ -267,7 +267,14 @@ }, }; - const siteAdapterRunners = { + const generatedSiteAdapterRunners = + window.__LIME_SITE_ADAPTER_RUNNERS__ && + typeof window.__LIME_SITE_ADAPTER_RUNNERS__ === "object" && + !Array.isArray(window.__LIME_SITE_ADAPTER_RUNNERS__) + ? window.__LIME_SITE_ADAPTER_RUNNERS__ + : {}; + + const legacySiteAdapterRunners = { "github/search": async (args, helpers) => { const query = String(args.query || "").trim(); const limit = helpers.number(args.limit, 10); @@ -929,6 +936,11 @@ }, }; + const siteAdapterRunners = { + ...legacySiteAdapterRunners, + ...generatedSiteAdapterRunners, + }; + async function executeCommand(commandData) { const command = String(commandData.command || "").trim(); const target = commandData.target; diff --git a/extensions/lime-chrome/site_adapter_runners.generated.js b/extensions/lime-chrome/site_adapter_runners.generated.js new file mode 100644 index 000000000..394b9cac6 --- /dev/null +++ b/extensions/lime-chrome/site_adapter_runners.generated.js @@ -0,0 +1,1050 @@ +// 由 scripts/generate-extension-site-adapter-runners.mjs 自动生成,请勿手改。 +(function () { + const generatedSiteAdapterRunners = { + "36kr/newsflash": (async (args, helpers) => { + const limit = helpers.number(args.limit, 10); + await helpers.waitFor( + () => document.querySelectorAll('a[href*="/p/"]').length > 0, + 12000, + 300, + ); + const links = Array.from(document.querySelectorAll('a[href*="/p/"]')); + const items = helpers.take( + helpers.uniqueBy( + links + .map((anchor) => { + const card = anchor.closest("div, article"); + return { + title: helpers.text(anchor), + url: helpers.absoluteUrl(anchor.getAttribute("href") || ""), + summary: helpers.text(card?.querySelector("p")), + }; + }) + .filter((item) => item.title && item.url), + (item) => item.url, + ), + limit, + ); + + return { + ok: true, + data: { + items, + count: items.length, + }, + source_url: location.href, + }; +}), + + "bilibili/search": (async (args, helpers) => { + const query = String(args.query || "").trim(); + const limit = helpers.number(args.limit, 10); + await helpers.waitFor( + () => + document.querySelectorAll( + 'a[href*="/video/BV"], a[href*="//www.bilibili.com/video/"]', + ).length > 0, + 12000, + 300, + ); + const links = Array.from( + document.querySelectorAll( + 'a[href*="/video/BV"], a[href*="//www.bilibili.com/video/"]', + ), + ); + const items = helpers.take( + helpers.uniqueBy( + links + .map((anchor) => { + const card = anchor.closest("div"); + return { + title: helpers.text(anchor), + url: helpers.absoluteUrl(anchor.getAttribute("href") || ""), + author: helpers.text( + card?.querySelector( + ".bili-video-card__info--author, .up-name, .bili-video-card__info--bottom .bili-video-card__info--author", + ), + ), + summary: helpers.text( + card?.querySelector( + ".bili-video-card__info--desc, .des, .bili-video-card__info--title", + ), + ), + }; + }) + .filter((item) => item.title && item.url), + (item) => item.url, + ), + limit, + ); + + if (items.length === 0 && helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: `B 站没有返回 "${query}" 的搜索结果,可能需要先登录。`, + }; + } + + return { + ok: true, + data: { + query, + items, + count: items.length, + }, + source_url: location.href, + }; +}), + + "github/issues": (async (args, helpers) => { + const repo = String(args.repo || "").trim(); + const limit = helpers.number(args.limit, 10); + await helpers.waitFor( + () => + document.querySelectorAll( + 'a[data-hovercard-type="issue"], a[id^="issue_"]', + ).length > 0, + 12000, + 300, + ); + const links = Array.from( + document.querySelectorAll( + 'a[data-hovercard-type="issue"], a[id^="issue_"]', + ), + ); + const items = helpers.take( + helpers.uniqueBy( + links + .map((anchor) => { + const row = anchor.closest("div, li"); + return { + title: helpers.text(anchor), + url: helpers.absoluteUrl(anchor.getAttribute("href") || ""), + status: helpers.text( + row?.querySelector( + '[aria-label*="Open"], [aria-label*="Closed"], .State', + ), + ), + summary: helpers.text( + row?.querySelector("span.color-fg-muted, .markdown-title + div"), + ), + }; + }) + .filter((item) => item.title && item.url), + (item) => item.url, + ), + limit, + ); + + if (items.length === 0 && helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: `GitHub 仓库 ${repo} 的 issue 列表为空,可能需要登录后访问。`, + }; + } + + return { + ok: true, + data: { + repo, + items, + count: items.length, + }, + source_url: location.href, + }; +}), + + "github/search": (async (args, helpers) => { + const query = String(args.query || "").trim(); + const limit = helpers.number(args.limit, 10); + await helpers.waitFor( + () => document.querySelectorAll("a.v-align-middle").length > 0, + 12000, + 300, + ); + const links = Array.from(document.querySelectorAll("a.v-align-middle")); + const items = helpers.take( + helpers.uniqueBy( + links + .map((anchor) => { + const card = anchor.closest("li, div.search-title, div.Box-row"); + return { + title: helpers.text(anchor), + url: helpers.absoluteUrl(anchor.getAttribute("href") || ""), + summary: helpers.text(card?.querySelector("p")), + }; + }) + .filter((item) => item.title && item.url), + (item) => item.url, + ), + limit, + ); + + if (items.length === 0 && helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: "GitHub 搜索结果为空,可能需要先登录后再访问。", + }; + } + + return { + ok: true, + data: { + query, + items, + count: items.length, + }, + source_url: location.href, + }; +}), + + "linux-do/categories": (async (args, helpers) => { + const limit = helpers.number(args.limit, 10); + + try { + const response = await fetch("/categories.json", { credentials: "include" }); + if (!response.ok) { + return { + ok: false, + error_code: "auth_required", + error_message: "linux.do 分类列表暂不可用,可能需要先登录。", + }; + } + const payload = await response.json(); + const categories = Array.isArray(payload?.category_list?.categories) + ? payload.category_list.categories + : []; + + const items = helpers.take( + categories.map((category) => ({ + name: String(category?.name || "").trim(), + slug: String(category?.slug || "").trim(), + id: category?.id ?? null, + topics: category?.topic_count ?? 0, + description: String(category?.description_text || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 80), + })), + limit, + ).filter((item) => item.name); + + return { + ok: true, + data: { + items, + count: items.length, + }, + source_url: location.href, + }; + } catch (error) { + return { + ok: false, + error_code: "runtime_error", + error_message: + error instanceof Error ? error.message : "读取 linux.do 分类列表失败。", + }; + } +}), + + "linux-do/hot": (async (args, helpers) => { + const limit = helpers.number(args.limit, 10); + const allowedPeriods = new Set(["all", "daily", "weekly", "monthly", "yearly"]); + const period = String(args.period || "weekly").trim().toLowerCase(); + const normalizedPeriod = allowedPeriods.has(period) ? period : "weekly"; + + try { + const response = await fetch( + "/top.json?period=" + encodeURIComponent(normalizedPeriod), + { credentials: "include" }, + ); + if (!response.ok) { + return { + ok: false, + error_code: "auth_required", + error_message: "linux.do 热门话题暂不可用,可能需要先登录。", + }; + } + const payload = await response.json(); + const topics = Array.isArray(payload?.topic_list?.topics) + ? payload.topic_list.topics + : []; + const categories = Array.isArray(payload?.topic_list?.categories) + ? payload.topic_list.categories + : Array.isArray(payload?.categories) + ? payload.categories + : []; + const categoryMap = new Map( + categories.map((category) => [category?.id, String(category?.name || "").trim()]), + ); + + const items = helpers.take( + topics.map((topic, index) => ({ + rank: index + 1, + title: String(topic?.title || "").trim(), + replies: Math.max(0, Number(topic?.posts_count || 1) - 1), + views: Number(topic?.views || 0), + likes: Number(topic?.like_count || 0), + category: + categoryMap.get(topic?.category_id) || + String(topic?.category_id || "").trim(), + })), + limit, + ).filter((item) => item.title); + + return { + ok: true, + data: { + period: normalizedPeriod, + items, + count: items.length, + }, + source_url: location.href, + }; + } catch (error) { + return { + ok: false, + error_code: "runtime_error", + error_message: + error instanceof Error ? error.message : "读取 linux.do 热门话题失败。", + }; + } +}), + + "smzdm/search": (async (args, helpers) => { + const query = String(args.query || "").trim(); + const limit = helpers.number(args.limit, 10); + const rowSelector = "li.feed-row-wide"; + + await helpers.waitFor( + () => + document.querySelectorAll(rowSelector).length > 0 || + /搜索结果|相关好价|什么值得买/i.test(document.body?.textContent || ""), + 12000, + 300, + ); + + const rows = Array.from(document.querySelectorAll(rowSelector)); + const items = helpers.take( + helpers.uniqueBy( + rows + .map((row, index) => { + const titleAnchor = + row.querySelector("h5.feed-block-title > a") || row.querySelector("h5 > a"); + const rawHref = + titleAnchor?.getAttribute("href") || titleAnchor?.href || ""; + const url = helpers.absoluteUrl(rawHref); + const title = ( + titleAnchor?.getAttribute("title") || helpers.text(titleAnchor) + ).trim(); + const price = helpers.text(row.querySelector(".z-highlight")); + const mall = helpers.text( + row.querySelector(".z-feed-foot-r .feed-block-extras span") || + row.querySelector(".z-feed-foot-r span"), + ); + const commentsText = helpers.text( + row.querySelector(".feed-btn-comment"), + ).replace(/[^\d]/g, ""); + return { + rank: index + 1, + title, + url, + price, + mall, + comments: commentsText ? Number(commentsText) : 0, + }; + }) + .filter((item) => item.title && item.url), + (item) => item.url, + ), + limit, + ); + + return { + ok: true, + data: { + query, + items, + count: items.length, + }, + source_url: location.href, + }; +}), + + "yahoo-finance/quote": (async (args, helpers) => { + const symbol = String(args.symbol || "").trim().toUpperCase(); + if (!symbol) { + return { + ok: false, + error_code: "invalid_args", + error_message: "symbol 不能为空。", + }; + } + + const normalizeText = (value) => { + const text = String(value ?? "").replace(/\s+/g, " ").trim(); + return text || null; + }; + const normalizeNumber = (value) => { + if (value === undefined || value === null || value === "") { + return null; + } + const text = String(value).replace(/,/g, "").replace(/%/g, "").trim(); + const number = Number(text); + return Number.isFinite(number) ? number : null; + }; + const buildResult = (item) => ({ + ok: true, + data: { + symbol, + items: [item], + count: 1, + }, + source_url: location.href, + }); + + try { + const chartUrl = + "https://query1.finance.yahoo.com/v8/finance/chart/" + + encodeURIComponent(symbol) + + "?interval=1d&range=1d"; + const response = await fetch(chartUrl, { credentials: "include" }); + if (response.ok) { + const payload = await response.json(); + const chart = payload?.chart?.result?.[0]; + if (chart) { + const meta = chart.meta || {}; + const previousClose = meta.previousClose ?? meta.chartPreviousClose ?? null; + const price = meta.regularMarketPrice ?? null; + const change = + price != null && previousClose != null ? price - previousClose : null; + const changePercent = + change != null && previousClose + ? Number(((change / previousClose) * 100).toFixed(2)) + : null; + return buildResult({ + symbol: meta.symbol || symbol, + name: meta.shortName || meta.longName || symbol, + price: price != null ? Number(price.toFixed(2)) : null, + change: change != null ? Number(change.toFixed(2)) : null, + changePercent, + open: chart.indicators?.quote?.[0]?.open?.[0] ?? null, + high: meta.regularMarketDayHigh ?? null, + low: meta.regularMarketDayLow ?? null, + volume: meta.regularMarketVolume ?? null, + marketCap: meta.marketCap ?? null, + }); + } + } + } catch {} + + await helpers.waitFor( + () => + document.querySelector('[data-testid="qsp-price"]') || + document.querySelector('fin-streamer[data-field="regularMarketPrice"]') || + document.querySelector("h1"), + 12000, + 300, + ); + + const titleText = normalizeText(document.querySelector("h1")?.textContent); + const item = { + symbol, + name: titleText + ? titleText.replace(/\s*\([^)]+\)\s*$/, "").trim() || symbol + : symbol, + price: normalizeNumber( + document.querySelector('[data-testid="qsp-price"]')?.textContent || + document.querySelector('fin-streamer[data-field="regularMarketPrice"]') + ?.textContent, + ), + change: normalizeNumber( + document.querySelector('[data-testid="qsp-price-change"]')?.textContent || + document.querySelector('fin-streamer[data-field="regularMarketChange"]') + ?.textContent, + ), + changePercent: normalizeNumber( + document.querySelector('[data-testid="qsp-price-change-percent"]') + ?.textContent || + document.querySelector( + 'fin-streamer[data-field="regularMarketChangePercent"]', + )?.textContent, + ), + open: normalizeNumber( + document.querySelector('[data-test="OPEN-value"]')?.textContent, + ), + high: normalizeNumber( + document.querySelector('[data-test="DAYS_RANGE-value"]') + ?.textContent?.split(" - ") + ?.at(1), + ), + low: normalizeNumber( + document.querySelector('[data-test="DAYS_RANGE-value"]') + ?.textContent?.split(" - ") + ?.at(0), + ), + volume: normalizeNumber( + document.querySelector('[data-test="TD_VOLUME-value"]')?.textContent, + ), + marketCap: normalizeText( + document.querySelector('[data-test="MARKET_CAP-value"]')?.textContent, + ), + }; + + if (item.price != null || item.name !== symbol) { + return buildResult(item); + } + + return { + ok: true, + data: { + symbol, + items: [], + count: 0, + }, + source_url: location.href, + }; +}), + + "x/article-export": (async (args, helpers) => { + const ARTICLE_ROOT_SELECTOR = '[data-testid="twitterArticleReadView"]'; + const ARTICLE_TITLE_SELECTOR = '[data-testid="twitter-article-title"]'; + const ARTICLE_CONTENT_SELECTOR = + '[data-testid="longformRichTextComponent"] [data-contents="true"], [data-testid="longformRichTextComponent"]'; + const IMAGE_SELECTOR = '[data-testid="tweetPhoto"] img'; + const CODE_BLOCK_SELECTOR = '[data-testid="markdown-code-block"]'; + + function normalizeText(value) { + return String(value || "") + .replace(/\u00a0/g, " ") + .replace(/\s+/g, " ") + .trim(); + } + + function normalizeMultilineText(value) { + return String(value || "") + .replace(/\r\n/g, "\n") + .replace(/\u00a0/g, " ") + .replace(/[ \t]+\n/g, "\n") + .replace(/\n{3,}/g, "\n\n") + .trim(); + } + + function escapeMarkdownText(value) { + return String(value || "").replace(/([\\`*_{}\[\]()#+\-.!|>])/g, "\\$1"); + } + + function normalizeArticleUrl(rawUrl) { + try { + const url = new URL(rawUrl, location.href); + const hostname = url.hostname.replace(/^www\./, "").toLowerCase(); + if (hostname !== "x.com" && hostname !== "twitter.com") { + return null; + } + if (!/\/article\//.test(url.pathname)) { + return null; + } + return url.toString(); + } catch { + return null; + } + } + + function resolveAuthor() { + const titleMatch = document.title.match(/^(.+?) on X/i); + if (titleMatch?.[1]) { + return normalizeText(titleMatch[1]); + } + + const pathMatch = location.pathname.match(/^\/([^/]+)/); + if (pathMatch?.[1]) { + return `@${pathMatch[1]}`; + } + + return null; + } + + function normalizeImageUrl(rawUrl) { + try { + const url = new URL(rawUrl, location.href); + if (url.hostname.includes("pbs.twimg.com")) { + if (url.searchParams.has("format")) { + url.searchParams.set("name", "orig"); + } + } + return url.toString(); + } catch { + return rawUrl || ""; + } + } + + function resolveSuggestedImageName(rawUrl, fallbackIndex) { + try { + const url = new URL(rawUrl, location.href); + const format = normalizeText(url.searchParams.get("format")); + const ext = format || normalizeText(url.pathname.split(".").pop()) || "jpg"; + return `image-${fallbackIndex + 1}.${ext}`; + } catch { + return `image-${fallbackIndex + 1}.jpg`; + } + } + + function resolveCodeLanguage(element) { + const candidates = [ + element.getAttribute("data-language"), + element.querySelector("[data-language]")?.getAttribute("data-language"), + element.querySelector("code")?.getAttribute("data-language"), + element.querySelector("pre")?.getAttribute("data-language"), + element.querySelector("code")?.className, + ]; + + for (const candidate of candidates) { + const normalized = normalizeText(candidate); + if (!normalized) { + continue; + } + const match = normalized.match(/language-([a-z0-9_+-]+)/i); + if (match?.[1]) { + return match[1].toLowerCase(); + } + if (/^[a-z0-9_+-]+$/i.test(normalized)) { + return normalized.toLowerCase(); + } + } + + return ""; + } + + function createState() { + return { + imageUrls: new Set(), + images: [], + }; + } + + function registerImage(state, imageElement) { + const rawUrl = + imageElement.getAttribute("src") || + imageElement.getAttribute("data-src") || + ""; + const normalizedUrl = normalizeImageUrl(rawUrl); + if (!normalizedUrl) { + return ""; + } + + if (!state.imageUrls.has(normalizedUrl)) { + state.imageUrls.add(normalizedUrl); + state.images.push({ + url: normalizedUrl, + alt: normalizeText(imageElement.getAttribute("alt")) || undefined, + suggested_file_name: resolveSuggestedImageName( + normalizedUrl, + state.images.length, + ), + }); + } + + const altText = normalizeText(imageElement.getAttribute("alt")) || "插图"; + return `![${escapeMarkdownText(altText)}](${normalizedUrl})`; + } + + function collectInlineMarkdown(node, state) { + if (!node) { + return ""; + } + + if (node.nodeType === Node.TEXT_NODE) { + return escapeMarkdownText(node.textContent || ""); + } + + if (node.nodeType !== Node.ELEMENT_NODE) { + return ""; + } + + const element = node; + if (element.matches?.(IMAGE_SELECTOR) || element.tagName === "IMG") { + return registerImage(state, element); + } + + if (element.matches?.(CODE_BLOCK_SELECTOR)) { + return ""; + } + + if (element.tagName === "BR") { + return "\n"; + } + + const childMarkdown = Array.from(element.childNodes) + .map((child) => collectInlineMarkdown(child, state)) + .join(""); + const normalized = childMarkdown.replace(/[ \t]+\n/g, "\n"); + + if (element.tagName === "A") { + const href = helpers.absoluteUrl(element.getAttribute("href") || ""); + const label = normalizeMultilineText(normalized); + if (!href) { + return label; + } + return label ? `[${label}](${href})` : href; + } + + if (element.tagName === "CODE") { + const codeText = normalizeMultilineText(element.textContent || ""); + return codeText ? `\`${codeText}\`` : ""; + } + + if (element.tagName === "STRONG" || element.tagName === "B") { + const text = normalized.trim(); + return text ? `**${text}**` : ""; + } + + if (element.tagName === "EM" || element.tagName === "I") { + const text = normalized.trim(); + return text ? `*${text}*` : ""; + } + + return normalized; + } + + function hasMeaningfulText(element) { + return normalizeText(element.textContent || "").length > 0; + } + + function serializeList(element, state, depth = 0) { + const items = Array.from(element.children) + .filter((child) => child.tagName === "LI") + .map((item, index) => { + const marker = element.tagName === "OL" ? `${index + 1}.` : "-"; + const nestedLists = Array.from(item.children).filter((child) => + ["UL", "OL"].includes(child.tagName), + ); + const clonedItem = item.cloneNode(true); + nestedLists.forEach((list) => { + const nestedClone = clonedItem.querySelector(list.tagName.toLowerCase()); + nestedClone?.remove(); + }); + + const text = normalizeMultilineText( + collectInlineMarkdown(clonedItem, state), + ); + const lines = []; + if (text) { + lines.push(`${" ".repeat(depth)}${marker} ${text}`); + } + nestedLists.forEach((list) => { + const nestedMarkdown = serializeList(list, state, depth + 1); + if (nestedMarkdown) { + lines.push(nestedMarkdown); + } + }); + return lines.join("\n"); + }) + .filter(Boolean); + + return items.join("\n"); + } + + function serializeBlock(element, state) { + if (!(element instanceof Element)) { + return []; + } + + if (element.matches(ARTICLE_TITLE_SELECTOR)) { + return []; + } + + if (element.matches(CODE_BLOCK_SELECTOR)) { + const codeText = normalizeMultilineText(element.innerText || element.textContent || ""); + if (!codeText) { + return []; + } + const language = resolveCodeLanguage(element); + return [`\`\`\`${language}\n${codeText}\n\`\`\``]; + } + + if (element.matches(IMAGE_SELECTOR) || element.matches('[data-testid="tweetPhoto"], figure')) { + const images = element.matches(IMAGE_SELECTOR) + ? [element] + : Array.from(element.querySelectorAll("img")); + return images + .map((image) => registerImage(state, image)) + .filter(Boolean); + } + + if (element.matches("ul,ol")) { + const listMarkdown = serializeList(element, state); + return listMarkdown ? [listMarkdown] : []; + } + + if (element.matches("blockquote")) { + const text = normalizeMultilineText(collectInlineMarkdown(element, state)); + if (!text) { + return []; + } + return [text.split("\n").map((line) => `> ${line}`).join("\n")]; + } + + if (element.matches("h1,h2,h3,h4,h5,h6")) { + const level = Number(element.tagName.slice(1)) || 2; + const text = normalizeMultilineText(collectInlineMarkdown(element, state)); + return text ? [`${"#".repeat(Math.min(level, 6))} ${text}`] : []; + } + + if (element.matches("hr")) { + return ["---"]; + } + + const directBlockChildren = Array.from(element.children).filter((child) => { + if (child.matches(CODE_BLOCK_SELECTOR)) { + return true; + } + if (child.matches(IMAGE_SELECTOR) || child.matches('[data-testid="tweetPhoto"], figure')) { + return true; + } + if (child.matches("ul,ol,blockquote,h1,h2,h3,h4,h5,h6,hr")) { + return true; + } + return child.children.length > 0 && !["A", "SPAN", "EM", "STRONG", "I", "B", "CODE"].includes(child.tagName); + }); + + if (directBlockChildren.length > 0 && !element.matches("p,li")) { + return directBlockChildren.flatMap((child) => serializeBlock(child, state)); + } + + if (!hasMeaningfulText(element) && !element.querySelector("img")) { + return []; + } + + const paragraph = normalizeMultilineText(collectInlineMarkdown(element, state)); + return paragraph ? [paragraph] : []; + } + + function serializeArticle(root, state) { + const blocks = Array.from(root.children) + .flatMap((child) => serializeBlock(child, state)) + .map((block) => normalizeMultilineText(block)) + .filter(Boolean); + + if (blocks.length > 0) { + return blocks.join("\n\n"); + } + + const fallback = normalizeMultilineText(root.innerText || root.textContent || ""); + return fallback; + } + + const requestedUrl = String(args.url || "").trim(); + if (requestedUrl && !normalizeArticleUrl(requestedUrl)) { + return { + ok: false, + error_code: "invalid_args", + error_message: "url 必须是 x.com 或 twitter.com 的 article 链接。", + }; + } + + const articleRoot = await helpers.waitFor( + () => document.querySelector(ARTICLE_ROOT_SELECTOR), + 15000, + 250, + ); + if (!articleRoot) { + if (helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: "未能读取 X 长文内容,可能需要先登录 X 后再访问。", + }; + } + return { + ok: false, + error_code: "adapter_runtime_error", + error_message: "未找到 X 长文阅读视图。", + }; + } + + const title = + normalizeText(articleRoot.querySelector(ARTICLE_TITLE_SELECTOR)?.textContent) || + normalizeText(document.title.replace(/\s+on X.*$/i, "")); + const contentRoot = articleRoot.querySelector(ARTICLE_CONTENT_SELECTOR); + if (!contentRoot) { + return { + ok: false, + error_code: helpers.looksLikeLoginWall() ? "auth_required" : "adapter_runtime_error", + error_message: "未找到 X 长文正文区域。", + }; + } + + const state = createState(); + const markdown = serializeArticle(contentRoot, state); + if (!markdown) { + return { + ok: false, + error_code: helpers.looksLikeLoginWall() ? "auth_required" : "adapter_runtime_error", + error_message: "正文为空,无法导出 Markdown。", + }; + } + + const publishedAt = + articleRoot.querySelector("time[datetime]")?.getAttribute("datetime") || + document.querySelector("time[datetime]")?.getAttribute("datetime") || + undefined; + const sourceUrl = normalizeArticleUrl(location.href) || location.href; + + return { + ok: true, + source_url: sourceUrl, + data: { + export_kind: "markdown_bundle", + title: title || undefined, + source_url: sourceUrl, + author: resolveAuthor() || undefined, + published_at: publishedAt || undefined, + markdown, + images: state.images, + }, + }; +}), + + "zhihu/hot": (async (args, helpers) => { + const limit = helpers.number(args.limit, 10); + const hrefTokens = ["/question/"]; + const maxCandidates = Math.max(limit * 6, 30); + const main = document.querySelector("main") || document.body; + const collectCandidates = (maxCount) => { + if (!main) { + return []; + } + const results = []; + const seen = new Set(); + for (const anchor of main.getElementsByTagName("a")) { + const href = anchor.getAttribute("href") || ""; + if (!hrefTokens.some((token) => href.includes(token))) { + continue; + } + const title = helpers.text(anchor); + const url = helpers.absoluteUrl(href); + if (!title || !url || seen.has(url)) { + continue; + } + seen.add(url); + results.push({ anchor, title, url }); + if (results.length >= maxCount) { + break; + } + } + return results; + }; + await helpers.waitFor(() => collectCandidates(1)[0], 12000, 300); + const items = helpers.take( + collectCandidates(maxCandidates) + .map(({ anchor, title, url }, index) => { + const card = anchor.closest("section, div"); + return { + rank: index + 1, + title, + url, + summary: helpers.text(card?.querySelector("p")), + }; + }) + .filter((item) => item.title && item.url), + limit, + ); + + if (items.length === 0 && helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: "当前页面没有返回知乎热榜内容,可能需要先登录知乎。", + }; + } + + return { + ok: true, + data: { + items, + count: items.length, + }, + source_url: location.href, + }; +}), + + "zhihu/search": (async (args, helpers) => { + const query = String(args.query || "").trim(); + const limit = helpers.number(args.limit, 10); + const hrefTokens = ["/question/", "/answer/", "/zvideo/"]; + const maxCandidates = Math.max(limit * 8, 40); + const main = document.querySelector("main") || document.body; + const collectCandidates = (maxCount) => { + if (!main) { + return []; + } + const results = []; + const seen = new Set(); + for (const anchor of main.getElementsByTagName("a")) { + const href = anchor.getAttribute("href") || ""; + if (!hrefTokens.some((token) => href.includes(token))) { + continue; + } + const title = helpers.text(anchor); + const url = helpers.absoluteUrl(href); + if (!title || !url || seen.has(url)) { + continue; + } + seen.add(url); + results.push({ anchor, title, url }); + if (results.length >= maxCount) { + break; + } + } + return results; + }; + await helpers.waitFor(() => collectCandidates(1)[0], 12000, 300); + const items = helpers.take( + collectCandidates(maxCandidates) + .map(({ anchor, title, url }) => { + const card = anchor.closest("div"); + return { + title, + url, + summary: helpers.text(card?.querySelector("p")), + }; + }) + .filter((item) => item.title && item.url), + limit, + ); + + if (items.length === 0 && helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: `知乎没有返回 "${query}" 的搜索结果,可能需要先登录。`, + }; + } + + return { + ok: true, + data: { + query, + items, + count: items.length, + }, + source_url: location.href, + }; +}) + }; + + const existingSiteAdapterRunners = + window.__LIME_SITE_ADAPTER_RUNNERS__ && + typeof window.__LIME_SITE_ADAPTER_RUNNERS__ === "object" && + !Array.isArray(window.__LIME_SITE_ADAPTER_RUNNERS__) + ? window.__LIME_SITE_ADAPTER_RUNNERS__ + : {}; + + window.__LIME_SITE_ADAPTER_RUNNERS__ = { + ...generatedSiteAdapterRunners, + ...existingSiteAdapterRunners, + }; +})(); diff --git a/package.json b/package.json index d5edf4b17..21d7993df 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "lime", "private": true, - "version": "1.4.0", + "version": "1.5.0", "type": "module", "engines": { "node": ">=22.0.0" @@ -12,16 +12,18 @@ }, "homepage": "https://github.com/aiclientproxy/lime", "scripts": { + "generate:extension-site-adapters": "node scripts/generate-extension-site-adapter-runners.mjs", + "check:extension-site-adapters": "node scripts/generate-extension-site-adapter-runners.mjs --check", "heatmap:project": "node scripts/project-heatmap.mjs", "governance:graph": "node scripts/governance-graph.mjs", - "predev": "npm run verify:app-version && node scripts/ensure-dev-port.mjs", + "predev": "npm run generate:extension-site-adapters && npm run verify:app-version && node scripts/ensure-dev-port.mjs", "dev": "vite", - "build": "npm run verify:app-version && tsc && vite build", + "build": "npm run generate:extension-site-adapters && npm run verify:app-version && tsc && vite build", "preview": "vite preview", "tauri": "tauri", - "tauri:dev": "CARGO_TARGET_DIR=target tauri dev", - "tauri:dev:headless": "CARGO_TARGET_DIR=target tauri dev --config src-tauri/tauri.conf.headless.json", - "tauri:dev:nowatch": "CARGO_TARGET_DIR=target tauri dev --no-watch", + "tauri:dev": "npm run generate:extension-site-adapters && CARGO_TARGET_DIR=target tauri dev", + "tauri:dev:headless": "npm run generate:extension-site-adapters && CARGO_TARGET_DIR=target tauri dev --config src-tauri/tauri.conf.headless.json", + "tauri:dev:nowatch": "npm run generate:extension-site-adapters && CARGO_TARGET_DIR=target tauri dev --no-watch", "tauri:dev:profile:trace": "node scripts/run-tauri-profile.mjs trace", "tauri:dev:profile:trace:devtools": "node scripts/run-tauri-profile.mjs trace --open-devtools", "tauri:dev:profile:trace:headless": "node scripts/run-tauri-profile.mjs trace --headless", diff --git a/packages/lime-cli-npm/README.md b/packages/lime-cli-npm/README.md index f16d09460..d5180f67a 100644 --- a/packages/lime-cli-npm/README.md +++ b/packages/lime-cli-npm/README.md @@ -14,6 +14,7 @@ Lime 的官方命令行入口,面向统一任务编排。 当前主线提供: +- `lime media image generate` - `lime task create image` - `lime task create cover` - `lime task create video` @@ -45,7 +46,7 @@ npm install -g @limecloud/lime-cli 示例: ```bash -lime task create image \ +lime media image generate \ --prompt "未来城市插图,蓝色电影感" \ --size "1024x1024" \ --workspace "." \ @@ -83,8 +84,9 @@ lime doctor 说明: -- `lime media image|cover|video generate` 仍保留为兼容别名。 -- 新主线统一收敛到 `lime task create ...`。 +- 图片主线推荐使用 `lime media image generate`,它会在创建 task artifact 后继续推进真实图片执行链。 +- `lime task create image` 作为兼容入口仍可使用,但现在也会复用同一条图片执行链,不会只停在 `pending_submit`。 +- `lime media cover|video generate` 仍保留为兼容别名。 - 如果你现在只发布 npm、不发布 GitHub Release,请至少准备一种运行方式: - 设置 `LIME_CLI_BINARY_PATH` - 或在 Lime 源码仓库内使用该 wrapper,让它自动回退到 `cargo run` @@ -110,7 +112,7 @@ npm run build:release -- \ ```bash npm run build:release -- \ --target-triple "aarch64-apple-darwin" \ - --version "1.4.0" \ + --version "1.5.0" \ --out-dir "./dist" ``` diff --git a/packages/lime-cli-npm/package.json b/packages/lime-cli-npm/package.json index a2c46bbcc..7c2e4821d 100644 --- a/packages/lime-cli-npm/package.json +++ b/packages/lime-cli-npm/package.json @@ -1,6 +1,6 @@ { "name": "@limecloud/lime-cli", - "version": "1.4.0", + "version": "1.5.0", "description": "Lime 官方任务 CLI", "bin": { "lime": "scripts/run.js" diff --git a/scripts/generate-extension-site-adapter-runners.mjs b/scripts/generate-extension-site-adapter-runners.mjs new file mode 100644 index 000000000..1258eaf11 --- /dev/null +++ b/scripts/generate-extension-site-adapter-runners.mjs @@ -0,0 +1,114 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const projectRoot = path.resolve(__dirname, ".."); +const bundledIndexPath = path.join( + projectRoot, + "src-tauri/resources/site-adapters/bundled/index.json", +); +const bundledScriptsRoot = path.join( + projectRoot, + "src-tauri/resources/site-adapters/bundled", +); +const outputPath = path.join( + projectRoot, + "extensions/lime-chrome/site_adapter_runners.generated.js", +); + +async function readBundledCatalog() { + const raw = await fs.readFile(bundledIndexPath, "utf8"); + const parsed = JSON.parse(raw); + const adapters = Array.isArray(parsed?.adapters) ? parsed.adapters : []; + if (adapters.length === 0) { + throw new Error("bundled site adapter catalog 为空"); + } + return adapters; +} + +async function readRunnerSource(scriptFile) { + if (typeof scriptFile !== "string" || scriptFile.trim().length === 0) { + throw new Error("adapter 缺少 script_file"); + } + const scriptPath = path.join(bundledScriptsRoot, scriptFile); + return fs.readFile(scriptPath, "utf8"); +} + +function buildOutput(entries) { + const body = entries + .map(({ name, source }) => { + const normalizedSource = source + .trim() + .replace(/\r\n/g, "\n") + .replace(/;\s*$/, ""); + return ` ${JSON.stringify(name)}: (${normalizedSource})`; + }) + .join(",\n\n"); + + return `// 由 scripts/generate-extension-site-adapter-runners.mjs 自动生成,请勿手改。 +(function () { + const generatedSiteAdapterRunners = { +${body} + }; + + const existingSiteAdapterRunners = + window.__LIME_SITE_ADAPTER_RUNNERS__ && + typeof window.__LIME_SITE_ADAPTER_RUNNERS__ === "object" && + !Array.isArray(window.__LIME_SITE_ADAPTER_RUNNERS__) + ? window.__LIME_SITE_ADAPTER_RUNNERS__ + : {}; + + window.__LIME_SITE_ADAPTER_RUNNERS__ = { + ...generatedSiteAdapterRunners, + ...existingSiteAdapterRunners, + }; +})(); +`; +} + +async function collectEntries() { + const adapters = await readBundledCatalog(); + const entries = []; + for (const adapter of adapters) { + const name = String(adapter?.name || "").trim(); + if (!name) { + throw new Error("bundled adapter 缺少 name"); + } + const source = await readRunnerSource(adapter?.script_file); + entries.push({ name, source }); + } + return entries; +} + +async function main() { + const entries = await collectEntries(); + const output = buildOutput(entries); + const checkOnly = process.argv.includes("--check"); + let current = ""; + try { + current = await fs.readFile(outputPath, "utf8"); + } catch (error) { + if (error?.code !== "ENOENT") { + throw error; + } + } + + if (checkOnly) { + if (current !== output) { + throw new Error( + "site_adapter_runners.generated.js 已过期,请先运行 npm run generate:extension-site-adapters", + ); + } + return; + } + + await fs.writeFile(outputPath, output, "utf8"); +} + +main().catch((error) => { + console.error( + `[generate-extension-site-adapter-runners] ${error instanceof Error ? error.message : String(error)}`, + ); + process.exitCode = 1; +}); diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 3a915eb7b..8320bb5ac 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -378,7 +378,7 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "aster-core" -version = "0.27.0" +version = "0.27.1" dependencies = [ "ahash", "anyhow", @@ -470,7 +470,7 @@ dependencies = [ [[package]] name = "aster-models" -version = "0.27.0" +version = "0.27.1" dependencies = [ "serde", "serde_json", @@ -5101,7 +5101,7 @@ dependencies = [ [[package]] name = "lime" -version = "1.4.0" +version = "1.5.0" dependencies = [ "anyhow", "arboard", @@ -5206,7 +5206,7 @@ dependencies = [ [[package]] name = "lime-agent" -version = "1.4.0" +version = "1.5.0" dependencies = [ "anyhow", "aster-core", @@ -5235,7 +5235,7 @@ dependencies = [ [[package]] name = "lime-browser-runtime" -version = "1.4.0" +version = "1.5.0" dependencies = [ "chrono", "futures", @@ -5252,17 +5252,19 @@ dependencies = [ [[package]] name = "lime-cli" -version = "1.4.0" +version = "1.5.0" dependencies = [ "clap", + "lime-core", "lime-media-runtime", "serde_json", "tempfile", + "tokio", ] [[package]] name = "lime-config" -version = "1.4.0" +version = "1.5.0" dependencies = [ "async-trait", "lime-core", @@ -5278,7 +5280,7 @@ dependencies = [ [[package]] name = "lime-core" -version = "1.4.0" +version = "1.5.0" dependencies = [ "aster-models", "async-trait", @@ -5318,7 +5320,7 @@ dependencies = [ [[package]] name = "lime-credential" -version = "1.4.0" +version = "1.5.0" dependencies = [ "axum 0.7.9", "base64 0.22.1", @@ -5353,7 +5355,7 @@ dependencies = [ [[package]] name = "lime-gateway" -version = "1.4.0" +version = "1.5.0" dependencies = [ "aes", "axum 0.7.9", @@ -5383,7 +5385,7 @@ dependencies = [ [[package]] name = "lime-infra" -version = "1.4.0" +version = "1.5.0" dependencies = [ "chrono", "dashmap 5.5.3", @@ -5403,7 +5405,7 @@ dependencies = [ [[package]] name = "lime-mcp" -version = "1.4.0" +version = "1.5.0" dependencies = [ "async-trait", "dirs 5.0.1", @@ -5419,13 +5421,16 @@ dependencies = [ [[package]] name = "lime-media-runtime" -version = "1.4.0" +version = "1.5.0" dependencies = [ + "axum 0.7.9", "chrono", + "reqwest 0.12.28", "serde", "serde_json", "tempfile", "thiserror 1.0.69", + "tokio", "uuid", ] @@ -5447,7 +5452,7 @@ dependencies = [ [[package]] name = "lime-processor" -version = "1.4.0" +version = "1.5.0" dependencies = [ "async-trait", "lime-core", @@ -5466,7 +5471,7 @@ dependencies = [ [[package]] name = "lime-providers" -version = "1.4.0" +version = "1.5.0" dependencies = [ "anyhow", "async-stream", @@ -5521,7 +5526,7 @@ dependencies = [ [[package]] name = "lime-server" -version = "1.4.0" +version = "1.5.0" dependencies = [ "aster-core", "async-stream", @@ -5566,7 +5571,7 @@ dependencies = [ [[package]] name = "lime-server-utils" -version = "1.4.0" +version = "1.5.0" dependencies = [ "axum 0.7.9", "futures", @@ -5581,7 +5586,7 @@ dependencies = [ [[package]] name = "lime-services" -version = "1.4.0" +version = "1.5.0" dependencies = [ "anyhow", "aster-core", @@ -5623,7 +5628,7 @@ dependencies = [ [[package]] name = "lime-skills" -version = "1.4.0" +version = "1.5.0" dependencies = [ "async-trait", "dirs 5.0.1", @@ -5641,7 +5646,7 @@ dependencies = [ [[package]] name = "lime-terminal" -version = "1.4.0" +version = "1.5.0" dependencies = [ "async-trait", "base64 0.22.1", @@ -5668,7 +5673,7 @@ dependencies = [ [[package]] name = "lime-websocket" -version = "1.4.0" +version = "1.5.0" dependencies = [ "axum 0.7.9", "chrono", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d68e911c0..a0f78d764 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -3,7 +3,7 @@ members = ["crates/*"] resolver = "2" [workspace.package] -version = "1.4.0" +version = "1.5.0" edition = "2021" authors = ["coso"] repository = "https://github.com/aiclientproxy/lime" @@ -129,8 +129,8 @@ enigo = "0.3" # 如需联调本地 aster-rust,请运行: # npm run setup:local-aster -- /path/to/aster-rust # 脚本会在仓库根 .cargo/config.toml 写入本地 patch 覆盖;该文件已被 .gitignore 忽略。 -aster = { package = "aster-core", git = "https://github.com/astercloud/aster-rust", tag = "v0.27.0" } -aster-models = { git = "https://github.com/astercloud/aster-rust", tag = "v0.27.0" } +aster = { package = "aster-core", git = "https://github.com/astercloud/aster-rust", tag = "v0.27.1" } +aster-models = { git = "https://github.com/astercloud/aster-rust", tag = "v0.27.1" } # MCP (Model Context Protocol) rmcp = { version = "0.12.0", features = ["client", "transport-io", "transport-child-process"] } @@ -194,7 +194,7 @@ version = "2.4" [package] name = "lime" -version = "1.4.0" +version = "1.5.0" description = "AI API Proxy Desktop App" authors = ["you"] edition = "2021" diff --git a/src-tauri/crates/agent/src/event_converter.rs b/src-tauri/crates/agent/src/event_converter.rs index 269ce3b2c..d583b8e7f 100644 --- a/src-tauri/crates/agent/src/event_converter.rs +++ b/src-tauri/crates/agent/src/event_converter.rs @@ -1074,6 +1074,7 @@ pub fn convert_to_tauri_message(message: &Message) -> TauriMessage { role: format!("{:?}", message.role).to_lowercase(), content, timestamp: message.created, + usage: None, } } diff --git a/src-tauri/crates/agent/src/protocol.rs b/src-tauri/crates/agent/src/protocol.rs index 82c6ded4c..7c6f50458 100644 --- a/src-tauri/crates/agent/src/protocol.rs +++ b/src-tauri/crates/agent/src/protocol.rs @@ -68,6 +68,8 @@ pub struct AgentMessage { pub role: String, pub content: Vec, pub timestamp: i64, + #[serde(skip_serializing_if = "Option::is_none")] + pub usage: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src-tauri/crates/agent/src/session_store.rs b/src-tauri/crates/agent/src/session_store.rs index 3413fd0d1..f332f0810 100644 --- a/src-tauri/crates/agent/src/session_store.rs +++ b/src-tauri/crates/agent/src/session_store.rs @@ -989,6 +989,38 @@ pub fn get_session_sync(db: &DbConnection, session_id: &str) -> Result Option { + match (session.input_tokens, session.output_tokens) { + (Some(input_tokens), Some(output_tokens)) if input_tokens >= 0 && output_tokens >= 0 => { + Some(crate::protocol::AgentTokenUsage { + input_tokens: input_tokens as u32, + output_tokens: output_tokens as u32, + }) + } + _ => None, + } +} + +fn apply_runtime_usage_fallback_to_latest_assistant_message( + messages: &mut [RuntimeAgentMessage], + session: &AsterSession, +) -> Option { + let usage = resolve_runtime_usage_from_aster_session(session)?; + let latest_assistant_message = messages + .iter_mut() + .rev() + .find(|message| message.role.eq_ignore_ascii_case("assistant"))?; + + if latest_assistant_message.usage.is_some() { + return None; + } + + latest_assistant_message.usage = Some(usage.clone()); + Some(usage) +} + pub async fn get_runtime_session_detail( db: &DbConnection, session_id: &str, @@ -1017,6 +1049,38 @@ pub async fn get_runtime_session_detail( } }; + if let Some(session) = session.as_ref() { + if let Some(usage) = + apply_runtime_usage_fallback_to_latest_assistant_message(&mut detail.messages, session) + { + match db.lock() { + Ok(conn) => { + if let Err(error) = + agent_session_repository::update_latest_assistant_message_usage( + &conn, + session_id, + usage.input_tokens, + usage.output_tokens, + ) + { + tracing::warn!( + "[SessionStore] 运行态 usage 回填消息失败,已降级继续: session_id={}, error={}", + session_id, + error + ); + } + } + Err(error) => { + tracing::warn!( + "[SessionStore] 运行态 usage 回填消息时数据库锁定失败,已降级继续: session_id={}, error={}", + session_id, + error + ); + } + } + } + } + detail.execution_runtime = build_session_execution_runtime( session_id, session.as_ref(), @@ -1303,6 +1367,13 @@ fn convert_agent_message( role: message.role.clone(), content, timestamp, + usage: message + .usage + .as_ref() + .map(|usage| crate::protocol::AgentTokenUsage { + input_tokens: usage.input_tokens, + output_tokens: usage.output_tokens, + }), }; // 调试日志 @@ -1406,6 +1477,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, ) .expect("add message"); @@ -1805,6 +1877,7 @@ mod tests { }]), tool_call_id: None, reasoning_content: None, + usage: Some(lime_core::agent::types::TokenUsage::new(20_480, 10_240)), }; let assistant_converted = convert_agent_message( @@ -1818,6 +1891,13 @@ mod tests { if id == "call-1" && tool_name == "Write" ) })); + assert_eq!( + assistant_converted + .usage + .as_ref() + .map(|usage| (usage.input_tokens, usage.output_tokens)), + Some((20_480, 10_240)) + ); let tool = AgentMessage { role: "tool".to_string(), @@ -1826,6 +1906,7 @@ mod tests { tool_calls: None, tool_call_id: Some("call-1".to_string()), reasoning_content: None, + usage: None, }; let tool_converted = convert_agent_message( @@ -1845,6 +1926,85 @@ mod tests { })); } + #[test] + fn apply_runtime_usage_fallback_should_fill_latest_assistant_message() { + let mut messages = vec![ + RuntimeAgentMessage { + id: None, + role: "user".to_string(), + content: vec![RuntimeAgentMessageContent::Text { + text: "请先起草内容首稿".to_string(), + }], + timestamp: 1, + usage: None, + }, + RuntimeAgentMessage { + id: None, + role: "assistant".to_string(), + content: vec![RuntimeAgentMessageContent::Text { + text: "# 内容首稿框架".to_string(), + }], + timestamp: 2, + usage: None, + }, + ]; + let session = AsterSession { + id: "session-usage-fallback".to_string(), + input_tokens: Some(3_833), + output_tokens: Some(615), + ..AsterSession::default() + }; + + let applied = + apply_runtime_usage_fallback_to_latest_assistant_message(&mut messages, &session); + + assert_eq!( + applied.map(|usage| (usage.input_tokens, usage.output_tokens)), + Some((3_833, 615)) + ); + assert_eq!( + messages[1] + .usage + .as_ref() + .map(|usage| (usage.input_tokens, usage.output_tokens)), + Some((3_833, 615)) + ); + } + + #[test] + fn apply_runtime_usage_fallback_should_not_override_existing_usage() { + let mut messages = vec![RuntimeAgentMessage { + id: None, + role: "assistant".to_string(), + content: vec![RuntimeAgentMessageContent::Text { + text: "已存在 usage".to_string(), + }], + timestamp: 2, + usage: Some(crate::protocol::AgentTokenUsage { + input_tokens: 20_480, + output_tokens: 10_240, + }), + }]; + let session = AsterSession { + id: "session-usage-existing".to_string(), + input_tokens: Some(3_833), + output_tokens: Some(615), + ..AsterSession::default() + }; + + let applied = + apply_runtime_usage_fallback_to_latest_assistant_message(&mut messages, &session); + + assert!(applied.is_none()); + assert_eq!( + messages[0] + .usage + .as_ref() + .map(|usage| (usage.input_tokens, usage.output_tokens)), + Some((20_480, 10_240)) + ); + } + #[test] fn convert_agent_message_should_keep_image_parts_for_history() { let user_with_image = AgentMessage { @@ -1864,6 +2024,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }; let converted = convert_agent_message( @@ -1891,6 +2052,7 @@ mod tests { tool_calls: None, tool_call_id: Some("call-2".to_string()), reasoning_content: None, + usage: None, }; let converted = convert_agent_message( @@ -1951,6 +2113,7 @@ mod tests { }]), tool_call_id: None, reasoning_content: None, + usage: None, }, AgentMessage { role: "user".to_string(), @@ -1959,6 +2122,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, AgentMessage { role: "assistant".to_string(), @@ -1967,6 +2131,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, ]; @@ -2115,6 +2280,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, ) .expect("add system message"); @@ -2128,6 +2294,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, ) .expect("add user message"); @@ -2141,6 +2308,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, ) .expect("add assistant message"); @@ -2154,6 +2322,7 @@ mod tests { tool_calls: None, tool_call_id: Some("tool-1".to_string()), reasoning_content: None, + usage: None, }, ) .expect("add tool message"); diff --git a/src-tauri/crates/agent/src/tool_io_offload.rs b/src-tauri/crates/agent/src/tool_io_offload.rs index a417b2a10..962ad76f4 100644 --- a/src-tauri/crates/agent/src/tool_io_offload.rs +++ b/src-tauri/crates/agent/src/tool_io_offload.rs @@ -807,6 +807,7 @@ mod tests { }]), tool_call_id: None, reasoning_content: None, + usage: None, }, AgentMessage { role: "user".to_string(), @@ -815,6 +816,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, AgentMessage { role: "assistant".to_string(), @@ -823,6 +825,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: None, + usage: None, }, ]; diff --git a/src-tauri/crates/agent/src/turn_input_envelope.rs b/src-tauri/crates/agent/src/turn_input_envelope.rs index 944a6b64d..78dade693 100644 --- a/src-tauri/crates/agent/src/turn_input_envelope.rs +++ b/src-tauri/crates/agent/src/turn_input_envelope.rs @@ -76,12 +76,15 @@ pub enum TurnPromptAugmentationStageKind { DeepSearchSkillLaunch, SiteSearchSkillLaunch, PdfReadSkillLaunch, + PresentationSkillLaunch, + FormSkillLaunch, SummarySkillLaunch, TranslationSkillLaunch, AnalysisSkillLaunch, TranscriptionSkillLaunch, UrlParseSkillLaunch, TypesettingSkillLaunch, + WebpageSkillLaunch, ServiceSkillLaunch, ServiceSkillLaunchPreload, Elicitation, diff --git a/src-tauri/crates/core/src/agent/types.rs b/src-tauri/crates/core/src/agent/types.rs index 84df3a250..031788a9b 100644 --- a/src-tauri/crates/core/src/agent/types.rs +++ b/src-tauri/crates/core/src/agent/types.rs @@ -204,6 +204,9 @@ pub struct AgentMessage { /// DeepSeek Reasoner 在 Tool Calls 场景下要求此字段 #[serde(skip_serializing_if = "Option::is_none")] pub reasoning_content: Option, + /// 当前消息的 token 使用量 + #[serde(skip_serializing_if = "Option::is_none")] + pub usage: Option, } /// 消息内容类型 diff --git a/src-tauri/crates/core/src/database/agent_session_repository.rs b/src-tauri/crates/core/src/database/agent_session_repository.rs index 2f9d8116c..69c851aa2 100644 --- a/src-tauri/crates/core/src/database/agent_session_repository.rs +++ b/src-tauri/crates/core/src/database/agent_session_repository.rs @@ -213,3 +213,13 @@ pub fn update_session_provider_config( ) .map_err(|error| format!("更新会话 provider/model 失败: {error}")) } + +pub fn update_latest_assistant_message_usage( + conn: &Connection, + session_id: &str, + input_tokens: u32, + output_tokens: u32, +) -> Result { + AgentDao::update_latest_assistant_message_usage(conn, session_id, input_tokens, output_tokens) + .map_err(|error| format!("更新最新 assistant 消息 usage 失败: {error}")) +} diff --git a/src-tauri/crates/core/src/database/dao/agent.rs b/src-tauri/crates/core/src/database/dao/agent.rs index 9ea02e557..2e10798f7 100644 --- a/src-tauri/crates/core/src/database/dao/agent.rs +++ b/src-tauri/crates/core/src/database/dao/agent.rs @@ -924,9 +924,11 @@ impl AgentDao { timestamp, tool_calls_json, tool_call_id, - reasoning_content + reasoning_content, + input_tokens, + output_tokens ) - VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)", + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", params![ session_id, message.role, @@ -935,6 +937,8 @@ impl AgentDao { tool_calls_json, message.tool_call_id, message.reasoning_content.as_deref(), + message.usage.as_ref().map(|usage| usage.input_tokens), + message.usage.as_ref().map(|usage| usage.output_tokens), ], )?; @@ -953,7 +957,8 @@ impl AgentDao { session_id: &str, ) -> Result, rusqlite::Error> { let mut stmt = conn.prepare( - "SELECT role, content_json, timestamp, tool_calls_json, tool_call_id, reasoning_content + "SELECT role, content_json, timestamp, tool_calls_json, tool_call_id, reasoning_content, + input_tokens, output_tokens FROM agent_messages WHERE session_id = ? ORDER BY id ASC", )?; @@ -964,6 +969,8 @@ impl AgentDao { let tool_calls_json: Option = row.get(3)?; let tool_call_id: Option = row.get(4)?; let reasoning_content: Option = row.get(5)?; + let input_tokens: Option = row.get(6)?; + let output_tokens: Option = row.get(7)?; // 解析 JSON - 支持多种格式 // 1. Aster 格式: [{"Text":"..."}, {"Text":"..."}] @@ -980,12 +987,42 @@ impl AgentDao { tool_calls, tool_call_id, reasoning_content, + usage: match (input_tokens, output_tokens) { + (Some(input_tokens), Some(output_tokens)) => { + Some(crate::agent::types::TokenUsage { + input_tokens, + output_tokens, + }) + } + _ => None, + }, }) })?; messages.collect() } + pub fn update_latest_assistant_message_usage( + conn: &Connection, + session_id: &str, + input_tokens: u32, + output_tokens: u32, + ) -> Result { + let rows = conn.execute( + "UPDATE agent_messages + SET input_tokens = ?1, output_tokens = ?2 + WHERE id = ( + SELECT id FROM agent_messages + WHERE session_id = ?3 AND role = 'assistant' + ORDER BY id DESC + LIMIT 1 + )", + params![input_tokens, output_tokens, session_id], + )?; + + Ok(rows > 0) + } + /// 删除会话的所有消息 pub fn delete_messages(conn: &Connection, session_id: &str) -> Result<(), rusqlite::Error> { conn.execute( @@ -1132,7 +1169,9 @@ mod tests { timestamp TEXT NOT NULL, tool_calls_json TEXT, tool_call_id TEXT, - reasoning_content TEXT + reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER ); ", ) @@ -1474,6 +1513,7 @@ mod tests { tool_calls: None, tool_call_id: None, reasoning_content: Some("先分析参数,再继续请求".to_string()), + usage: Some(crate::agent::types::TokenUsage::new(1200, 300)), }, ) .unwrap(); @@ -1484,5 +1524,57 @@ mod tests { messages[0].reasoning_content.as_deref(), Some("先分析参数,再继续请求") ); + assert_eq!( + messages[0].usage, + Some(crate::agent::types::TokenUsage::new(1200, 300)) + ); + } + + #[test] + fn update_latest_assistant_message_usage_should_only_touch_latest_assistant() { + let conn = setup_pattern_test_db(); + + conn.execute( + "INSERT INTO agent_sessions (id, model, system_prompt, title, created_at, updated_at, working_dir, execution_strategy) + VALUES (?1, ?2, NULL, ?3, ?4, ?5, NULL, ?6)", + params![ + "session-usage", + "gpt-4.1", + "usage 会话", + "2026-03-19T10:00:00+08:00", + "2026-03-19T10:00:00+08:00", + "react" + ], + ) + .unwrap(); + + conn.execute( + "INSERT INTO agent_messages (session_id, role, content_json, timestamp) VALUES (?1, ?2, ?3, ?4)", + params!["session-usage", "assistant", r#"[{"type":"text","text":"旧助手消息"}]"#, "2026-03-19T10:00:01+08:00"], + ) + .unwrap(); + conn.execute( + "INSERT INTO agent_messages (session_id, role, content_json, timestamp) VALUES (?1, ?2, ?3, ?4)", + params!["session-usage", "user", r#"[{"type":"text","text":"用户消息"}]"#, "2026-03-19T10:00:02+08:00"], + ) + .unwrap(); + conn.execute( + "INSERT INTO agent_messages (session_id, role, content_json, timestamp) VALUES (?1, ?2, ?3, ?4)", + params!["session-usage", "assistant", r#"[{"type":"text","text":"最新助手消息"}]"#, "2026-03-19T10:00:03+08:00"], + ) + .unwrap(); + + let updated = + AgentDao::update_latest_assistant_message_usage(&conn, "session-usage", 2048, 512) + .unwrap(); + assert!(updated); + + let messages = AgentDao::get_messages(&conn, "session-usage").unwrap(); + assert_eq!(messages[0].usage, None); + assert_eq!(messages[1].usage, None); + assert_eq!( + messages[2].usage, + Some(crate::agent::types::TokenUsage::new(2048, 512)) + ); } } diff --git a/src-tauri/crates/core/src/database/migration/general_chat_migration.rs b/src-tauri/crates/core/src/database/migration/general_chat_migration.rs index 449eb3f14..1605d6bbe 100644 --- a/src-tauri/crates/core/src/database/migration/general_chat_migration.rs +++ b/src-tauri/crates/core/src/database/migration/general_chat_migration.rs @@ -396,7 +396,9 @@ mod tests { timestamp TEXT NOT NULL, tool_calls_json TEXT, tool_call_id TEXT, - reasoning_content TEXT + reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER ); ", ) @@ -430,7 +432,9 @@ mod tests { timestamp TEXT NOT NULL, tool_calls_json TEXT, tool_call_id TEXT, - reasoning_content TEXT + reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER ); ", ) diff --git a/src-tauri/crates/core/src/database/schema.rs b/src-tauri/crates/core/src/database/schema.rs index 754e35546..124875b39 100644 --- a/src-tauri/crates/core/src/database/schema.rs +++ b/src-tauri/crates/core/src/database/schema.rs @@ -624,6 +624,8 @@ pub fn create_tables(conn: &Connection) -> Result<(), rusqlite::Error> { tool_calls_json TEXT, tool_call_id TEXT, reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER, FOREIGN KEY (session_id) REFERENCES agent_sessions(id) ON DELETE CASCADE )", [], @@ -633,6 +635,14 @@ pub fn create_tables(conn: &Connection) -> Result<(), rusqlite::Error> { "ALTER TABLE agent_messages ADD COLUMN reasoning_content TEXT", [], ); + let _ = conn.execute( + "ALTER TABLE agent_messages ADD COLUMN input_tokens INTEGER", + [], + ); + let _ = conn.execute( + "ALTER TABLE agent_messages ADD COLUMN output_tokens INTEGER", + [], + ); // 创建 agent_messages 索引 conn.execute( diff --git a/src-tauri/crates/core/src/models/mod.rs b/src-tauri/crates/core/src/models/mod.rs index 86150fb46..4f37a9cd5 100644 --- a/src-tauri/crates/core/src/models/mod.rs +++ b/src-tauri/crates/core/src/models/mod.rs @@ -42,10 +42,12 @@ pub use skill_model::{ SkillPackageInspection, SkillRepo, SkillResourceSummary, SkillSourceKind, SkillStandardCompliance, SkillState, SkillStates, ANALYSIS_SKILL_DIRECTORY, BROADCAST_GENERATE_SKILL_DIRECTORY, CONTENT_POST_WITH_COVER_SKILL_DIRECTORY, - COVER_GENERATE_SKILL_DIRECTORY, DEFAULT_LIME_SKILL_DIRECTORIES, IMAGE_GENERATE_SKILL_DIRECTORY, - LIBRARY_SKILL_DIRECTORY, MODAL_RESOURCE_SEARCH_SKILL_DIRECTORY, PDF_READ_SKILL_DIRECTORY, + COVER_GENERATE_SKILL_DIRECTORY, DEFAULT_LIME_SKILL_DIRECTORIES, FORM_GENERATE_SKILL_DIRECTORY, + IMAGE_GENERATE_SKILL_DIRECTORY, LIBRARY_SKILL_DIRECTORY, MODAL_RESOURCE_SEARCH_SKILL_DIRECTORY, + PDF_READ_SKILL_DIRECTORY, PRESENTATION_GENERATE_SKILL_DIRECTORY, REPORT_GENERATE_SKILL_DIRECTORY, RESEARCH_SKILL_DIRECTORY, SITE_SEARCH_SKILL_DIRECTORY, SUMMARY_SKILL_DIRECTORY, TRANSCRIPTION_GENERATE_SKILL_DIRECTORY, TRANSLATION_SKILL_DIRECTORY, TYPESETTING_SKILL_DIRECTORY, URL_PARSE_SKILL_DIRECTORY, VIDEO_GENERATE_SKILL_DIRECTORY, + WEBPAGE_GENERATE_SKILL_DIRECTORY, }; pub use vertex_model::{VertexApiKeyEntry, VertexModelAlias}; diff --git a/src-tauri/crates/core/src/models/skill_model.rs b/src-tauri/crates/core/src/models/skill_model.rs index c944f23aa..e46a45ac9 100644 --- a/src-tauri/crates/core/src/models/skill_model.rs +++ b/src-tauri/crates/core/src/models/skill_model.rs @@ -33,13 +33,16 @@ pub const RESEARCH_SKILL_DIRECTORY: &str = "research"; pub const REPORT_GENERATE_SKILL_DIRECTORY: &str = "report_generate"; pub const SITE_SEARCH_SKILL_DIRECTORY: &str = "site_search"; pub const PDF_READ_SKILL_DIRECTORY: &str = "pdf_read"; +pub const PRESENTATION_GENERATE_SKILL_DIRECTORY: &str = "presentation_generate"; +pub const FORM_GENERATE_SKILL_DIRECTORY: &str = "form_generate"; pub const SUMMARY_SKILL_DIRECTORY: &str = "summary"; pub const TRANSLATION_SKILL_DIRECTORY: &str = "translation"; pub const ANALYSIS_SKILL_DIRECTORY: &str = "analysis"; pub const TYPESETTING_SKILL_DIRECTORY: &str = "typesetting"; +pub const WEBPAGE_GENERATE_SKILL_DIRECTORY: &str = "webpage_generate"; pub const CONTENT_POST_WITH_COVER_SKILL_DIRECTORY: &str = "content_post_with_cover"; -pub const DEFAULT_LIME_SKILL_DIRECTORIES: [&str; 17] = [ +pub const DEFAULT_LIME_SKILL_DIRECTORIES: [&str; 20] = [ VIDEO_GENERATE_SKILL_DIRECTORY, TRANSCRIPTION_GENERATE_SKILL_DIRECTORY, BROADCAST_GENERATE_SKILL_DIRECTORY, @@ -52,10 +55,13 @@ pub const DEFAULT_LIME_SKILL_DIRECTORIES: [&str; 17] = [ REPORT_GENERATE_SKILL_DIRECTORY, SITE_SEARCH_SKILL_DIRECTORY, PDF_READ_SKILL_DIRECTORY, + PRESENTATION_GENERATE_SKILL_DIRECTORY, + FORM_GENERATE_SKILL_DIRECTORY, SUMMARY_SKILL_DIRECTORY, TRANSLATION_SKILL_DIRECTORY, ANALYSIS_SKILL_DIRECTORY, TYPESETTING_SKILL_DIRECTORY, + WEBPAGE_GENERATE_SKILL_DIRECTORY, CONTENT_POST_WITH_COVER_SKILL_DIRECTORY, ]; @@ -576,7 +582,9 @@ mod tests { assert!(is_default_lime_skill(REPORT_GENERATE_SKILL_DIRECTORY)); assert!(is_default_lime_skill(SITE_SEARCH_SKILL_DIRECTORY)); assert!(is_default_lime_skill(PDF_READ_SKILL_DIRECTORY)); + assert!(is_default_lime_skill(FORM_GENERATE_SKILL_DIRECTORY)); assert!(is_default_lime_skill(SUMMARY_SKILL_DIRECTORY)); + assert!(is_default_lime_skill(WEBPAGE_GENERATE_SKILL_DIRECTORY)); assert!(is_default_lime_skill( CONTENT_POST_WITH_COVER_SKILL_DIRECTORY )); diff --git a/src-tauri/crates/lime-cli/Cargo.toml b/src-tauri/crates/lime-cli/Cargo.toml index a2ab7b704..626b0a134 100644 --- a/src-tauri/crates/lime-cli/Cargo.toml +++ b/src-tauri/crates/lime-cli/Cargo.toml @@ -13,6 +13,8 @@ path = "src/main.rs" clap.workspace = true serde_json.workspace = true lime-media-runtime.workspace = true +lime-core.workspace = true +tokio.workspace = true [dev-dependencies] tempfile.workspace = true diff --git a/src-tauri/crates/lime-cli/src/catalog.rs b/src-tauri/crates/lime-cli/src/catalog.rs index c776f800d..a7d4ab90f 100644 --- a/src-tauri/crates/lime-cli/src/catalog.rs +++ b/src-tauri/crates/lime-cli/src/catalog.rs @@ -10,7 +10,7 @@ AI Agent 技能: draft -> pending_submit -> queued -> running -> partial -> succeeded|failed|cancelled 示例: - lime task create image --prompt \"未来城市插图\" --size \"1024x1024\" + lime media image generate --prompt \"未来城市插图\" --size \"1024x1024\" lime task create transcription --source-path \"/tmp/interview.wav\" --output-format srt lime task create broadcast --title \"播客摘要\" --content \"原文内容\" lime task list --family image --status running @@ -21,7 +21,7 @@ AI Agent 技能: pub const TASK_AFTER_HELP: &str = "\ 常用命令: - lime task create image --prompt \"未来城市插图\" + lime media image generate --prompt \"未来城市插图\" lime task create transcription --source-url \"https://example.com/demo.mp4\" lime task create url-parse --url \"https://example.com\" --summary \"摘要\" lime task list --family image @@ -49,10 +49,10 @@ pub const TASK_ENTRIES: &[TaskCatalogEntry] = &[ TaskCatalogEntry { command_name: "image", task_type: TaskType::ImageGenerate, - description: "根据提示词创建普通配图任务。", + description: "根据提示词提交普通配图任务,并推进真实图片执行链。", skill_name: "image_generate", docs_dir: "src-tauri/resources/default-skills/image_generate", - example: "lime task create image --prompt \"未来城市插图\" --size \"1024x1024\"", + example: "lime media image generate --prompt \"未来城市插图\" --size \"1024x1024\"", }, TaskCatalogEntry { command_name: "cover", @@ -147,7 +147,7 @@ pub const SKILL_ENTRIES: &[SkillCatalogEntry] = &[ SkillCatalogEntry { name: "image_generate", description: "普通配图任务技能。", - recommended_command: "lime task create image --prompt \"...\"", + recommended_command: "lime media image generate --prompt \"...\"", skill_path: "src-tauri/resources/default-skills/image_generate/SKILL.md", references: &[], }, @@ -196,6 +196,27 @@ pub const SKILL_ENTRIES: &[SkillCatalogEntry] = &[ skill_path: "tools/lime-cli/domains/typesetting/SKILL.md", references: &["tools/lime-cli/domains/typesetting/references/create.md"], }, + SkillCatalogEntry { + name: "webpage_generate", + description: "单文件 HTML 网页生成技能。", + recommended_command: "lime skill show webpage_generate", + skill_path: "src-tauri/resources/default-skills/webpage_generate/SKILL.md", + references: &[], + }, + SkillCatalogEntry { + name: "presentation_generate", + description: "单文件 Markdown 演示稿生成技能。", + recommended_command: "lime skill show presentation_generate", + skill_path: "src-tauri/resources/default-skills/presentation_generate/SKILL.md", + references: &[], + }, + SkillCatalogEntry { + name: "form_generate", + description: "A2UI 表单生成技能。", + recommended_command: "lime skill show form_generate", + skill_path: "src-tauri/resources/default-skills/form_generate/SKILL.md", + references: &[], + }, SkillCatalogEntry { name: "modal_resource_search", description: "素材检索任务技能。", diff --git a/src-tauri/crates/lime-cli/src/main.rs b/src-tauri/crates/lime-cli/src/main.rs index 451962083..80c45a5a1 100644 --- a/src-tauri/crates/lime-cli/src/main.rs +++ b/src-tauri/crates/lime-cli/src/main.rs @@ -4,10 +4,13 @@ use std::path::{Path, PathBuf}; use std::process::ExitCode; use clap::{Args, Parser, Subcommand}; +use lime_core::config::load_config; use lime_media_runtime::{ - list_task_outputs, load_task_output, retry_task_artifact, update_task_status, - write_task_artifact, MediaRuntimeError, MediaTaskErrorOutput, TaskRelationships, TaskType, - TaskWriteOptions, DEFAULT_ARTIFACT_ROOT, + build_image_generation_endpoint, execute_image_generation_task as execute_image_task_runtime, + list_task_outputs, load_task_output, patch_task_artifact, retry_task_artifact, + update_task_status, write_task_artifact, ImageGenerationRunnerConfig, MediaRuntimeError, + MediaTaskErrorOutput, TaskArtifactPatch, TaskErrorRecord, TaskProgress, TaskRelationships, + TaskType, TaskWriteOptions, DEFAULT_ARTIFACT_ROOT, IMAGE_TASK_RUNNER_WORKER_ID, }; use serde_json::{json, Value}; @@ -619,7 +622,7 @@ fn run_task_create_command(command: TaskCreateCommand) -> Result Result { match command.command { MediaSubcommand::Image(image) => match image.command { - ImageSubcommand::Generate(args) => create_image_task(args), + ImageSubcommand::Generate(args) => generate_image_task(args), }, MediaSubcommand::Cover(cover) => match cover.command { CoverSubcommand::Generate(args) => create_cover_task(args), @@ -715,41 +718,186 @@ fn run_doctor_command(args: DoctorArgs) -> Result { })) } -fn create_image_task(args: ImageGenerateArgs) -> Result { - let workspace_root = resolve_workspace_root(args.output.workspace.clone())?; - let output = write_task_artifact( - &workspace_root, +fn create_image_task_artifact( + workspace_root: &Path, + args: &ImageGenerateArgs, +) -> Result { + write_task_artifact( + workspace_root, TaskType::ImageGenerate, - args.title, - json!({ - "prompt": args.prompt, - "mode": args.mode, - "raw_text": args.raw_text, - "model": args.model, - "style": args.style, - "size": args.size, - "aspect_ratio": args.aspect_ratio, - "count": args.count, - "usage": args.usage, - "provider_id": args.provider_id, - "session_id": args.session_id, - "project_id": args.project_id, - "content_id": args.content_id, - "entry_source": args.entry_source, - "requested_target": args.requested_target, - "slot_id": args.slot_id, - "anchor_hint": args.anchor_hint, - "anchor_section_title": args.anchor_section_title, - "anchor_text": args.anchor_text, - "target_output_id": args.target_output_id, - "target_output_ref_id": args.target_output_ref_id, - "reference_images": args.reference_images, - }), + args.title.clone(), + build_image_task_payload(args), task_write_options(&args.output), + ) +} + +fn create_image_task(args: ImageGenerateArgs) -> Result { + generate_image_task(args) +} + +fn build_image_task_payload(args: &ImageGenerateArgs) -> Value { + json!({ + "prompt": args.prompt, + "mode": args.mode, + "raw_text": args.raw_text, + "model": args.model, + "style": args.style, + "size": args.size, + "aspect_ratio": args.aspect_ratio, + "count": args.count, + "usage": args.usage, + "provider_id": args.provider_id, + "session_id": args.session_id, + "project_id": args.project_id, + "content_id": args.content_id, + "entry_source": args.entry_source, + "requested_target": args.requested_target, + "slot_id": args.slot_id, + "anchor_hint": args.anchor_hint, + "anchor_section_title": args.anchor_section_title, + "anchor_text": args.anchor_text, + "target_output_id": args.target_output_id, + "target_output_ref_id": args.target_output_ref_id, + "reference_images": args.reference_images, + }) +} + +fn read_non_empty_env(name: &str) -> Option { + std::env::var(name).ok().and_then(|value| { + let trimmed = value.trim(); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_string()) + } + }) +} + +fn read_env_port(name: &str) -> Result, String> { + let Some(raw) = read_non_empty_env(name) else { + return Ok(None); + }; + raw.parse::() + .map(Some) + .map_err(|error| format!("{name} 不是合法端口: {error}")) +} + +fn resolve_cli_image_generation_runner_config() -> Result { + let endpoint_override = read_non_empty_env("LIME_MEDIA_IMAGE_ENDPOINT"); + let api_key_override = read_non_empty_env("LIME_MEDIA_IMAGE_API_KEY") + .or_else(|| read_non_empty_env("LIME_SERVER_API_KEY")); + let host_override = read_non_empty_env("LIME_SERVER_HOST"); + let port_override = read_env_port("LIME_SERVER_PORT")?; + + let (loaded_config, config_load_error) = match load_config() { + Ok(config) => (Some(config), None), + Err(error) => (None, Some(error.to_string())), + }; + + let host = host_override + .or_else(|| { + loaded_config + .as_ref() + .map(|config| config.server.host.clone()) + }) + .unwrap_or_else(|| "127.0.0.1".to_string()); + let port = port_override + .or_else(|| loaded_config.as_ref().map(|config| config.server.port)) + .unwrap_or(9000); + let api_key = api_key_override + .or_else(|| { + loaded_config + .as_ref() + .map(|config| config.server.api_key.trim().to_string()) + .filter(|value| !value.is_empty()) + }) + .ok_or_else(|| match config_load_error { + Some(error) => format!("Lime 本地图片服务未配置 API Key,且加载本地配置失败: {error}"), + None => "Lime 本地图片服务未配置 API Key".to_string(), + })?; + + Ok(ImageGenerationRunnerConfig { + endpoint: endpoint_override.unwrap_or_else(|| build_image_generation_endpoint(&host, port)), + api_key, + }) +} + +fn build_image_task_progress( + phase: &str, + message: impl Into, + percent: Option, +) -> TaskProgress { + TaskProgress { + phase: Some(phase.to_string()), + percent, + message: Some(message.into()), + preview_slots: Vec::new(), + } +} + +fn build_image_task_error( + code: &str, + message: impl Into, + retryable: bool, + stage: &str, +) -> TaskErrorRecord { + TaskErrorRecord { + code: code.to_string(), + message: message.into(), + retryable, + stage: Some(stage.to_string()), + provider_code: None, + occurred_at: None, + } +} + +fn mark_cli_image_task_failed( + workspace_root: &Path, + task_id: &str, + message: impl Into, +) -> Result { + let task_error = + build_image_task_error("image_worker_unavailable", message, false, "bootstrap"); + let output = patch_task_artifact( + workspace_root, + task_id, + None, + TaskArtifactPatch { + status: Some("failed".to_string()), + last_error: Some(Some(task_error.clone())), + progress: Some(build_image_task_progress( + "failed", + task_error.message.clone(), + None, + )), + current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), + ..TaskArtifactPatch::default() + }, )?; Ok(json!(output)) } +fn generate_image_task(args: ImageGenerateArgs) -> Result { + let workspace_root = resolve_workspace_root(args.output.workspace.clone())?; + let created = create_image_task_artifact(&workspace_root, &args)?; + let runner_config = match resolve_cli_image_generation_runner_config() { + Ok(config) => config, + Err(error_message) => { + return mark_cli_image_task_failed(&workspace_root, &created.task_id, error_message); + } + }; + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .map_err(|error| MediaRuntimeError::Io(format!("初始化图片任务运行时失败: {error}")))?; + let output = runtime.block_on(execute_image_task_runtime( + &workspace_root, + &created.task_id, + &runner_config, + ))?; + Ok(json!(output)) +} + fn create_cover_task(args: CoverGenerateArgs) -> Result { let workspace_root = resolve_workspace_root(args.output.workspace.clone())?; let output = write_task_artifact( @@ -1070,45 +1218,119 @@ mod tests { assert_eq!(output["skill"]["name"], "broadcast_generate"); } + #[test] + fn skill_show_image_generate_prefers_media_command() { + let output = run(Cli { + command: Command::Skill(SkillCommand { + command: SkillSubcommand::Show(SkillShowArgs { + name: "image_generate".to_string(), + }), + }), + }) + .expect("show image skill"); + + assert_eq!( + output["skill"]["recommended_command"], + "lime media image generate --prompt \"...\"" + ); + } + + #[test] + fn skill_show_webpage_generate_returns_builtin_skill() { + let output = run(Cli { + command: Command::Skill(SkillCommand { + command: SkillSubcommand::Show(SkillShowArgs { + name: "webpage_generate".to_string(), + }), + }), + }) + .expect("show webpage skill"); + + assert_eq!(output["skill"]["name"], "webpage_generate"); + assert_eq!( + output["skill"]["skill_path"], + "src-tauri/resources/default-skills/webpage_generate/SKILL.md" + ); + } + + #[test] + fn skill_show_presentation_generate_returns_builtin_skill() { + let output = run(Cli { + command: Command::Skill(SkillCommand { + command: SkillSubcommand::Show(SkillShowArgs { + name: "presentation_generate".to_string(), + }), + }), + }) + .expect("show presentation skill"); + + assert_eq!(output["skill"]["name"], "presentation_generate"); + assert_eq!( + output["skill"]["skill_path"], + "src-tauri/resources/default-skills/presentation_generate/SKILL.md" + ); + } + + #[test] + fn skill_show_form_generate_returns_builtin_skill() { + let output = run(Cli { + command: Command::Skill(SkillCommand { + command: SkillSubcommand::Show(SkillShowArgs { + name: "form_generate".to_string(), + }), + }), + }) + .expect("show form skill"); + + assert_eq!(output["skill"]["name"], "form_generate"); + assert_eq!( + output["skill"]["skill_path"], + "src-tauri/resources/default-skills/form_generate/SKILL.md" + ); + } + #[test] fn create_image_task_preserves_extended_context_fields() { let temp_dir = tempfile::tempdir().expect("create temp dir"); - let output = create_image_task(ImageGenerateArgs { - prompt: "城市夜景".to_string(), - title: Some("夜景修图".to_string()), - mode: Some("edit".to_string()), - raw_text: Some("@配图 编辑 #img-2 去掉角标".to_string()), - model: Some("fal-ai/nano-banana-pro".to_string()), - style: Some("写实".to_string()), - size: Some("1024x1024".to_string()), - aspect_ratio: Some("1:1".to_string()), - count: Some(1), - usage: Some("claw-image-workbench".to_string()), - provider_id: Some("fal".to_string()), - session_id: Some("session-1".to_string()), - project_id: Some("project-1".to_string()), - content_id: Some("content-1".to_string()), - entry_source: Some("at_image_command".to_string()), - requested_target: Some("generate".to_string()), - slot_id: Some("slot-1".to_string()), - anchor_hint: Some("section_end".to_string()), - anchor_section_title: Some("核心观点".to_string()), - anchor_text: Some("这里是核心观点段落。".to_string()), - target_output_id: Some("task-image-1:output:1".to_string()), - target_output_ref_id: Some("img-2".to_string()), - reference_images: vec![ - "https://example.com/image-2.png".to_string(), - "/tmp/input-1.png".to_string(), - ], - output: SharedTaskWriteArgs { - workspace: Some(temp_dir.path().to_path_buf()), - output: None, - artifact_dir: None, - idempotency_key: None, - json: true, + let output = json!(create_image_task_artifact( + temp_dir.path(), + &ImageGenerateArgs { + prompt: "城市夜景".to_string(), + title: Some("夜景修图".to_string()), + mode: Some("edit".to_string()), + raw_text: Some("@配图 编辑 #img-2 去掉角标".to_string()), + model: Some("fal-ai/nano-banana-pro".to_string()), + style: Some("写实".to_string()), + size: Some("1024x1024".to_string()), + aspect_ratio: Some("1:1".to_string()), + count: Some(1), + usage: Some("claw-image-workbench".to_string()), + provider_id: Some("fal".to_string()), + session_id: Some("session-1".to_string()), + project_id: Some("project-1".to_string()), + content_id: Some("content-1".to_string()), + entry_source: Some("at_image_command".to_string()), + requested_target: Some("generate".to_string()), + slot_id: Some("slot-1".to_string()), + anchor_hint: Some("section_end".to_string()), + anchor_section_title: Some("核心观点".to_string()), + anchor_text: Some("这里是核心观点段落。".to_string()), + target_output_id: Some("task-image-1:output:1".to_string()), + target_output_ref_id: Some("img-2".to_string()), + reference_images: vec![ + "https://example.com/image-2.png".to_string(), + "/tmp/input-1.png".to_string(), + ], + output: SharedTaskWriteArgs { + workspace: Some(temp_dir.path().to_path_buf()), + output: None, + artifact_dir: None, + idempotency_key: None, + json: true, + }, }, - }) - .expect("create image"); + ) + .expect("create image")); assert_eq!(output["record"]["payload"]["mode"], "edit"); assert_eq!(output["record"]["payload"]["target_output_ref_id"], "img-2"); @@ -1159,38 +1381,41 @@ mod tests { #[test] fn task_list_returns_created_items() { let temp_dir = tempfile::tempdir().expect("create temp dir"); - let _ = create_image_task(ImageGenerateArgs { - prompt: "城市".to_string(), - title: None, - mode: None, - raw_text: None, - model: None, - style: None, - size: None, - aspect_ratio: None, - count: None, - usage: None, - provider_id: None, - session_id: None, - project_id: None, - content_id: None, - entry_source: None, - requested_target: None, - slot_id: None, - anchor_hint: None, - anchor_section_title: None, - anchor_text: None, - target_output_id: None, - target_output_ref_id: None, - reference_images: Vec::new(), - output: SharedTaskWriteArgs { - workspace: Some(temp_dir.path().to_path_buf()), - output: None, - artifact_dir: None, - idempotency_key: None, - json: true, + let _ = create_image_task_artifact( + temp_dir.path(), + &ImageGenerateArgs { + prompt: "城市".to_string(), + title: None, + mode: None, + raw_text: None, + model: None, + style: None, + size: None, + aspect_ratio: None, + count: None, + usage: None, + provider_id: None, + session_id: None, + project_id: None, + content_id: None, + entry_source: None, + requested_target: None, + slot_id: None, + anchor_hint: None, + anchor_section_title: None, + anchor_text: None, + target_output_id: None, + target_output_ref_id: None, + reference_images: Vec::new(), + output: SharedTaskWriteArgs { + workspace: Some(temp_dir.path().to_path_buf()), + output: None, + artifact_dir: None, + idempotency_key: None, + json: true, + }, }, - }) + ) .expect("create image"); let output = run(Cli { @@ -1217,38 +1442,41 @@ mod tests { #[test] fn task_list_supports_family_filter() { let temp_dir = tempfile::tempdir().expect("create temp dir"); - let _ = create_image_task(ImageGenerateArgs { - prompt: "城市".to_string(), - title: None, - mode: None, - raw_text: None, - model: None, - style: None, - size: None, - aspect_ratio: None, - count: None, - usage: None, - provider_id: None, - session_id: None, - project_id: None, - content_id: None, - entry_source: None, - requested_target: None, - slot_id: None, - anchor_hint: None, - anchor_section_title: None, - anchor_text: None, - target_output_id: None, - target_output_ref_id: None, - reference_images: Vec::new(), - output: SharedTaskWriteArgs { - workspace: Some(temp_dir.path().to_path_buf()), - output: None, - artifact_dir: None, - idempotency_key: None, - json: true, + let _ = create_image_task_artifact( + temp_dir.path(), + &ImageGenerateArgs { + prompt: "城市".to_string(), + title: None, + mode: None, + raw_text: None, + model: None, + style: None, + size: None, + aspect_ratio: None, + count: None, + usage: None, + provider_id: None, + session_id: None, + project_id: None, + content_id: None, + entry_source: None, + requested_target: None, + slot_id: None, + anchor_hint: None, + anchor_section_title: None, + anchor_text: None, + target_output_id: None, + target_output_ref_id: None, + reference_images: Vec::new(), + output: SharedTaskWriteArgs { + workspace: Some(temp_dir.path().to_path_buf()), + output: None, + artifact_dir: None, + idempotency_key: None, + json: true, + }, }, - }) + ) .expect("create image"); let _ = create_url_parse_task(UrlParseArgs { url: "https://example.com".to_string(), @@ -1331,6 +1559,32 @@ mod tests { ); } + #[test] + fn create_typesetting_task_preserves_platform_and_rules() { + let temp_dir = tempfile::tempdir().expect("create temp dir"); + let output = create_typesetting_task(TypesettingArgs { + content: "这是一段待排版正文".to_string(), + target_platform: "小红书".to_string(), + title: Some("小红书排版".to_string()), + rules: vec!["语气:轻快".to_string(), "段落:短句".to_string()], + output: SharedTaskWriteArgs { + workspace: Some(temp_dir.path().to_path_buf()), + output: None, + artifact_dir: None, + idempotency_key: None, + json: true, + }, + }) + .expect("create typesetting task"); + + assert_eq!(output["record"]["payload"]["targetPlatform"], "小红书"); + assert_eq!(output["record"]["payload"]["content"], "这是一段待排版正文"); + assert_eq!( + output["record"]["payload"]["rules"], + json!(["语气:轻快", "段落:短句"]) + ); + } + #[test] fn task_attempts_returns_attempt_history() { let temp_dir = tempfile::tempdir().expect("create temp dir"); diff --git a/src-tauri/crates/media-runtime/Cargo.toml b/src-tauri/crates/media-runtime/Cargo.toml index 772fdc1fe..beb69c5f8 100644 --- a/src-tauri/crates/media-runtime/Cargo.toml +++ b/src-tauri/crates/media-runtime/Cargo.toml @@ -11,6 +11,9 @@ serde_json.workspace = true chrono.workspace = true uuid.workspace = true thiserror.workspace = true +reqwest.workspace = true [dev-dependencies] +axum.workspace = true tempfile.workspace = true +tokio.workspace = true diff --git a/src-tauri/crates/media-runtime/src/lib.rs b/src-tauri/crates/media-runtime/src/lib.rs index 06427b92c..3e22f1a6e 100644 --- a/src-tauri/crates/media-runtime/src/lib.rs +++ b/src-tauri/crates/media-runtime/src/lib.rs @@ -1,14 +1,54 @@ use std::fs; use std::path::{Component, Path, PathBuf}; use std::str::FromStr; +use std::time::Duration; use chrono::Utc; use serde::{Deserialize, Deserializer, Serialize}; -use serde_json::Value; +use serde_json::{json, Value}; use thiserror::Error; use uuid::Uuid; pub const DEFAULT_ARTIFACT_ROOT: &str = ".lime/tasks"; +pub const IMAGE_TASK_RUNNER_WORKER_ID: &str = "lime-image-api-worker"; +pub const IMAGE_TASK_RUNNER_TIMEOUT_SECS: u64 = 300; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ImageGenerationRunnerConfig { + pub endpoint: String, + pub api_key: String, +} + +#[derive(Debug, Clone)] +struct PreparedImageTaskInput { + prompt: String, + model: String, + size: Option, + count: u32, + style: Option, + provider_id: Option, +} + +pub fn normalize_image_generation_service_host(host: &str) -> String { + let trimmed = host.trim(); + if trimmed.is_empty() || trimmed == "0.0.0.0" || trimmed == "::" { + return "127.0.0.1".to_string(); + } + if trimmed.starts_with('[') && trimmed.ends_with(']') { + return trimmed.to_string(); + } + if trimmed.contains(':') { + return format!("[{trimmed}]"); + } + trimmed.to_string() +} + +pub fn build_image_generation_endpoint(host: &str, port: u16) -> String { + format!( + "http://{}:{port}/v1/images/generations", + normalize_image_generation_service_host(host) + ) +} #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] @@ -950,6 +990,394 @@ fn normalize_status(status: &str) -> String { } } +fn read_payload_string(payload: &Value, keys: &[&str]) -> Option { + keys.iter().find_map(|key| { + payload + .get(*key) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToOwned::to_owned) + }) +} + +fn read_payload_positive_u32(payload: &Value, keys: &[&str]) -> Option { + keys.iter().find_map(|key| { + let value = payload.get(*key)?; + if let Some(number) = value.as_u64() { + return u32::try_from(number).ok().filter(|item| *item > 0); + } + value + .as_str() + .and_then(|item| item.trim().parse::().ok().filter(|parsed| *parsed > 0)) + }) +} + +fn prepare_image_task_input(task: &MediaTaskOutput) -> Result { + let payload = &task.record.payload; + let prompt = read_payload_string(payload, &["prompt"]) + .ok_or_else(|| "图片任务缺少 prompt,无法继续执行".to_string())?; + let count = read_payload_positive_u32(payload, &["count", "image_count"]).unwrap_or(1); + + Ok(PreparedImageTaskInput { + prompt, + model: read_payload_string(payload, &["model"]).unwrap_or_default(), + size: read_payload_string(payload, &["size"]), + count, + style: read_payload_string(payload, &["style"]), + provider_id: read_payload_string(payload, &["provider_id", "providerId"]), + }) +} + +fn collect_generated_images(response_body: &Value) -> Vec { + response_body + .get("data") + .and_then(Value::as_array) + .map(|items| { + items + .iter() + .filter_map(|item| { + let record = item.as_object()?; + let url = record + .get("url") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToOwned::to_owned) + .or_else(|| { + record + .get("b64_json") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(|value| format!("data:image/png;base64,{value}")) + })?; + Some(json!({ + "url": url, + "revised_prompt": record + .get("revised_prompt") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()), + })) + }) + .collect() + }) + .unwrap_or_default() +} + +fn summarize_response_body(body: &str) -> String { + let trimmed = body.trim(); + if trimmed.is_empty() { + return "响应体为空".to_string(); + } + + let preview: String = trimmed.chars().take(240).collect(); + if trimmed.chars().count() > preview.chars().count() { + format!("{preview}...") + } else { + preview + } +} + +fn build_image_task_progress(phase: &str, message: String, percent: Option) -> TaskProgress { + TaskProgress { + phase: Some(phase.to_string()), + percent, + message: Some(message), + preview_slots: Vec::new(), + } +} + +fn build_image_task_error( + code: &str, + message: impl Into, + retryable: bool, + stage: &str, +) -> TaskErrorRecord { + TaskErrorRecord { + code: code.to_string(), + message: message.into(), + retryable, + stage: Some(stage.to_string()), + provider_code: None, + occurred_at: Some(Utc::now().to_rfc3339()), + } +} + +fn load_current_image_task( + workspace_root: &Path, + task_id: &str, +) -> Result { + load_task_output(workspace_root, task_id, None) +} + +fn patch_image_task( + workspace_root: &Path, + task_id: &str, + patch: TaskArtifactPatch, +) -> Result { + patch_task_artifact(workspace_root, task_id, None, patch) +} + +fn mark_image_task_failed( + workspace_root: &Path, + task_id: &str, + error: TaskErrorRecord, + on_update: &mut F, +) -> Result +where + F: FnMut(&MediaTaskOutput), +{ + let current = load_current_image_task(workspace_root, task_id)?; + if current.normalized_status == "cancelled" { + return Ok(current); + } + + let output = patch_image_task( + workspace_root, + task_id, + TaskArtifactPatch { + status: Some("failed".to_string()), + last_error: Some(Some(error.clone())), + progress: Some(build_image_task_progress( + "failed", + error.message.clone(), + None, + )), + current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), + ..TaskArtifactPatch::default() + }, + )?; + on_update(&output); + Ok(output) +} + +pub async fn execute_image_generation_task( + workspace_root: &Path, + task_id: &str, + runner_config: &ImageGenerationRunnerConfig, +) -> Result { + execute_image_generation_task_with_hook(workspace_root, task_id, runner_config, |_| {}).await +} + +pub async fn execute_image_generation_task_with_hook( + workspace_root: &Path, + task_id: &str, + runner_config: &ImageGenerationRunnerConfig, + mut on_update: F, +) -> Result +where + F: FnMut(&MediaTaskOutput) + Send, +{ + let current = load_current_image_task(workspace_root, task_id)?; + if matches!( + current.normalized_status.as_str(), + "cancelled" | "failed" | "succeeded" | "partial" + ) { + return Ok(current); + } + + let queued_output = if current.normalized_status == "pending" { + let output = patch_image_task( + workspace_root, + task_id, + TaskArtifactPatch { + status: Some("queued".to_string()), + progress: Some(build_image_task_progress( + "queued", + "图片任务已进入队列,等待图片服务响应。".to_string(), + Some(0), + )), + current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), + ..TaskArtifactPatch::default() + }, + )?; + on_update(&output); + output + } else { + current + }; + + if queued_output.normalized_status == "cancelled" { + return Ok(queued_output); + } + + let prepared_input = match prepare_image_task_input(&queued_output) { + Ok(prepared_input) => prepared_input, + Err(message) => { + let task_error = + build_image_task_error("invalid_image_task_payload", message, false, "payload"); + return mark_image_task_failed(workspace_root, task_id, task_error, &mut on_update); + } + }; + + let running_output = patch_image_task( + workspace_root, + task_id, + TaskArtifactPatch { + status: Some("running".to_string()), + progress: Some(build_image_task_progress( + "running", + "图片生成中,结果会自动回填到对话与画布。".to_string(), + None, + )), + current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), + ..TaskArtifactPatch::default() + }, + )?; + on_update(&running_output); + + let client = reqwest::Client::builder() + .no_proxy() + .timeout(Duration::from_secs(IMAGE_TASK_RUNNER_TIMEOUT_SECS)) + .build() + .unwrap_or_else(|_| reqwest::Client::new()); + + let request_body = json!({ + "prompt": prepared_input.prompt.clone(), + "model": prepared_input.model.clone(), + "n": prepared_input.count.max(1), + "size": prepared_input.size.clone(), + "response_format": "b64_json", + "quality": Value::Null, + "style": prepared_input.style.clone(), + "user": task_id, + }); + + let mut request_builder = client + .post(&runner_config.endpoint) + .header("Authorization", format!("Bearer {}", runner_config.api_key)); + if let Some(provider_id) = prepared_input + .provider_id + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + { + request_builder = request_builder.header("X-Provider-Id", provider_id); + } + + let response = match request_builder.json(&request_body).send().await { + Ok(response) => response, + Err(error) => { + let task_error = build_image_task_error( + "image_request_failed", + format!("调用图片服务失败: {error}"), + true, + "request", + ); + return mark_image_task_failed(workspace_root, task_id, task_error, &mut on_update); + } + }; + + let status = response.status(); + let response_body_raw = match response.text().await { + Ok(body) => body, + Err(error) => { + let task_error = build_image_task_error( + "image_response_read_failed", + format!("读取图片服务响应失败: {error}"), + false, + "response", + ); + return mark_image_task_failed(workspace_root, task_id, task_error, &mut on_update); + } + }; + let response_body: Value = match serde_json::from_str(&response_body_raw) { + Ok(body) => body, + Err(error) => { + let detail = summarize_response_body(&response_body_raw); + let task_error = build_image_task_error( + "image_response_parse_failed", + format!("解析图片服务响应失败: {error};{detail}"), + false, + "response", + ); + return mark_image_task_failed(workspace_root, task_id, task_error, &mut on_update); + } + }; + + if !status.is_success() { + let error_code = response_body + .get("error") + .and_then(|value| value.get("code")) + .and_then(Value::as_str) + .filter(|value| !value.trim().is_empty()) + .unwrap_or("image_generation_failed"); + let error_message = response_body + .get("error") + .and_then(|value| value.get("message")) + .and_then(Value::as_str) + .filter(|value| !value.trim().is_empty()) + .unwrap_or("图片服务未返回可用结果"); + let task_error = build_image_task_error( + error_code, + error_message, + status.is_server_error() || status.as_u16() == 429, + "request", + ); + return mark_image_task_failed(workspace_root, task_id, task_error, &mut on_update); + } + + let images = collect_generated_images(&response_body); + if images.is_empty() { + let task_error = build_image_task_error( + "image_result_empty", + "图片服务已返回成功,但没有可用的图片地址", + false, + "result", + ); + return mark_image_task_failed(workspace_root, task_id, task_error, &mut on_update); + } + + let latest = load_current_image_task(workspace_root, task_id)?; + if latest.normalized_status == "cancelled" { + return Ok(latest); + } + + let final_status = if images.len() < prepared_input.count as usize { + "partial" + } else { + "succeeded" + }; + let result_value = json!({ + "provider_id": prepared_input.provider_id, + "model": if prepared_input.model.trim().is_empty() { + None:: + } else { + Some(prepared_input.model) + }, + "size": prepared_input.size, + "requested_count": prepared_input.count, + "received_count": images.len(), + "images": images, + "response": response_body, + }); + let success_message = if final_status == "partial" { + format!("图片任务已返回部分结果,共生成 {} 张。", images.len()) + } else { + format!("图片任务已完成,共生成 {} 张。", images.len()) + }; + let completed = patch_image_task( + workspace_root, + task_id, + TaskArtifactPatch { + status: Some(final_status.to_string()), + result: Some(Some(result_value)), + last_error: Some(None), + progress: Some(build_image_task_progress( + final_status, + success_message, + Some(100), + )), + current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), + ..TaskArtifactPatch::default() + }, + )?; + on_update(&completed); + Ok(completed) +} + fn supports_idempotent_reuse(normalized_status: &str) -> bool { matches!(normalized_status, "pending" | "queued" | "running") } @@ -1730,6 +2158,15 @@ pub fn parse_media_task_output(raw: &str) -> Option { #[cfg(test)] mod tests { use super::*; + use std::sync::{Arc, Mutex}; + + use axum::{ + extract::Json, + http::{HeaderMap, StatusCode}, + routing::post, + Router, + }; + use tokio::net::TcpListener; #[test] fn write_media_task_artifact_uses_default_task_root() { @@ -2068,4 +2505,192 @@ mod tests { vec![".lime/tasks/image_generate/demo.json".to_string()] ); } + + #[tokio::test] + async fn execute_image_generation_task_should_advance_task_file_to_succeeded() { + let temp_dir = tempfile::tempdir().expect("create temp dir"); + let captured_provider_id = Arc::new(Mutex::new(None::)); + let captured_response_format = Arc::new(Mutex::new(None::)); + let created = write_task_artifact( + temp_dir.path(), + TaskType::ImageGenerate, + Some("青柠主视觉".to_string()), + json!({ + "prompt": "未来感青柠实验室", + "size": "1024x1024", + "count": 1, + "style": "cinematic", + "provider_id": "fal", + "model": "fal-ai/nano-banana-pro", + }), + TaskWriteOptions::default(), + ) + .expect("create task"); + + let listener = TcpListener::bind("127.0.0.1:0") + .await + .expect("bind image api"); + let address = listener.local_addr().expect("resolve address"); + let captured_provider_id_for_server = Arc::clone(&captured_provider_id); + let captured_response_format_for_server = Arc::clone(&captured_response_format); + let server = tokio::spawn(async move { + let app = Router::new().route( + "/v1/images/generations", + post(move |headers: HeaderMap, Json(body): Json| { + let captured_provider_id = Arc::clone(&captured_provider_id_for_server); + let captured_response_format = Arc::clone(&captured_response_format_for_server); + async move { + let provider_id = headers + .get("x-provider-id") + .and_then(|value| value.to_str().ok()) + .map(|value| value.to_string()); + *captured_provider_id.lock().expect("lock provider id") = provider_id; + let response_format = body + .get("response_format") + .and_then(Value::as_str) + .map(|value| value.to_string()); + *captured_response_format + .lock() + .expect("lock response format") = response_format; + ( + StatusCode::OK, + Json(json!({ + "created": 1_717_200_000i64, + "data": [ + { + "b64_json": "ZmFrZS1saW1lLWltYWdl", + "revised_prompt": "未来感青柠实验室主视觉" + } + ] + })), + ) + } + }), + ); + axum::serve(listener, app).await.expect("serve image api"); + }); + + let result = execute_image_generation_task( + temp_dir.path(), + &created.task_id, + &ImageGenerationRunnerConfig { + endpoint: format!("http://{address}/v1/images/generations"), + api_key: "test-key".to_string(), + }, + ) + .await + .expect("execute image task"); + + assert_eq!(result.normalized_status, "succeeded"); + assert_eq!( + result + .record + .result + .as_ref() + .and_then(|value| value.get("images")) + .and_then(Value::as_array) + .map(Vec::len), + Some(1) + ); + assert_eq!( + result + .record + .result + .as_ref() + .and_then(|value| value.get("images")) + .and_then(Value::as_array) + .and_then(|images| images.first()) + .and_then(|value| value.get("url")) + .and_then(Value::as_str), + Some("data:image/png;base64,ZmFrZS1saW1lLWltYWdl") + ); + assert_eq!( + result + .record + .attempts + .last() + .and_then(|attempt| attempt.worker_id.as_deref()), + Some(IMAGE_TASK_RUNNER_WORKER_ID) + ); + assert_eq!( + captured_provider_id + .lock() + .expect("lock provider id") + .clone(), + Some("fal".to_string()) + ); + assert_eq!( + captured_response_format + .lock() + .expect("lock response format") + .clone(), + Some("b64_json".to_string()) + ); + + server.abort(); + } + + #[tokio::test] + async fn execute_image_generation_task_should_mark_task_failed_when_service_rejects() { + let temp_dir = tempfile::tempdir().expect("create temp dir"); + let created = write_task_artifact( + temp_dir.path(), + TaskType::ImageGenerate, + Some("青柠主视觉".to_string()), + json!({ + "prompt": "未来感青柠实验室", + "size": "1024x1024", + "count": 1, + "provider_id": "fal", + "model": "fal-ai/nano-banana-pro", + }), + TaskWriteOptions::default(), + ) + .expect("create task"); + + let listener = TcpListener::bind("127.0.0.1:0") + .await + .expect("bind image api"); + let address = listener.local_addr().expect("resolve address"); + let server = tokio::spawn(async move { + let app = Router::new().route( + "/v1/images/generations", + post(|| async move { + ( + StatusCode::TOO_MANY_REQUESTS, + Json(json!({ + "error": { + "code": "rate_limited", + "message": "图片服务限流,请稍后重试" + } + })), + ) + }), + ); + axum::serve(listener, app).await.expect("serve image api"); + }); + + let result = execute_image_generation_task( + temp_dir.path(), + &created.task_id, + &ImageGenerationRunnerConfig { + endpoint: format!("http://{address}/v1/images/generations"), + api_key: "test-key".to_string(), + }, + ) + .await + .expect("image task should settle to failed output"); + + assert_eq!(result.normalized_status, "failed"); + assert_eq!( + result.last_error.as_ref().map(|value| value.code.as_str()), + Some("rate_limited") + ); + assert_eq!( + result.last_error.as_ref().map(|value| value.retryable), + Some(true) + ); + + server.abort(); + } } diff --git a/src-tauri/crates/services/src/session_context_service.rs b/src-tauri/crates/services/src/session_context_service.rs index e3cadc45f..4e5fb43c4 100644 --- a/src-tauri/crates/services/src/session_context_service.rs +++ b/src-tauri/crates/services/src/session_context_service.rs @@ -600,6 +600,8 @@ mod tests { tool_calls_json TEXT, tool_call_id TEXT, reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER, FOREIGN KEY (session_id) REFERENCES agent_sessions(id) ON DELETE CASCADE )", [], diff --git a/src-tauri/resources/default-skills/form_generate/SKILL.md b/src-tauri/resources/default-skills/form_generate/SKILL.md new file mode 100644 index 000000000..2a8d70014 --- /dev/null +++ b/src-tauri/resources/default-skills/form_generate/SKILL.md @@ -0,0 +1,72 @@ +--- +name: form_generate +description: 根据目标说明生成一份可直接在聊天区渲染的 A2UI 表单,复用 Lime 现有表单协议。 +metadata: + lime_argument_hint: 输入表单目标、表单类型、受众、风格与字段数。 + lime_when_to_use: 用户需要快速产出问卷、报名表、反馈表、申请表或线索收集表时使用。 + lime_version: 1.0.0 + lime_execution_mode: prompt + lime_surface: workbench + lime_category: creation +--- + +你是 Lime 的表单生成助手。 + +## 工作目标 + +根据用户输入生成一份可直接在聊天区渲染的 A2UI 表单,不要发明新的表单协议。 + +## 执行规则 + +- 优先使用 `form_request.prompt`、`form_request.content` 与当前对话里最近的相关上下文。 +- 最终必须输出且只输出一个 ` ```a2ui ` 代码块;代码块内放可被 Lime 现有 parser 识别的 JSON。 +- 优先使用简化表单格式: + `{"type":"form","title":"...","description":"...","fields":[...],"submitLabel":"提交"}` +- 字段类型只允许使用 `choice`、`text`、`slider`、`checkbox`。 +- `choice` 字段必须补 `options`,每个选项至少包含 `value` 与 `label`。 +- 若用户指定了 `form_type`、`style`、`audience`、`field_count`,必须显式遵循;未指定时默认按高完成度通用表单执行。 +- 如果是报名/申请/线索表单,默认包含姓名、联系方式、角色/需求、隐私同意等字段。 +- 如果是问卷/反馈表单,优先包含目标背景、满意度/评分、选择项、开放意见等字段。 +- 字段文案必须贴合用户主题,不要输出 lorem ipsum、字段一/字段二 这类空占位。 +- 字段数尽量贴近用户要求;未指定时默认控制在 5-8 个字段。 +- 如信息不足,最多追问 1 个关键问题;除非真的缺失目标,否则不要停在追问。 +- 不要输出 ``、HTML、Markdown 表格或新的自定义 DSL。 +- 若需要补充说明,把说明放在 ` ```a2ui ` 代码块之后,控制在 2-4 行。 + +## 简化表单格式要求 + +- `title`:表单标题,必须具体。 +- `description`:一句说明表单用途和填写预期。 +- `fields`:数组,字段顺序需符合填写流。 +- 每个字段必须包含: + - `id` + - `type` + - `label` +- 选填字段按需添加: + - `description` + - `placeholder` + - `default` + - `options` + - `min` + - `max` + - `variant` +- `submitLabel` 默认可用“提交”“发送报名”“提交反馈”等贴合语义的文案。 + +## 输出格式(固定) + +```a2ui +{ + "type": "form", + "title": "AI Workshop 报名表", + "description": "收集活动报名信息与参与偏好。", + "fields": [ + { + "id": "name", + "type": "text", + "label": "姓名", + "placeholder": "请输入姓名" + } + ], + "submitLabel": "提交报名" +} +``` diff --git a/src-tauri/resources/default-skills/image_generate/SKILL.md b/src-tauri/resources/default-skills/image_generate/SKILL.md index f6b30712f..596f05fa3 100644 --- a/src-tauri/resources/default-skills/image_generate/SKILL.md +++ b/src-tauri/resources/default-skills/image_generate/SKILL.md @@ -5,7 +5,7 @@ allowed-tools: Bash, lime_create_image_generation_task metadata: lime_argument_hint: 输入主题、画面主体、风格、构图、数量、尺寸。 lime_when_to_use: 用户需要普通配图、插图或概念图时使用;封面需求优先交给 cover_generate。 - lime_version: 1.3.0 + lime_version: 1.3.1 lime_execution_mode: prompt lime_surface: workbench lime_category: media @@ -20,13 +20,18 @@ metadata: ## 执行规则 - 先判断是否属于封面需求;封面需求请转 `cover_generate`。 +- 当前已经进入 `@配图/@修图/@重绘 -> image_skill_launch -> Skill(image_generate)` 主链,不要先调用 `ToolSearch`、`WebSearch`、`Read`、`Glob`、`Grep` 去“找技能”或“确认工具”。 +- 不要搜索 “Skill image_generate”、“lime media image generate --json”、“lime_create_image_generation_task” 之类目录信息;当前上下文已经明确要求执行图片任务。 - 提示词必须包含主体、场景、风格,不要空泛。 - 若调用方在结构化上下文里提供了 `image_task`,必须优先复用其中的 `mode`、`reference_images`、`target_output_*`、`session_id`、`project_id`、`content_id`、`entry_source`、`requested_target` 等字段,不要擅自丢失。 +- 若上下文已提供 `provider_id` 或 `model`,提交任务时也要原样透传,不要降级成匿名默认值。 - 若用户给了参考素材,需体现在参数中;若 `reference_images` 已经是文件路径、URL 或输入图片物化路径,直接原样透传。 -- 优先调用 `Bash` 执行 `lime media image generate --json` 创建任务;如当前环境只提供 `task create` 入口,也可使用 `lime task create image --json`。 +- 优先调用 `Bash` 执行 `lime media image generate --json` 提交任务。 +- 如果当前环境实际走到 `lime task create image --json` 兼容入口,也必须确认它复用同一条图片执行链,而不是只写一个 `pending_submit` 任务文件后停止。 - 若当前环境暂时无法执行 `lime` CLI,再回退到 `lime_create_image_generation_task`。 -- 任务结果必须兼容 `lime task create image --json` 的任务文件契约。 -- `payload` 中至少包含:`prompt`、`style`、`size`、`count`、`usage`;如有上下文,还应携带 `mode`、`reference_images`、`target_output_id`、`target_output_ref_id`、`session_id`、`project_id`、`content_id`、`entry_source`、`requested_target`。 +- 回退 `lime_create_image_generation_task` 时,仍必须复用同一条图片任务执行链;不要传 `outputPath`,不要把任务写成 markdown 文稿。 +- `lime media image generate --json` 与 `lime task create image --json` 的任务结果都必须兼容同一份图片任务文件契约。 +- `payload` 中至少包含:`prompt`、`style`、`size`、`count`、`usage`;如有上下文,还应携带 `mode`、`provider_id`、`model`、`reference_images`、`target_output_id`、`target_output_ref_id`、`session_id`、`project_id`、`content_id`、`entry_source`、`requested_target`。 ## 输出格式(固定) @@ -35,4 +40,4 @@ metadata: - 任务类型:image_generate - 任务 ID:{task_id} - 任务文件:{path} -- 状态:pending_submit +- 状态:{status} diff --git a/src-tauri/resources/default-skills/presentation_generate/SKILL.md b/src-tauri/resources/default-skills/presentation_generate/SKILL.md new file mode 100644 index 000000000..da998823f --- /dev/null +++ b/src-tauri/resources/default-skills/presentation_generate/SKILL.md @@ -0,0 +1,68 @@ +--- +name: presentation_generate +description: 根据目标说明生成一份可直接讲述、继续导出的单文件演示稿 Markdown,并落到工作区供右侧 viewer 预览。 +metadata: + lime_argument_hint: 输入演示目标、演示类型、受众、风格、页数与核心论点。 + lime_when_to_use: 用户需要快速产出路演稿、汇报稿、培训稿或方案演示时使用。 + lime_version: 1.0.0 + lime_execution_mode: prompt + lime_surface: workbench + lime_category: creation +--- + +你是 Lime 的演示稿生成助手。 + +## 工作目标 + +根据用户输入生成一个可直接讲述和继续导出的单文件 Markdown 演示稿,并通过 `` 落到工作区。 + +## 执行规则 + +- 优先使用 `presentation_request.prompt`、`presentation_request.content` 与当前对话里最近的相关上下文。 +- 默认产出一个自包含的 Markdown 演示稿,不依赖额外构建工具才能查看。 +- 如果用户提供了 `deck_type`、`style`、`audience`、`slide_count`,必须显式遵循;未指定时默认按高完成度通用演示稿执行。 +- 演示稿必须可讲述,每一页都要给出明确标题、核心要点与讲述重点,不要只写空泛标题。 +- 页面结构至少包含:封面页、目录页、问题/背景页、方案/核心论点页、案例/证明页、结论/行动页。 +- 如果目标页数已给出,尽量贴近;未给出时默认控制在 8-12 页。 +- 页面文案必须贴合用户主题,不要输出 lorem ipsum、占位 bullet 或泛泛模板词。 +- 如信息不足,最多追问 1 个关键问题;除非真的缺失目标,否则不要停在追问。 +- 最终必须输出且只输出一个 ``,文件扩展名必须是 `.md`。 +- `` 内只能放最终 Markdown,不要再包 Markdown 代码块。 +- 如果需要补充说明,把说明放在 `` 之后,且不要重复整份文稿。 + +## Markdown 结构要求 + +- 使用 Markdown 标题和分隔线组织页面。 +- 文件开头先给出演示名称、演示类型、受众与建议讲述时长。 +- 每一页统一使用以下结构: + `## 01 封面` + `- 页面目标:...` + `- 标题:...` + `- 要点:...` + `- 讲述备注:...` +- 页面之间使用 `---` 分隔,方便后续导出或转换。 +- 如果适合加入数据、案例或图示建议,可以在对应页添加 `- 可视化建议:...`。 + +## 输出格式(固定) + + +# 演示稿标题 + +- 演示类型:... +- 目标受众:... +- 建议讲述时长:... + +--- + +## 01 封面 +- 页面目标:... +- 标题:... +- 要点:... +- 讲述备注:... + + +## 收尾要求 + +- 如果用户明确要求“融资路演”“销售方案”“培训课件”“周报汇报”等类型,页面结构必须体现对应逻辑。 +- 如果用户没有指定文件名,使用与主题相关的 slug。 +- 若用户还需要一句摘要,可在文件后补 2-4 行简短总结:适用场景、页数结构、建议下一步。 diff --git a/src-tauri/resources/default-skills/site_search/SKILL.md b/src-tauri/resources/default-skills/site_search/SKILL.md index d9cdfe92a..0c08d5407 100644 --- a/src-tauri/resources/default-skills/site_search/SKILL.md +++ b/src-tauri/resources/default-skills/site_search/SKILL.md @@ -1,6 +1,6 @@ --- name: site_search -description: 通过站点适配器检索指定站点内容(GitHub、知乎、B站、36Kr、linux.do、什么值得买、Yahoo Finance)。 +description: 通过站点适配器检索指定站点内容(GitHub、知乎、B站、36Kr、linux.do、什么值得买、Yahoo Finance、X 长文)。 allowed-tools: lime_site_run, lime_site_list, lime_site_search, lime_site_info metadata: lime_argument_hint: 输入目标站点、查询关键词或标的、返回数量,以及是否要保存到当前内容/项目。 @@ -44,6 +44,7 @@ metadata: - 36Kr:`36kr/newsflash` - linux.do:`linux-do/categories`、`linux-do/hot` - 什么值得买:`smzdm/search` +- X:`x/article-export` - Yahoo Finance:`yahoo-finance/quote` 全量参数、登录提示和域名清单见 `references/adapter-catalog.md`。 @@ -58,6 +59,7 @@ metadata: - 仓库搜索优先 `github/search` - 仓库 issue 列表优先 `github/issues` - 热榜/热门优先 `zhihu/hot`、`linux-do/hot`、`36kr/newsflash` + - X 长文导出优先 `x/article-export` - 股票报价优先 `yahoo-finance/quote` 3. 用 `lime_site_info` 校验参数 4. 用 `lime_site_run` 执行 diff --git a/src-tauri/resources/default-skills/site_search/references/adapter-catalog.md b/src-tauri/resources/default-skills/site_search/references/adapter-catalog.md index 0fddb25a1..40dbf143b 100644 --- a/src-tauri/resources/default-skills/site_search/references/adapter-catalog.md +++ b/src-tauri/resources/default-skills/site_search/references/adapter-catalog.md @@ -19,6 +19,7 @@ | `linux-do/categories` | linux.do | 读取 linux.do 分类列表。 | 无 | limit | 请先在浏览器中登录 linux.do,再重试该命令。 | | `linux-do/hot` | linux.do | 读取 linux.do 热门话题。 | 无 | limit, period | 请先在浏览器中登录 linux.do,再重试该命令。 | | `smzdm/search` | search.smzdm.com | 按关键词采集什么值得买搜索结果。 | query | limit | 无 | +| `x/article-export` | x.com | 把 X 长文导出为 Markdown 正文和图片资源包。 | url | 无 | 如果页面内容未完整加载,请先在浏览器中登录 X 并打开目标文章页面。 | | `yahoo-finance/quote` | finance.yahoo.com | 读取 Yahoo Finance 股票行情摘要。 | symbol | 无 | 无 | | `zhihu/hot` | www.zhihu.com | 采集知乎热榜问题列表。 | 无 | limit | 请先在浏览器中登录知乎,再重试该命令。 | | `zhihu/search` | www.zhihu.com | 按关键词采集知乎搜索结果。 | query | limit | 请先在浏览器中登录知乎,再重试该命令。 | @@ -33,6 +34,7 @@ - 社区目录:`linux-do/categories` - 快讯流:`36kr/newsflash` - 商品搜索:`smzdm/search` +- X 长文导出:`x/article-export` - 行情摘要:`yahoo-finance/quote` ## 使用提醒 diff --git a/src-tauri/resources/default-skills/webpage_generate/SKILL.md b/src-tauri/resources/default-skills/webpage_generate/SKILL.md new file mode 100644 index 000000000..d36c9ce89 --- /dev/null +++ b/src-tauri/resources/default-skills/webpage_generate/SKILL.md @@ -0,0 +1,54 @@ +--- +name: webpage_generate +description: 根据目标说明生成可直接预览的单文件 HTML 网页,并落到工作区供右侧 viewer 预览。 +metadata: + lime_argument_hint: 输入网页目标、页面类型、风格、技术偏好、核心卖点与 CTA。 + lime_when_to_use: 用户需要快速产出落地页、官网页、活动页或产品展示页原型时使用。 + lime_version: 1.0.0 + lime_execution_mode: prompt + lime_surface: workbench + lime_category: creation +--- + +你是 Lime 的网页生成助手。 + +## 工作目标 + +根据用户输入生成一个可直接预览的单文件 HTML 页面,并通过 `` 落到工作区。 + +## 执行规则 + +- 优先使用 `webpage_request.prompt`、`webpage_request.content` 与当前对话里最近的相关上下文。 +- 默认产出一个自包含 HTML 文件,不依赖 npm、构建工具、React/Vite 或外部资源才能预览。 +- 页面必须同时兼顾桌面与移动端,包含清晰的信息层级、主 CTA、核心卖点区块与结尾收口。 +- 如果用户提供了 `page_type`、`style`、`tech_stack`,必须显式遵循;未指定时默认按高完成度落地页执行。 +- 视觉方向要明确,不要默认紫色玻璃态模板感;优先使用稳定的排版、间距、层次和少量必要动效。 +- 页面文案必须贴合用户主题,不要输出 lorem ipsum 或空泛占位文案。 +- 如信息不足,最多追问 1 个关键问题;除非真的缺失目标,否则不要停在追问。 +- 最终必须输出且只输出一个 ``,文件扩展名必须是 `.html`。 +- `` 内只能放最终 HTML,不要再包 Markdown 代码块。 +- 如果需要补充说明,把说明放在 `` 之后,且不要重复整页源码。 + +## HTML 要求 + +- 使用语义化 HTML 结构。 +- 包含 ``、``、``、`` 与 `viewport`。 +- 使用 CSS variables 管理颜色、间距与阴影。 +- 默认使用内联 CSS,必要时可加入少量原生 JS 交互。 +- 页面至少包含:首屏、卖点/能力区、证明/案例区、CTA 区、页脚。 +- CTA 按钮、卡片、间距与背景层必须可读,不要出现贴边、溢出或移动端布局断裂。 + +## 输出格式(固定) + + + + +... + + + +## 收尾要求 + +- 如果用户明确要求“官网”“活动页”“产品页”等页面类型,文件内容必须体现对应结构。 +- 如果用户没有指定文件名,使用与主题相关的 slug。 +- 若用户还需要页面说明,可在文件后补 2-4 行简短总结:页面定位、结构亮点、建议下一步。 diff --git a/src-tauri/resources/site-adapters/bundled/index.json b/src-tauri/resources/site-adapters/bundled/index.json index b09d42039..4adc9a5a1 100644 --- a/src-tauri/resources/site-adapters/bundled/index.json +++ b/src-tauri/resources/site-adapters/bundled/index.json @@ -238,6 +238,30 @@ "script_file": "scripts/yahoo-finance-quote.js", "source_version": "2026-03-28" }, + { + "name": "x/article-export", + "domain": "x.com", + "description": "把 X 长文导出为 Markdown 正文和图片资源包。", + "read_only": true, + "capabilities": ["article_export", "markdown_bundle", "research"], + "args": [ + { + "name": "url", + "description": "X 长文链接,格式 https://x.com/<账号>/article/<文章ID>", + "required": true, + "arg_type": "string", + "example": "https://x.com/GoogleCloudTech/article/2033953579824758855" + } + ], + "example": "x/article-export {\"url\":\"https://x.com/GoogleCloudTech/article/2033953579824758855\"}", + "auth_hint": "如果页面内容未完整加载,请先在浏览器中登录 X 并打开目标文章页面。", + "entry": { + "kind": "builder", + "id": "x_article_export" + }, + "script_file": "scripts/x-article-export.js", + "source_version": "2026-04-07" + }, { "name": "zhihu/hot", "domain": "www.zhihu.com", diff --git a/src-tauri/resources/site-adapters/bundled/scripts/x-article-export.js b/src-tauri/resources/site-adapters/bundled/scripts/x-article-export.js new file mode 100644 index 000000000..4bcc0b91d --- /dev/null +++ b/src-tauri/resources/site-adapters/bundled/scripts/x-article-export.js @@ -0,0 +1,398 @@ +async (args, helpers) => { + const ARTICLE_ROOT_SELECTOR = '[data-testid="twitterArticleReadView"]'; + const ARTICLE_TITLE_SELECTOR = '[data-testid="twitter-article-title"]'; + const ARTICLE_CONTENT_SELECTOR = + '[data-testid="longformRichTextComponent"] [data-contents="true"], [data-testid="longformRichTextComponent"]'; + const IMAGE_SELECTOR = '[data-testid="tweetPhoto"] img'; + const CODE_BLOCK_SELECTOR = '[data-testid="markdown-code-block"]'; + + function normalizeText(value) { + return String(value || "") + .replace(/\u00a0/g, " ") + .replace(/\s+/g, " ") + .trim(); + } + + function normalizeMultilineText(value) { + return String(value || "") + .replace(/\r\n/g, "\n") + .replace(/\u00a0/g, " ") + .replace(/[ \t]+\n/g, "\n") + .replace(/\n{3,}/g, "\n\n") + .trim(); + } + + function escapeMarkdownText(value) { + return String(value || "").replace(/([\\`*_{}\[\]()#+\-.!|>])/g, "\\$1"); + } + + function normalizeArticleUrl(rawUrl) { + try { + const url = new URL(rawUrl, location.href); + const hostname = url.hostname.replace(/^www\./, "").toLowerCase(); + if (hostname !== "x.com" && hostname !== "twitter.com") { + return null; + } + if (!/\/article\//.test(url.pathname)) { + return null; + } + return url.toString(); + } catch { + return null; + } + } + + function resolveAuthor() { + const titleMatch = document.title.match(/^(.+?) on X/i); + if (titleMatch?.[1]) { + return normalizeText(titleMatch[1]); + } + + const pathMatch = location.pathname.match(/^\/([^/]+)/); + if (pathMatch?.[1]) { + return `@${pathMatch[1]}`; + } + + return null; + } + + function normalizeImageUrl(rawUrl) { + try { + const url = new URL(rawUrl, location.href); + if (url.hostname.includes("pbs.twimg.com")) { + if (url.searchParams.has("format")) { + url.searchParams.set("name", "orig"); + } + } + return url.toString(); + } catch { + return rawUrl || ""; + } + } + + function resolveSuggestedImageName(rawUrl, fallbackIndex) { + try { + const url = new URL(rawUrl, location.href); + const format = normalizeText(url.searchParams.get("format")); + const ext = format || normalizeText(url.pathname.split(".").pop()) || "jpg"; + return `image-${fallbackIndex + 1}.${ext}`; + } catch { + return `image-${fallbackIndex + 1}.jpg`; + } + } + + function resolveCodeLanguage(element) { + const candidates = [ + element.getAttribute("data-language"), + element.querySelector("[data-language]")?.getAttribute("data-language"), + element.querySelector("code")?.getAttribute("data-language"), + element.querySelector("pre")?.getAttribute("data-language"), + element.querySelector("code")?.className, + ]; + + for (const candidate of candidates) { + const normalized = normalizeText(candidate); + if (!normalized) { + continue; + } + const match = normalized.match(/language-([a-z0-9_+-]+)/i); + if (match?.[1]) { + return match[1].toLowerCase(); + } + if (/^[a-z0-9_+-]+$/i.test(normalized)) { + return normalized.toLowerCase(); + } + } + + return ""; + } + + function createState() { + return { + imageUrls: new Set(), + images: [], + }; + } + + function registerImage(state, imageElement) { + const rawUrl = + imageElement.getAttribute("src") || + imageElement.getAttribute("data-src") || + ""; + const normalizedUrl = normalizeImageUrl(rawUrl); + if (!normalizedUrl) { + return ""; + } + + if (!state.imageUrls.has(normalizedUrl)) { + state.imageUrls.add(normalizedUrl); + state.images.push({ + url: normalizedUrl, + alt: normalizeText(imageElement.getAttribute("alt")) || undefined, + suggested_file_name: resolveSuggestedImageName( + normalizedUrl, + state.images.length, + ), + }); + } + + const altText = normalizeText(imageElement.getAttribute("alt")) || "插图"; + return `![${escapeMarkdownText(altText)}](${normalizedUrl})`; + } + + function collectInlineMarkdown(node, state) { + if (!node) { + return ""; + } + + if (node.nodeType === Node.TEXT_NODE) { + return escapeMarkdownText(node.textContent || ""); + } + + if (node.nodeType !== Node.ELEMENT_NODE) { + return ""; + } + + const element = node; + if (element.matches?.(IMAGE_SELECTOR) || element.tagName === "IMG") { + return registerImage(state, element); + } + + if (element.matches?.(CODE_BLOCK_SELECTOR)) { + return ""; + } + + if (element.tagName === "BR") { + return "\n"; + } + + const childMarkdown = Array.from(element.childNodes) + .map((child) => collectInlineMarkdown(child, state)) + .join(""); + const normalized = childMarkdown.replace(/[ \t]+\n/g, "\n"); + + if (element.tagName === "A") { + const href = helpers.absoluteUrl(element.getAttribute("href") || ""); + const label = normalizeMultilineText(normalized); + if (!href) { + return label; + } + return label ? `[${label}](${href})` : href; + } + + if (element.tagName === "CODE") { + const codeText = normalizeMultilineText(element.textContent || ""); + return codeText ? `\`${codeText}\`` : ""; + } + + if (element.tagName === "STRONG" || element.tagName === "B") { + const text = normalized.trim(); + return text ? `**${text}**` : ""; + } + + if (element.tagName === "EM" || element.tagName === "I") { + const text = normalized.trim(); + return text ? `*${text}*` : ""; + } + + return normalized; + } + + function hasMeaningfulText(element) { + return normalizeText(element.textContent || "").length > 0; + } + + function serializeList(element, state, depth = 0) { + const items = Array.from(element.children) + .filter((child) => child.tagName === "LI") + .map((item, index) => { + const marker = element.tagName === "OL" ? `${index + 1}.` : "-"; + const nestedLists = Array.from(item.children).filter((child) => + ["UL", "OL"].includes(child.tagName), + ); + const clonedItem = item.cloneNode(true); + nestedLists.forEach((list) => { + const nestedClone = clonedItem.querySelector(list.tagName.toLowerCase()); + nestedClone?.remove(); + }); + + const text = normalizeMultilineText( + collectInlineMarkdown(clonedItem, state), + ); + const lines = []; + if (text) { + lines.push(`${" ".repeat(depth)}${marker} ${text}`); + } + nestedLists.forEach((list) => { + const nestedMarkdown = serializeList(list, state, depth + 1); + if (nestedMarkdown) { + lines.push(nestedMarkdown); + } + }); + return lines.join("\n"); + }) + .filter(Boolean); + + return items.join("\n"); + } + + function serializeBlock(element, state) { + if (!(element instanceof Element)) { + return []; + } + + if (element.matches(ARTICLE_TITLE_SELECTOR)) { + return []; + } + + if (element.matches(CODE_BLOCK_SELECTOR)) { + const codeText = normalizeMultilineText(element.innerText || element.textContent || ""); + if (!codeText) { + return []; + } + const language = resolveCodeLanguage(element); + return [`\`\`\`${language}\n${codeText}\n\`\`\``]; + } + + if (element.matches(IMAGE_SELECTOR) || element.matches('[data-testid="tweetPhoto"], figure')) { + const images = element.matches(IMAGE_SELECTOR) + ? [element] + : Array.from(element.querySelectorAll("img")); + return images + .map((image) => registerImage(state, image)) + .filter(Boolean); + } + + if (element.matches("ul,ol")) { + const listMarkdown = serializeList(element, state); + return listMarkdown ? [listMarkdown] : []; + } + + if (element.matches("blockquote")) { + const text = normalizeMultilineText(collectInlineMarkdown(element, state)); + if (!text) { + return []; + } + return [text.split("\n").map((line) => `> ${line}`).join("\n")]; + } + + if (element.matches("h1,h2,h3,h4,h5,h6")) { + const level = Number(element.tagName.slice(1)) || 2; + const text = normalizeMultilineText(collectInlineMarkdown(element, state)); + return text ? [`${"#".repeat(Math.min(level, 6))} ${text}`] : []; + } + + if (element.matches("hr")) { + return ["---"]; + } + + const directBlockChildren = Array.from(element.children).filter((child) => { + if (child.matches(CODE_BLOCK_SELECTOR)) { + return true; + } + if (child.matches(IMAGE_SELECTOR) || child.matches('[data-testid="tweetPhoto"], figure')) { + return true; + } + if (child.matches("ul,ol,blockquote,h1,h2,h3,h4,h5,h6,hr")) { + return true; + } + return child.children.length > 0 && !["A", "SPAN", "EM", "STRONG", "I", "B", "CODE"].includes(child.tagName); + }); + + if (directBlockChildren.length > 0 && !element.matches("p,li")) { + return directBlockChildren.flatMap((child) => serializeBlock(child, state)); + } + + if (!hasMeaningfulText(element) && !element.querySelector("img")) { + return []; + } + + const paragraph = normalizeMultilineText(collectInlineMarkdown(element, state)); + return paragraph ? [paragraph] : []; + } + + function serializeArticle(root, state) { + const blocks = Array.from(root.children) + .flatMap((child) => serializeBlock(child, state)) + .map((block) => normalizeMultilineText(block)) + .filter(Boolean); + + if (blocks.length > 0) { + return blocks.join("\n\n"); + } + + const fallback = normalizeMultilineText(root.innerText || root.textContent || ""); + return fallback; + } + + const requestedUrl = String(args.url || "").trim(); + if (requestedUrl && !normalizeArticleUrl(requestedUrl)) { + return { + ok: false, + error_code: "invalid_args", + error_message: "url 必须是 x.com 或 twitter.com 的 article 链接。", + }; + } + + const articleRoot = await helpers.waitFor( + () => document.querySelector(ARTICLE_ROOT_SELECTOR), + 15000, + 250, + ); + if (!articleRoot) { + if (helpers.looksLikeLoginWall()) { + return { + ok: false, + error_code: "auth_required", + error_message: "未能读取 X 长文内容,可能需要先登录 X 后再访问。", + }; + } + return { + ok: false, + error_code: "adapter_runtime_error", + error_message: "未找到 X 长文阅读视图。", + }; + } + + const title = + normalizeText(articleRoot.querySelector(ARTICLE_TITLE_SELECTOR)?.textContent) || + normalizeText(document.title.replace(/\s+on X.*$/i, "")); + const contentRoot = articleRoot.querySelector(ARTICLE_CONTENT_SELECTOR); + if (!contentRoot) { + return { + ok: false, + error_code: helpers.looksLikeLoginWall() ? "auth_required" : "adapter_runtime_error", + error_message: "未找到 X 长文正文区域。", + }; + } + + const state = createState(); + const markdown = serializeArticle(contentRoot, state); + if (!markdown) { + return { + ok: false, + error_code: helpers.looksLikeLoginWall() ? "auth_required" : "adapter_runtime_error", + error_message: "正文为空,无法导出 Markdown。", + }; + } + + const publishedAt = + articleRoot.querySelector("time[datetime]")?.getAttribute("datetime") || + document.querySelector("time[datetime]")?.getAttribute("datetime") || + undefined; + const sourceUrl = normalizeArticleUrl(location.href) || location.href; + + return { + ok: true, + source_url: sourceUrl, + data: { + export_kind: "markdown_bundle", + title: title || undefined, + source_url: sourceUrl, + author: resolveAuthor() || undefined, + published_at: publishedAt || undefined, + markdown, + images: state.images, + }, + }; +}; diff --git a/src-tauri/src/agent_tools/inventory.rs b/src-tauri/src/agent_tools/inventory.rs index 551368a14..5d4106561 100644 --- a/src-tauri/src/agent_tools/inventory.rs +++ b/src-tauri/src/agent_tools/inventory.rs @@ -980,9 +980,8 @@ mod tests { #[test] fn test_build_tool_inventory_workbench_with_browser_surface_keeps_small_default_allowlist() { - let expected_catalog = tool_catalog_entries_for_surface( - WorkspaceToolSurface::workbench_with_browser_assist(), - ); + let expected_catalog = + tool_catalog_entries_for_surface(WorkspaceToolSurface::workbench_with_browser_assist()); let inventory = build_tool_inventory(AgentToolInventoryBuildInput { surface: WorkspaceToolSurface::workbench_with_browser_assist(), caller: "assistant".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/analysis_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/analysis_skill_launch.rs index 035a80359..b750a12d2 100644 --- a/src-tauri/src/commands/aster_agent_cmd/analysis_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/analysis_skill_launch.rs @@ -1,6 +1,13 @@ use super::*; const ANALYSIS_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const ANALYSIS_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +97,74 @@ pub(crate) fn merge_system_prompt_with_analysis_skill_launch( } } +pub(crate) fn should_lock_analysis_skill_launch_to_analysis( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["analysis_skill_launch", "analysisSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "analysis_request".to_string()) + == "analysis_request" +} + +pub(crate) fn append_analysis_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_analysis_skill_launch_to_analysis(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前分析技能启动回合生效".to_string()), + }] + }; + + for pattern in ANALYSIS_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1227, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "分析技能启动回合已锁定为 Skill(analysis) 主链,禁止先走工具目录/联网检索偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_analysis_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_analysis_skill_launch_to_analysis(request_metadata) { + return; + } + + for tool_name in ANALYSIS_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_analysis_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -145,8 +220,17 @@ fn build_analysis_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走分析技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(analysis) 真正执行前,不要先走 ToolSearch / WebSearch / Grep 等工具目录发现、联网检索或内容检索偏航。".to_string(), + "- 不要先搜索 “analysis”、“read_file” 或 “list_directory” 的目录信息;当前 analysis_request 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(analysis)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建 task file,也不要回退成普通聊天分析。".to_string(), "- 若用户明确给了正文、文件路径或范围,优先分析这些材料;若未明确给材料,则分析当前对话中与请求最相关的内容。".to_string(), + "- 如需处理本地路径或目录,只允许在 Skill(analysis) 内最小化使用 Read / Glob 确认必要内容;不要在进入 Skill 前先探测大量文件。".to_string(), "- 分析结果必须区分原文事实、你的判断与待确认项,不要把推断写成已确认事实。".to_string(), format!("- 当前分析请求上下文(JSON):{request_json}"), format!("- 当前入口来源:{entry_source}。"), diff --git a/src-tauri/src/commands/aster_agent_cmd/broadcast_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/broadcast_skill_launch.rs index eefaffdb0..9c8f0f601 100644 --- a/src-tauri/src/commands/aster_agent_cmd/broadcast_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/broadcast_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const BROADCAST_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const BROADCAST_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +101,74 @@ pub(crate) fn merge_system_prompt_with_broadcast_skill_launch( } } +pub(crate) fn should_lock_broadcast_skill_launch_to_broadcast_generation( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["broadcast_skill_launch", "broadcastSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "broadcast_task".to_string()) + == "broadcast_task" +} + +pub(crate) fn append_broadcast_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_broadcast_skill_launch_to_broadcast_generation(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前播报技能启动回合生效".to_string()), + }] + }; + + for pattern in BROADCAST_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1236, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "播报技能启动回合已锁定为 Skill(broadcast_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_broadcast_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_broadcast_skill_launch_to_broadcast_generation(request_metadata) { + return; + } + + for tool_name in BROADCAST_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_broadcast_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -152,6 +231,14 @@ fn build_broadcast_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走播报技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(broadcast_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “broadcast_generate”、“lime task create broadcast --json” 或 “lime_create_broadcast_generation_task” 之类目录信息;当前 broadcast_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(broadcast_generate)。".to_string(), "- Skill 执行后,优先沿 broadcast_generate skill 的 Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_broadcast_generation_task。".to_string(), "- 不要伪造“播报已完成”;在 task file 真正返回结果前,只能汇报任务已提交、排队或执行中。".to_string(), format!("- 当前播报任务上下文(JSON):{task_json}"), diff --git a/src-tauri/src/commands/aster_agent_cmd/cover_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/cover_skill_launch.rs index 29ae2953d..29fdef503 100644 --- a/src-tauri/src/commands/aster_agent_cmd/cover_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/cover_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const COVER_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const COVER_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -46,6 +57,74 @@ pub(crate) fn merge_system_prompt_with_cover_skill_launch( } } +pub(crate) fn should_lock_cover_skill_launch_to_cover_generation( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["cover_skill_launch", "coverSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "cover_task".to_string()) + == "cover_task" +} + +pub(crate) fn append_cover_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_cover_skill_launch_to_cover_generation(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前封面技能启动回合生效".to_string()), + }] + }; + + for pattern in COVER_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1238, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "封面技能启动回合已锁定为 Skill(cover_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_cover_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_cover_skill_launch_to_cover_generation(request_metadata) { + return; + } + + for tool_name in COVER_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_cover_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -98,6 +177,14 @@ fn build_cover_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走封面技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(cover_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “cover_generate”、“social_generate_cover_image” 或 “lime task create cover --json” 之类目录信息;当前 cover_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(cover_generate)。".to_string(), "- Skill 执行后,优先沿 cover_generate skill 的 social_generate_cover_image + Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_cover_generation_task。".to_string(), "- 不要把封面任务退化成普通配图,也不要伪造“封面已生成完成”;在 task file 真正返回结果前,只能汇报任务已提交、排队或执行中。".to_string(), format!("- 当前封面任务上下文(JSON):{cover_task_json}"), diff --git a/src-tauri/src/commands/aster_agent_cmd/deep_search_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/deep_search_skill_launch.rs index 89855bc6c..04a23ced7 100644 --- a/src-tauri/src/commands/aster_agent_cmd/deep_search_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/deep_search_skill_launch.rs @@ -1,6 +1,15 @@ use super::*; const DEEP_SEARCH_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const DEEP_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +99,74 @@ pub(crate) fn merge_system_prompt_with_deep_search_skill_launch( } } +pub(crate) fn should_lock_deep_search_skill_launch_to_prompt_search( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["deep_search_skill_launch", "deepSearchSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "deep_search_request".to_string()) + == "deep_search_request" +} + +pub(crate) fn append_deep_search_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_deep_search_skill_launch_to_prompt_search(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前深搜技能启动回合生效".to_string()), + }] + }; + + for pattern in DEEP_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1233, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "深搜技能启动回合已锁定为 Skill(research) 主链,禁止先走工具目录/本地文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_deep_search_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_deep_search_skill_launch_to_prompt_search(request_metadata) { + return; + } + + for tool_name in DEEP_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_deep_search_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -151,6 +228,14 @@ fn build_deep_search_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走深搜技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(research) 真正执行前,不要先走 ToolSearch / Read / Glob / Grep 等工具目录发现或本地文件链路。".to_string(), + "- 不要先搜索 “research”、“search_query” 或 “WebSearch” 的目录信息;当前 deep_search_request 已经提供了足够上下文。".to_string(), + "- 如果某个工具目录/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(research)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建 task file,也不要退回普通聊天、普通 @搜索 或一次浅搜。".to_string(), "- research skill 内部必须真正执行联网检索,不要只凭已有记忆直接回答。".to_string(), "- 深搜至少执行 2 轮以上扩搜,主动使用不同关键词组合、来源或时间切片;不能只搜一次就直接收尾。".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/form_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/form_skill_launch.rs new file mode 100644 index 000000000..c5a4616a3 --- /dev/null +++ b/src-tauri/src/commands/aster_agent_cmd/form_skill_launch.rs @@ -0,0 +1,274 @@ +use super::*; + +const FORM_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const FORM_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; + +fn extract_object_string( + object: &serde_json::Map, + keys: &[&str], +) -> Option { + keys.iter() + .filter_map(|key| object.get(*key)) + .find_map(serde_json::Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) +} + +fn extract_object_u64( + object: &serde_json::Map, + keys: &[&str], +) -> Option { + keys.iter() + .filter_map(|key| object.get(*key)) + .find_map(|value| { + value + .as_u64() + .or_else(|| value.as_i64().map(|raw| raw.max(0) as u64)) + }) + .filter(|value| *value > 0) +} + +fn ensure_harness_workbench_chat_mode(value: &mut serde_json::Value, launch_keys: &[&str]) { + let Some(root) = value.as_object_mut() else { + return; + }; + let harness = if root.contains_key("harness") { + match root + .get_mut("harness") + .and_then(serde_json::Value::as_object_mut) + { + Some(harness) => harness, + None => return, + } + } else { + root + }; + + let has_launch = launch_keys.iter().any(|key| { + harness + .get(*key) + .and_then(serde_json::Value::as_object) + .is_some() + }); + if !has_launch { + return; + } + + harness.insert( + "chat_mode".to_string(), + serde_json::Value::String("workbench".to_string()), + ); +} + +fn truncate_prompt_text(value: String, max_chars: usize) -> String { + let total_chars = value.chars().count(); + if total_chars <= max_chars { + return value; + } + + let truncated = value.chars().take(max_chars).collect::(); + format!("{truncated}...(已截断,原始长度 {total_chars} 字)") +} + +pub(crate) fn prepare_form_skill_launch_request_metadata( + request_metadata: Option<&serde_json::Value>, +) -> Option { + let mut metadata = request_metadata.cloned()?; + ensure_harness_workbench_chat_mode(&mut metadata, &["form_skill_launch", "formSkillLaunch"]); + + Some(metadata) +} + +pub(crate) fn merge_system_prompt_with_form_skill_launch( + base_prompt: Option, + request_metadata: Option<&serde_json::Value>, +) -> Option { + let Some(launch_prompt) = build_form_skill_launch_system_prompt(request_metadata) else { + return base_prompt; + }; + + match base_prompt { + Some(base) => { + if base.contains(FORM_SKILL_LAUNCH_PROMPT_MARKER) { + Some(base) + } else if base.trim().is_empty() { + Some(launch_prompt) + } else { + Some(format!("{base}\n\n{launch_prompt}")) + } + } + None => Some(launch_prompt), + } +} + +pub(crate) fn should_lock_form_skill_launch_to_form_generate( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = + extract_harness_nested_object(request_metadata, &["form_skill_launch", "formSkillLaunch"]) + else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "form_request".to_string()) + == "form_request" +} + +pub(crate) fn append_form_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_form_skill_launch_to_form_generate(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前表单生成技能启动回合生效".to_string()), + }] + }; + + for pattern in FORM_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1225, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "表单生成技能启动回合已锁定为 Skill(form_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_form_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_form_skill_launch_to_form_generate(request_metadata) { + return; + } + + for tool_name in FORM_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + +fn build_form_skill_launch_system_prompt( + request_metadata: Option<&serde_json::Value>, +) -> Option { + let launch = + extract_harness_nested_object(request_metadata, &["form_skill_launch", "formSkillLaunch"])?; + let kind = + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "form_request".to_string()); + if kind != "form_request" { + return None; + } + + let skill_name = extract_object_string(launch, &["skill_name", "skillName"]) + .unwrap_or_else(|| "form_generate".to_string()); + let form_request = launch + .get("form_request") + .and_then(serde_json::Value::as_object)?; + let raw_text = extract_object_string(form_request, &["raw_text", "rawText"]); + let prompt = extract_object_string(form_request, &["prompt"]) + .unwrap_or_else(|| "请生成一个可直接使用的 A2UI 表单".to_string()); + let content = extract_object_string(form_request, &["content"]); + let form_type = extract_object_string(form_request, &["form_type", "formType"]); + let style = extract_object_string(form_request, &["style"]); + let audience = extract_object_string(form_request, &["audience"]); + let field_count = extract_object_u64(form_request, &["field_count", "fieldCount"]); + let project_id = extract_object_string(form_request, &["project_id", "projectId"]); + let content_id = extract_object_string(form_request, &["content_id", "contentId"]); + let entry_source = extract_object_string(form_request, &["entry_source", "entrySource"]) + .unwrap_or_else(|| "at_form_command".to_string()); + let args_payload = serde_json::json!({ + "user_input": raw_text.clone().unwrap_or_else(|| prompt.clone()), + "form_request": serde_json::Value::Object(form_request.clone()), + }); + let args_json = truncate_prompt_text( + serde_json::to_string(&args_payload).unwrap_or_else(|_| "{}".to_string()), + 4_000, + ); + let request_json = truncate_prompt_text( + serde_json::to_string(form_request).unwrap_or_else(|_| "{}".to_string()), + 4_000, + ); + + let mut lines = vec![ + FORM_SKILL_LAUNCH_PROMPT_MARKER.to_string(), + "- 当前回合来自表单生成技能启动,不要把它当成普通聊天回答。".to_string(), + "- 先快速归纳用户的表单目标,然后立刻把任务交给 Skill 工具;不要停留在泛泛解释。".to_string(), + format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), + "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), + format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走表单生成技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(form_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 目标是复用 Lime 现有 A2UI 协议输出一份真实可渲染的表单,不要退回纯文本问题列表,也不要输出另一套自定义表单 DSL。".to_string(), + "- 最终结果必须输出一个 ```a2ui 代码块,并在代码块内放一份可被现有 A2UI parser 识别的 JSON。".to_string(), + "- 优先输出简化表单格式:{ \"type\": \"form\", \"title\": \"...\", \"description\": \"...\", \"fields\": [...], \"submitLabel\": \"提交\" }。".to_string(), + "- 字段类型只允许使用 simple form 已支持的 choice / text / slider / checkbox;不要发明 DatePicker、FileUpload 等当前 simple form 还未支持的字段。".to_string(), + "- 若用户要求报名/线索表单,应至少包含联系人字段与隐私同意 checkbox;若是问卷/反馈表单,应优先使用 choice、slider 和 text 组合。".to_string(), + "- 如信息不足,最多追问 1 个关键问题;除非真的缺失目标,否则不要停在追问。".to_string(), + format!("- 当前表单请求上下文(JSON):{request_json}"), + format!("- 当前入口来源:{entry_source}。"), + ]; + + lines.push(format!("- 当前表单目标:{prompt}")); + if let Some(value) = content.as_deref() { + lines.push(format!( + "- 当前原始命令摘要:{}", + truncate_prompt_text(value.to_string(), 400) + )); + } + if let Some(value) = form_type.as_deref() { + lines.push(format!("- 当前表单类型:{value}。")); + } + if let Some(value) = style.as_deref() { + lines.push(format!("- 当前风格要求:{value}。")); + } + if let Some(value) = audience.as_deref() { + lines.push(format!("- 当前目标受众:{value}。")); + } + if let Some(value) = field_count { + lines.push(format!("- 目标字段数:{value}。")); + } + if let Some(value) = project_id.as_deref() { + lines.push(format!("- 当前项目 ID:{value}。")); + } + if let Some(value) = content_id.as_deref() { + lines.push(format!("- 当前内容 ID:{value}。")); + } + lines.push("- 不要输出 ``、HTML、Markdown 表格或伪代码来替代 A2UI;这次需要直接复用现有 A2UI 渲染链。".to_string()); + + Some(lines.join("\n")) +} diff --git a/src-tauri/src/commands/aster_agent_cmd/image_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/image_skill_launch.rs index d513ba308..6d6f4a7dc 100644 --- a/src-tauri/src/commands/aster_agent_cmd/image_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/image_skill_launch.rs @@ -4,6 +4,18 @@ use std::fs; use std::path::{Path, PathBuf}; const IMAGE_SKILL_INPUT_REF_PREFIX: &str = "skill-input-image://"; +pub(super) const IMAGE_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const IMAGE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -254,6 +266,74 @@ pub(crate) fn merge_system_prompt_with_image_skill_launch( } } +pub(crate) fn should_lock_image_skill_launch_to_image_generation( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["image_skill_launch", "imageSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "image_task".to_string()) + == "image_task" +} + +pub(crate) fn append_image_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_image_skill_launch_to_image_generation(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前图片技能启动回合生效".to_string()), + }] + }; + + for pattern in IMAGE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1240, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "图片技能启动回合已锁定为 Skill(image_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_image_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_image_skill_launch_to_image_generation(request_metadata) { + return; + } + + for tool_name in IMAGE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_image_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -309,7 +389,16 @@ fn build_image_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走图片技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(image_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “Skill image_generate”、“lime media image generate --json”、“lime_create_image_generation_task” 之类目录信息;当前 image_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(image_generate)。".to_string(), "- Skill 执行后,优先沿 image_generate skill 的 Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_image_generation_task。".to_string(), + "- 如果回退到 lime_create_image_generation_task,也必须只提交标准 image task 参数;不要传 outputPath,不要把任务写成 markdown 文稿。".to_string(), "- 不要伪造“图片已生成完成”;在 task file 真正返回结果前,只能汇报任务已提交、排队或执行中。".to_string(), format!("- 当前图片任务上下文(JSON):{image_task_json}"), format!("- 当前模式:{mode}。"), diff --git a/src-tauri/src/commands/aster_agent_cmd/mod.rs b/src-tauri/src/commands/aster_agent_cmd/mod.rs index e35c7f5b9..544f7b416 100644 --- a/src-tauri/src/commands/aster_agent_cmd/mod.rs +++ b/src-tauri/src/commands/aster_agent_cmd/mod.rs @@ -149,7 +149,6 @@ const SOCIAL_IMAGE_DEFAULT_SIZE: &str = "1024x1024"; const SOCIAL_IMAGE_DEFAULT_RESPONSE_FORMAT: &str = "url"; const AUTO_CONTINUE_PROMPT_MARKER: &str = "【自动续写策略】"; const ELICITATION_CONTEXT_PROMPT_MARKER: &str = "【已收集的补充信息】"; -const IMAGE_SKILL_LAUNCH_PROMPT_MARKER: &str = "【图片技能启动】"; const SERVICE_SKILL_LAUNCH_PROMPT_MARKER: &str = "【站点技能启动】"; const SERVICE_SKILL_LAUNCH_PRELOAD_PROMPT_MARKER: &str = "【站点技能预执行结果】"; const TEAM_PREFERENCE_PROMPT_MARKER: &str = "【Team 协作偏好】"; @@ -265,9 +264,11 @@ pub(crate) mod command_api; mod cover_skill_launch; mod deep_search_skill_launch; mod dto; +mod form_skill_launch; mod image_skill_launch; mod mcp_bridge; mod pdf_read_skill_launch; +mod presentation_skill_launch; mod prompt_context; mod reply_runtime; mod report_skill_launch; @@ -287,6 +288,7 @@ mod translation_skill_launch; mod typesetting_skill_launch; mod url_parse_skill_launch; mod video_skill_launch; +mod webpage_skill_launch; #[cfg(test)] use self::subagent_runtime::{ build_subagent_customization_state, build_subagent_customization_system_prompt, @@ -306,11 +308,15 @@ pub(crate) use action_runtime::{ validate_elicitation_submission, }; pub(crate) use analysis_skill_launch::{ + append_analysis_skill_launch_session_permissions, merge_system_prompt_with_analysis_skill_launch, prepare_analysis_skill_launch_request_metadata, + prune_analysis_skill_launch_detour_tools_from_registry, }; pub(crate) use broadcast_skill_launch::{ + append_broadcast_skill_launch_session_permissions, merge_system_prompt_with_broadcast_skill_launch, prepare_broadcast_skill_launch_request_metadata, + prune_broadcast_skill_launch_detour_tools_from_registry, }; pub(crate) use browser_assist::{ append_browser_assist_session_permissions, apply_browser_requirement_to_request_tool_policy, @@ -337,10 +343,15 @@ pub(crate) use command_api::{ agent_runtime_update_session, agent_runtime_wait_subagents, aster_agent_configure_from_pool, aster_agent_configure_provider, aster_agent_init, aster_agent_reset, aster_agent_status, }; -pub(crate) use cover_skill_launch::merge_system_prompt_with_cover_skill_launch; +pub(crate) use cover_skill_launch::{ + append_cover_skill_launch_session_permissions, merge_system_prompt_with_cover_skill_launch, + prune_cover_skill_launch_detour_tools_from_registry, +}; pub(crate) use deep_search_skill_launch::{ + append_deep_search_skill_launch_session_permissions, merge_system_prompt_with_deep_search_skill_launch, prepare_deep_search_skill_launch_request_metadata, + prune_deep_search_skill_launch_detour_tools_from_registry, }; #[allow(unused_imports)] pub(crate) use dto::{ @@ -361,12 +372,26 @@ pub(crate) use dto::{ AgentRuntimeWaitSubagentsRequest, AgentRuntimeWaitSubagentsResponse, AsterAgentStatus, AsterChatRequest, AutoContinuePayload, ConfigureFromPoolRequest, ConfigureProviderRequest, }; +pub(crate) use form_skill_launch::{ + append_form_skill_launch_session_permissions, merge_system_prompt_with_form_skill_launch, + prepare_form_skill_launch_request_metadata, prune_form_skill_launch_detour_tools_from_registry, +}; pub(crate) use image_skill_launch::{ - merge_system_prompt_with_image_skill_launch, prepare_image_skill_launch_request_metadata, + append_image_skill_launch_session_permissions, merge_system_prompt_with_image_skill_launch, + prepare_image_skill_launch_request_metadata, + prune_image_skill_launch_detour_tools_from_registry, }; pub(crate) use mcp_bridge::{ensure_lime_mcp_servers_running, inject_mcp_extensions}; pub(crate) use pdf_read_skill_launch::{ + append_pdf_read_skill_launch_session_permissions, merge_system_prompt_with_pdf_read_skill_launch, prepare_pdf_read_skill_launch_request_metadata, + prune_pdf_read_skill_launch_detour_tools_from_registry, +}; +pub(crate) use presentation_skill_launch::{ + append_presentation_skill_launch_session_permissions, + merge_system_prompt_with_presentation_skill_launch, + prepare_presentation_skill_launch_request_metadata, + prune_presentation_skill_launch_detour_tools_from_registry, }; #[cfg(test)] pub(crate) use prompt_context::build_team_preference_system_prompt; @@ -384,15 +409,21 @@ use reply_runtime::{ should_fallback_to_react_from_code_orchestrated, stream_reply_once, }; pub(crate) use report_skill_launch::{ - merge_system_prompt_with_report_skill_launch, prepare_report_skill_launch_request_metadata, + append_report_skill_launch_session_permissions, merge_system_prompt_with_report_skill_launch, + prepare_report_skill_launch_request_metadata, + prune_report_skill_launch_detour_tools_from_registry, }; use request_model_resolution::resolve_runtime_request_provider_config; pub(crate) use research_skill_launch::{ + append_research_skill_launch_session_permissions, merge_system_prompt_with_research_skill_launch, prepare_research_skill_launch_request_metadata, + prune_research_skill_launch_detour_tools_from_registry, }; pub(crate) use resource_search_skill_launch::{ + append_resource_search_skill_launch_session_permissions, merge_system_prompt_with_resource_search_skill_launch, prepare_resource_search_skill_launch_request_metadata, + prune_resource_search_skill_launch_detour_tools_from_registry, }; use run_metadata::{ build_chat_run_finish_metadata, build_chat_run_metadata_base, extract_harness_array, @@ -424,8 +455,10 @@ pub(crate) use session_runtime::{ SessionRecentRuntimeContext, }; pub(crate) use site_search_skill_launch::{ + append_site_search_skill_launch_session_permissions, merge_system_prompt_with_site_search_skill_launch, prepare_site_search_skill_launch_request_metadata, + prune_site_search_skill_launch_detour_tools_from_registry, }; #[allow(unused_imports)] pub(crate) use subagent_runtime::{ @@ -435,7 +468,9 @@ pub(crate) use subagent_runtime::{ maybe_emit_subagent_status_for_runtime_event, SubagentControlRuntime, }; pub(crate) use summary_skill_launch::{ - merge_system_prompt_with_summary_skill_launch, prepare_summary_skill_launch_request_metadata, + append_summary_skill_launch_session_permissions, merge_system_prompt_with_summary_skill_launch, + prepare_summary_skill_launch_request_metadata, + prune_summary_skill_launch_detour_tools_from_registry, }; #[allow(unused_imports)] pub(crate) use tool_runtime::social_generate_cover_image_cmd; @@ -452,17 +487,38 @@ pub(crate) use tool_runtime::{ ensure_browser_mcp_tools_registered, ensure_creation_task_tools_registered, ensure_runtime_support_tools_registered, ensure_social_image_tool_registered, }; -pub(crate) use transcription_skill_launch::merge_system_prompt_with_transcription_skill_launch; +pub(crate) use transcription_skill_launch::{ + append_transcription_skill_launch_session_permissions, + merge_system_prompt_with_transcription_skill_launch, + prune_transcription_skill_launch_detour_tools_from_registry, +}; pub(crate) use translation_skill_launch::{ + append_translation_skill_launch_session_permissions, merge_system_prompt_with_translation_skill_launch, prepare_translation_skill_launch_request_metadata, + prune_translation_skill_launch_detour_tools_from_registry, }; pub(crate) use typesetting_skill_launch::{ + append_typesetting_skill_launch_session_permissions, merge_system_prompt_with_typesetting_skill_launch, prepare_typesetting_skill_launch_request_metadata, + prune_typesetting_skill_launch_detour_tools_from_registry, +}; +pub(crate) use url_parse_skill_launch::{ + append_url_parse_skill_launch_session_permissions, + merge_system_prompt_with_url_parse_skill_launch, + prune_url_parse_skill_launch_detour_tools_from_registry, }; -pub(crate) use url_parse_skill_launch::merge_system_prompt_with_url_parse_skill_launch; pub(crate) use video_skill_launch::merge_system_prompt_with_video_skill_launch; +pub(crate) use video_skill_launch::{ + append_video_skill_launch_session_permissions, + prune_video_skill_launch_detour_tools_from_registry, +}; +pub(crate) use webpage_skill_launch::{ + append_webpage_skill_launch_session_permissions, merge_system_prompt_with_webpage_skill_launch, + prepare_webpage_skill_launch_request_metadata, + prune_webpage_skill_launch_detour_tools_from_registry, +}; pub async fn resume_persisted_runtime_queues_on_startup( app: AppHandle, diff --git a/src-tauri/src/commands/aster_agent_cmd/pdf_read_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/pdf_read_skill_launch.rs index d972bd1e6..b84ad6cd4 100644 --- a/src-tauri/src/commands/aster_agent_cmd/pdf_read_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/pdf_read_skill_launch.rs @@ -1,6 +1,13 @@ use super::*; const PDF_READ_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const PDF_READ_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +97,74 @@ pub(crate) fn merge_system_prompt_with_pdf_read_skill_launch( } } +pub(crate) fn should_lock_pdf_read_skill_launch_to_pdf_read( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["pdf_read_skill_launch", "pdfReadSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "pdf_read_request".to_string()) + == "pdf_read_request" +} + +pub(crate) fn append_pdf_read_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_pdf_read_skill_launch_to_pdf_read(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前读PDF技能启动回合生效".to_string()), + }] + }; + + for pattern in PDF_READ_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1230, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "读PDF技能启动回合已锁定为 Skill(pdf_read) 主链,禁止先走工具目录/联网搜索偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_pdf_read_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_pdf_read_skill_launch_to_pdf_read(request_metadata) { + return; + } + + for tool_name in PDF_READ_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_pdf_read_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -150,6 +225,14 @@ fn build_pdf_read_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走读PDF技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(pdf_read) 真正执行前,不要先走 ToolSearch / WebSearch / Grep 等工具目录发现、联网搜索或内容检索偏航。".to_string(), + "- 不要先搜索 “pdf_read”、“read_file” 或 “list_directory” 的目录信息;当前 pdf_read_request 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(pdf_read)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建 task file,也不要退回普通聊天凭空回答。".to_string(), "- 若拿到本地或工作区 PDF 路径,优先最小化使用 `list_directory / read_file` 读取目标 PDF,并保留真实 tool timeline。".to_string(), "- 若路径是相对路径,可先用 `list_directory` 确认位置,再调用 `read_file`;不要假装文件已经读取成功。".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/presentation_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/presentation_skill_launch.rs new file mode 100644 index 000000000..1bb9b6985 --- /dev/null +++ b/src-tauri/src/commands/aster_agent_cmd/presentation_skill_launch.rs @@ -0,0 +1,280 @@ +use super::*; + +const PRESENTATION_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const PRESENTATION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; + +fn extract_object_string( + object: &serde_json::Map, + keys: &[&str], +) -> Option { + keys.iter() + .filter_map(|key| object.get(*key)) + .find_map(serde_json::Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) +} + +fn extract_object_u64( + object: &serde_json::Map, + keys: &[&str], +) -> Option { + keys.iter() + .filter_map(|key| object.get(*key)) + .find_map(|value| { + value + .as_u64() + .or_else(|| value.as_i64().map(|raw| raw.max(0) as u64)) + }) + .filter(|value| *value > 0) +} + +fn ensure_harness_workbench_chat_mode(value: &mut serde_json::Value, launch_keys: &[&str]) { + let Some(root) = value.as_object_mut() else { + return; + }; + let harness = if root.contains_key("harness") { + match root + .get_mut("harness") + .and_then(serde_json::Value::as_object_mut) + { + Some(harness) => harness, + None => return, + } + } else { + root + }; + + let has_launch = launch_keys.iter().any(|key| { + harness + .get(*key) + .and_then(serde_json::Value::as_object) + .is_some() + }); + if !has_launch { + return; + } + + harness.insert( + "chat_mode".to_string(), + serde_json::Value::String("workbench".to_string()), + ); +} + +fn truncate_prompt_text(value: String, max_chars: usize) -> String { + let total_chars = value.chars().count(); + if total_chars <= max_chars { + return value; + } + + let truncated = value.chars().take(max_chars).collect::(); + format!("{truncated}...(已截断,原始长度 {total_chars} 字)") +} + +pub(crate) fn prepare_presentation_skill_launch_request_metadata( + request_metadata: Option<&serde_json::Value>, +) -> Option { + let mut metadata = request_metadata.cloned()?; + ensure_harness_workbench_chat_mode( + &mut metadata, + &["presentation_skill_launch", "presentationSkillLaunch"], + ); + + Some(metadata) +} + +pub(crate) fn merge_system_prompt_with_presentation_skill_launch( + base_prompt: Option, + request_metadata: Option<&serde_json::Value>, +) -> Option { + let Some(launch_prompt) = build_presentation_skill_launch_system_prompt(request_metadata) + else { + return base_prompt; + }; + + match base_prompt { + Some(base) => { + if base.contains(PRESENTATION_SKILL_LAUNCH_PROMPT_MARKER) { + Some(base) + } else if base.trim().is_empty() { + Some(launch_prompt) + } else { + Some(format!("{base}\n\n{launch_prompt}")) + } + } + None => Some(launch_prompt), + } +} + +pub(crate) fn should_lock_presentation_skill_launch_to_presentation_generate( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["presentation_skill_launch", "presentationSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "presentation_request".to_string()) + == "presentation_request" +} + +pub(crate) fn append_presentation_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_presentation_skill_launch_to_presentation_generate(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前演示稿生成技能启动回合生效".to_string()), + }] + }; + + for pattern in PRESENTATION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1224, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "演示稿生成技能启动回合已锁定为 Skill(presentation_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_presentation_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_presentation_skill_launch_to_presentation_generate(request_metadata) { + return; + } + + for tool_name in PRESENTATION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + +fn build_presentation_skill_launch_system_prompt( + request_metadata: Option<&serde_json::Value>, +) -> Option { + let launch = extract_harness_nested_object( + request_metadata, + &["presentation_skill_launch", "presentationSkillLaunch"], + )?; + let kind = extract_object_string(launch, &["kind"]) + .unwrap_or_else(|| "presentation_request".to_string()); + if kind != "presentation_request" { + return None; + } + + let skill_name = extract_object_string(launch, &["skill_name", "skillName"]) + .unwrap_or_else(|| "presentation_generate".to_string()); + let presentation_request = launch + .get("presentation_request") + .and_then(serde_json::Value::as_object)?; + let raw_text = extract_object_string(presentation_request, &["raw_text", "rawText"]); + let prompt = extract_object_string(presentation_request, &["prompt"]) + .unwrap_or_else(|| "请生成一份可直接讲述的演示文稿草稿".to_string()); + let content = extract_object_string(presentation_request, &["content"]); + let deck_type = extract_object_string(presentation_request, &["deck_type", "deckType"]); + let style = extract_object_string(presentation_request, &["style"]); + let audience = extract_object_string(presentation_request, &["audience"]); + let slide_count = extract_object_u64(presentation_request, &["slide_count", "slideCount"]); + let project_id = extract_object_string(presentation_request, &["project_id", "projectId"]); + let content_id = extract_object_string(presentation_request, &["content_id", "contentId"]); + let entry_source = + extract_object_string(presentation_request, &["entry_source", "entrySource"]) + .unwrap_or_else(|| "at_presentation_command".to_string()); + let args_payload = serde_json::json!({ + "user_input": raw_text.clone().unwrap_or_else(|| prompt.clone()), + "presentation_request": serde_json::Value::Object(presentation_request.clone()), + }); + let args_json = truncate_prompt_text( + serde_json::to_string(&args_payload).unwrap_or_else(|_| "{}".to_string()), + 4_000, + ); + let request_json = truncate_prompt_text( + serde_json::to_string(presentation_request).unwrap_or_else(|_| "{}".to_string()), + 4_000, + ); + + let mut lines = vec![ + PRESENTATION_SKILL_LAUNCH_PROMPT_MARKER.to_string(), + "- 当前回合来自演示稿生成技能启动,不要把它当成普通聊天回答。".to_string(), + "- 先快速归纳用户的演示目标,然后立刻把任务交给 Skill 工具;不要停留在泛泛解释。".to_string(), + format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), + "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), + format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走演示稿生成技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(presentation_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 当前命令的目标是产出真实演示稿 artifact,不要先退回空泛大纲,也不要只给口头建议。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(presentation_generate)。".to_string(), + "- Skill 执行时必须产出一个可预览、可继续导出的单文件演示稿,并通过 落到工作区。".to_string(), + "- 不要伪造“演示稿已生成”但没有实际文件;如果信息不足,最多追问 1 个关键问题。".to_string(), + format!("- 当前演示请求上下文(JSON):{request_json}"), + format!("- 当前入口来源:{entry_source}。"), + ]; + + lines.push(format!("- 当前演示目标:{prompt}")); + if let Some(value) = content.as_deref() { + lines.push(format!( + "- 当前原始命令摘要:{}", + truncate_prompt_text(value.to_string(), 400) + )); + } + if let Some(value) = deck_type.as_deref() { + lines.push(format!("- 当前演示类型:{value}。")); + } + if let Some(value) = style.as_deref() { + lines.push(format!("- 当前风格要求:{value}。")); + } + if let Some(value) = audience.as_deref() { + lines.push(format!("- 当前受众:{value}。")); + } + if let Some(value) = slide_count { + lines.push(format!("- 当前目标页数:{value} 页。")); + } + if let Some(value) = project_id.as_deref() { + lines.push(format!("- 当前 project_id:{value}。")); + } + if let Some(value) = content_id.as_deref() { + lines.push(format!("- 当前 content_id:{value}。")); + } + lines.push("- 当前任务已经显式进入演示稿生成技能主链。".to_string()); + + Some(lines.join("\n")) +} diff --git a/src-tauri/src/commands/aster_agent_cmd/report_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/report_skill_launch.rs index d114d680b..d677e6e81 100644 --- a/src-tauri/src/commands/aster_agent_cmd/report_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/report_skill_launch.rs @@ -1,6 +1,15 @@ use super::*; const REPORT_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const REPORT_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +99,74 @@ pub(crate) fn merge_system_prompt_with_report_skill_launch( } } +pub(crate) fn should_lock_report_skill_launch_to_report_generate( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["report_skill_launch", "reportSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "report_request".to_string()) + == "report_request" +} + +pub(crate) fn append_report_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_report_skill_launch_to_report_generate(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前研报技能启动回合生效".to_string()), + }] + }; + + for pattern in REPORT_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1232, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "研报技能启动回合已锁定为 Skill(report_generate) 主链,禁止先走工具目录/本地文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_report_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_report_skill_launch_to_report_generate(request_metadata) { + return; + } + + for tool_name in REPORT_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_report_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -150,6 +227,14 @@ fn build_report_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走研报技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(report_generate) 真正执行前,不要先走 ToolSearch / Read / Glob / Grep 等工具目录发现或本地文件链路。".to_string(), + "- 不要先搜索 “report_generate”、“search_query” 或 “WebSearch” 的目录信息;当前 report_request 已经提供了足够上下文。".to_string(), + "- 如果某个工具目录/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(report_generate)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建媒体 task file,也不要退回普通聊天写长文。".to_string(), "- report_generate skill 内部必须先执行真实联网检索,再产出研究报告。".to_string(), "- 如果用户要求最新、近期、今天或时间敏感信息,检索词里必须补年份或时间范围,并在结果中标注时间口径。".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/research_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/research_skill_launch.rs index c4e725fd1..98b4c808e 100644 --- a/src-tauri/src/commands/aster_agent_cmd/research_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/research_skill_launch.rs @@ -1,6 +1,15 @@ use super::*; const RESEARCH_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const RESEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +99,74 @@ pub(crate) fn merge_system_prompt_with_research_skill_launch( } } +pub(crate) fn should_lock_research_skill_launch_to_prompt_search( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["research_skill_launch", "researchSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "research_request".to_string()) + == "research_request" +} + +pub(crate) fn append_research_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_research_skill_launch_to_prompt_search(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前搜索技能启动回合生效".to_string()), + }] + }; + + for pattern in RESEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1234, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "搜索技能启动回合已锁定为 Skill(research) 主链,禁止先走工具目录/本地文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_research_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_research_skill_launch_to_prompt_search(request_metadata) { + return; + } + + for tool_name in RESEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_research_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -150,6 +227,14 @@ fn build_research_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走搜索技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(research) 真正执行前,不要先走 ToolSearch / Read / Glob / Grep 等工具目录发现或本地文件链路。".to_string(), + "- 不要先搜索 “research”、“search_query” 或 “WebSearch” 的目录信息;当前 research_request 已经提供了足够上下文。".to_string(), + "- 如果某个工具目录/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(research)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建媒体 task file,也不要回退成普通聊天搜索。".to_string(), "- research skill 内部必须真正执行联网检索,不要只凭已有记忆直接回答。".to_string(), "- 如果用户要求最新、近期、今天或时间敏感信息,检索词里必须补年份或时间范围,并在最终回答中标注时间口径。".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/resource_search_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/resource_search_skill_launch.rs index c86486bd4..170399adf 100644 --- a/src-tauri/src/commands/aster_agent_cmd/resource_search_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/resource_search_skill_launch.rs @@ -2,6 +2,17 @@ use super::*; const RESOURCE_SEARCH_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const RESOURCE_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -92,6 +103,74 @@ pub(crate) fn merge_system_prompt_with_resource_search_skill_launch( } } +pub(crate) fn should_lock_resource_search_skill_launch_to_modal_resource_search( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["resource_search_skill_launch", "resourceSearchSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "resource_search_task".to_string()) + == "resource_search_task" +} + +pub(crate) fn append_resource_search_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_resource_search_skill_launch_to_modal_resource_search(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前素材技能启动回合生效".to_string()), + }] + }; + + for pattern in RESOURCE_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1235, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "素材技能启动回合已锁定为 Skill(modal_resource_search) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_resource_search_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_resource_search_skill_launch_to_modal_resource_search(request_metadata) { + return; + } + + for tool_name in RESOURCE_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_resource_search_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -164,6 +243,14 @@ fn build_resource_search_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走素材技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(modal_resource_search) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “modal_resource_search”、“lime_search_web_images” 或 “lime task create resource-search --json” 之类目录信息;当前 resource_search_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(modal_resource_search)。".to_string(), format!("- 当前素材检索任务上下文(JSON):{task_json}"), format!("- 当前入口来源:{entry_source}。"), ]; diff --git a/src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs b/src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs index 27d515bb6..f7e40254f 100644 --- a/src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs +++ b/src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs @@ -471,10 +471,14 @@ async fn execute_aster_chat_request( request.metadata = prepare_deep_search_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_site_search_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_pdf_read_skill_launch_request_metadata(request.metadata.as_ref()); + request.metadata = + prepare_presentation_skill_launch_request_metadata(request.metadata.as_ref()); + request.metadata = prepare_form_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_summary_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_translation_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_analysis_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_typesetting_skill_launch_request_metadata(request.metadata.as_ref()); + request.metadata = prepare_webpage_skill_launch_request_metadata(request.metadata.as_ref()); request.metadata = prepare_service_scene_launch_request_metadata(request.metadata.as_ref()); let runtime_config = config_manager.config(); apply_web_search_runtime_env(&runtime_config); @@ -803,10 +807,28 @@ async fn execute_aster_chat_request( prompt_with_pdf_read_skill_launch.clone(), ); - let prompt_with_summary_skill_launch = merge_system_prompt_with_summary_skill_launch( + let prompt_with_presentation_skill_launch = merge_system_prompt_with_presentation_skill_launch( prompt_with_pdf_read_skill_launch, request.metadata.as_ref(), ); + turn_input_builder.apply_prompt_stage( + TurnPromptAugmentationStageKind::PresentationSkillLaunch, + prompt_with_presentation_skill_launch.clone(), + ); + + let prompt_with_form_skill_launch = merge_system_prompt_with_form_skill_launch( + prompt_with_presentation_skill_launch, + request.metadata.as_ref(), + ); + turn_input_builder.apply_prompt_stage( + TurnPromptAugmentationStageKind::FormSkillLaunch, + prompt_with_form_skill_launch.clone(), + ); + + let prompt_with_summary_skill_launch = merge_system_prompt_with_summary_skill_launch( + prompt_with_form_skill_launch, + request.metadata.as_ref(), + ); turn_input_builder.apply_prompt_stage( TurnPromptAugmentationStageKind::SummarySkillLaunch, prompt_with_summary_skill_launch.clone(), @@ -858,10 +880,19 @@ async fn execute_aster_chat_request( prompt_with_typesetting_skill_launch.clone(), ); - let prompt_with_service_skill_launch = merge_system_prompt_with_service_skill_launch( + let prompt_with_webpage_skill_launch = merge_system_prompt_with_webpage_skill_launch( prompt_with_typesetting_skill_launch, request.metadata.as_ref(), ); + turn_input_builder.apply_prompt_stage( + TurnPromptAugmentationStageKind::WebpageSkillLaunch, + prompt_with_webpage_skill_launch.clone(), + ); + + let prompt_with_service_skill_launch = merge_system_prompt_with_service_skill_launch( + prompt_with_webpage_skill_launch, + request.metadata.as_ref(), + ); turn_input_builder.apply_prompt_stage( TurnPromptAugmentationStageKind::ServiceSkillLaunch, prompt_with_service_skill_launch.clone(), @@ -1541,7 +1572,16 @@ async fn execute_aster_chat_request( tracing::warn!("[AsterAgent] 完成 turn 时间线失败(已降级继续): {}", error); } } - let done_event = RuntimeAgentEvent::FinalDone { usage: None }; + let usage = resolve_runtime_message_usage(session_id).await; + if let Some(ref usage) = usage { + if let Err(error) = persist_latest_assistant_message_usage(db, session_id, usage) { + tracing::warn!( + "[AsterAgent] 持久化消息 usage 失败(已降级继续): {}", + error + ); + } + } + let done_event = RuntimeAgentEvent::FinalDone { usage }; if let Err(e) = app.emit(&request.event_name, &done_event) { tracing::error!("[AsterAgent] 发送完成事件失败: {}", e); } @@ -1609,6 +1649,44 @@ async fn update_compaction_session_metrics( persist_compaction_session_metrics_update(&session_config.id, &update).await } +fn resolve_runtime_message_usage_from_session( + session: &aster::session::Session, +) -> Option { + match (session.input_tokens, session.output_tokens) { + (Some(input_tokens), Some(output_tokens)) if input_tokens >= 0 && output_tokens >= 0 => { + Some(lime_agent::AgentTokenUsage { + input_tokens: input_tokens as u32, + output_tokens: output_tokens as u32, + }) + } + _ => None, + } +} + +async fn resolve_runtime_message_usage(session_id: &str) -> Option { + let session = read_session(session_id, false, "读取会话 token 统计失败") + .await + .ok()?; + resolve_runtime_message_usage_from_session(&session) +} + +fn persist_latest_assistant_message_usage( + db: &DbConnection, + session_id: &str, + usage: &lime_agent::AgentTokenUsage, +) -> Result<(), String> { + let conn = db + .lock() + .map_err(|error| format!("更新消息 usage 时数据库锁定失败: {error}"))?; + lime_core::database::agent_session_repository::update_latest_assistant_message_usage( + &conn, + session_id, + usage.input_tokens, + usage.output_tokens, + )?; + Ok(()) +} + fn build_compaction_session_metrics_update( session: &aster::session::Session, session_config: &aster::agents::SessionConfig, diff --git a/src-tauri/src/commands/aster_agent_cmd/site_search_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/site_search_skill_launch.rs index 29023ddf9..c4f19def1 100644 --- a/src-tauri/src/commands/aster_agent_cmd/site_search_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/site_search_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const SITE_SEARCH_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const SITE_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +101,91 @@ pub(crate) fn merge_system_prompt_with_site_search_skill_launch( } } +pub(crate) fn should_lock_site_search_skill_launch_to_site_tools( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["site_search_skill_launch", "siteSearchSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "site_search_request".to_string()) + == "site_search_request" +} + +pub(crate) fn append_site_search_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_site_search_skill_launch_to_site_tools(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前站点搜索技能启动回合生效".to_string()), + }] + }; + + for pattern in SITE_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1231, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "站点搜索技能启动回合已锁定为 Skill(site_search) 主链,禁止先走通用搜索/本地文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } + + for pattern in super::service_skill_launch::service_skill_launch_browser_deny_patterns() { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1231, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "站点搜索技能启动回合应优先沿 lime_site_* 主链执行,禁止直接回退到底层浏览器兼容工具" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_site_search_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_site_search_skill_launch_to_site_tools(request_metadata) { + return; + } + + for tool_name in SITE_SEARCH_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_site_search_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -153,6 +249,14 @@ fn build_site_search_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走站点搜索技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(site_search) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用搜索、工具目录发现或本地文件链路。".to_string(), + "- 不要先搜索 “site_search”、“lime_site_run” 或 “lime_site_search” 的目录信息;当前 site_search_request 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(site_search)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建 task file,也不要退回普通 research / WebSearch。".to_string(), "- site_search skill 内部应优先沿 lime_site_info / lime_site_run / lime_site_search 主链执行,不要先改用 WebSearch、research、webReader 或底层浏览器工具替代。".to_string(), "- 若用户已明确指定站点,应优先在该站点的 adapter 范围内求解;只有 adapter 名不明确时,才允许先用 lime_site_search 缩小范围。".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/summary_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/summary_skill_launch.rs index 6641a9e5d..1af843240 100644 --- a/src-tauri/src/commands/aster_agent_cmd/summary_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/summary_skill_launch.rs @@ -1,6 +1,13 @@ use super::*; const SUMMARY_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const SUMMARY_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +97,74 @@ pub(crate) fn merge_system_prompt_with_summary_skill_launch( } } +pub(crate) fn should_lock_summary_skill_launch_to_summary( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["summary_skill_launch", "summarySkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "summary_request".to_string()) + == "summary_request" +} + +pub(crate) fn append_summary_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_summary_skill_launch_to_summary(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前总结技能启动回合生效".to_string()), + }] + }; + + for pattern in SUMMARY_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1229, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "总结技能启动回合已锁定为 Skill(summary) 主链,禁止先走工具目录/联网检索偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_summary_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_summary_skill_launch_to_summary(request_metadata) { + return; + } + + for tool_name in SUMMARY_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_summary_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -151,8 +226,17 @@ fn build_summary_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走总结技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(summary) 真正执行前,不要先走 ToolSearch / WebSearch / Grep 等工具目录发现、联网检索或内容检索偏航。".to_string(), + "- 不要先搜索 “summary”、“read_file” 或 “list_directory” 的目录信息;当前 summary_request 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(summary)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建 task file,也不要回退成普通聊天总结。".to_string(), "- 若用户明确给了正文、文件路径或范围,优先总结这些材料;若未明确给材料,则总结当前对话中与请求最相关的内容。".to_string(), + "- 如需处理本地路径或目录,只允许在 Skill(summary) 内最小化使用 Read / Glob 确认必要内容;不要在进入 Skill 前先探测大量文件。".to_string(), "- 结果必须忠于原文,不要补写原文没有的新事实;遇到信息缺失或歧义时,要单独标注待确认项。".to_string(), format!("- 当前总结请求上下文(JSON):{request_json}"), format!("- 当前入口来源:{entry_source}。"), diff --git a/src-tauri/src/commands/aster_agent_cmd/tests.rs b/src-tauri/src/commands/aster_agent_cmd/tests.rs index 8a37abc87..759ed4307 100644 --- a/src-tauri/src/commands/aster_agent_cmd/tests.rs +++ b/src-tauri/src/commands/aster_agent_cmd/tests.rs @@ -761,6 +761,1891 @@ mod tests { ); } + #[test] + fn test_append_image_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "image_skill_launch": { + "kind": "image_task", + "skill_name": "image_generate", + "image_task": { + "prompt": "生成一张夏日青柠汽水插图" + } + } + } + }); + let mut permissions = Vec::new(); + + append_image_skill_launch_session_permissions( + &mut permissions, + "session-image-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1240); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-image-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_image_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() { + let metadata = serde_json::json!({ + "harness": { + "image_skill_launch": { + "kind": "image_task", + "skill_name": "image_generate", + "image_task": { + "prompt": "生成一张夏日青柠汽水插图" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_image_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_cover_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "cover_skill_launch": { + "kind": "cover_task", + "skill_name": "cover_generate", + "cover_task": { + "prompt": "生成一张夏日青柠新品封面" + } + } + } + }); + let mut permissions = Vec::new(); + + append_cover_skill_launch_session_permissions( + &mut permissions, + "session-cover-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1238); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-cover-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_cover_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() { + let metadata = serde_json::json!({ + "harness": { + "cover_skill_launch": { + "kind": "cover_task", + "skill_name": "cover_generate", + "cover_task": { + "prompt": "生成一张夏日青柠新品封面" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_cover_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_video_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "video_skill_launch": { + "kind": "video_task", + "skill_name": "video_generate", + "video_task": { + "prompt": "生成一条夏日青柠新品短视频" + } + } + } + }); + let mut permissions = Vec::new(); + + append_video_skill_launch_session_permissions( + &mut permissions, + "session-video-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1237); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-video-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_video_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() { + let metadata = serde_json::json!({ + "harness": { + "video_skill_launch": { + "kind": "video_task", + "skill_name": "video_generate", + "video_task": { + "prompt": "生成一条夏日青柠新品短视频" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_video_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_broadcast_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "broadcast_skill_launch": { + "kind": "broadcast_task", + "skill_name": "broadcast_generate", + "broadcast_task": { + "prompt": "把新品发布稿整理成适合口播的文案" + } + } + } + }); + let mut permissions = Vec::new(); + + append_broadcast_skill_launch_session_permissions( + &mut permissions, + "session-broadcast-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1236); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-broadcast-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_broadcast_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() + { + let metadata = serde_json::json!({ + "harness": { + "broadcast_skill_launch": { + "kind": "broadcast_task", + "skill_name": "broadcast_generate", + "broadcast_task": { + "prompt": "把新品发布稿整理成适合口播的文案" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_broadcast_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_resource_search_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "resource_search_skill_launch": { + "kind": "resource_search_task", + "skill_name": "modal_resource_search", + "resource_search_task": { + "resource_type": "image", + "query": "咖啡馆木桌背景" + } + } + } + }); + let mut permissions = Vec::new(); + + append_resource_search_skill_launch_session_permissions( + &mut permissions, + "session-resource-search-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1235); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-resource-search-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_resource_search_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "resource_search_skill_launch": { + "kind": "resource_search_task", + "skill_name": "modal_resource_search", + "resource_search_task": { + "resource_type": "image", + "query": "咖啡馆木桌背景" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_resource_search_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_research_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "research_skill_launch": { + "kind": "research_request", + "skill_name": "research", + "research_request": { + "query": "AI Agent 融资" + } + } + } + }); + let mut permissions = Vec::new(); + + append_research_skill_launch_session_permissions( + &mut permissions, + "session-research-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1234); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-research-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_research_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() + { + let metadata = serde_json::json!({ + "harness": { + "research_skill_launch": { + "kind": "research_request", + "skill_name": "research", + "research_request": { + "query": "AI Agent 融资" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_research_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("WebSearch")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_deep_search_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "deep_search_skill_launch": { + "kind": "deep_search_request", + "skill_name": "research", + "deep_search_request": { + "query": "AI Agent 融资" + } + } + } + }); + let mut permissions = Vec::new(); + + append_deep_search_skill_launch_session_permissions( + &mut permissions, + "session-deep-search-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1233); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-deep-search-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_deep_search_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "deep_search_skill_launch": { + "kind": "deep_search_request", + "skill_name": "research", + "deep_search_request": { + "query": "AI Agent 融资" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_deep_search_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("WebSearch")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_report_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "report_skill_launch": { + "kind": "report_request", + "skill_name": "report_generate", + "report_request": { + "query": "AI Agent 融资" + } + } + } + }); + let mut permissions = Vec::new(); + + append_report_skill_launch_session_permissions( + &mut permissions, + "session-report-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1232); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-report-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_report_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() { + let metadata = serde_json::json!({ + "harness": { + "report_skill_launch": { + "kind": "report_request", + "skill_name": "report_generate", + "report_request": { + "query": "AI Agent 融资" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_report_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("WebSearch")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_site_search_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "site_search_skill_launch": { + "kind": "site_search_request", + "skill_name": "site_search", + "site_search_request": { + "site": "GitHub", + "query": "openai agents sdk issue" + } + } + } + }); + let mut permissions = Vec::new(); + + append_site_search_skill_launch_session_permissions( + &mut permissions, + "session-site-search-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1231); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-site-search-skill-1") + ); + + let browser_deny_rule = permissions + .iter() + .find(|permission| permission.tool == "mcp__lime-browser__*") + .expect("should add browser compat deny rule"); + assert!(!browser_deny_rule.allowed); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_site_search_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "site_search_skill_launch": { + "kind": "site_search_request", + "skill_name": "site_search", + "site_search_request": { + "site": "GitHub", + "query": "openai agents sdk issue" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "lime_site_run", + "Run site adapter", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_site_search_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(registry.contains("lime_site_run")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_pdf_read_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "pdf_read_skill_launch": { + "kind": "pdf_read_request", + "skill_name": "pdf_read", + "pdf_read_request": { + "source_path": "/tmp/agent-report.pdf" + } + } + } + }); + let mut permissions = Vec::new(); + + append_pdf_read_skill_launch_session_permissions( + &mut permissions, + "session-pdf-read-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1230); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-pdf-read-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + } + + #[test] + fn test_prune_pdf_read_skill_launch_detour_tools_from_registry_keeps_read_and_glob_tools() { + let metadata = serde_json::json!({ + "harness": { + "pdf_read_skill_launch": { + "kind": "pdf_read_request", + "skill_name": "pdf_read", + "pdf_read_request": { + "source_path": "/tmp/agent-report.pdf" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_pdf_read_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Read")); + assert!(registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_summary_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "summary_skill_launch": { + "kind": "summary_request", + "skill_name": "summary", + "summary_request": { + "prompt": "请总结这篇长文的三点要点", + "content": "这是一篇关于 AI Agent 融资的长文" + } + } + } + }); + let mut permissions = Vec::new(); + + append_summary_skill_launch_session_permissions( + &mut permissions, + "session-summary-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1229); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-summary-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + } + + #[test] + fn test_prune_summary_skill_launch_detour_tools_from_registry_keeps_read_and_glob_tools() { + let metadata = serde_json::json!({ + "harness": { + "summary_skill_launch": { + "kind": "summary_request", + "skill_name": "summary", + "summary_request": { + "prompt": "请总结这篇长文的三点要点", + "content": "这是一篇关于 AI Agent 融资的长文" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_summary_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Read")); + assert!(registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_translation_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "translation_skill_launch": { + "kind": "translation_request", + "skill_name": "translation", + "translation_request": { + "prompt": "将 hello world 翻译成中文", + "content": "hello world" + } + } + } + }); + let mut permissions = Vec::new(); + + append_translation_skill_launch_session_permissions( + &mut permissions, + "session-translation-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1228); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-translation-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + } + + #[test] + fn test_prune_translation_skill_launch_detour_tools_from_registry_keeps_read_and_glob_tools() { + let metadata = serde_json::json!({ + "harness": { + "translation_skill_launch": { + "kind": "translation_request", + "skill_name": "translation", + "translation_request": { + "prompt": "将 hello world 翻译成中文", + "content": "hello world" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_translation_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Read")); + assert!(registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_analysis_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "analysis_skill_launch": { + "kind": "analysis_request", + "skill_name": "analysis", + "analysis_request": { + "prompt": "判断 OpenAI 新模型发布的商业影响", + "content": "OpenAI 发布新模型" + } + } + } + }); + let mut permissions = Vec::new(); + + append_analysis_skill_launch_session_permissions( + &mut permissions, + "session-analysis-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1227); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-analysis-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(!permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + } + + #[test] + fn test_prune_analysis_skill_launch_detour_tools_from_registry_keeps_read_and_glob_tools() { + let metadata = serde_json::json!({ + "harness": { + "analysis_skill_launch": { + "kind": "analysis_request", + "skill_name": "analysis", + "analysis_request": { + "prompt": "判断 OpenAI 新模型发布的商业影响", + "content": "OpenAI 发布新模型" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_analysis_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Read")); + assert!(registry.contains("Glob")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_transcription_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "transcription_skill_launch": { + "kind": "transcription_task", + "skill_name": "transcription_generate", + "transcription_task": { + "prompt": "生成逐字稿", + "source_url": "https://example.com/interview.mp4" + } + } + } + }); + let mut permissions = Vec::new(); + + append_transcription_skill_launch_session_permissions( + &mut permissions, + "session-transcription-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1226); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-transcription-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_transcription_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "transcription_skill_launch": { + "kind": "transcription_task", + "skill_name": "transcription_generate", + "transcription_task": { + "prompt": "生成逐字稿", + "source_url": "https://example.com/interview.mp4" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_transcription_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_url_parse_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "url_parse_skill_launch": { + "kind": "url_parse_task", + "skill_name": "url_parse", + "url_parse_task": { + "prompt": "提取要点并整理成投资人可读摘要", + "url": "https://example.com/agent" + } + } + } + }); + let mut permissions = Vec::new(); + + append_url_parse_skill_launch_session_permissions( + &mut permissions, + "session-url-parse-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1225); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-url-parse-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_url_parse_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "url_parse_skill_launch": { + "kind": "url_parse_task", + "skill_name": "url_parse", + "url_parse_task": { + "prompt": "提取要点并整理成投资人可读摘要", + "url": "https://example.com/agent" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_url_parse_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_typesetting_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "typesetting_skill_launch": { + "kind": "typesetting_task", + "skill_name": "typesetting", + "typesetting_task": { + "prompt": "整理成更适合小红书阅读的短句节奏", + "content": "这是一段待排版正文", + "target_platform": "小红书" + } + } + } + }); + let mut permissions = Vec::new(); + + append_typesetting_skill_launch_session_permissions( + &mut permissions, + "session-typesetting-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1224); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-typesetting-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_typesetting_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "typesetting_skill_launch": { + "kind": "typesetting_task", + "skill_name": "typesetting", + "typesetting_task": { + "prompt": "整理成更适合小红书阅读的短句节奏", + "content": "这是一段待排版正文", + "target_platform": "小红书" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_typesetting_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_presentation_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "presentation_skill_launch": { + "kind": "presentation_request", + "skill_name": "presentation_generate", + "presentation_request": { + "prompt": "帮我做一个 AI 助手创业项目融资演示稿", + "content": "类型:路演PPT 风格:极简科技 受众:投资人 页数:10", + "deck_type": "pitch_deck", + "style": "极简科技", + "audience": "投资人", + "slide_count": 10 + } + } + } + }); + let mut permissions = Vec::new(); + + append_presentation_skill_launch_session_permissions( + &mut permissions, + "session-presentation-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1224); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-presentation-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_presentation_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools( + ) { + let metadata = serde_json::json!({ + "harness": { + "presentation_skill_launch": { + "kind": "presentation_request", + "skill_name": "presentation_generate", + "presentation_request": { + "prompt": "帮我做一个 AI 助手创业项目融资演示稿", + "deck_type": "pitch_deck" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_presentation_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_form_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "form_skill_launch": { + "kind": "form_request", + "skill_name": "form_generate", + "form_request": { + "prompt": "帮我做一个 AI Workshop 报名表", + "content": "类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8", + "form_type": "registration_form", + "style": "简洁专业", + "audience": "活动嘉宾", + "field_count": 8 + } + } + } + }); + let mut permissions = Vec::new(); + + append_form_skill_launch_session_permissions( + &mut permissions, + "session-form-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1225); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-form-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_form_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() { + let metadata = serde_json::json!({ + "harness": { + "form_skill_launch": { + "kind": "form_request", + "skill_name": "form_generate", + "form_request": { + "prompt": "帮我做一个用户调研问卷" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_form_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Skill")); + } + + #[test] + fn test_append_webpage_skill_launch_session_permissions_blocks_detour_tools() { + let metadata = serde_json::json!({ + "harness": { + "webpage_skill_launch": { + "kind": "webpage_request", + "skill_name": "webpage_generate", + "webpage_request": { + "prompt": "帮我做一个 AI 代码助手官网", + "content": "类型:落地页 风格:未来感", + "page_type": "landing_page", + "style": "未来感", + "tech_stack": "原生 HTML" + } + } + } + }); + let mut permissions = Vec::new(); + + append_webpage_skill_launch_session_permissions( + &mut permissions, + "session-webpage-skill-1", + Some(&metadata), + ); + + let tool_search_rule = permissions + .iter() + .find(|permission| permission.tool == TOOL_SEARCH_TOOL_NAME) + .expect("should add ToolSearch deny rule"); + assert!(!tool_search_rule.allowed); + assert_eq!(tool_search_rule.priority, 1223); + assert_eq!(tool_search_rule.conditions.len(), 1); + assert_eq!( + tool_search_rule.conditions[0].value, + serde_json::json!("session-webpage-skill-1") + ); + + assert!(permissions + .iter() + .any(|permission| permission.tool == "WebSearch" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Read" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Glob" && !permission.allowed)); + assert!(permissions + .iter() + .any(|permission| permission.tool == "Grep" && !permission.allowed)); + } + + #[test] + fn test_prune_webpage_skill_launch_detour_tools_from_registry_hides_tool_search_and_fs_tools() { + let metadata = serde_json::json!({ + "harness": { + "webpage_skill_launch": { + "kind": "webpage_request", + "skill_name": "webpage_generate", + "webpage_request": { + "prompt": "帮我做一个 AI 代码助手官网", + "page_type": "landing_page" + } + } + } + }); + let mut registry = aster::tools::ToolRegistry::new(); + registry.register(Box::new(DummyTool::new( + TOOL_SEARCH_TOOL_NAME, + "Search tools", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "WebSearch", + "Web search", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Read", + "Read file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Glob", + "Glob file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Grep", + "Grep file", + serde_json::json!({"type": "object"}), + ))); + registry.register(Box::new(DummyTool::new( + "Skill", + "Run skill", + serde_json::json!({"type": "object"}), + ))); + + prune_webpage_skill_launch_detour_tools_from_registry(&mut registry, Some(&metadata)); + + assert!(!registry.contains(TOOL_SEARCH_TOOL_NAME)); + assert!(!registry.contains("WebSearch")); + assert!(!registry.contains("Read")); + assert!(!registry.contains("Glob")); + assert!(!registry.contains("Grep")); + assert!(registry.contains("Skill")); + } + #[test] fn test_agent_runtime_submit_turn_request_maps_to_aster_chat_request() { let json = r#"{ @@ -1745,6 +3630,7 @@ mod tests { text: "hello".to_string(), }], timestamp: 0, + usage: None, }, }, "/tmp/workspace", @@ -1770,6 +3656,7 @@ mod tests { text: "hello".to_string(), }], timestamp: 0, + usage: None, }, }, "/tmp/workspace", @@ -2138,11 +4025,18 @@ mod tests { ) .expect("should contain merged prompt"); - assert!(merged.contains(IMAGE_SKILL_LAUNCH_PROMPT_MARKER)); + assert!(merged.contains( + super::image_skill_launch::IMAGE_SKILL_LAUNCH_PROMPT_MARKER + )); assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"image_generate\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"image_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(image_generate)")); + assert!(merged.contains("lime media image generate --json")); assert!(merged.contains("不要伪造“图片已生成完成”")); assert!(merged.contains("当前任务已经显式进入图片技能主链")); } @@ -2179,7 +4073,12 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"cover_generate\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"cover_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(cover_generate)")); + assert!(merged.contains("lime task create cover --json")); assert!(merged.contains("不要把封面任务退化成普通配图")); assert!(merged.contains("当前任务已经显式进入封面技能主链")); } @@ -2213,7 +4112,12 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"video_generate\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"video_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(video_generate)")); + assert!(merged.contains("lime media video generate --json")); assert!(merged.contains("不要伪造“视频已生成完成”")); assert!(merged.contains("当前任务已经显式进入视频技能主链")); } @@ -2248,7 +4152,11 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"transcription_generate\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"transcription_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(transcription_generate)")); assert!(merged.contains("不要伪造“转写已完成”")); assert!(merged.contains("当前任务已经显式进入转写技能主链")); } @@ -2284,7 +4192,12 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"broadcast_generate\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"broadcast_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(broadcast_generate)")); + assert!(merged.contains("lime task create broadcast --json")); assert!(merged.contains("不要伪造“播报已完成”")); assert!(merged.contains("当前任务已经显式进入播报技能主链")); } @@ -2319,9 +4232,12 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"modal_resource_search\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"resource_search_task\":")); assert!(merged.contains("lime_search_web_images")); - assert!(merged.contains("不要先走 ToolSearch / WebSearch / Grep")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(modal_resource_search)")); assert!(merged.contains("当前任务已经显式进入素材检索技能主链")); } @@ -2357,7 +4273,11 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"research\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"research_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(research)")); assert!(merged.contains("research skill 内部必须真正执行联网检索")); assert!(merged.contains("当前任务已经显式进入搜索技能主链")); } @@ -2391,8 +4311,14 @@ mod tests { .expect("should contain merged prompt"); assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"research\"")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"deep_search_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(research)")); assert!(merged.contains("深搜至少执行 2 轮以上扩搜")); assert!(merged.contains("已确认事实")); assert!(merged.contains("当前任务已经显式进入深搜技能主链")); @@ -2427,8 +4353,14 @@ mod tests { .expect("should contain merged prompt"); assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"report_generate\"")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"report_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(report_generate)")); assert!(merged.contains("report_generate skill 内部必须先执行真实联网检索")); assert!(merged.contains("核心结论、关键证据、风险/待确认项与建议动作")); assert!(merged.contains("当前任务已经显式进入研报技能主链")); @@ -2463,7 +4395,11 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"site_search\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"site_search_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(site_search)")); assert!(merged.contains("不要先改用 WebSearch、research")); assert!(merged.contains("当前任务已经显式进入站点搜索技能主链")); } @@ -2494,8 +4430,14 @@ mod tests { .expect("should contain merged prompt"); assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"pdf_read\"")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"pdf_read_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Grep")); + assert!(merged.contains("应立即改为直调 Skill(pdf_read)")); assert!(merged.contains("list_directory / read_file")); assert!(merged.contains("当前任务已经显式提供 PDF 路径")); } @@ -2528,8 +4470,15 @@ mod tests { .expect("should contain merged prompt"); assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("skill=\"summary\"")); assert!(merged.contains("\"summary_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Grep")); + assert!(merged.contains("应立即改为直调 Skill(summary)")); + assert!(merged.contains("Read / Glob")); assert!(merged.contains("结果必须忠于原文")); assert!(merged.contains("当前任务已经显式进入总结技能主链")); } @@ -2562,8 +4511,15 @@ mod tests { .expect("should contain merged prompt"); assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("skill=\"translation\"")); assert!(merged.contains("\"translation_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Grep")); + assert!(merged.contains("应立即改为直调 Skill(translation)")); + assert!(merged.contains("Read / Glob")); assert!(merged.contains("译文必须忠于原文")); assert!(merged.contains("当前任务已经显式进入翻译技能主链")); } @@ -2595,8 +4551,15 @@ mod tests { .expect("should contain merged prompt"); assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("skill=\"analysis\"")); assert!(merged.contains("\"analysis_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Grep")); + assert!(merged.contains("应立即改为直调 Skill(analysis)")); + assert!(merged.contains("Read / Glob")); assert!(merged.contains("分析结果必须区分原文事实、你的判断与待确认项")); assert!(merged.contains("当前任务已经显式进入分析技能主链")); } @@ -2901,7 +4864,11 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"url_parse\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"url_parse_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(url_parse)")); assert!(merged.contains("extractStatus 设为 pending_extract")); assert!(merged.contains("当前任务已经显式进入链接解析技能主链")); } @@ -2934,7 +4901,11 @@ mod tests { assert!(merged.contains("第一优先工具调用必须是 Skill")); assert!(merged.contains("skill=\"typesetting\"")); assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); assert!(merged.contains("\"typesetting_task\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(typesetting)")); assert!(merged.contains("不要伪造“排版已完成”")); assert!(merged.contains("当前任务已经显式进入排版技能主链")); } @@ -2966,6 +4937,206 @@ mod tests { ); } + #[test] + fn test_merge_system_prompt_with_presentation_skill_launch_appends_prompt() { + let metadata = serde_json::json!({ + "harness": { + "allow_model_skills": true, + "presentation_skill_launch": { + "skill_name": "presentation_generate", + "kind": "presentation_request", + "presentation_request": { + "prompt": "帮我做一个 AI 助手创业项目融资演示稿", + "raw_text": "@PPT 类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿", + "content": "类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿", + "deck_type": "pitch_deck", + "style": "极简科技", + "audience": "投资人", + "slide_count": 10 + } + } + } + }); + + let merged = merge_system_prompt_with_presentation_skill_launch( + Some("你是助手".to_string()), + Some(&metadata), + ) + .expect("should contain merged prompt"); + + assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); + assert!(merged.contains("skill=\"presentation_generate\"")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); + assert!(merged.contains("\"presentation_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(presentation_generate)")); + assert!(merged.contains("必须产出一个可预览、可继续导出的单文件演示稿")); + assert!(merged.contains("当前任务已经显式进入演示稿生成技能主链")); + } + + #[test] + fn test_prepare_presentation_skill_launch_request_metadata_sets_workbench_chat_mode() { + let metadata = serde_json::json!({ + "harness": { + "presentation_skill_launch": { + "skill_name": "presentation_generate", + "kind": "presentation_request", + "presentation_request": { + "prompt": "帮我做一版融资路演演示稿" + } + } + } + }); + + let prepared = prepare_presentation_skill_launch_request_metadata(Some(&metadata)) + .expect("prepared metadata"); + + let harness = prepared + .get("harness") + .and_then(serde_json::Value::as_object) + .expect("harness"); + assert_eq!( + harness.get("chat_mode").and_then(serde_json::Value::as_str), + Some("workbench") + ); + } + + #[test] + fn test_merge_system_prompt_with_webpage_skill_launch_appends_prompt() { + let metadata = serde_json::json!({ + "harness": { + "allow_model_skills": true, + "webpage_skill_launch": { + "skill_name": "webpage_generate", + "kind": "webpage_request", + "webpage_request": { + "prompt": "帮我做一个 AI 代码助手官网", + "raw_text": "@网页 类型:落地页 风格:未来感 帮我做一个 AI 代码助手官网", + "content": "类型:落地页 风格:未来感 帮我做一个 AI 代码助手官网", + "page_type": "landing_page", + "style": "未来感", + "tech_stack": "原生 HTML" + } + } + } + }); + + let merged = merge_system_prompt_with_webpage_skill_launch( + Some("你是助手".to_string()), + Some(&metadata), + ) + .expect("should contain merged prompt"); + + assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); + assert!(merged.contains("skill=\"webpage_generate\"")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); + assert!(merged.contains("\"webpage_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("应立即改为直调 Skill(webpage_generate)")); + assert!(merged.contains("必须产出一个可预览的单文件 HTML")); + assert!(merged.contains("当前任务已经显式进入网页生成技能主链")); + } + + #[test] + fn test_merge_system_prompt_with_form_skill_launch_appends_prompt() { + let metadata = serde_json::json!({ + "harness": { + "allow_model_skills": true, + "form_skill_launch": { + "skill_name": "form_generate", + "kind": "form_request", + "form_request": { + "prompt": "帮我做一个 AI Workshop 报名表", + "raw_text": "@表单 类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表", + "content": "类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表", + "form_type": "registration_form", + "style": "简洁专业", + "audience": "活动嘉宾", + "field_count": 8 + } + } + } + }); + + let merged = merge_system_prompt_with_form_skill_launch( + Some("你是助手".to_string()), + Some(&metadata), + ) + .expect("should contain merged prompt"); + + assert!(merged.contains("<>")); + assert!(merged.contains("第一优先工具调用必须是 Skill")); + assert!(merged.contains("skill=\"form_generate\"")); + assert!(merged.contains("Skill.args 的 JSON")); + assert!(merged.contains("第一工具调用示例(Skill 参数 JSON)")); + assert!(merged.contains("\"form_request\":")); + assert!(merged.contains("不要为了确认技能名、工具名或命令名再去调用 ToolSearch")); + assert!(merged.contains("不要先走 ToolSearch / WebSearch / Read / Glob / Grep")); + assert!(merged.contains("目标是复用 Lime 现有 A2UI 协议输出一份真实可渲染的表单")); + assert!(merged.contains("最终结果必须输出一个 ```a2ui 代码块")); + assert!(merged.contains("字段类型只允许使用 simple form 已支持的 choice / text / slider / checkbox")); + } + + #[test] + fn test_prepare_form_skill_launch_request_metadata_sets_workbench_chat_mode() { + let metadata = serde_json::json!({ + "harness": { + "form_skill_launch": { + "skill_name": "form_generate", + "kind": "form_request", + "form_request": { + "prompt": "帮我做一个活动报名表" + } + } + } + }); + + let prepared = prepare_form_skill_launch_request_metadata(Some(&metadata)) + .expect("prepared metadata"); + + let harness = prepared + .get("harness") + .and_then(serde_json::Value::as_object) + .expect("harness"); + assert_eq!( + harness.get("chat_mode").and_then(serde_json::Value::as_str), + Some("workbench") + ); + } + + #[test] + fn test_prepare_webpage_skill_launch_request_metadata_sets_workbench_chat_mode() { + let metadata = serde_json::json!({ + "harness": { + "webpage_skill_launch": { + "skill_name": "webpage_generate", + "kind": "webpage_request", + "webpage_request": { + "prompt": "帮我做一个产品落地页" + } + } + } + }); + + let prepared = prepare_webpage_skill_launch_request_metadata(Some(&metadata)) + .expect("prepared metadata"); + + let harness = prepared + .get("harness") + .and_then(serde_json::Value::as_object) + .expect("harness"); + assert_eq!( + harness.get("chat_mode").and_then(serde_json::Value::as_str), + Some("workbench") + ); + } + #[test] fn test_prepare_image_skill_launch_request_metadata_materializes_input_refs() { let temp_dir = TempDir::new().expect("temp dir"); @@ -4025,6 +6196,7 @@ mod tests { text: "子代理最终结论".to_string(), }], timestamp: 0, + usage: None, }], execution_strategy: None, execution_runtime: None, diff --git a/src-tauri/src/commands/aster_agent_cmd/tool_runtime.rs b/src-tauri/src/commands/aster_agent_cmd/tool_runtime.rs index a315abc44..426906c2e 100644 --- a/src-tauri/src/commands/aster_agent_cmd/tool_runtime.rs +++ b/src-tauri/src/commands/aster_agent_cmd/tool_runtime.rs @@ -203,6 +203,73 @@ pub(crate) async fn apply_workspace_sandbox_permissions( } append_browser_assist_session_permissions(&mut permissions, session_id, request_metadata); + append_image_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); + append_cover_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); + append_video_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); + append_broadcast_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_resource_search_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_research_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_deep_search_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_report_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); + append_site_search_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_pdf_read_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_presentation_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_form_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); + append_summary_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); + append_translation_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_analysis_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_transcription_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_url_parse_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_typesetting_skill_launch_session_permissions( + &mut permissions, + session_id, + request_metadata, + ); + append_webpage_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); append_service_skill_launch_session_permissions(&mut permissions, session_id, request_metadata); let (registry_arc, _) = resolve_agent_registry(state).await?; @@ -243,6 +310,25 @@ pub(crate) async fn apply_workspace_sandbox_permissions( config_manager.0.clone(), ); workspace_tools::wrap_registry_native_tools_for_workspace_runtime(&mut registry); + prune_image_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_cover_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_video_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_broadcast_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_resource_search_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_research_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_deep_search_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_report_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_site_search_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_pdf_read_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_presentation_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_form_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_summary_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_translation_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_analysis_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_transcription_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_url_parse_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_typesetting_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); + prune_webpage_skill_launch_detour_tools_from_registry(&mut registry, request_metadata); Ok(apply_outcome) } diff --git a/src-tauri/src/commands/aster_agent_cmd/tool_runtime/creation_tools.rs b/src-tauri/src/commands/aster_agent_cmd/tool_runtime/creation_tools.rs index 68779aaf3..b66509865 100644 --- a/src-tauri/src/commands/aster_agent_cmd/tool_runtime/creation_tools.rs +++ b/src-tauri/src/commands/aster_agent_cmd/tool_runtime/creation_tools.rs @@ -1,8 +1,16 @@ use super::*; +use crate::commands::media_task_cmd::{ + create_image_generation_task_artifact_inner, finalize_image_generation_task_creation, + CreateImageGenerationTaskArtifactRequest, +}; use lime_media_runtime::{ write_task_artifact, MediaTaskType, TaskRelationships, TaskType, TaskWriteOptions, }; +const PROJECT_ID_ENV_KEYS: &[&str] = &["LIME_PROJECT_ID", "PROXYCAST_PROJECT_ID"]; +const CONTENT_ID_ENV_KEYS: &[&str] = &["LIME_CONTENT_ID", "PROXYCAST_CONTENT_ID"]; +const IMAGE_TASK_DEFAULT_ENTRY_SOURCE: &str = "at_image_command"; + fn submit_creation_task_record( app_handle: &AppHandle, context: &ToolContext, @@ -384,6 +392,8 @@ struct ImageTaskInput { #[serde(default)] provider_id: Option, #[serde(default)] + model: Option, + #[serde(default)] session_id: Option, #[serde(default)] project_id: Option, @@ -459,6 +469,159 @@ impl LimeCreateImageTaskTool { } } +fn image_task_input_schema() -> serde_json::Value { + serde_json::json!({ + "type": "object", + "properties": { + "prompt": { "type": "string", "description": "图像提示词。" }, + "title": { "type": "string", "description": "任务标题(可选)。" }, + "mode": { "type": "string", "description": "任务模式 generate/edit/variation(可选)。" }, + "rawText": { "type": "string", "description": "原始用户输入(可选)。" }, + "style": { "type": "string", "description": "风格(可选)。" }, + "size": { "type": "string", "description": "尺寸(可选)。" }, + "aspectRatio": { "type": "string", "description": "宽高比(可选)。" }, + "count": { "type": "integer", "minimum": 1, "maximum": 20, "description": "生成数量(可选)。" }, + "usage": { "type": "string", "description": "用途(可选)。" }, + "providerId": { "type": "string", "description": "Provider 标识(可选)。" }, + "model": { "type": "string", "description": "首选模型(可选)。" }, + "sessionId": { "type": "string", "description": "会话 ID(可选)。" }, + "projectId": { "type": "string", "description": "项目 ID(可选)。" }, + "contentId": { "type": "string", "description": "内容 ID(可选)。" }, + "entrySource": { "type": "string", "description": "入口来源(可选)。" }, + "requestedTarget": { "type": "string", "description": "目标类型 generate/cover(可选)。" }, + "slotId": { "type": "string", "description": "正文插图 slot 绑定(可选)。" }, + "anchorHint": { "type": "string", "description": "正文插图锚点提示(可选)。" }, + "anchorSectionTitle": { "type": "string", "description": "正文插图小节标题(可选)。" }, + "anchorText": { "type": "string", "description": "正文插图锚点文本(可选)。" }, + "targetOutputId": { "type": "string", "description": "目标图片输出 ID(可选)。" }, + "targetOutputRefId": { "type": "string", "description": "目标图片引用 ID(可选)。" }, + "referenceImages": { + "type": "array", + "items": { "type": "string" }, + "description": "参考图 URL、文件路径或已物化的输入图片路径(可选)。" + } + }, + "required": ["prompt"], + "additionalProperties": false, + "x-lime": { + "always_visible": true, + "tags": ["image", "task", "generation"], + "allowed_callers": ["assistant", "skill"] + } + }) +} + +fn build_image_generation_task_request( + context: &ToolContext, + input: ImageTaskInput, +) -> CreateImageGenerationTaskArtifactRequest { + let ImageTaskInput { + prompt, + title, + mode, + raw_text, + style, + size, + aspect_ratio, + count, + usage, + provider_id, + model, + session_id, + project_id, + content_id, + entry_source, + requested_target, + slot_id, + anchor_hint, + anchor_section_title, + anchor_text, + target_output_id, + target_output_ref_id, + reference_images, + output_path, + } = input; + let _compat_ignored_output_path = output_path; + let session_id = session_id.or_else(|| { + let value = context.session_id.trim(); + if value.is_empty() { + None + } else { + Some(value.to_string()) + } + }); + let project_id = project_id.or_else(|| { + PROJECT_ID_ENV_KEYS.iter().find_map(|key| { + context + .environment + .get(*key) + .map(String::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToString::to_string) + }) + }); + let content_id = content_id.or_else(|| { + CONTENT_ID_ENV_KEYS.iter().find_map(|key| { + context + .environment + .get(*key) + .map(String::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToString::to_string) + }) + }); + let entry_source = entry_source.or_else(|| Some(IMAGE_TASK_DEFAULT_ENTRY_SOURCE.to_string())); + + CreateImageGenerationTaskArtifactRequest { + project_root_path: context.working_directory.to_string_lossy().to_string(), + prompt, + title, + mode, + raw_text, + size, + aspect_ratio, + count, + usage, + style, + provider_id, + model, + session_id, + project_id, + content_id, + entry_source, + requested_target, + slot_id, + anchor_hint, + anchor_section_title, + anchor_text, + target_output_id, + target_output_ref_id, + reference_images, + } +} + +fn submit_image_generation_task_record( + app_handle: &AppHandle, + context: &ToolContext, + input: ImageTaskInput, +) -> Result { + let request = build_image_generation_task_request(context, input); + let project_root_path = request.project_root_path.trim().to_string(); + let output = create_image_generation_task_artifact_inner(request) + .map_err(|error| ToolError::execution_failed(format!("创建图片任务失败: {error}")))?; + + finalize_image_generation_task_creation(Some(app_handle), project_root_path.as_str(), &output); + + let serialized = serde_json::to_string_pretty(&output) + .unwrap_or_else(|_| serde_json::json!(&output).to_string()); + Ok(media_cli_bridge::attach_media_task_metadata( + ToolResult::success(serialized), + &output, + )) +} + #[async_trait] impl Tool for LimeCreateImageTaskTool { fn name(&self) -> &str { @@ -470,45 +633,7 @@ impl Tool for LimeCreateImageTaskTool { } fn input_schema(&self) -> serde_json::Value { - serde_json::json!({ - "type": "object", - "properties": { - "prompt": { "type": "string", "description": "图像提示词。" }, - "title": { "type": "string", "description": "任务标题(可选)。" }, - "mode": { "type": "string", "description": "任务模式 generate/edit/variation(可选)。" }, - "rawText": { "type": "string", "description": "原始用户输入(可选)。" }, - "style": { "type": "string", "description": "风格(可选)。" }, - "size": { "type": "string", "description": "尺寸(可选)。" }, - "aspectRatio": { "type": "string", "description": "宽高比(可选)。" }, - "count": { "type": "integer", "minimum": 1, "maximum": 20, "description": "生成数量(可选)。" }, - "usage": { "type": "string", "description": "用途(可选)。" }, - "providerId": { "type": "string", "description": "Provider 标识(可选)。" }, - "sessionId": { "type": "string", "description": "会话 ID(可选)。" }, - "projectId": { "type": "string", "description": "项目 ID(可选)。" }, - "contentId": { "type": "string", "description": "内容 ID(可选)。" }, - "entrySource": { "type": "string", "description": "入口来源(可选)。" }, - "requestedTarget": { "type": "string", "description": "目标类型 generate/cover(可选)。" }, - "slotId": { "type": "string", "description": "正文插图 slot 绑定(可选)。" }, - "anchorHint": { "type": "string", "description": "正文插图锚点提示(可选)。" }, - "anchorSectionTitle": { "type": "string", "description": "正文插图小节标题(可选)。" }, - "anchorText": { "type": "string", "description": "正文插图锚点文本(可选)。" }, - "targetOutputId": { "type": "string", "description": "目标图片输出 ID(可选)。" }, - "targetOutputRefId": { "type": "string", "description": "目标图片引用 ID(可选)。" }, - "referenceImages": { - "type": "array", - "items": { "type": "string" }, - "description": "参考图 URL、文件路径或已物化的输入图片路径(可选)。" - }, - "outputPath": { "type": "string", "description": "可选输出路径(相对工作目录)。" } - }, - "required": ["prompt"], - "additionalProperties": false, - "x-lime": { - "always_visible": true, - "tags": ["image", "task", "generation"], - "allowed_callers": ["assistant", "skill"] - } - }) + image_task_input_schema() } async fn execute( @@ -523,39 +648,7 @@ impl Tool for LimeCreateImageTaskTool { "prompt 不能为空字符串".to_string(), )); } - let payload = serde_json::json!({ - "prompt": input.prompt, - "mode": input.mode, - "raw_text": input.raw_text, - "model": "lime-image-cli", - "style": input.style, - "size": input.size, - "aspect_ratio": input.aspect_ratio, - "count": input.count, - "usage": input.usage, - "provider_id": input.provider_id, - "session_id": input.session_id, - "project_id": input.project_id, - "content_id": input.content_id, - "entry_source": input.entry_source, - "requested_target": input.requested_target, - "slot_id": input.slot_id, - "anchor_hint": input.anchor_hint, - "anchor_section_title": input.anchor_section_title, - "anchor_text": input.anchor_text, - "target_output_id": input.target_output_id, - "target_output_ref_id": input.target_output_ref_id, - "reference_images": input.reference_images - }); - submit_media_generation_task_record( - &self.app_handle, - context, - MediaTaskType::ImageGenerate, - input.title, - payload, - Some("pending_submit".to_string()), - input.output_path.as_deref(), - ) + submit_image_generation_task_record(&self.app_handle, context, input) } } @@ -1066,3 +1159,131 @@ pub(crate) async fn ensure_creation_task_tools_registered( ); Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::Value; + use tempfile::tempdir; + + #[test] + fn image_task_input_schema_should_expose_model_and_hide_output_path() { + let schema = image_task_input_schema(); + let properties = schema + .get("properties") + .and_then(Value::as_object) + .expect("schema properties"); + + assert!(properties.contains_key("model")); + assert!(!properties.contains_key("outputPath")); + } + + #[test] + fn build_image_generation_task_request_should_ignore_output_path_and_keep_standard_artifact() { + let temp_dir = tempdir().expect("create temp dir"); + let context = ToolContext::new(temp_dir.path().to_path_buf()) + .with_session_id("session-image-compat-1") + .with_environment(std::collections::HashMap::from([ + ( + "LIME_PROJECT_ID".to_string(), + "project-image-compat-1".to_string(), + ), + ( + "LIME_CONTENT_ID".to_string(), + "content-image-compat-1".to_string(), + ), + ])); + let request = build_image_generation_task_request( + &context, + ImageTaskInput { + prompt: "未来感青柠实验室".to_string(), + title: Some("青柠主视觉".to_string()), + mode: Some("generate".to_string()), + raw_text: Some("@配图 未来感青柠实验室".to_string()), + style: Some("cinematic".to_string()), + size: Some("1024x1024".to_string()), + aspect_ratio: Some("1:1".to_string()), + count: Some(2), + usage: Some("document-inline".to_string()), + provider_id: Some("fal".to_string()), + model: Some("fal-ai/nano-banana-pro".to_string()), + session_id: None, + project_id: None, + content_id: None, + entry_source: None, + requested_target: Some("generate".to_string()), + slot_id: Some("slot-1".to_string()), + anchor_hint: Some("section_end".to_string()), + anchor_section_title: Some("技术亮点".to_string()), + anchor_text: Some("这里需要一张未来实验室配图".to_string()), + target_output_id: Some("task-a:output:1".to_string()), + target_output_ref_id: Some("img-1".to_string()), + reference_images: vec!["https://example.com/reference.png".to_string()], + output_path: Some("output/image_generation_task.md".to_string()), + }, + ); + + assert_eq!( + request.project_root_path, + temp_dir.path().to_string_lossy().to_string() + ); + assert_eq!(request.model.as_deref(), Some("fal-ai/nano-banana-pro")); + assert_eq!( + request.session_id.as_deref(), + Some("session-image-compat-1") + ); + assert_eq!( + request.project_id.as_deref(), + Some("project-image-compat-1") + ); + assert_eq!( + request.content_id.as_deref(), + Some("content-image-compat-1") + ); + assert_eq!(request.entry_source.as_deref(), Some("at_image_command")); + + let output = + create_image_generation_task_artifact_inner(request).expect("create image artifact"); + + assert!(output.path.contains("image_generate")); + assert!(output.path.ends_with(".json")); + assert!(!output.path.ends_with(".md")); + assert!(output.absolute_path.ends_with(".json")); + assert_eq!( + output + .record + .payload + .get("session_id") + .and_then(Value::as_str), + Some("session-image-compat-1") + ); + assert_eq!( + output + .record + .payload + .get("project_id") + .and_then(Value::as_str), + Some("project-image-compat-1") + ); + assert_eq!( + output + .record + .payload + .get("content_id") + .and_then(Value::as_str), + Some("content-image-compat-1") + ); + assert_eq!( + output + .record + .payload + .get("entry_source") + .and_then(Value::as_str), + Some("at_image_command") + ); + assert_eq!( + output.record.payload.get("model").and_then(Value::as_str), + Some("fal-ai/nano-banana-pro") + ); + } +} diff --git a/src-tauri/src/commands/aster_agent_cmd/tool_runtime/media_cli_bridge.rs b/src-tauri/src/commands/aster_agent_cmd/tool_runtime/media_cli_bridge.rs index f65c9f58c..ca25aee58 100644 --- a/src-tauri/src/commands/aster_agent_cmd/tool_runtime/media_cli_bridge.rs +++ b/src-tauri/src/commands/aster_agent_cmd/tool_runtime/media_cli_bridge.rs @@ -48,6 +48,16 @@ fn read_output_slot_id(output: &MediaTaskOutput) -> Option { .or_else(|| read_payload_string(&output.record.payload, &["slot_id", "slotId"])) } +fn read_output_result_string(output: &MediaTaskOutput, keys: &[&str]) -> Option { + let result = output.record.result.as_ref()?; + read_payload_string(result, keys) +} + +fn read_output_result_u64(output: &MediaTaskOutput, keys: &[&str]) -> Option { + let result = output.record.result.as_ref()?; + read_payload_u64(result, keys) +} + pub(crate) fn tool_error_from_media_runtime(error: MediaRuntimeError) -> ToolError { match error { MediaRuntimeError::InvalidParams(message) => ToolError::invalid_params(message), @@ -86,6 +96,8 @@ pub(crate) fn emit_media_creation_task_event(app_handle: &AppHandle, output: &Me "anchor_hint": read_payload_string(payload_record, &["anchor_hint", "anchorHint"]), "anchor_section_title": read_payload_string(payload_record, &["anchor_section_title", "anchorSectionTitle"]), "anchor_text": read_payload_string(payload_record, &["anchor_text", "anchorText"]), + "requested_count": read_output_result_u64(output, &["requested_count", "requestedCount"]), + "received_count": read_output_result_u64(output, &["received_count", "receivedCount"]), }); if let Err(error) = app_handle.emit(CREATION_TASK_EVENT_NAME, &payload) { @@ -115,6 +127,56 @@ pub(crate) fn attach_media_task_metadata( "current_attempt_id", serde_json::json!(output.current_attempt_id), ) + .with_metadata( + "prompt", + serde_json::json!(read_payload_string(&output.record.payload, &["prompt"])), + ) + .with_metadata( + "size", + serde_json::json!(read_payload_string( + &output.record.payload, + &["size", "resolution"] + )), + ) + .with_metadata( + "project_id", + serde_json::json!(read_payload_string( + &output.record.payload, + &["project_id", "projectId"] + )), + ) + .with_metadata( + "content_id", + serde_json::json!(read_payload_string( + &output.record.payload, + &["content_id", "contentId"] + )), + ) + .with_metadata( + "provider_id", + serde_json::json!(read_output_result_string( + output, + &["provider_id", "providerId"] + )), + ) + .with_metadata( + "model", + serde_json::json!(read_output_result_string(output, &["model"])), + ) + .with_metadata( + "requested_count", + serde_json::json!(read_output_result_u64( + output, + &["requested_count", "requestedCount"] + )), + ) + .with_metadata( + "received_count", + serde_json::json!(read_output_result_u64( + output, + &["received_count", "receivedCount"] + )), + ) .with_metadata("artifact_paths", serde_json::json!(output.artifact_paths())) } diff --git a/src-tauri/src/commands/aster_agent_cmd/tool_runtime/site_tools.rs b/src-tauri/src/commands/aster_agent_cmd/tool_runtime/site_tools.rs index 956e1f1ce..9c59dd2e7 100644 --- a/src-tauri/src/commands/aster_agent_cmd/tool_runtime/site_tools.rs +++ b/src-tauri/src/commands/aster_agent_cmd/tool_runtime/site_tools.rs @@ -1159,6 +1159,12 @@ mod tests { content_id: "content-1".to_string(), project_id: "project-context".to_string(), title: "GitHub MCP 搜索结果".to_string(), + project_root_path: None, + bundle_relative_dir: None, + markdown_relative_path: None, + images_relative_dir: None, + meta_relative_path: None, + image_count: None, }, ), saved_project_id: Some("project-context".to_string()), diff --git a/src-tauri/src/commands/aster_agent_cmd/transcription_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/transcription_skill_launch.rs index 26f83bc63..f5e9fb29c 100644 --- a/src-tauri/src/commands/aster_agent_cmd/transcription_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/transcription_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const TRANSCRIPTION_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const TRANSCRIPTION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -47,6 +58,74 @@ pub(crate) fn merge_system_prompt_with_transcription_skill_launch( } } +pub(crate) fn should_lock_transcription_skill_launch_to_transcription_generation( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["transcription_skill_launch", "transcriptionSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "transcription_task".to_string()) + == "transcription_task" +} + +pub(crate) fn append_transcription_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_transcription_skill_launch_to_transcription_generation(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前转写技能启动回合生效".to_string()), + }] + }; + + for pattern in TRANSCRIPTION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1226, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "转写技能启动回合已锁定为 Skill(transcription_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_transcription_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_transcription_skill_launch_to_transcription_generation(request_metadata) { + return; + } + + for tool_name in TRANSCRIPTION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_transcription_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -107,6 +186,14 @@ fn build_transcription_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走转写技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(transcription_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “transcription_generate”、“lime task create transcription --json” 或 “lime_create_transcription_task” 之类目录信息;当前 transcription_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(transcription_generate)。".to_string(), "- Skill 执行后,优先沿 transcription_generate skill 的 Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_transcription_task。".to_string(), "- 不要伪造“转写已完成”;在 task file 真正返回结果前,只能汇报任务已提交、排队或执行中。".to_string(), format!("- 当前转写任务上下文(JSON):{transcription_task_json}"), diff --git a/src-tauri/src/commands/aster_agent_cmd/translation_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/translation_skill_launch.rs index 31ed45a60..51e649ff5 100644 --- a/src-tauri/src/commands/aster_agent_cmd/translation_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/translation_skill_launch.rs @@ -1,6 +1,13 @@ use super::*; const TRANSLATION_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const TRANSLATION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +97,74 @@ pub(crate) fn merge_system_prompt_with_translation_skill_launch( } } +pub(crate) fn should_lock_translation_skill_launch_to_translation( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["translation_skill_launch", "translationSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "translation_request".to_string()) + == "translation_request" +} + +pub(crate) fn append_translation_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_translation_skill_launch_to_translation(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前翻译技能启动回合生效".to_string()), + }] + }; + + for pattern in TRANSLATION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1228, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "翻译技能启动回合已锁定为 Skill(translation) 主链,禁止先走工具目录/联网检索偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_translation_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_translation_skill_launch_to_translation(request_metadata) { + return; + } + + for tool_name in TRANSLATION_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_translation_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -149,8 +224,17 @@ fn build_translation_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走翻译技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(translation) 真正执行前,不要先走 ToolSearch / WebSearch / Grep 等工具目录发现、联网检索或内容检索偏航。".to_string(), + "- 不要先搜索 “translation”、“read_file” 或 “list_directory” 的目录信息;当前 translation_request 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(translation)。".to_string(), "- 这条命令属于 prompt skill 主链,不要创建 task file,也不要回退成普通聊天翻译。".to_string(), "- 若用户明确给了正文、文件路径或范围,优先翻译这些材料;若未明确给材料,则翻译当前对话中与请求最相关的内容。".to_string(), + "- 如需处理本地路径或目录,只允许在 Skill(translation) 内最小化使用 Read / Glob 确认必要内容;不要在进入 Skill 前先探测大量文件。".to_string(), "- 译文必须忠于原文,不要补写原文没有的新事实;遇到术语或语义歧义时,要单独标注待确认项。".to_string(), format!("- 当前翻译请求上下文(JSON):{request_json}"), format!("- 当前入口来源:{entry_source}。"), diff --git a/src-tauri/src/commands/aster_agent_cmd/typesetting_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/typesetting_skill_launch.rs index 4ce6eaf3e..ff2b453f9 100644 --- a/src-tauri/src/commands/aster_agent_cmd/typesetting_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/typesetting_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const TYPESETTING_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const TYPESETTING_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -90,6 +101,74 @@ pub(crate) fn merge_system_prompt_with_typesetting_skill_launch( } } +pub(crate) fn should_lock_typesetting_skill_launch_to_typesetting( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["typesetting_skill_launch", "typesettingSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "typesetting_task".to_string()) + == "typesetting_task" +} + +pub(crate) fn append_typesetting_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_typesetting_skill_launch_to_typesetting(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前排版技能启动回合生效".to_string()), + }] + }; + + for pattern in TYPESETTING_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1224, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "排版技能启动回合已锁定为 Skill(typesetting) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_typesetting_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_typesetting_skill_launch_to_typesetting(request_metadata) { + return; + } + + for tool_name in TYPESETTING_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_typesetting_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -151,6 +230,14 @@ fn build_typesetting_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走排版技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(typesetting) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “typesetting”、“lime task create typesetting --json” 或 “lime_create_typesetting_task” 之类目录信息;当前 typesetting_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(typesetting)。".to_string(), "- Skill 执行后,优先沿 typesetting skill 的 Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_typesetting_task。".to_string(), "- 不要伪造“排版已完成”;在 task file 真正返回结果前,只能汇报任务已提交、排队或执行中。".to_string(), format!("- 当前排版任务上下文(JSON):{task_json}"), diff --git a/src-tauri/src/commands/aster_agent_cmd/url_parse_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/url_parse_skill_launch.rs index bbb07aa08..747bf4909 100644 --- a/src-tauri/src/commands/aster_agent_cmd/url_parse_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/url_parse_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const URL_PARSE_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const URL_PARSE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -46,6 +57,74 @@ pub(crate) fn merge_system_prompt_with_url_parse_skill_launch( } } +pub(crate) fn should_lock_url_parse_skill_launch_to_url_parse( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["url_parse_skill_launch", "urlParseSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "url_parse_task".to_string()) + == "url_parse_task" +} + +pub(crate) fn append_url_parse_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_url_parse_skill_launch_to_url_parse(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前链接解析技能启动回合生效".to_string()), + }] + }; + + for pattern in URL_PARSE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1225, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "链接解析技能启动回合已锁定为 Skill(url_parse) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_url_parse_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_url_parse_skill_launch_to_url_parse(request_metadata) { + return; + } + + for tool_name in URL_PARSE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_url_parse_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -97,6 +176,14 @@ fn build_url_parse_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走链接解析技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(url_parse) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “url_parse”、“lime task create url-parse --json” 或 “lime_create_url_parse_task” 之类目录信息;当前 url_parse_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(url_parse)。".to_string(), "- Skill 执行后,优先沿 url_parse skill 的 Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_url_parse_task。".to_string(), "- 如果当前回合无法在预算内抓取并整理网页正文,也必须创建真实 url_parse task,并把 extractStatus 设为 pending_extract,而不是停留在空泛解释。".to_string(), "- 不要伪造“链接已解析完成”;只有 task payload 已经写入 summary / keyPoints 且 extractStatus=ready 时,才能声称已得到解析结果。".to_string(), diff --git a/src-tauri/src/commands/aster_agent_cmd/video_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/video_skill_launch.rs index 1df490058..1bd51f52e 100644 --- a/src-tauri/src/commands/aster_agent_cmd/video_skill_launch.rs +++ b/src-tauri/src/commands/aster_agent_cmd/video_skill_launch.rs @@ -1,6 +1,17 @@ use super::*; const VIDEO_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const VIDEO_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; fn extract_object_string( object: &serde_json::Map, @@ -46,6 +57,74 @@ pub(crate) fn merge_system_prompt_with_video_skill_launch( } } +pub(crate) fn should_lock_video_skill_launch_to_video_generation( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["video_skill_launch", "videoSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "video_task".to_string()) + == "video_task" +} + +pub(crate) fn append_video_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_video_skill_launch_to_video_generation(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前视频技能启动回合生效".to_string()), + }] + }; + + for pattern in VIDEO_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1237, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "视频技能启动回合已锁定为 Skill(video_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_video_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_video_skill_launch_to_video_generation(request_metadata) { + return; + } + + for tool_name in VIDEO_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + fn build_video_skill_launch_system_prompt( request_metadata: Option<&serde_json::Value>, ) -> Option { @@ -97,6 +176,14 @@ fn build_video_skill_launch_system_prompt( format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走视频技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(video_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 不要搜索 “video_generate”、“lime media video generate --json” 或 “lime_create_video_generation_task” 之类目录信息;当前 video_task 已经提供了足够上下文。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(video_generate)。".to_string(), "- Skill 执行后,优先沿 video_generate skill 的 Bash / task file 主链提交异步任务;只有 Skill 明确不可用时,才允许直接回退到 lime_create_video_generation_task / create_video_generation_task。".to_string(), "- 不要伪造“视频已生成完成”;在 task file 真正返回结果前,只能汇报任务已提交、排队或执行中。".to_string(), format!("- 当前视频任务上下文(JSON):{video_task_json}"), diff --git a/src-tauri/src/commands/aster_agent_cmd/webpage_skill_launch.rs b/src-tauri/src/commands/aster_agent_cmd/webpage_skill_launch.rs new file mode 100644 index 000000000..86dad87a2 --- /dev/null +++ b/src-tauri/src/commands/aster_agent_cmd/webpage_skill_launch.rs @@ -0,0 +1,260 @@ +use super::*; + +const WEBPAGE_SKILL_LAUNCH_PROMPT_MARKER: &str = "<>"; +const WEBPAGE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS: &[&str] = &[ + TOOL_SEARCH_TOOL_NAME, + "WebSearch", + "web_search", + "Read", + "read", + "Glob", + "glob", + "Grep", + "grep", +]; + +fn extract_object_string( + object: &serde_json::Map, + keys: &[&str], +) -> Option { + keys.iter() + .filter_map(|key| object.get(*key)) + .find_map(serde_json::Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) +} + +fn ensure_harness_workbench_chat_mode(value: &mut serde_json::Value, launch_keys: &[&str]) { + let Some(root) = value.as_object_mut() else { + return; + }; + let harness = if root.contains_key("harness") { + match root + .get_mut("harness") + .and_then(serde_json::Value::as_object_mut) + { + Some(harness) => harness, + None => return, + } + } else { + root + }; + + let has_launch = launch_keys.iter().any(|key| { + harness + .get(*key) + .and_then(serde_json::Value::as_object) + .is_some() + }); + if !has_launch { + return; + } + + harness.insert( + "chat_mode".to_string(), + serde_json::Value::String("workbench".to_string()), + ); +} + +fn truncate_prompt_text(value: String, max_chars: usize) -> String { + let total_chars = value.chars().count(); + if total_chars <= max_chars { + return value; + } + + let truncated = value.chars().take(max_chars).collect::(); + format!("{truncated}...(已截断,原始长度 {total_chars} 字)") +} + +pub(crate) fn prepare_webpage_skill_launch_request_metadata( + request_metadata: Option<&serde_json::Value>, +) -> Option { + let mut metadata = request_metadata.cloned()?; + ensure_harness_workbench_chat_mode( + &mut metadata, + &["webpage_skill_launch", "webpageSkillLaunch"], + ); + + Some(metadata) +} + +pub(crate) fn merge_system_prompt_with_webpage_skill_launch( + base_prompt: Option, + request_metadata: Option<&serde_json::Value>, +) -> Option { + let Some(launch_prompt) = build_webpage_skill_launch_system_prompt(request_metadata) else { + return base_prompt; + }; + + match base_prompt { + Some(base) => { + if base.contains(WEBPAGE_SKILL_LAUNCH_PROMPT_MARKER) { + Some(base) + } else if base.trim().is_empty() { + Some(launch_prompt) + } else { + Some(format!("{base}\n\n{launch_prompt}")) + } + } + None => Some(launch_prompt), + } +} + +pub(crate) fn should_lock_webpage_skill_launch_to_webpage_generate( + request_metadata: Option<&serde_json::Value>, +) -> bool { + let Some(launch) = extract_harness_nested_object( + request_metadata, + &["webpage_skill_launch", "webpageSkillLaunch"], + ) else { + return false; + }; + + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "webpage_request".to_string()) + == "webpage_request" +} + +pub(crate) fn append_webpage_skill_launch_session_permissions( + permissions: &mut Vec, + session_id: &str, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_webpage_skill_launch_to_webpage_generate(request_metadata) { + return; + } + + let session_id = session_id.trim(); + let conditions = if session_id.is_empty() { + Vec::new() + } else { + vec![PermissionCondition { + condition_type: ConditionType::Session, + field: Some("session_id".to_string()), + operator: ConditionOperator::Equals, + value: serde_json::json!(session_id), + validator: None, + description: Some("仅对当前网页生成技能启动回合生效".to_string()), + }] + }; + + for pattern in WEBPAGE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + permissions.push(ToolPermission { + tool: (*pattern).to_string(), + allowed: false, + priority: 1223, + conditions: conditions.clone(), + parameter_restrictions: Vec::new(), + scope: PermissionScope::Session, + reason: Some( + "网页生成技能启动回合已锁定为 Skill(webpage_generate) 主链,禁止先走通用工具搜索/读文件链路偏航" + .to_string(), + ), + expires_at: None, + metadata: HashMap::new(), + }); + } +} + +pub(crate) fn prune_webpage_skill_launch_detour_tools_from_registry( + registry: &mut aster::tools::ToolRegistry, + request_metadata: Option<&serde_json::Value>, +) { + if !should_lock_webpage_skill_launch_to_webpage_generate(request_metadata) { + return; + } + + for tool_name in WEBPAGE_SKILL_LAUNCH_DETOUR_DENY_PATTERNS { + registry.unregister(tool_name); + } +} + +fn build_webpage_skill_launch_system_prompt( + request_metadata: Option<&serde_json::Value>, +) -> Option { + let launch = extract_harness_nested_object( + request_metadata, + &["webpage_skill_launch", "webpageSkillLaunch"], + )?; + let kind = + extract_object_string(launch, &["kind"]).unwrap_or_else(|| "webpage_request".to_string()); + if kind != "webpage_request" { + return None; + } + + let skill_name = extract_object_string(launch, &["skill_name", "skillName"]) + .unwrap_or_else(|| "webpage_generate".to_string()); + let webpage_request = launch + .get("webpage_request") + .and_then(serde_json::Value::as_object)?; + let raw_text = extract_object_string(webpage_request, &["raw_text", "rawText"]); + let prompt = extract_object_string(webpage_request, &["prompt"]) + .unwrap_or_else(|| "请生成一个可直接预览的网页".to_string()); + let content = extract_object_string(webpage_request, &["content"]); + let page_type = extract_object_string(webpage_request, &["page_type", "pageType"]); + let style = extract_object_string(webpage_request, &["style"]); + let tech_stack = extract_object_string(webpage_request, &["tech_stack", "techStack"]); + let project_id = extract_object_string(webpage_request, &["project_id", "projectId"]); + let content_id = extract_object_string(webpage_request, &["content_id", "contentId"]); + let entry_source = extract_object_string(webpage_request, &["entry_source", "entrySource"]) + .unwrap_or_else(|| "at_webpage_command".to_string()); + let args_payload = serde_json::json!({ + "user_input": raw_text.clone().unwrap_or_else(|| prompt.clone()), + "webpage_request": serde_json::Value::Object(webpage_request.clone()), + }); + let args_json = truncate_prompt_text( + serde_json::to_string(&args_payload).unwrap_or_else(|_| "{}".to_string()), + 4_000, + ); + let request_json = truncate_prompt_text( + serde_json::to_string(webpage_request).unwrap_or_else(|_| "{}".to_string()), + 4_000, + ); + + let mut lines = vec![ + WEBPAGE_SKILL_LAUNCH_PROMPT_MARKER.to_string(), + "- 当前回合来自网页生成技能启动,不要把它当成普通聊天回答。".to_string(), + "- 先快速归纳用户网页目标,然后立刻把任务交给 Skill 工具;不要停留在泛泛解释。".to_string(), + format!("- 第一优先工具调用必须是 Skill,且 skill=\"{skill_name}\"。"), + "- 调用 Skill 时,args 必须是一个严格 JSON 字符串,不要漏引号、不要写注释、不要只传半截字段。".to_string(), + format!("- 推荐传给 Skill.args 的 JSON:{args_json}"), + format!( + "- 第一工具调用示例(Skill 参数 JSON):{{\"skill\":\"{skill_name}\",\"args\":{}}}", + serde_json::to_string(&args_json).unwrap_or_else(|_| "\"{}\"".to_string()) + ), + "- 当前回合已经显式知道要走网页生成技能主链,不要为了确认技能名、工具名或命令名再去调用 ToolSearch。".to_string(), + "- 在 Skill(webpage_generate) 真正执行前,不要先走 ToolSearch / WebSearch / Read / Glob / Grep 等通用工具发现、检索或读文件链路。".to_string(), + "- 当前网页命令的目标是产出真实 HTML artifact,不要先退回空泛文案,也不要只给伪代码或结构说明。".to_string(), + "- 如果某个通用搜索/读文件工具因为 session policy 被拒绝,不要重复同类调用;应立即改为直调 Skill(webpage_generate)。".to_string(), + "- Skill 执行时必须产出一个可预览的单文件 HTML,并通过 落到工作区。".to_string(), + "- 不要伪造“网页已生成”但没有实际文件;如果信息不足,最多追问 1 个关键问题。".to_string(), + format!("- 当前网页请求上下文(JSON):{request_json}"), + format!("- 当前入口来源:{entry_source}。"), + ]; + + lines.push(format!("- 当前网页目标:{prompt}")); + if let Some(value) = content.as_deref() { + lines.push(format!( + "- 当前原始命令摘要:{}", + truncate_prompt_text(value.to_string(), 400) + )); + } + if let Some(value) = page_type.as_deref() { + lines.push(format!("- 当前页面类型:{value}。")); + } + if let Some(value) = style.as_deref() { + lines.push(format!("- 当前风格要求:{value}。")); + } + if let Some(value) = tech_stack.as_deref() { + lines.push(format!("- 当前技术偏好:{value}。")); + } + if let Some(value) = project_id.as_deref() { + lines.push(format!("- 当前 project_id:{value}。")); + } + if let Some(value) = content_id.as_deref() { + lines.push(format!("- 当前 content_id:{value}。")); + } + lines.push("- 当前任务已经显式进入网页生成技能主链。".to_string()); + + Some(lines.join("\n")) +} diff --git a/src-tauri/src/commands/media_task_cmd.rs b/src-tauri/src/commands/media_task_cmd.rs index 9d814513b..b8cc98698 100644 --- a/src-tauri/src/commands/media_task_cmd.rs +++ b/src-tauri/src/commands/media_task_cmd.rs @@ -9,19 +9,17 @@ use lime_media_runtime::{ }; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::json; use sha2::{Digest, Sha256}; use std::collections::HashSet; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use std::time::Duration; use tauri::{AppHandle, Manager}; use crate::commands::aster_agent_cmd::tool_runtime::media_cli_bridge; use crate::config::GlobalConfigManagerState; const IMAGE_TASK_RUNNER_WORKER_ID: &str = "lime-image-api-worker"; -const IMAGE_TASK_RUNNER_TIMEOUT_SECS: u64 = 300; static ACTIVE_IMAGE_TASK_EXECUTIONS: Lazy>> = Lazy::new(|| Mutex::new(HashSet::new())); @@ -215,16 +213,6 @@ struct ImageGenerationRunnerConfig { api_key: String, } -#[derive(Debug, Clone)] -struct PreparedImageTaskInput { - prompt: String, - model: String, - size: Option, - count: u32, - style: Option, - provider_id: Option, -} - fn normalize_server_host(host: &str) -> String { let trimmed = host.trim(); if trimmed.is_empty() || trimmed == "0.0.0.0" || trimmed == "::" { @@ -302,96 +290,6 @@ fn build_task_error( } } -fn read_payload_string(payload: &Value, keys: &[&str]) -> Option { - keys.iter().find_map(|key| { - payload - .get(*key) - .and_then(Value::as_str) - .map(str::trim) - .filter(|value| !value.is_empty()) - .map(ToOwned::to_owned) - }) -} - -fn read_payload_positive_u32(payload: &Value, keys: &[&str]) -> Option { - keys.iter().find_map(|key| { - let value = payload.get(*key)?; - if let Some(number) = value.as_u64() { - return u32::try_from(number).ok().filter(|item| *item > 0); - } - value - .as_str() - .and_then(|item| item.trim().parse::().ok().filter(|parsed| *parsed > 0)) - }) -} - -fn prepare_image_task_input(task: &MediaTaskOutput) -> Result { - let payload = &task.record.payload; - let prompt = read_payload_string(payload, &["prompt"]) - .ok_or_else(|| "图片任务缺少 prompt,无法继续执行".to_string())?; - let count = read_payload_positive_u32(payload, &["count", "image_count"]).unwrap_or(1); - - Ok(PreparedImageTaskInput { - prompt, - model: read_payload_string(payload, &["model"]).unwrap_or_default(), - size: read_payload_string(payload, &["size"]), - count, - style: read_payload_string(payload, &["style"]), - provider_id: read_payload_string(payload, &["provider_id", "providerId"]), - }) -} - -fn collect_generated_images(response_body: &Value) -> Vec { - response_body - .get("data") - .and_then(Value::as_array) - .map(|items| { - items - .iter() - .filter_map(|item| { - let record = item.as_object()?; - let url = record - .get("url") - .and_then(Value::as_str) - .map(str::trim) - .filter(|value| !value.is_empty()) - .map(ToOwned::to_owned) - .or_else(|| { - record - .get("b64_json") - .and_then(Value::as_str) - .map(str::trim) - .filter(|value| !value.is_empty()) - .map(|value| format!("data:image/png;base64,{value}")) - })?; - Some(json!({ - "url": url, - "revised_prompt": record - .get("revised_prompt") - .and_then(Value::as_str) - .map(str::trim) - .filter(|value| !value.is_empty()), - })) - }) - .collect() - }) - .unwrap_or_default() -} - -fn summarize_response_body(body: &str) -> String { - let trimmed = body.trim(); - if trimmed.is_empty() { - return "响应体为空".to_string(); - } - - let preview: String = trimmed.chars().take(240).collect(); - if trimmed.chars().count() > preview.chars().count() { - format!("{preview}...") - } else { - preview - } -} - fn load_current_image_task( workspace_root: &Path, task_id: &str, @@ -447,207 +345,18 @@ async fn execute_image_generation_task( task_id: String, runner_config: ImageGenerationRunnerConfig, ) -> Result { - let current = load_current_image_task(&workspace_root, &task_id)?; - if matches!( - current.normalized_status.as_str(), - "cancelled" | "failed" | "succeeded" | "partial" - ) { - return Ok(current); - } - - let queued_output = if current.normalized_status == "pending" { - let output = patch_image_task( - &workspace_root, - &task_id, - TaskArtifactPatch { - status: Some("queued".to_string()), - progress: Some(build_task_progress( - "queued", - "图片任务已进入队列,等待图片服务响应。".to_string(), - Some(0), - )), - current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), - ..TaskArtifactPatch::default() - }, - )?; - emit_image_task_event(app.as_ref(), &output); - output - } else { - current - }; - - if queued_output.normalized_status == "cancelled" { - return Ok(queued_output); - } - - let prepared_input = prepare_image_task_input(&queued_output).map_err(|message| { - let task_error = build_task_error("invalid_image_task_payload", message, false, "payload"); - let _ = mark_image_task_failed(app.as_ref(), &workspace_root, &task_id, task_error); - "图片任务 payload 无法执行".to_string() - })?; - - let running_output = patch_image_task( + let emit_app = app.clone(); + lime_media_runtime::execute_image_generation_task_with_hook( &workspace_root, &task_id, - TaskArtifactPatch { - status: Some("running".to_string()), - progress: Some(build_task_progress( - "running", - "图片生成中,结果会自动回填到对话与画布。".to_string(), - None, - )), - current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), - ..TaskArtifactPatch::default() + &lime_media_runtime::ImageGenerationRunnerConfig { + endpoint: runner_config.endpoint, + api_key: runner_config.api_key, }, - )?; - emit_image_task_event(app.as_ref(), &running_output); - - let client = reqwest::Client::builder() - .no_proxy() - .timeout(Duration::from_secs(IMAGE_TASK_RUNNER_TIMEOUT_SECS)) - .build() - .unwrap_or_else(|_| reqwest::Client::new()); - - let request_body = lime_core::models::openai::ImageGenerationRequest { - prompt: prepared_input.prompt.clone(), - model: prepared_input.model.clone(), - n: prepared_input.count.max(1), - size: prepared_input.size.clone(), - response_format: "b64_json".to_string(), - quality: None, - style: prepared_input.style.clone(), - user: Some(task_id.clone()), - }; - - let mut request_builder = client - .post(&runner_config.endpoint) - .header("Authorization", format!("Bearer {}", runner_config.api_key)); - if let Some(provider_id) = prepared_input - .provider_id - .as_deref() - .map(str::trim) - .filter(|value| !value.is_empty()) - { - request_builder = request_builder.header("X-Provider-Id", provider_id); - } - - let response = request_builder - .json(&request_body) - .send() - .await - .map_err(|error| { - let task_error = build_task_error( - "image_request_failed", - format!("调用图片服务失败: {error}"), - true, - "request", - ); - let _ = mark_image_task_failed(app.as_ref(), &workspace_root, &task_id, task_error); - format!("调用图片服务失败: {error}") - })?; - - let status = response.status(); - let response_body_raw = response.text().await.map_err(|error| { - let task_error = build_task_error( - "image_response_read_failed", - format!("读取图片服务响应失败: {error}"), - false, - "response", - ); - let _ = mark_image_task_failed(app.as_ref(), &workspace_root, &task_id, task_error); - format!("读取图片服务响应失败: {error}") - })?; - let response_body: Value = serde_json::from_str(&response_body_raw).map_err(|error| { - let detail = summarize_response_body(&response_body_raw); - let task_error = build_task_error( - "image_response_parse_failed", - format!("解析图片服务响应失败: {error};{detail}"), - false, - "response", - ); - let _ = mark_image_task_failed(app.as_ref(), &workspace_root, &task_id, task_error); - format!("解析图片服务响应失败: {error};{detail}") - })?; - - if !status.is_success() { - let error_code = response_body - .get("error") - .and_then(|value| value.get("code")) - .and_then(Value::as_str) - .filter(|value| !value.trim().is_empty()) - .unwrap_or("image_generation_failed"); - let error_message = response_body - .get("error") - .and_then(|value| value.get("message")) - .and_then(Value::as_str) - .filter(|value| !value.trim().is_empty()) - .unwrap_or("图片服务未返回可用结果"); - let task_error = build_task_error( - error_code, - error_message, - status.is_server_error() || status.as_u16() == 429, - "request", - ); - return mark_image_task_failed(app.as_ref(), &workspace_root, &task_id, task_error); - } - - let images = collect_generated_images(&response_body); - if images.is_empty() { - let task_error = build_task_error( - "image_result_empty", - "图片服务已返回成功,但没有可用的图片地址", - false, - "result", - ); - return mark_image_task_failed(app.as_ref(), &workspace_root, &task_id, task_error); - } - - let latest = load_current_image_task(&workspace_root, &task_id)?; - if latest.normalized_status == "cancelled" { - return Ok(latest); - } - - let final_status = if images.len() < prepared_input.count as usize { - "partial" - } else { - "succeeded" - }; - let result_value = json!({ - "provider_id": prepared_input.provider_id, - "model": if prepared_input.model.trim().is_empty() { - None:: - } else { - Some(prepared_input.model.clone()) - }, - "size": prepared_input.size, - "requested_count": prepared_input.count, - "received_count": images.len(), - "images": images, - "response": response_body, - }); - let success_message = if final_status == "partial" { - format!("图片任务已返回部分结果,共生成 {} 张。", images.len()) - } else { - format!("图片任务已完成,共生成 {} 张。", images.len()) - }; - let completed = patch_image_task( - &workspace_root, - &task_id, - TaskArtifactPatch { - status: Some(final_status.to_string()), - result: Some(Some(result_value)), - last_error: Some(None), - progress: Some(build_task_progress( - final_status, - success_message, - Some(100), - )), - current_attempt_worker_id: Some(Some(IMAGE_TASK_RUNNER_WORKER_ID.to_string())), - ..TaskArtifactPatch::default() - }, - )?; - emit_image_task_event(app.as_ref(), &completed); - Ok(completed) + move |output| emit_image_task_event(emit_app.as_ref(), output), + ) + .await + .map_err(|error| format!("执行图片任务失败: {error}")) } pub(crate) fn start_image_generation_task_worker_if_needed( @@ -708,6 +417,17 @@ fn emit_creation_task_event_if_needed(app: Option<&AppHandle>, output: &MediaTas } } +pub(crate) fn finalize_image_generation_task_creation( + app: Option<&AppHandle>, + workspace_root: &str, + output: &MediaTaskOutput, +) { + emit_creation_task_event_if_needed(app, output); + if let Some(app_handle) = app { + start_image_generation_task_worker_if_needed(app_handle, workspace_root, output); + } +} + pub(crate) fn create_image_generation_task_artifact_inner( request: CreateImageGenerationTaskArtifactRequest, ) -> Result { @@ -870,8 +590,7 @@ pub fn create_image_generation_task_artifact( ) -> Result { let project_root_path = request.project_root_path.trim().to_string(); let output = create_image_generation_task_artifact_inner(request)?; - emit_creation_task_event_if_needed(Some(&app), &output); - start_image_generation_task_worker_if_needed(&app, &project_root_path, &output); + finalize_image_generation_task_creation(Some(&app), &project_root_path, &output); Ok(output) } @@ -905,6 +624,7 @@ mod tests { routing::post, Json, Router, }; + use serde_json::Value; use std::sync::{Arc, Mutex}; use tokio::net::TcpListener; diff --git a/src-tauri/src/dev_bridge/dispatcher/media_tasks.rs b/src-tauri/src/dev_bridge/dispatcher/media_tasks.rs index 18904261c..533fae070 100644 --- a/src-tauri/src/dev_bridge/dispatcher/media_tasks.rs +++ b/src-tauri/src/dev_bridge/dispatcher/media_tasks.rs @@ -2,8 +2,8 @@ use super::{args_or_default, parse_nested_arg}; use crate::commands::aster_agent_cmd::tool_runtime::media_cli_bridge; use crate::commands::media_task_cmd::{ cancel_media_task_artifact_inner, create_image_generation_task_artifact_inner, - get_media_task_artifact_inner, list_media_task_artifacts_inner, - start_image_generation_task_worker_if_needed, CreateImageGenerationTaskArtifactRequest, + finalize_image_generation_task_creation, get_media_task_artifact_inner, + list_media_task_artifacts_inner, CreateImageGenerationTaskArtifactRequest, ListMediaTaskArtifactsRequest, MediaTaskLookupRequest, }; use crate::dev_bridge::DevBridgeState; @@ -29,14 +29,11 @@ pub(super) async fn try_handle( let project_root_path = request.project_root_path.trim().to_string(); let output = create_image_generation_task_artifact_inner(request).map_err(to_dyn_error)?; - if let Some(app_handle) = state.app_handle.as_ref() { - media_cli_bridge::emit_media_creation_task_event(app_handle, &output); - start_image_generation_task_worker_if_needed( - app_handle, - project_root_path.as_str(), - &output, - ); - } + finalize_image_generation_task_creation( + state.app_handle.as_ref(), + project_root_path.as_str(), + &output, + ); serde_json::to_value(output)? } "get_media_task_artifact" => { diff --git a/src-tauri/src/services/browser_connector_service.rs b/src-tauri/src/services/browser_connector_service.rs index d8e21c399..eec263595 100644 --- a/src-tauri/src/services/browser_connector_service.rs +++ b/src-tauri/src/services/browser_connector_service.rs @@ -15,6 +15,12 @@ use tauri::{AppHandle, Manager}; const SETTINGS_SUBDIR: &str = "connectors"; const SETTINGS_FILE_NAME: &str = "browser-connector-settings.json"; const EXTENSION_INSTALL_DIR_NAME: &str = "Lime Browser Connector"; +const EXTENSION_SYNC_REQUIRED_FILES: [&str; 4] = [ + "manifest.json", + "background.js", + "content_script.js", + "site_adapter_runners.generated.js", +]; const SYSTEM_CONNECTOR_DEFINITIONS: [(&str, &str, &str); 5] = [ ( @@ -551,6 +557,34 @@ pub fn resolve_browser_connector_extension_source(app: &AppHandle) -> Result Result, String> { + for relative_path in EXTENSION_SYNC_REQUIRED_FILES { + let bundled_path = bundled_extension_dir.join(relative_path); + let bundled_content = fs::read(&bundled_path) + .map_err(|error| format!("读取内置连接器文件失败 {:?}: {error}", bundled_path))?; + + let installed_path = install_dir.join(relative_path); + let installed_content = match fs::read(&installed_path) { + Ok(content) => content, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => { + return Ok(Some(format!("缺少关键文件 {relative_path}"))); + } + Err(error) => { + return Ok(Some(format!("关键文件 {relative_path} 无法读取: {error}"))); + } + }; + + if installed_content != bundled_content { + return Ok(Some(format!("关键文件 {relative_path} 已变化"))); + } + } + + Ok(None) +} + fn build_install_status_from_paths( bundled_extension_dir: &Path, install_root_dir: Option<&Path>, @@ -586,15 +620,22 @@ fn build_install_status_from_paths( match read_manifest_info(&install_dir) { Ok(installed_manifest) => { - let status = if installed_manifest.version == bundled_manifest.version { - "installed" + let (status, message) = if installed_manifest.version != bundled_manifest.version { + ( + "update_available", + Some("检测到用户目录中的连接器版本落后于当前应用".to_string()), + ) + } else if let Some(drift_reason) = + detect_extension_sync_drift(bundled_extension_dir, &install_dir)? + { + ( + "update_available", + Some(format!( + "检测到已安装连接器与当前应用内置扩展不一致({drift_reason}),请重新同步扩展" + )), + ) } else { - "update_available" - }; - let message = if status == "installed" { - Some("已安装最新版本浏览器连接器".to_string()) - } else { - Some("检测到用户目录中的连接器版本落后于当前应用".to_string()) + ("installed", Some("已安装最新版本浏览器连接器".to_string())) }; Ok(BrowserConnectorInstallStatus { @@ -838,19 +879,38 @@ pub fn update_browser_action_capability_enabled( mod tests { use super::*; - fn create_extension_dir(base_dir: &Path, version: &str) -> PathBuf { - let extension_dir = base_dir.join(format!("extension-{version}")); + fn write_extension_fixture(extension_dir: &Path, version: &str, tag: &str) { fs::create_dir_all(&extension_dir).expect("创建扩展目录失败"); fs::write( extension_dir.join("manifest.json"), format!( r#"{{ - "name": "Lime Browser Connector", + "name": "Lime Browser Bridge", "version": "{version}" }}"# ), ) .expect("写入 manifest 失败"); + fs::write( + extension_dir.join("background.js"), + format!("globalThis.__lime_background = \"{tag}\";\n"), + ) + .expect("写入 background.js 失败"); + fs::write( + extension_dir.join("content_script.js"), + format!("globalThis.__lime_content = \"{tag}\";\n"), + ) + .expect("写入 content_script.js 失败"); + fs::write( + extension_dir.join("site_adapter_runners.generated.js"), + format!("globalThis.__lime_generated = \"{tag}\";\n"), + ) + .expect("写入 site_adapter_runners.generated.js 失败"); + } + + fn create_extension_dir(base_dir: &Path, version: &str, tag: &str) -> PathBuf { + let extension_dir = base_dir.join(format!("extension-{version}-{tag}")); + write_extension_fixture(&extension_dir, version, tag); extension_dir } @@ -864,7 +924,7 @@ mod tests { #[test] fn status_should_report_not_installed_without_root_dir() { let temp_dir = tempfile::tempdir().expect("创建临时目录失败"); - let bundled_dir = create_extension_dir(temp_dir.path(), "1.0.0"); + let bundled_dir = create_extension_dir(temp_dir.path(), "1.0.0", "bundled"); let status = build_install_status_from_paths(&bundled_dir, None).expect("读取状态失败"); assert_eq!(status.status, "not_installed"); @@ -875,18 +935,10 @@ mod tests { #[test] fn status_should_report_update_available_when_versions_differ() { let temp_dir = tempfile::tempdir().expect("创建临时目录失败"); - let bundled_dir = create_extension_dir(temp_dir.path(), "1.1.0"); + let bundled_dir = create_extension_dir(temp_dir.path(), "1.1.0", "bundled"); let install_root = temp_dir.path().join("user-selected"); let installed_dir = resolve_browser_connector_install_dir(&install_root); - fs::create_dir_all(&installed_dir).expect("创建安装目录失败"); - fs::write( - installed_dir.join("manifest.json"), - r#"{ - "name": "Lime Browser Connector", - "version": "1.0.0" -}"#, - ) - .expect("写入已安装 manifest 失败"); + write_extension_fixture(&installed_dir, "1.0.0", "installed"); let status = build_install_status_from_paths(&bundled_dir, Some(&install_root)) .expect("读取状态失败"); @@ -895,6 +947,44 @@ mod tests { assert_eq!(status.bundled_version, "1.1.0"); } + #[test] + fn status_should_report_installed_when_versions_and_files_match() { + let temp_dir = tempfile::tempdir().expect("创建临时目录失败"); + let bundled_dir = create_extension_dir(temp_dir.path(), "1.1.0", "bundled"); + let install_root = temp_dir.path().join("user-selected"); + let installed_dir = resolve_browser_connector_install_dir(&install_root); + copy_dir_recursive(&bundled_dir, &installed_dir).expect("复制安装目录失败"); + + let status = build_install_status_from_paths(&bundled_dir, Some(&install_root)) + .expect("读取状态失败"); + + assert_eq!(status.status, "installed"); + assert_eq!( + status.message.as_deref(), + Some("已安装最新版本浏览器连接器") + ); + } + + #[test] + fn status_should_report_update_available_when_required_file_missing() { + let temp_dir = tempfile::tempdir().expect("创建临时目录失败"); + let bundled_dir = create_extension_dir(temp_dir.path(), "1.1.0", "bundled"); + let install_root = temp_dir.path().join("user-selected"); + let installed_dir = resolve_browser_connector_install_dir(&install_root); + copy_dir_recursive(&bundled_dir, &installed_dir).expect("复制安装目录失败"); + fs::remove_file(installed_dir.join("site_adapter_runners.generated.js")) + .expect("删除 generated runner 失败"); + + let status = build_install_status_from_paths(&bundled_dir, Some(&install_root)) + .expect("读取状态失败"); + + assert_eq!(status.status, "update_available"); + assert!(status + .message + .as_deref() + .is_some_and(|message| message.contains("site_adapter_runners.generated.js"))); + } + #[cfg(target_os = "macos")] #[test] fn settings_snapshot_should_expose_visible_system_connectors_on_macos() { diff --git a/src-tauri/src/services/chat_history_service.rs b/src-tauri/src/services/chat_history_service.rs index f9068858b..429e4482e 100644 --- a/src-tauri/src/services/chat_history_service.rs +++ b/src-tauri/src/services/chat_history_service.rs @@ -213,7 +213,9 @@ mod tests { timestamp TEXT NOT NULL, tool_calls_json TEXT, tool_call_id TEXT, - reasoning_content TEXT + reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER ); CREATE TABLE general_chat_sessions ( id TEXT PRIMARY KEY, diff --git a/src-tauri/src/services/conversation_statistics_service.rs b/src-tauri/src/services/conversation_statistics_service.rs index 82df9fa78..676d4eea6 100644 --- a/src-tauri/src/services/conversation_statistics_service.rs +++ b/src-tauri/src/services/conversation_statistics_service.rs @@ -557,7 +557,9 @@ mod tests { timestamp TEXT NOT NULL, tool_calls_json TEXT, tool_call_id TEXT, - reasoning_content TEXT + reasoning_content TEXT, + input_tokens INTEGER, + output_tokens INTEGER ); CREATE TABLE general_chat_sessions ( id TEXT PRIMARY KEY, diff --git a/src-tauri/src/services/site_adapter_registry.rs b/src-tauri/src/services/site_adapter_registry.rs index dea416b17..a3ae71f7d 100644 --- a/src-tauri/src/services/site_adapter_registry.rs +++ b/src-tauri/src/services/site_adapter_registry.rs @@ -5,6 +5,7 @@ use serde_json::{Map, Value}; use std::collections::{BTreeMap, BTreeSet}; use std::fs; use std::path::{Path, PathBuf}; +use url::Url; const BUNDLED_ADAPTER_RELATIVE_DIR: &str = "resources/site-adapters/bundled"; const IMPORTED_ADAPTER_RELATIVE_DIR: &str = "site-adapters/imported"; @@ -742,6 +743,9 @@ fn load_embedded_bundled_script(script_file: &str) -> Result<&'static str, Strin "scripts/yahoo-finance-quote.js" => Ok(include_str!( "../../resources/site-adapters/bundled/scripts/yahoo-finance-quote.js" )), + "scripts/x-article-export.js" => Ok(include_str!( + "../../resources/site-adapters/bundled/scripts/x-article-export.js" + )), "scripts/zhihu-hot.js" => Ok(include_str!( "../../resources/site-adapters/bundled/scripts/zhihu-hot.js" )), @@ -885,6 +889,7 @@ fn render_entry_template(template: &str, args: &Map) -> Result) -> Result { match id { "github_issues" => build_github_issues_url(args), + "x_article_export" => build_x_article_export_url(args), _ => Err(format!("不支持的入口构造器: {id}")), } } @@ -916,6 +921,24 @@ fn build_github_issues_url(args: &Map) -> Result } } +fn build_x_article_export_url(args: &Map) -> Result { + let raw_url = get_required_string_arg(args, "url")?; + let parsed = + Url::parse(&raw_url).map_err(|error| format!("url 不是合法的站点链接: {error}"))?; + let hostname = parsed + .host_str() + .map(|value| value.trim().to_ascii_lowercase()) + .ok_or_else(|| "url 缺少域名".to_string())?; + if hostname != "x.com" && hostname != "www.x.com" && hostname != "twitter.com" { + return Err("url 必须指向 x.com 或 twitter.com".to_string()); + } + if !parsed.path().contains("/article/") { + return Err("url 必须是 X 长文 article 链接".to_string()); + } + + Ok(parsed.to_string()) +} + fn get_required_string_arg(args: &Map, key: &str) -> Result { get_optional_string_arg(args, key).ok_or_else(|| format!("参数 {key} 不能为空")) } @@ -1037,6 +1060,18 @@ mod tests { if template == "https://search.smzdm.com/?c=home&s={{query|urlencode}}&v=b" )); assert!(smzdm.script.contains("li.feed-row-wide")); + + let x_article = adapters + .iter() + .find(|adapter| adapter.name == "x/article-export") + .expect("x/article-export should exist"); + assert_eq!(x_article.source_kind, SiteAdapterSourceKind::Bundled); + assert_eq!(x_article.source_version.as_deref(), Some("2026-04-07")); + assert!(matches!( + x_article.entry, + SiteAdapterEntrySpec::Builder { ref id } if id == "x_article_export" + )); + assert!(x_article.script.contains("markdown_bundle")); } #[test] @@ -1114,6 +1149,35 @@ mod tests { assert_eq!(adapters[0].source_version.as_deref(), Some("sync-1")); } + #[test] + fn should_build_x_article_export_url_with_builder() { + let mut args = Map::new(); + args.insert( + "url".to_string(), + Value::String("https://x.com/GoogleCloudTech/article/2033953579824758855".to_string()), + ); + + let url = build_entry_url_with_builder("x_article_export", &args) + .expect("x article builder should accept article url"); + assert_eq!( + url, + "https://x.com/GoogleCloudTech/article/2033953579824758855" + ); + } + + #[test] + fn should_reject_non_article_url_for_x_article_export_builder() { + let mut args = Map::new(); + args.insert( + "url".to_string(), + Value::String("https://x.com/GoogleCloudTech/status/123".to_string()), + ); + + let error = build_entry_url_with_builder("x_article_export", &args) + .expect_err("non-article url should be rejected"); + assert!(error.contains("article")); + } + #[test] fn should_load_imported_adapters_from_imported_catalog() { let temp_dir = tempdir().expect("temp dir should exist"); diff --git a/src-tauri/src/services/site_capability_service.rs b/src-tauri/src/services/site_capability_service.rs index 186a70668..1e559060e 100644 --- a/src-tauri/src/services/site_capability_service.rs +++ b/src-tauri/src/services/site_capability_service.rs @@ -9,6 +9,8 @@ use crate::services::site_adapter_registry::{ build_entry_url, find_site_adapter_spec, load_site_adapter_specs, normalize_site_adapter_name, SiteAdapterArgType, SiteAdapterSpec, }; +use crate::workspace::WorkspaceManager; +use base64::Engine; use lime_browser_runtime::{CdpSessionState, CdpTargetInfo}; use lime_core::database::dao::browser_profile::{ BrowserProfileDao, BrowserProfileRecord, BrowserProfileTransportKind, @@ -16,9 +18,13 @@ use lime_core::database::dao::browser_profile::{ use lime_server::chrome_bridge::{ self, ChromeBridgeCommandRequest, ChromeBridgeCommandResult, ChromeBridgeObserverSnapshot, }; +use reqwest::header::CONTENT_TYPE; use serde::{Deserialize, Serialize}; use serde_json::{json, Map, Value}; use std::collections::HashSet; +use std::fs; +use std::future::Future; +use std::path::{Path, PathBuf}; use std::time::{Duration, Instant}; use url::Url; @@ -28,6 +34,9 @@ const MIN_ADAPTER_EVALUATE_TIMEOUT_MS: u64 = 30_000; const MAX_TIMEOUT_MS: u64 = 120_000; const EXPLICIT_PROJECT_SAVE_SOURCE: &str = "explicit_project"; const EXPLICIT_CONTENT_SAVE_SOURCE: &str = "explicit_content"; +const SITE_EXPORTS_ROOT_DIR: &str = "exports"; +const MARKDOWN_BUNDLE_EXPORT_KIND: &str = "markdown_bundle"; +const MARKDOWN_BUNDLE_IMAGE_DIR: &str = "images"; #[derive(Debug, Clone, Serialize)] pub struct SiteAdapterArgumentDefinition { @@ -176,6 +185,98 @@ pub struct SavedSiteAdapterContent { pub content_id: String, pub project_id: String, pub title: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub project_root_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub bundle_relative_dir: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub markdown_relative_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub images_relative_dir: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub meta_relative_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub image_count: Option, +} + +#[derive(Debug, Clone, Deserialize)] +struct MarkdownBundleImageExport { + url: String, + #[serde(default)] + alt: Option, + #[serde(default)] + suggested_file_name: Option, +} + +#[derive(Debug, Clone, Deserialize)] +struct MarkdownBundleExport { + #[serde(rename = "export_kind")] + _export_kind: String, + #[serde(default)] + title: Option, + #[serde(default)] + source_url: Option, + #[serde(default)] + author: Option, + #[serde(default)] + published_at: Option, + markdown: String, + #[serde(default)] + images: Vec, +} + +#[derive(Debug, Clone)] +struct MaterializedMarkdownBundle { + title: String, + markdown: String, + bundle_relative_dir: String, + markdown_relative_path: String, + images_relative_dir: String, + meta_relative_path: String, + image_count: usize, + source_url: Option, + author: Option, + published_at: Option, +} + +#[derive(Debug, Clone, Serialize)] +struct SavedMarkdownBundleImageRecord { + original_url: String, + #[serde(skip_serializing_if = "Option::is_none")] + alt: Option, + #[serde(skip_serializing_if = "Option::is_none")] + suggested_file_name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + markdown_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + project_relative_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + download_error: Option, +} + +#[derive(Debug, Clone, Serialize)] +struct SavedMarkdownBundleMeta { + export_kind: String, + adapter_name: String, + #[serde(skip_serializing_if = "Option::is_none")] + skill_title: Option, + title: String, + #[serde(skip_serializing_if = "Option::is_none")] + original_title: Option, + #[serde(skip_serializing_if = "Option::is_none")] + source_url: Option, + #[serde(skip_serializing_if = "Option::is_none")] + author: Option, + #[serde(skip_serializing_if = "Option::is_none")] + published_at: Option, + entry_url: String, + exported_at: String, + bundle_relative_dir: String, + markdown_relative_path: String, + images_relative_dir: String, + meta_relative_path: String, + image_count: usize, + images: Vec, } #[derive(Debug, Clone)] @@ -211,7 +312,7 @@ struct SiteAdapterRecommendationCandidate { #[derive(Debug, Clone)] struct SiteAdapterAttachedLaunchCandidate { profile_key: String, - target_id: String, + target_id: Option, current_url_matches: bool, saved_existing_session: bool, } @@ -431,6 +532,612 @@ pub fn build_site_result_document_body( lines.join("\n") } +fn block_on_site_capability_future(future: F) -> Result +where + F: Future>, +{ + if let Ok(handle) = tokio::runtime::Handle::try_current() { + return tokio::task::block_in_place(|| handle.block_on(future)); + } + + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_io() + .enable_time() + .build() + .map_err(|error| format!("创建站点保存 Runtime 失败: {error}"))?; + runtime.block_on(future) +} + +fn trim_optional_text(value: Option<&str>) -> Option { + value + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToString::to_string) +} + +fn parse_markdown_bundle_export( + result: &SiteAdapterRunResult, +) -> Result, String> { + let Some(data) = result.data.as_ref() else { + return Ok(None); + }; + let Some(export_kind) = data.get("export_kind").and_then(Value::as_str) else { + return Ok(None); + }; + if export_kind != MARKDOWN_BUNDLE_EXPORT_KIND { + return Ok(None); + } + + let export: MarkdownBundleExport = serde_json::from_value(data.clone()) + .map_err(|error| format!("解析 markdown bundle 结果失败: {error}"))?; + if export.markdown.trim().is_empty() { + return Err("markdown bundle 结果缺少正文 markdown".to_string()); + } + + Ok(Some(export)) +} + +fn sanitize_export_segment(value: &str) -> String { + let mut sanitized = String::with_capacity(value.len()); + let mut last_was_dash = false; + + for ch in value.chars() { + let normalized = if ch.is_ascii_alphanumeric() { + Some(ch.to_ascii_lowercase()) + } else if matches!(ch, '/' | '\\' | '-' | '_' | ' ' | '.') { + Some('-') + } else { + None + }; + + let Some(next_char) = normalized else { + continue; + }; + if next_char == '-' { + if last_was_dash { + continue; + } + last_was_dash = true; + sanitized.push(next_char); + continue; + } + + last_was_dash = false; + sanitized.push(next_char); + } + + let trimmed = sanitized.trim_matches('-'); + if trimmed.is_empty() { + "export".to_string() + } else { + trimmed.to_string() + } +} + +fn extract_last_path_segment(raw_url: Option<&str>) -> Option { + let url = Url::parse(raw_url?).ok()?; + url.path_segments() + .and_then(|mut segments| segments.next_back().map(ToString::to_string)) + .and_then(|value| trim_optional_text(Some(value.as_str()))) +} + +fn resolve_markdown_bundle_title( + request: &RunSiteAdapterRequest, + adapter: &SiteAdapterDefinition, + export: &MarkdownBundleExport, +) -> String { + trim_optional_text(request.save_title.as_deref()) + .or_else(|| trim_optional_text(export.title.as_deref())) + .or_else(|| trim_optional_text(request.skill_title.as_deref())) + .unwrap_or_else(|| build_site_result_document_title(&adapter.name, None)) +} + +fn resolve_markdown_bundle_slug(title: &str, export: &MarkdownBundleExport) -> String { + let title_slug = sanitize_export_segment(title); + if title_slug != "export" { + return title_slug; + } + + extract_last_path_segment(export.source_url.as_deref()) + .map(|value| sanitize_export_segment(&value)) + .filter(|value| value != "export") + .unwrap_or_else(|| "article-export".to_string()) +} + +fn first_non_empty_markdown_line(value: &str) -> Option<&str> { + value.lines().map(str::trim).find(|line| !line.is_empty()) +} + +fn markdown_heading_matches_title(markdown: &str, title: &str) -> bool { + let normalized_title = title.trim(); + if normalized_title.is_empty() { + return false; + } + + let Some(first_line) = first_non_empty_markdown_line(markdown) else { + return false; + }; + if first_line == normalized_title { + return true; + } + + first_line + .strip_prefix('#') + .map(str::trim) + .is_some_and(|line| line == normalized_title) +} + +fn build_markdown_bundle_document_body( + title: &str, + export: &MarkdownBundleExport, + markdown_body: &str, +) -> String { + let mut lines = Vec::new(); + let normalized_body = markdown_body.trim(); + + if !markdown_heading_matches_title(normalized_body, title) { + lines.push(format!("# {title}")); + lines.push(String::new()); + } + + let mut metadata_lines = Vec::new(); + if let Some(author) = trim_optional_text(export.author.as_deref()) { + metadata_lines.push(format!("> 作者:{author}")); + } + if let Some(published_at) = trim_optional_text(export.published_at.as_deref()) { + metadata_lines.push(format!("> 发布时间:{published_at}")); + } + if let Some(source_url) = trim_optional_text(export.source_url.as_deref()) { + metadata_lines.push(format!("> 原文链接:{source_url}")); + } + if !metadata_lines.is_empty() { + lines.extend(metadata_lines); + lines.push(String::new()); + } + + lines.push(normalized_body.to_string()); + lines.join("\n") +} + +fn normalize_bundle_file_name_segment(value: &str) -> Option { + let mut sanitized = String::with_capacity(value.len()); + let mut last_was_dash = false; + + for ch in value.chars() { + let normalized = if ch.is_ascii_alphanumeric() { + Some(ch.to_ascii_lowercase()) + } else if matches!(ch, '-' | '_' | ' ') { + Some('-') + } else { + None + }; + + let Some(next_char) = normalized else { + continue; + }; + if next_char == '-' { + if last_was_dash { + continue; + } + last_was_dash = true; + sanitized.push(next_char); + continue; + } + last_was_dash = false; + sanitized.push(next_char); + } + + let trimmed = sanitized.trim_matches('-'); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_string()) + } +} + +fn extract_extension_from_file_name(value: &str) -> Option { + Path::new(value) + .extension() + .and_then(|ext| ext.to_str()) + .map(str::trim) + .filter(|value| !value.is_empty() && value.len() <= 12) + .map(|value| value.to_ascii_lowercase()) +} + +fn extract_extension_from_url(raw_url: &str) -> Option { + let url = Url::parse(raw_url).ok()?; + if let Some(format) = url + .query_pairs() + .find_map(|(key, value)| (key == "format").then_some(value.into_owned())) + .and_then(|value| trim_optional_text(Some(value.as_str()))) + { + return Some(format.to_ascii_lowercase()); + } + + url.path_segments() + .and_then(|mut segments| segments.next_back().map(ToString::to_string)) + .and_then(|value| extract_extension_from_file_name(&value)) +} + +fn extension_from_content_type(content_type: Option<&str>) -> Option<&'static str> { + match content_type + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or_default() + { + "image/jpeg" => Some("jpg"), + "image/png" => Some("png"), + "image/gif" => Some("gif"), + "image/webp" => Some("webp"), + "image/svg+xml" => Some("svg"), + "image/bmp" => Some("bmp"), + _ => None, + } +} + +fn build_markdown_bundle_image_file_name( + index: usize, + image: &MarkdownBundleImageExport, + content_type: Option<&str>, + used_file_names: &mut HashSet, +) -> String { + let suggested = trim_optional_text(image.suggested_file_name.as_deref()); + let suggested_stem = suggested + .as_deref() + .and_then(|value| Path::new(value).file_stem().and_then(|stem| stem.to_str())) + .and_then(normalize_bundle_file_name_segment); + let fallback_stem = extract_last_path_segment(Some(image.url.as_str())) + .as_deref() + .and_then(|value| Path::new(value).file_stem().and_then(|stem| stem.to_str())) + .and_then(normalize_bundle_file_name_segment); + let stem = suggested_stem + .or(fallback_stem) + .unwrap_or_else(|| format!("image-{}", index + 1)); + let extension = suggested + .as_deref() + .and_then(extract_extension_from_file_name) + .or_else(|| extract_extension_from_url(&image.url)) + .or_else(|| extension_from_content_type(content_type).map(ToString::to_string)) + .unwrap_or_else(|| "jpg".to_string()); + + let mut file_name = format!("{stem}.{extension}"); + if used_file_names.insert(file_name.clone()) { + return file_name; + } + + let mut duplicate_index = 2usize; + loop { + file_name = format!("{stem}-{duplicate_index}.{extension}"); + if used_file_names.insert(file_name.clone()) { + return file_name; + } + duplicate_index += 1; + } +} + +fn path_to_forward_slashes(path: &Path) -> String { + path.to_string_lossy().replace('\\', "/") +} + +fn relative_path_from(base: &Path, target: &Path) -> Result { + let relative = target + .strip_prefix(base) + .map_err(|error| format!("无法构建相对路径: {error}"))?; + Ok(path_to_forward_slashes(relative)) +} + +fn allocate_markdown_bundle_export_dir(base_dir: &Path, slug: &str) -> Result { + fs::create_dir_all(base_dir) + .map_err(|error| format!("创建导出目录失败 {}: {error}", base_dir.display()))?; + + for index in 1usize.. { + let candidate = if index == 1 { + base_dir.join(slug) + } else { + base_dir.join(format!("{slug}-{index}")) + }; + if candidate.exists() { + continue; + } + fs::create_dir_all(&candidate) + .map_err(|error| format!("创建导出资源包失败 {}: {error}", candidate.display()))?; + return Ok(candidate); + } + + Err("无法创建唯一的导出目录".to_string()) +} + +async fn download_markdown_bundle_image( + client: &reqwest::Client, + image_url: &str, +) -> Result<(Vec, Option), String> { + if image_url.starts_with("data:") { + return decode_markdown_bundle_data_url(image_url); + } + + let response = client + .get(image_url) + .send() + .await + .map_err(|error| format!("下载图片失败: {error}"))?; + if !response.status().is_success() { + return Err(format!("下载图片失败: HTTP {}", response.status())); + } + + let content_type = response + .headers() + .get(CONTENT_TYPE) + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.split(';').next()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToString::to_string); + let bytes = response + .bytes() + .await + .map_err(|error| format!("读取图片内容失败: {error}"))?; + + Ok((bytes.to_vec(), content_type)) +} + +fn decode_markdown_bundle_data_url(image_url: &str) -> Result<(Vec, Option), String> { + let (header, payload) = image_url + .split_once(',') + .ok_or_else(|| "data URL 格式不正确".to_string())?; + if !header.starts_with("data:") { + return Err("仅支持 http(s) 或 data URL".to_string()); + } + + let meta = &header[5..]; + let mut mime_type: Option = None; + let mut is_base64 = false; + if !meta.is_empty() { + let mut parts = meta.split(';'); + if let Some(first) = parts.next() { + mime_type = trim_optional_text(Some(first)); + } + is_base64 = parts.any(|part| part.eq_ignore_ascii_case("base64")); + } + if !is_base64 { + return Err("暂不支持非 base64 的 data URL".to_string()); + } + + let decoded = base64::engine::general_purpose::STANDARD + .decode(payload.trim()) + .map_err(|error| format!("解码 data URL 失败: {error}"))?; + Ok((decoded, mime_type)) +} + +fn build_markdown_bundle_metadata_map(bundle: &MaterializedMarkdownBundle) -> Map { + let mut metadata = Map::new(); + metadata.insert( + "siteAdapterExportKind".to_string(), + Value::String(MARKDOWN_BUNDLE_EXPORT_KIND.to_string()), + ); + metadata.insert( + "siteAdapterBundleRelativeDir".to_string(), + Value::String(bundle.bundle_relative_dir.clone()), + ); + metadata.insert( + "siteAdapterBundleMarkdownPath".to_string(), + Value::String(bundle.markdown_relative_path.clone()), + ); + metadata.insert( + "siteAdapterBundleImagesDir".to_string(), + Value::String(bundle.images_relative_dir.clone()), + ); + metadata.insert( + "siteAdapterBundleMetaPath".to_string(), + Value::String(bundle.meta_relative_path.clone()), + ); + metadata.insert( + "siteAdapterImageCount".to_string(), + Value::Number(serde_json::Number::from(bundle.image_count as u64)), + ); + metadata.insert( + "siteAdapterAuthor".to_string(), + bundle + .author + .as_ref() + .map(|value| Value::String(value.clone())) + .unwrap_or(Value::Null), + ); + metadata.insert( + "siteAdapterPublishedAt".to_string(), + bundle + .published_at + .as_ref() + .map(|value| Value::String(value.clone())) + .unwrap_or(Value::Null), + ); + metadata.insert( + "siteAdapterSourceUrl".to_string(), + bundle + .source_url + .as_ref() + .map(|value| Value::String(value.clone())) + .unwrap_or(Value::Null), + ); + metadata +} + +fn resolve_workspace_root_path(db: &DbConnection, project_id: &str) -> Option { + WorkspaceManager::new(db.clone()) + .get(&project_id.to_string()) + .ok() + .flatten() + .map(|workspace| workspace.root_path.to_string_lossy().to_string()) +} + +fn build_saved_site_adapter_content( + db: &DbConnection, + content_id: &str, + project_id: &str, + title: &str, + bundle: Option<&MaterializedMarkdownBundle>, +) -> SavedSiteAdapterContent { + SavedSiteAdapterContent { + content_id: content_id.to_string(), + project_id: project_id.to_string(), + title: title.to_string(), + project_root_path: resolve_workspace_root_path(db, project_id), + bundle_relative_dir: bundle.map(|value| value.bundle_relative_dir.clone()), + markdown_relative_path: bundle.map(|value| value.markdown_relative_path.clone()), + images_relative_dir: bundle.map(|value| value.images_relative_dir.clone()), + meta_relative_path: bundle.map(|value| value.meta_relative_path.clone()), + image_count: bundle.map(|value| value.image_count), + } +} + +fn materialize_markdown_bundle( + db: &DbConnection, + project_id: &str, + adapter: &SiteAdapterDefinition, + request: &RunSiteAdapterRequest, + result: &SiteAdapterRunResult, + export: &MarkdownBundleExport, +) -> Result { + let workspace = WorkspaceManager::new(db.clone()) + .get(&project_id.to_string())? + .ok_or_else(|| format!("未找到目标项目: {project_id}"))?; + let workspace_root = workspace.root_path; + fs::create_dir_all(&workspace_root) + .map_err(|error| format!("创建项目目录失败 {}: {error}", workspace_root.display()))?; + + let bundle_title = resolve_markdown_bundle_title(request, adapter, export); + let bundle_slug = resolve_markdown_bundle_slug(&bundle_title, export); + let adapter_dir = workspace_root + .join(SITE_EXPORTS_ROOT_DIR) + .join(sanitize_export_segment(&adapter.name)); + let bundle_dir = allocate_markdown_bundle_export_dir(&adapter_dir, &bundle_slug)?; + let images_dir = bundle_dir.join(MARKDOWN_BUNDLE_IMAGE_DIR); + fs::create_dir_all(&images_dir) + .map_err(|error| format!("创建图片目录失败 {}: {error}", images_dir.display()))?; + + let source_url = trim_optional_text(export.source_url.as_deref()) + .or_else(|| trim_optional_text(result.source_url.as_deref())); + let author = trim_optional_text(export.author.as_deref()); + let published_at = trim_optional_text(export.published_at.as_deref()); + + let adapter_name = adapter.name.clone(); + let skill_title = trim_optional_text(request.skill_title.as_deref()); + let original_title = trim_optional_text(export.title.as_deref()); + let entry_url = result.entry_url.clone(); + + let (rewritten_markdown, image_records) = block_on_site_capability_future(async { + let client = reqwest::Client::builder() + .user_agent("Mozilla/5.0 LimeSiteAdapter/1.0") + .build() + .map_err(|error| format!("创建图片下载客户端失败: {error}"))?; + let mut markdown = export.markdown.trim().to_string(); + let mut records = Vec::new(); + let mut used_file_names = HashSet::new(); + + for (index, image) in export.images.iter().enumerate() { + let image_url = image.url.trim(); + if image_url.is_empty() { + continue; + } + + match download_markdown_bundle_image(&client, image_url).await { + Ok((bytes, content_type)) => { + let file_name = build_markdown_bundle_image_file_name( + index, + image, + content_type.as_deref(), + &mut used_file_names, + ); + let image_path = images_dir.join(&file_name); + fs::write(&image_path, bytes).map_err(|error| { + format!("写入图片失败 {}: {error}", image_path.display()) + })?; + let markdown_path = path_to_forward_slashes( + Path::new(MARKDOWN_BUNDLE_IMAGE_DIR) + .join(&file_name) + .as_path(), + ); + let project_relative_path = relative_path_from(&workspace_root, &image_path)?; + markdown = markdown.replace(image_url, &markdown_path); + records.push(SavedMarkdownBundleImageRecord { + original_url: image_url.to_string(), + alt: trim_optional_text(image.alt.as_deref()), + suggested_file_name: trim_optional_text( + image.suggested_file_name.as_deref(), + ), + markdown_path: Some(markdown_path), + project_relative_path: Some(project_relative_path), + download_error: None, + }); + } + Err(error) => { + records.push(SavedMarkdownBundleImageRecord { + original_url: image_url.to_string(), + alt: trim_optional_text(image.alt.as_deref()), + suggested_file_name: trim_optional_text( + image.suggested_file_name.as_deref(), + ), + markdown_path: None, + project_relative_path: None, + download_error: Some(error), + }); + } + } + } + + Ok((markdown, records)) + })?; + + let final_markdown = + build_markdown_bundle_document_body(&bundle_title, export, &rewritten_markdown); + let markdown_path = bundle_dir.join("index.md"); + fs::write(&markdown_path, &final_markdown) + .map_err(|error| format!("写入 Markdown 失败 {}: {error}", markdown_path.display()))?; + let markdown_relative_path = relative_path_from(&workspace_root, &markdown_path)?; + let bundle_relative_dir = relative_path_from(&workspace_root, &bundle_dir)?; + let images_relative_dir = relative_path_from(&workspace_root, &images_dir)?; + let meta_path = bundle_dir.join("meta.json"); + let meta_relative_path = relative_path_from(&workspace_root, &meta_path)?; + + let metadata = SavedMarkdownBundleMeta { + export_kind: MARKDOWN_BUNDLE_EXPORT_KIND.to_string(), + adapter_name, + skill_title, + title: bundle_title.clone(), + original_title, + source_url: source_url.clone(), + author: author.clone(), + published_at: published_at.clone(), + entry_url, + exported_at: chrono::Utc::now().to_rfc3339(), + bundle_relative_dir: bundle_relative_dir.clone(), + markdown_relative_path: markdown_relative_path.clone(), + images_relative_dir: images_relative_dir.clone(), + meta_relative_path: meta_relative_path.clone(), + image_count: image_records + .iter() + .filter(|record| record.project_relative_path.is_some()) + .count(), + images: image_records, + }; + let metadata_bytes = serde_json::to_vec_pretty(&metadata) + .map_err(|error| format!("序列化导出元数据失败: {error}"))?; + fs::write(&meta_path, metadata_bytes) + .map_err(|error| format!("写入导出元数据失败 {}: {error}", meta_path.display()))?; + + Ok(MaterializedMarkdownBundle { + title: bundle_title, + markdown: final_markdown, + bundle_relative_dir, + markdown_relative_path, + images_relative_dir, + meta_relative_path, + image_count: metadata.image_count, + source_url, + author, + published_at, + }) +} + pub fn save_site_result_to_project( db: &DbConnection, project_id: &str, @@ -444,6 +1151,42 @@ pub fn save_site_result_to_project( return Err("project_id 不能为空".to_string()); } + if let Some(export) = parse_markdown_bundle_export(result)? { + let mut request_with_save_title = request.clone(); + if let Some(title) = trim_optional_text(save_title) { + request_with_save_title.save_title = Some(title); + } + let bundle = materialize_markdown_bundle( + db, + normalized_project_id, + adapter, + &request_with_save_title, + result, + &export, + )?; + let mut metadata = build_site_result_metadata_map(adapter, result, true); + metadata.extend(build_markdown_bundle_metadata_map(&bundle)); + let manager = ContentManager::new(db.clone()); + let content = manager + .create(ContentCreateRequest { + project_id: normalized_project_id.to_string(), + title: bundle.title.clone(), + content_type: Some(ContentType::Document), + order: None, + body: Some(bundle.markdown.clone()), + metadata: Some(Value::Object(metadata)), + }) + .map_err(|error| format!("保存 Markdown 资源包到项目失败: {error}"))?; + + return Ok(build_saved_site_adapter_content( + db, + &content.id, + &content.project_id, + &content.title, + Some(&bundle), + )); + } + let manager = ContentManager::new(db.clone()); let title = build_site_result_document_title(&adapter.name, save_title); let body = build_site_result_document_body(adapter, request, result); @@ -459,11 +1202,13 @@ pub fn save_site_result_to_project( }) .map_err(|error| format!("保存站点结果到项目失败: {error}"))?; - Ok(SavedSiteAdapterContent { - content_id: content.id, - project_id: content.project_id, - title, - }) + Ok(build_saved_site_adapter_content( + db, + &content.id, + &content.project_id, + &title, + None, + )) } pub fn save_site_result_to_content( @@ -483,12 +1228,40 @@ pub fn save_site_result_to_content( return Err(format!("未找到要写回的内容: {normalized_content_id}")); }; - let body = build_site_result_document_body(adapter, request, result); let mut metadata = existing_content .metadata .and_then(|value| value.as_object().cloned()) .unwrap_or_default(); metadata.extend(build_site_result_metadata_map(adapter, result, false)); + if let Some(export) = parse_markdown_bundle_export(result)? { + let bundle = materialize_markdown_bundle( + db, + &existing_content.project_id, + adapter, + request, + result, + &export, + )?; + metadata.extend(build_markdown_bundle_metadata_map(&bundle)); + let updated = manager.update( + &normalized_content_id.to_string(), + ContentUpdateRequest { + body: Some(bundle.markdown.clone()), + metadata: Some(Value::Object(metadata)), + ..Default::default() + }, + )?; + + return Ok(build_saved_site_adapter_content( + db, + &updated.id, + &updated.project_id, + &updated.title, + Some(&bundle), + )); + } + + let body = build_site_result_document_body(adapter, request, result); let updated = manager.update( &normalized_content_id.to_string(), @@ -499,11 +1272,13 @@ pub fn save_site_result_to_content( }, )?; - Ok(SavedSiteAdapterContent { - content_id: updated.id, - project_id: updated.project_id, - title: updated.title, - }) + Ok(build_saved_site_adapter_content( + db, + &updated.id, + &updated.project_id, + &updated.title, + None, + )) } pub fn save_existing_site_result_to_project( @@ -1119,6 +1894,13 @@ fn build_site_adapter_attached_session_missing_target_message(spec: &SiteAdapter ) } +fn build_site_adapter_attached_session_auto_open_message(spec: &SiteAdapterSpec) -> String { + format!( + "已检测到真实浏览器会话,执行时会自动打开 {} 的目标页面并继续运行。", + spec.domain + ) +} + fn build_site_adapter_attached_session_ready_message(spec: &SiteAdapterSpec) -> String { format!( "已检测到 {} 的真实浏览器页面,Claw 可以直接复用当前会话执行。", @@ -1187,7 +1969,9 @@ async fn resolve_site_adapter_launch_readiness_for_spec( } }; let selected_target = select_existing_session_target(&tabs, &spec.domain).map(|tab| tab.id); - let is_ready = selected_target.is_some(); + let has_selected_target = selected_target.is_some(); + let can_auto_open_target = status_snapshot.control_count > 0; + let is_ready = has_selected_target || can_auto_open_target; return Ok(build_site_adapter_launch_readiness_result( if is_ready { @@ -1199,7 +1983,11 @@ async fn resolve_site_adapter_launch_readiness_for_spec( Some(requested_profile_key), selected_target, if is_ready { - build_site_adapter_attached_session_ready_message(spec) + if has_selected_target { + build_site_adapter_attached_session_ready_message(spec) + } else { + build_site_adapter_attached_session_auto_open_message(spec) + } } else { build_site_adapter_attached_session_missing_target_message(spec) }, @@ -1227,49 +2015,52 @@ async fn resolve_site_adapter_launch_readiness_for_spec( Vec::new() } }; - let Some(selected_target) = select_existing_session_target(&tabs, &spec.domain) else { - continue; - }; + let selected_target = select_existing_session_target(&tabs, &spec.domain).map(|tab| tab.id); attached_candidates.push(SiteAdapterAttachedLaunchCandidate { profile_key: observer.profile_key.clone(), - target_id: selected_target.id, + target_id: selected_target, current_url_matches: observer_matches_site_domain(observer, &spec.domain), saved_existing_session: transport == Some(BrowserProfileTransportKind::ExistingSession), }); } - if let Some(candidate) = attached_candidates - .into_iter() - .max_by_key(|item| (item.current_url_matches, item.saved_existing_session)) - { + if let Some(candidate) = attached_candidates.into_iter().max_by_key(|item| { + ( + item.target_id.is_some(), + item.current_url_matches, + item.saved_existing_session, + ) + }) { + let can_auto_open_target = status_snapshot.control_count > 0; + let is_ready = candidate.target_id.is_some() || can_auto_open_target; return Ok(build_site_adapter_launch_readiness_result( - SiteAdapterLaunchReadinessStatus::Ready, + if is_ready { + SiteAdapterLaunchReadinessStatus::Ready + } else { + SiteAdapterLaunchReadinessStatus::RequiresBrowserRuntime + }, spec, Some(candidate.profile_key), - Some(candidate.target_id), - build_site_adapter_attached_session_ready_message(spec), + candidate.target_id, + if is_ready { + if candidate.current_url_matches { + build_site_adapter_attached_session_ready_message(spec) + } else { + build_site_adapter_attached_session_auto_open_message(spec) + } + } else { + build_site_adapter_attached_session_missing_target_message(spec) + }, )); } - let has_attached_observer = status_snapshot.observers.iter().any(|observer| { - profiles - .iter() - .find(|profile| profile.profile_key == observer.profile_key) - .map(|profile| profile.transport_kind != BrowserProfileTransportKind::ManagedCdp) - .unwrap_or(true) - }); - Ok(build_site_adapter_launch_readiness_result( SiteAdapterLaunchReadinessStatus::RequiresBrowserRuntime, spec, None, None, - if has_attached_observer { - build_site_adapter_attached_session_missing_target_message(spec) - } else { - build_site_adapter_attached_session_required_message(spec) - }, + build_site_adapter_attached_session_required_message(spec), )) } @@ -1369,7 +2160,16 @@ fn select_existing_session_target( domain: &str, ) -> Option { tabs.iter() - .max_by_key(|tab| (tab_matches_domain(tab, domain), tab.active, -tab.index)) + .filter(|tab| tab_matches_domain(tab, domain)) + .max_by_key(|tab| (tab.active, -tab.index)) + .cloned() +} + +fn select_existing_session_navigation_seed( + tabs: &[ExistingSessionTabRecord], +) -> Option { + tabs.iter() + .max_by_key(|tab| (tab.active, -tab.index)) .cloned() } @@ -1695,12 +2495,12 @@ async fn run_existing_session_adapter( .map(|value| value.trim().to_string()) .filter(|value| !value.is_empty()) { - ExistingSessionTabRecord { + Some(ExistingSessionTabRecord { id: explicit_target_id, index: 0, url: None, active: true, - } + }) } else { let tabs = match load_existing_session_tabs(&profile_key).await { Ok(result) => result, @@ -1716,28 +2516,19 @@ async fn run_existing_session_adapter( ); } }; - let Some(selected_target) = select_existing_session_target(&tabs, &spec.domain) else { - return build_error_result( - spec, - profile_key, - None, - None, - entry_url, - "no_matching_context", - "当前 Chrome 没有匹配的目标站点标签页,请先打开目标站点页面,或手动传入 target_id。", - ); - }; - selected_target + select_existing_session_target(&tabs, &spec.domain) }; let should_skip_navigation = selected_target - .url - .as_deref() + .as_ref() + .and_then(|target| target.url.as_deref()) .map(|current_url| url_matches_expected_entry(current_url, &entry_url)) .unwrap_or(false); - let mut bridged_target_id = Some(selected_target.id.clone()); + let mut bridged_target_id = selected_target.as_ref().map(|target| target.id.clone()); let latest_source_url = if should_skip_navigation { - selected_target.url.clone() + selected_target + .as_ref() + .and_then(|target| target.url.clone()) } else { let navigation_result = match execute_bridge_adapter_command(ChromeBridgeCommandRequest { profile_key: Some(profile_key.clone()), @@ -1771,11 +2562,25 @@ async fn run_existing_session_adapter( .and_then(|data| data.get("tab_id")) .and_then(value_to_string) .or(bridged_target_id.clone()); + if bridged_target_id.is_none() { + bridged_target_id = load_existing_session_tabs(&profile_key) + .await + .ok() + .and_then(|tabs| { + select_existing_session_target(&tabs, &spec.domain) + .or_else(|| select_existing_session_navigation_seed(&tabs)) + }) + .map(|tab| tab.id); + } navigation_result .page_info .as_ref() .and_then(|page| page.url.clone()) - .or(selected_target.url.clone()) + .or_else(|| { + selected_target + .as_ref() + .and_then(|target| target.url.clone()) + }) }; let adapter_output = match execute_bridge_adapter_command(ChromeBridgeCommandRequest { @@ -2647,10 +3452,12 @@ mod tests { use crate::database::schema::create_tables; use crate::workspace::{WorkspaceManager, WorkspaceType}; use lime_core::database::dao::browser_profile::UpsertBrowserProfileInput; + use lime_server::chrome_bridge::ObserverCommandResultPayload; use rusqlite::Connection; use std::collections::HashSet; use std::sync::{Arc, Mutex}; use tempfile::tempdir; + use tokio::sync::mpsc; fn setup_test_db() -> DbConnection { let conn = Connection::open_in_memory().expect("创建内存数据库失败"); @@ -2928,6 +3735,108 @@ mod tests { assert_eq!(selected.id, "tab-2"); } + #[test] + fn should_ignore_non_matching_existing_session_tabs() { + let selected = select_existing_session_target( + &[ExistingSessionTabRecord { + id: "tab-1".to_string(), + index: 0, + url: Some("https://outlook.live.com/mail/".to_string()), + active: true, + }], + "x.com", + ); + + assert!(selected.is_none()); + } + + #[tokio::test] + async fn should_mark_attached_observer_as_ready_when_control_can_auto_open_target_page() { + let db = setup_test_db(); + let spec = find_site_adapter_spec("x/article-export") + .expect("registry should load") + .expect("x adapter should exist"); + let hub = chrome_bridge::chrome_bridge_hub(); + let observer_client_id = format!("observer-test-{}", uuid::Uuid::new_v4()); + let control_client_id = format!("control-test-{}", uuid::Uuid::new_v4()); + let (observer_tx, mut observer_rx) = mpsc::unbounded_channel::(); + let (control_tx, _control_rx) = mpsc::unbounded_channel::(); + + hub.register_observer( + observer_client_id.clone(), + Some("default".to_string()), + Some("Chrome".to_string()), + observer_tx, + ) + .await; + hub.register_control( + control_client_id.clone(), + Some("Chrome".to_string()), + control_tx, + ) + .await; + hub.handle_observer_page_info_update( + &observer_client_id, + "# Outlook\nURL: https://outlook.live.com/mail/".to_string(), + ) + .await; + + let hub_for_task = hub.clone(); + let observer_client_id_for_task = observer_client_id.clone(); + let responder = tokio::spawn(async move { + let message = observer_rx.recv().await.expect("应收到 list_tabs 命令"); + let payload: Value = serde_json::from_str(&message).expect("命令消息应是合法 JSON"); + let data = payload + .get("data") + .and_then(Value::as_object) + .expect("命令消息应包含 data"); + assert_eq!( + data.get("command").and_then(Value::as_str), + Some("list_tabs") + ); + let request_id = data + .get("requestId") + .and_then(Value::as_str) + .expect("应包含 requestId") + .to_string(); + hub_for_task + .handle_observer_command_result( + &observer_client_id_for_task, + ObserverCommandResultPayload { + request_id, + status: "success".to_string(), + message: Some("ok".to_string()), + error: None, + data: Some(json!({ + "tabs": [ + { + "id": "outlook-tab", + "index": 0, + "url": "https://outlook.live.com/mail/", + "active": true + } + ] + })), + }, + ) + .await; + }); + + let readiness = + resolve_site_adapter_launch_readiness_for_spec(&db, &spec, Some("default"), None) + .await + .expect("readiness should resolve"); + + responder.await.expect("bridge responder should finish"); + hub.unregister_observer(&observer_client_id).await; + hub.unregister_control(&control_client_id).await; + + assert_eq!(readiness.status, SiteAdapterLaunchReadinessStatus::Ready); + assert_eq!(readiness.profile_key.as_deref(), Some("default")); + assert_eq!(readiness.target_id, None); + assert!(readiness.message.contains("自动打开")); + } + #[test] fn should_rank_observer_context_before_scope_only_recommendations() { let github = find_site_adapter_spec("github/search") @@ -3295,6 +4204,173 @@ mod tests { assert_eq!(actual_source_kind, expected_source_kind); } + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn should_save_markdown_bundle_site_result_to_project_resources() { + let db = setup_test_db(); + let workspace_root = tempdir().expect("创建临时目录失败"); + let workspace = WorkspaceManager::new(db.clone()) + .create_with_type( + "X 长文项目".to_string(), + workspace_root.path().join("x-article-export-project"), + WorkspaceType::General, + ) + .expect("创建测试项目失败"); + let image_url = "data:image/png;base64,iVBORw0KGgo=".to_string(); + let adapter = get_site_adapter("x/article-export").expect("x/article-export should exist"); + let request = SaveSiteAdapterResultRequest { + project_id: Some(workspace.id.clone()), + content_id: None, + save_title: None, + run_request: RunSiteAdapterRequest { + adapter_name: "x/article-export".to_string(), + args: serde_json::json!({ + "url": "https://x.com/GoogleCloudTech/article/2033953579824758855" + }), + profile_key: Some("general_browser_assist".to_string()), + target_id: Some("target-1".to_string()), + timeout_ms: Some(20_000), + content_id: None, + project_id: None, + save_title: None, + require_attached_session: Some(true), + skill_title: Some("X 文章转存".to_string()), + }, + result: SiteAdapterRunResult { + ok: true, + adapter: "x/article-export".to_string(), + domain: "x.com".to_string(), + profile_key: "general_browser_assist".to_string(), + session_id: Some("session-1".to_string()), + target_id: Some("target-1".to_string()), + entry_url: "https://x.com/GoogleCloudTech/article/2033953579824758855".to_string(), + source_url: Some( + "https://x.com/GoogleCloudTech/article/2033953579824758855".to_string(), + ), + data: Some(serde_json::json!({ + "export_kind": "markdown_bundle", + "title": "Google Cloud Agent2Agent 协议简介", + "source_url": "https://x.com/GoogleCloudTech/article/2033953579824758855", + "author": "Google Cloud Tech", + "published_at": "2026-04-07T08:00:00.000Z", + "markdown": format!( + "这是一篇测试长文。\n\n![封面图]({image_url})\n\n结尾总结。" + ), + "images": [ + { + "url": image_url, + "alt": "封面图", + "suggested_file_name": "cover-image.png" + } + ] + })), + error_code: None, + error_message: None, + auth_hint: None, + report_hint: None, + saved_content: None, + saved_project_id: None, + saved_by: None, + save_skipped_project_id: None, + save_skipped_by: None, + save_error_message: None, + }, + }; + + let saved_content = + save_existing_site_result_to_project(&db, request).expect("应保存 Markdown 资源包"); + let manager = ContentManager::new(db.clone()); + let content = manager + .get(&saved_content.content_id) + .expect("读取内容失败") + .expect("内容应存在"); + + assert_eq!(saved_content.project_id, workspace.id); + assert_eq!(saved_content.title, "Google Cloud Agent2Agent 协议简介"); + assert_eq!( + saved_content.project_root_path.as_deref(), + Some(workspace.root_path.to_string_lossy().as_ref()) + ); + assert_eq!(content.title, "Google Cloud Agent2Agent 协议简介"); + assert!(content.body.contains("images/")); + assert!(!content.body.contains("data:image")); + + let metadata = content.metadata.as_ref().expect("应写入 metadata"); + assert_eq!( + metadata.get("siteAdapterExportKind"), + Some(&serde_json::json!("markdown_bundle")) + ); + assert_eq!( + metadata.get("siteAdapterImageCount"), + Some(&serde_json::json!(1)) + ); + + let bundle_dir = metadata + .get("siteAdapterBundleRelativeDir") + .and_then(Value::as_str) + .expect("应记录 bundle 相对目录"); + let markdown_path = metadata + .get("siteAdapterBundleMarkdownPath") + .and_then(Value::as_str) + .expect("应记录 markdown 相对路径"); + assert_eq!( + saved_content.markdown_relative_path.as_deref(), + Some(markdown_path) + ); + let meta_path = metadata + .get("siteAdapterBundleMetaPath") + .and_then(Value::as_str) + .expect("应记录 meta 相对路径"); + assert_eq!( + saved_content.meta_relative_path.as_deref(), + Some(meta_path) + ); + assert_eq!( + saved_content.bundle_relative_dir.as_deref(), + Some(bundle_dir) + ); + let images_relative_dir = metadata + .get("siteAdapterBundleImagesDir") + .and_then(Value::as_str) + .expect("应记录图片目录相对路径"); + assert_eq!( + saved_content.images_relative_dir.as_deref(), + Some(images_relative_dir) + ); + assert_eq!(saved_content.image_count, Some(1)); + + let exported_markdown = std::fs::read_to_string(workspace.root_path.join(markdown_path)) + .expect("导出的 Markdown 应存在"); + let exported_meta = std::fs::read_to_string(workspace.root_path.join(meta_path)) + .expect("导出的 meta.json 应存在"); + let image_dir = workspace.root_path.join(bundle_dir).join("images"); + let image_entries = std::fs::read_dir(&image_dir) + .expect("图片目录应存在") + .collect::, _>>() + .expect("读取图片目录失败"); + + assert!(workspace.root_path.join(bundle_dir).exists()); + assert_eq!(image_entries.len(), 1); + let exported_image_name = image_entries[0] + .path() + .file_name() + .and_then(|value| value.to_str()) + .expect("图片文件名应存在") + .to_string(); + assert!(exported_markdown.contains(&format!("images/{exported_image_name}"))); + assert!(!exported_markdown.contains("data:image")); + assert!(exported_meta.contains("\"export_kind\": \"markdown_bundle\"")); + assert!(exported_meta.contains(&exported_image_name)); + let expected_source_kind = adapter.source_kind.clone().map(Value::String); + assert_eq!( + metadata.get("siteAdapterName"), + Some(&serde_json::json!("x/article-export")) + ); + assert_eq!( + metadata.get("siteAdapterSourceKind"), + expected_source_kind.as_ref() + ); + } + #[test] fn should_reject_saving_failed_site_result() { let db = setup_test_db(); @@ -3410,6 +4486,10 @@ mod tests { Some(EXPLICIT_PROJECT_SAVE_SOURCE) ); assert_eq!(saved_result.save_error_message, None); + assert_eq!( + saved_content.project_root_path.as_deref(), + Some(workspace.root_path.to_string_lossy().as_ref()) + ); assert_eq!(content.project_id, workspace.id); assert_eq!(content.title, "自动保存的 GitHub MCP 搜索结果"); } diff --git a/src-tauri/src/skills/default_skills.rs b/src-tauri/src/skills/default_skills.rs index 3e8d3569f..9701ef71a 100644 --- a/src-tauri/src/skills/default_skills.rs +++ b/src-tauri/src/skills/default_skills.rs @@ -9,11 +9,13 @@ use lime_core::models::parse_skill_manifest_from_content; use lime_core::models::{ ANALYSIS_SKILL_DIRECTORY, BROADCAST_GENERATE_SKILL_DIRECTORY, CONTENT_POST_WITH_COVER_SKILL_DIRECTORY, COVER_GENERATE_SKILL_DIRECTORY, - IMAGE_GENERATE_SKILL_DIRECTORY, LIBRARY_SKILL_DIRECTORY, MODAL_RESOURCE_SEARCH_SKILL_DIRECTORY, - PDF_READ_SKILL_DIRECTORY, REPORT_GENERATE_SKILL_DIRECTORY, RESEARCH_SKILL_DIRECTORY, - SITE_SEARCH_SKILL_DIRECTORY, SUMMARY_SKILL_DIRECTORY, TRANSCRIPTION_GENERATE_SKILL_DIRECTORY, - TRANSLATION_SKILL_DIRECTORY, TYPESETTING_SKILL_DIRECTORY, URL_PARSE_SKILL_DIRECTORY, - VIDEO_GENERATE_SKILL_DIRECTORY, + FORM_GENERATE_SKILL_DIRECTORY, IMAGE_GENERATE_SKILL_DIRECTORY, LIBRARY_SKILL_DIRECTORY, + MODAL_RESOURCE_SEARCH_SKILL_DIRECTORY, PDF_READ_SKILL_DIRECTORY, + PRESENTATION_GENERATE_SKILL_DIRECTORY, REPORT_GENERATE_SKILL_DIRECTORY, + RESEARCH_SKILL_DIRECTORY, SITE_SEARCH_SKILL_DIRECTORY, SUMMARY_SKILL_DIRECTORY, + TRANSCRIPTION_GENERATE_SKILL_DIRECTORY, TRANSLATION_SKILL_DIRECTORY, + TYPESETTING_SKILL_DIRECTORY, URL_PARSE_SKILL_DIRECTORY, VIDEO_GENERATE_SKILL_DIRECTORY, + WEBPAGE_GENERATE_SKILL_DIRECTORY, }; const VIDEO_GENERATE_SKILL_CONTENT: &str = @@ -51,6 +53,12 @@ const SITE_SEARCH_SKILL_CONTENT: &str = const PDF_READ_SKILL_CONTENT: &str = include_str!("../../resources/default-skills/pdf_read/SKILL.md"); +const PRESENTATION_GENERATE_SKILL_CONTENT: &str = + include_str!("../../resources/default-skills/presentation_generate/SKILL.md"); + +const FORM_GENERATE_SKILL_CONTENT: &str = + include_str!("../../resources/default-skills/form_generate/SKILL.md"); + const SUMMARY_SKILL_CONTENT: &str = include_str!("../../resources/default-skills/summary/SKILL.md"); const TRANSLATION_SKILL_CONTENT: &str = @@ -69,6 +77,9 @@ const BUNDLED_SITE_ADAPTER_INDEX_CONTENT: &str = const TYPESETTING_SKILL_CONTENT: &str = include_str!("../../resources/default-skills/typesetting/SKILL.md"); +const WEBPAGE_GENERATE_SKILL_CONTENT: &str = + include_str!("../../resources/default-skills/webpage_generate/SKILL.md"); + const CONTENT_POST_WITH_COVER_SKILL_CONTENT: &str = include_str!("../../resources/default-skills/content_post_with_cover/SKILL.md"); @@ -98,7 +109,7 @@ const SITE_SEARCH_EXTRA_FILES: &[BundledSkillFile] = &[BundledSkillFile { content: SITE_SEARCH_ADAPTER_CATALOG_CONTENT, }]; -fn default_skills() -> [BundledSkillDefinition; 17] { +fn default_skills() -> [BundledSkillDefinition; 20] { [ BundledSkillDefinition { directory: VIDEO_GENERATE_SKILL_DIRECTORY, @@ -160,6 +171,16 @@ fn default_skills() -> [BundledSkillDefinition; 17] { skill_content: PDF_READ_SKILL_CONTENT, extra_files: &[], }, + BundledSkillDefinition { + directory: PRESENTATION_GENERATE_SKILL_DIRECTORY, + skill_content: PRESENTATION_GENERATE_SKILL_CONTENT, + extra_files: &[], + }, + BundledSkillDefinition { + directory: FORM_GENERATE_SKILL_DIRECTORY, + skill_content: FORM_GENERATE_SKILL_CONTENT, + extra_files: &[], + }, BundledSkillDefinition { directory: SUMMARY_SKILL_DIRECTORY, skill_content: SUMMARY_SKILL_CONTENT, @@ -180,6 +201,11 @@ fn default_skills() -> [BundledSkillDefinition; 17] { skill_content: TYPESETTING_SKILL_CONTENT, extra_files: &[], }, + BundledSkillDefinition { + directory: WEBPAGE_GENERATE_SKILL_DIRECTORY, + skill_content: WEBPAGE_GENERATE_SKILL_CONTENT, + extra_files: &[], + }, BundledSkillDefinition { directory: CONTENT_POST_WITH_COVER_SKILL_DIRECTORY, skill_content: CONTENT_POST_WITH_COVER_SKILL_CONTENT, @@ -378,8 +404,9 @@ mod tests { assert!(IMAGE_GENERATE_SKILL_CONTENT .contains("allowed-tools: Bash, lime_create_image_generation_task")); assert!(IMAGE_GENERATE_SKILL_CONTENT - .contains("优先调用 `Bash` 执行 `lime media image generate --json` 创建任务")); - assert!(IMAGE_GENERATE_SKILL_CONTENT.contains("也可使用 `lime task create image --json`")); + .contains("优先调用 `Bash` 执行 `lime media image generate --json` 提交任务")); + assert!(IMAGE_GENERATE_SKILL_CONTENT + .contains("如果当前环境实际走到 `lime task create image --json` 兼容入口")); assert!(LIBRARY_SKILL_CONTENT.contains("name: library")); assert!(URL_PARSE_SKILL_CONTENT.contains("name: url_parse")); assert!(RESEARCH_SKILL_CONTENT.contains("name: research")); @@ -388,11 +415,15 @@ mod tests { assert!(SITE_SEARCH_SKILL_CONTENT.contains("name: site_search")); assert!(PDF_READ_SKILL_CONTENT.contains("name: pdf_read")); assert!(PDF_READ_SKILL_CONTENT.contains("allowed-tools: list_directory, read_file")); + assert!(FORM_GENERATE_SKILL_CONTENT.contains("name: form_generate")); + assert!(FORM_GENERATE_SKILL_CONTENT.contains("lime_surface: workbench")); + assert!(FORM_GENERATE_SKILL_CONTENT.contains("```a2ui")); assert!(SUMMARY_SKILL_CONTENT.contains("name: summary")); assert!(SUMMARY_SKILL_CONTENT.contains("allowed-tools: list_directory, read_file")); assert!(SITE_SEARCH_ADAPTER_CATALOG_CONTENT.contains("`github/search`")); assert!(SITE_SEARCH_ADAPTER_CATALOG_CONTENT.contains("`zhihu/hot`")); assert!(TYPESETTING_SKILL_CONTENT.contains("name: typesetting")); + assert!(WEBPAGE_GENERATE_SKILL_CONTENT.contains("name: webpage_generate")); assert!(VIDEO_GENERATE_SKILL_CONTENT.contains("lime_surface: workbench")); assert!(TRANSCRIPTION_GENERATE_SKILL_CONTENT.contains("lime_surface: workbench")); assert!(BROADCAST_GENERATE_SKILL_CONTENT.contains("lime_surface: workbench")); @@ -400,6 +431,7 @@ mod tests { assert!(MODAL_RESOURCE_SEARCH_SKILL_CONTENT.contains("lime_surface: workbench")); assert!(IMAGE_GENERATE_SKILL_CONTENT.contains("lime_surface: workbench")); assert!(TYPESETTING_SKILL_CONTENT.contains("lime_surface: workbench")); + assert!(WEBPAGE_GENERATE_SKILL_CONTENT.contains("lime_surface: workbench")); assert!(LIBRARY_SKILL_CONTENT.contains("lime_surface: chat")); assert!(URL_PARSE_SKILL_CONTENT.contains("lime_surface: chat")); assert!(RESEARCH_SKILL_CONTENT.contains("lime_surface: chat")); diff --git a/src-tauri/tauri.conf.headless.json b/src-tauri/tauri.conf.headless.json index dd772dd35..fcb67af75 100644 --- a/src-tauri/tauri.conf.headless.json +++ b/src-tauri/tauri.conf.headless.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Lime", - "version": "1.4.0", + "version": "1.5.0", "identifier": "com.lime.app", "build": { "beforeDevCommand": "npm run dev:web-bridge", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 14cf01e0b..287ca3165 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Lime", - "version": "1.4.0", + "version": "1.5.0", "identifier": "com.lime.app", "build": { "beforeDevCommand": "npm run dev", diff --git a/src/App.tsx b/src/App.tsx index 8219e31ae..66cdb081b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -43,6 +43,7 @@ import { ComponentDebugOverlay } from "./components/dev"; import { buildClawAgentParams } from "./lib/workspace/navigation"; import { toast } from "sonner"; import { SettingsTabs } from "./types/settings"; +import { hasTauriInvokeCapability } from "./lib/tauri-runtime"; const AppContainer = styled.div` display: flex; @@ -98,6 +99,7 @@ const pageLoadingFallback = ( ); function AppContent() { + const hasTauriDesktopRuntime = hasTauriInvokeCapability(); const [showSplash, setShowSplash] = useState(true); const { currentPage, pageParams, handleNavigate } = useAppNavigation(); const [agentHasMessages, setAgentHasMessages] = useState(false); @@ -210,7 +212,9 @@ function AppContent() { }); const { error: registryError, refresh: _refreshRegistry } = - useRelayRegistry(); + useRelayRegistry({ + autoLoad: hasTauriDesktopRuntime, + }); useAppStartupEffects({ currentPage, registryError, diff --git a/src/assets/entry-surface/capability-agent-teams-lime.png b/src/assets/entry-surface/capability-agent-teams-lime.png new file mode 100644 index 0000000000000000000000000000000000000000..aef90486f9826608b736dd80217db17cf2265153 GIT binary patch literal 444577 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ᛙEO#eaD+hu9B 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
>J$lBgu!)Ca-deFNWU&K>^ZFA?PpAORhnj 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

}U8y%52$x&#F61B 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

5s6qvCM; zI!2Nk2G>vI`lAKhL5fpUv&%wQC#sD_#5GUEW3)m>v_BJ37)8LPy2}9bTt$dkuK?;x zn!ot&G>+b^{$79TF!X6DD9$eiFZs4La~6m$kxb z%9u;AQi7agJ<%@kKg~Bbu24EGd)l-5bK(BZtd$K-jIU7acnuRV@Fq7oH{QYdg0L2g zYKu|8{Fcj@K++Xp(2Apni`cXvsd=5s!Knya8{RN{vtekeTu{AA-;@+Xp<^8;;-w&6 zjQ04prx@b&3{_6e&Du3?IKE{BI(djq|3EB^hM}y-Ri^x)KYf)x!ZJ|Y5 zl6%n*XsMQC@mH_B`RDuiDdMuhWLJEH_j&vT!r3|5(Wh(L%`e7{+*<2FdTLj(d#mBL zwI!k_l6OWrua&jifpQd&Whq9&t*Nd9v09Ypb3^yR2)*jPTG;J;u6R# zeH9zQR_GuLoGKU1jSp!~bPX@kC^gNdW&5>FWGWSYlXEx349abdN7Z4|xA zTpXP3tZZUB{_4LsxleVyGxV`QWf$8L2uoG^}WXZ0P1Ui zrC>!Nu6CSf`2Dn|W=nC$vtUehL%gE{bha+`8HYh9`elHy95GCPbz}cW&V}+ zWR8G(hDNd36d*j+9Le>-AWh1TNfNc3&uvll7mvaz9Dx*7aQVfH-3<(>A*JJALWCEu zVb%;zZtczFFViqYq6}aHs@H& zEjY&ADz&u1QLGU%ZYe4TV;z>hR_hi|(f6oR8cZn(K6^}i`)Ug#PRgUN{;Vv{hs<@8 zS#rrM>*XMqTAu|ui}9zG^Q)(o(Ot;JI7Rb#s$~hF&k-sr4tLzMGysJXE`@J6V=y?W zz;}BnEmrWOk7S;itZz3_V2?Jsu3?+?Vx;D`?5H^E^V zT}ae;*j#+g)7g>5t(8KIwT(t*VNB`jgZAgCc@iAGoGhFimF$B)%}*m0=evb$=!bTN z+oLOtPr`I-X8{0e6Q|lP9$o7lgHqr=aFUumEMI^6M~5lr_1GSkhQ{NLC8QDwZX~I| zQIGW#^oMUUH;LaArW{~BW4^0OSpQdUs++&FO~2g-P}@y1J~Cm$HEb`$q#HB<*GT-G z*+4o#HA|=|!}51tH$%K0v?dLV^IHick>*|^MjXvJWH8K0fY&4h5II&fhs%6H3t)>P z8#MiC+1k?K(gNm0VR8Yng`2m?6n80-{g+S@!h@D1b*hCh z&M3mBxSRGk=iZUFhV~mnyKlUd_0i;_ncW$ZNPSC67!Q1;Ri z5v+>^;*@%!bkJ}sWDI9`EsxyXFjP7&AEQV3v_@{v8dDDp zH)^$Y4|XDout(Kr`P7hZ5&(Z^m{gCtF`9#ELAXT>gt5nLs20BSMkxR~ zhOy`G&#vxDk4)Cmhb3VT>Ka-%Mvb(e8a7SWB`uvgU#Hx=0=6)Jd=7&lNmi1?QL)I4 z<#^ECP`<5Qo*MlB?X z97op3bkE5JGUpOO^aT{dJ|J)S3ed43iBawAg$I`N#E0!ao}DK1`}0`SK|Eg+7l!8i zS{pv{++^n5t!J(3TO;=lM-0)#5xWw`PPS7LRd-R@y$Up>Uh)MQ27z^6aj}93zlDU)`2AjqvB0S5e692OiS;9vrSPjPzJ-l zVabV$MC3VXd4u%6w!VX!^Zm#$NTcl3ZlkqkI0_kuXhaEfA3{-2$rPv1-$Rs#18fUq zdMB%Zd+M}ZJjOID!iSA@sOMylYUWz0PkDgUSzE3hO}ko}1`vc9kE8e+KJAlEyFaS6 z(`lqZ76t=mZ3#b5r1zr!?CRA@S1N|D-URo0db|#SayMu?5$V-E3Z5T8+b@9+iqm`{ zd!0Zl88D?JTkEPW*97fjJbA2tn#@~_me`1o$OJ1Iv9JB}Jasn>wgQHHc9+*fkvU6V zaI=$8CaIWzvG;1nd&q8+EW&L1Gf~caLp!0eoI|KyEdaYRs3mlUEl+>Wvr^-?-2AOC z-g(n6Q-RbXnk8Vh8r5`5OTQL+uR|`4PoCUP?@Q)fN|KuMWM{=`>rd-So8aV9rs|Ps zoubVVeYe->_gYAJtvyI?QmQyA^a|Nv*?EgV)bxVs%seH1nkYC_UiHZ*V@6qH#om9V z6Q|||j6;^1+XOkQR~GQv*7%k8f)Ec}v}eb}P#LR0Hz#d&d8jUc^62Dcg-*R3t6LA1 zq1weq!R@v3?$-fBW=Ila`dwI~K@fUDJIPOpkWvYa9XQv4%w_o?+#;>?wa&9mkUD*Jh0x4IhX>J!7sKwJQ`#diTz? zfoa)dCj!^JWIB4BN)v}_pLEPcdPn=4oy=c9*b9~E!6jv{(^omn$z_X9WzE8=@*t-? zF&4ofMx`YLshG?P-SXzqccsz4S|j$pcn=B2`^lw-O2Nfu(6Sls+TC1BNQHaYV8mcQ zDJFO`-`)^GT;uFe#KS?!4trK?@z~`ql0M}j7`g)*`I-noaIK!JNC&7Fj%@c zRrj(c`NmdC^yo);;(}8Y5j)++R-xpoib<=@Rhl0d%oR2mH6-^up$pnY%4ZOX z$?a*eE)w5j^Ro4Tl+(UN2`|ufLYe9i=O4JZu)FnczZkc!&o13o7@ zAo7YkT|o42!I%$#yjqX9x6Qr0pSCcN0gL7;@B+XrjF#5*wd~I_*$krf@oJSBG00Yjo5{dZR8lHUk#fT-u zSG27e!oi}(*(hwUM)S`$(Y{TEQIM#LLo9RrWhMx;!p?>`_CK1K=5h1Jkr2veCleD&}eVL|JpL$6vCyxNTI6!~{5-`#(5@u#2A za+gZnTJLlr@|VxJ4Lly_`50qQ#qU2y4AmqpjgRsh=Kz6VuY2pCmv$R3DfQyXE@#H) zHx9)Wh(WILpTa{_lR;lO55qtTj}}icdMybXV)Ai-nv6f}U8tVk=t;X!-*UE$Tc)1+ z1(MO@%b}4v&8;Z>(O|+hDA+^%&y-Eotw?^gC(bMFb<28fus>#oTrpXpHXWJzv3hn^ zDX706wl&gkKTtZ!Cm7tQr?Vl#qhg74UWhgwC9K!U_4kPBN4MqSr zST$vVp*^blk{*@^DybAH;F+c&|NbZ-iYzajR5K^2ap5Hp7aZ|CbDqr1G}{QdvA(fr z{B;GA0w0B^`eap?N)nCHdqv~NB@c59){f};PA-t>-%>R>Dtte(Pa#nIH)NS|X+9a? zBHSe0G9I*x^IGhn71n0^wFmC(G^*~ZZW-TI7{HH}&4`|V4;gCRAdaS|Qk*WRV55>? zJs$jfU}L^8_;Q(%w`8aST~CEhJCOSs77B72SnD z{pSk^_J@Lg#FDBanQ=IX5;k* z>O*8qWN!JmEkm4)|7wvMFJnRefh?H)Rg0+cKgGO9jv`p=SW?}%wyvy?H!8_GrMBcG z7$YW)dy}`A;xIFa$tXIXWtjRH>g#*YTs5WB5t9Pvy>8SZCB$$7Er_RdlJrmqIG|&0#gK8=~R_ zdidA?&ZF%b+zvEyZ2ni;lXPes1`)AYYWKWc^BT=LF}OL+`ZbFu(w}AxtV~qgYdH)&*c- z&|;AfiM6a1wtt90aL7{DdT~ADW5SMa8q4?wffDkOJE&FOk~x2sVGt}D%&$TLvT>J$ zMBVbz(w2BBD-~y=+AY%D$Mf(S;5C^5qAPnmfx99h1W)DQ3RhelX4fN_@SU$6U0lp; zgibSqdva(`K&O5x01P=9h)f~H26O<|-v+y|tj&sAS|Q<;qrnT<4{0roibDkj-D`6y z-DY!80%FhVrdJBVju+iQe9R2PazKX~gc*_rQp0rhM-YuzxlYRlmtx1CFc(Z04i>eR zT-etSf5zEKwP$pfI-u{4(k!5C?x$a|p9hcSynJ%X2l-@9%QlJ~x_lAyv_C#a=GYdf zSp(4;mt1+*DmT_@sh=%)|a^Wab2l#;`vhuHdbRLAHqR+ag764qnAuF}(vh zKFE2$iZb=Uqt>~03!}b*^SqamBDhvjI61KDY}7Dg=z_vq$_x;Yj8QQ;oKdSo&yorC z^yQp22XqwKH5yjAx5ZO@OWa77u?JvDdnMdAe6hHpacfpG97ri}!Xq5Uhn~U!D`|y7 zlCl0Oie0oaF7l$P3Z}6HPj=jb6{C>Xx?4X0z|5%%y=lW$`j>N&vz(E+A^pnPnkVdB zA1m9~X*8Sk9t2$b-EtdOy{1_9%06n07+bQFR3YXPa4X%^1-;{37=G_nd5Xwd$PJK% zIVIv&cW+HuCVi8iM#C&Ex%dS4hz}I>C_g-m_2aU28ex=Yp{CnCRI?l}ErIFqqU+xy z%rE53cuC={4=#yl%f4RvCsSqjmyg$*_|g=g8J~<5I&of03bm256>?uv!QeMkN-9MX z%JGRKOWDPPX%Ja4SjV|w{=Q(NF6@(o>+wqrm{m|f{>%TW?N%V%J23}(7QwOGU-X{p zOA43LE3VC1k#F~}#ky!j4De#AYKiCeT~nbQ6oWPr7a;sG>V5gFi?38B`URk0ZU@sg zvWQ}(QR(G7<_6@fKC^u4(#uFg%4~bRNi$}Y3{A=&A=hFQlL}dZoFy;Ka@R0f%X46C zimy*|5BYZeu9=30@nKm#$jPTzzbQGP8&aFJ9gSP@s>0JIMg@0E#i<=4ta{c)tJiar z=m*EXempKqX&;hB?v4NdXWT)E#GA~L-;RX~T^IMW_HF92<(z<|yU3es-8)@5!3x1! zN@>3W8SLWN>2_`VC0Sl^e~H^#N$&)UB(Ys!t-r_jNV!?td$KRdv@23`FO;hHqgA|p zYR>qC{m9jBCsKSm8CsiWGXWv2^<;l`NHy=ES)uumXnz*KsT9AEDHvCS;K++EUy3`STI z;8+LfXuJgZNLwHbD9Q0E$EX(m*CJb{5zS9Shk$3~zI@hzrY2D5?hOo^8&>XTAcA8s zYKg2;VZg2Rp=?3pa>17c21k=2LD5I74BkptbqQ6@8?EDKbyWCW`!TdH@&sYzHGgtB zqy66)6#~3`o7EEY+rnpNld%eivkFuTM&(OW;etjuX{e$yt{FojY6hO1^68LWaZnf5 z;>GHNATysY04-khGnD>HrHS>*tP>AX!Sz{Y;P#od(|h-HM3!0w+cuQIl7%bOOrc-x z6?X^(h7$U5O)3-VkjTB83df^J`gdiYrxM>-m$DsTf;Yu%@{7;3^{e0vU#~Bpt>Ycz zeaq*JQFGv5L7Zdx{BYQhWVVT=7^(Ddw}ZQRV1!WakyphMR3&MG_ zsA)kM1r}ORQUIC9+w-Cd!3Xxw>7SQyl>K! z2Yy04kX~OrN7Si9Ipy|PGz?#e@396J{jZv^GQNCTV#dR3TQ4*uW=QBate=MDoi1`O zS?981fT^{b0p_M6a`E6Q2;>(g4+@@1YssAQW;2ydu}iOle*QZuDEc_spuk6wO4(%x zr7x47Sj!AC>?^TZNqqUYk}zaRgFb@yO+lem0NOg-6AdBF-X#}D$#N8ap53Xa6yXvc zbdr0Jt&6Gnqsx>VVEk)|w%&X3)G%VC%xG_G=!J_Bjm!7GBhzw@_X6^b7C5A0s&Ewg zfl)fr6dn)J!%CUfc7YSm3;w4tihz#-u;qi1Nwo8AAR?5K>A4k8B+~I>9>3p2hpmLi zFCeoW#VZO}lX&>L2EKjJoQM5lg3pjrQHkV1qg57xmb@3s< znmT+4ut6p`-H#}Wk z0<$&Xa(eX!2>rX0CwC=Eqrd*C<)l0ezx%(uGh^0$z(`0)1;Hg?`Q5LQ>MK!L;b6Se zpQeF$oF}JzEyG0&rX7~%wPe{t4J+vAAl#cQ!KjCS=GC-}=@UQ}XKR-E+}JlKPIUZn zo+F@@-TyJY6KFgaraW+rJ#DO={+*o)W?HuOBHQ3}>unJ`6@#u_ixnT}XEkfOL-gAN zvq5qc6rp$2=7}ZDgVSZ!?7+L znm4@TisuK2;!^e+Pidayjwq1KdaXY2O@D~vgbkBJ1VKg=l>l>Z)cx6Jc3g&ot8(vr z3ET!>jJmsPdgdB`C{g;~#<9K2`~0s;Jx{sb)U@A_h5FRUxYz5-G!2j4vK=6X?toDO z3|0xv%4?NQgVDH(%2xle|p$Glpi`a0)DY;oo+d} z;4aM+NU<^iciCEapgo<-BEKqKDI!qqK0KswkpM23*g=$*W6Sbu?|FbD1Vxhz4@|+L z-a~%t;~OkFiBl0_TDm&A_8Mb1U(k0P4q75xDAJgNSFjCD=eV_s9L>08#lW=WQ?w-|}0O;;^2d zM1J$G%+2DyrntrL@|g1&)jLNt_&c==rSfk_w3mf_)7YY!9NqFHLz#{)=8%}1Ie))t zQ6R}j*LLUhVpKdl3m?VNi`W^;Rg<;CaxNC**y+luYQnlmib(&*(znMYdAI*#nAGNU ztM*JcK=FTVL14d6-`DTeKjf=WZ|?j0T-W=0A6NwhY&Vi=b#!xF1g@!IHnu%-5E>4-`4+hny-drKG!U#OQUU z;c(0X2{?3wBt|H_%Vu|HQqa8clBVFH!%>1ir;N+(^Rl?l%yh)r0=P zb0j_=js<{Uzsdur&el~0mFH_$0CttqCj5yg+Vg=Ahxziv|}yDxYqHu z=;*~M6E$bljw+wgx92A;>Ue*6J#Mga&-SUE3UCtPGV0zFFiGNgFD@Ndm`tdHh$9-@ z5tZK-#-X47g>^5>Gg_UzlXPV|8M_uD$!lu%ACU5oms}*R5=H61B%{YdX#P6D(qsoM zRUK3^<;W$)2&vnIq=y{)4=6FB8oSu*u^3h+WfSiH3-e*a5)d44ek)C(SAAM&nb5fq z1Dn>)JE;{95gYesVEsbJ>`)LI;i=O_nCzdY_;m=4ojBa_zy1Qx=j0ldM%xG-+{PD? zf#En*0J1lf#=(@0Vmx2Yk9BqXHhV=sTy)4AZtxno3rs7JKts1-<+YZd21gZfUo}71 z$}_H1#v&7u6(edkhhgd@L~pQ!Vg2O50W8#(w+D8>trdmEq9W)pRS2+@2^M5QVv9Y3 zFkGUuI!XnLN0Gg`Vdh=KDi zZkE|Q7V&}bMuIwy|n>)higF+v{d3wmZ1so307SER)F(O)a z?+$$!Q~&G4#f}8JoVK#l|IE>OK6gGtef=S?`pV4*oBqP@-^^JI0EWwwyYrW@VsAGa zlFO9ZG<*JHv0RJt`?OMo95YBUsgs9S0BHhs-(LZkD&dkk2$!(>!Qs=Vqv^TQj2Fw& z^xxd!xZ^!q-V1htY9{!^TdnS~a53ScTW2s0(h@>8QH*m3v#3NkMgrqfhLc!u3EWft zCeAyNx^A9o%z1~qj~j%xxvE-cNtP20mizgD@`hgZ37x{i z%Z6Fma4TacLN(@S67xgIpvGu84C@o;xQXf0&vrdo00wkzR-?+McBN<6mBhN)67!T` zF7sNfSAkuSBoqkcRa~|TgEW+JuNhY)@X%?_aKc{o%6OXgd1{m6oI<7o*fB4iUfsbl zh2)u5w$zmfUrZXrD7L$d`)MF_FenEVsh1gnLVXYsF1cvzHqAj7da=3!P!NkNO*3Ay z#2wNuDw_#dwll$WkM||W%~})sQ31)MV&#BEhyB7Fj_38Hu&gQ|6T1=uJ0z(ml`!ho zf1#zlZJm}_rJsrV?`=SoyD_c=@+4dh8*#n^j?DH8t(D2@X}G48Tbrer5Rl>rWimc8 ziT$vDKei-;OEGJ6vf0nRalU!f9IgF2HMgbH9tLv@d({EY8&&lfK1l&}J<5h?!P&ND z*F3XXa*-~ob5>`26`RnGR!`GEC97VtzB2g(R+*Tj@9EPsM;QKxKCh5u+yJKo*tPt( zLcqt5q3j)NnT+2y9lAB|F>&T4aP~NuxdFEm_fr$Wj68tKdDf11VGRoBNZ%H z?xFsWV^27V4|3MV5DQB9P+ELz{2yvSfo=xe;~2{L{PS_ge?Dy(SA2FWO%OHJC8#sS z%$Yxa+Y^1wW0pp*QL6;$&{lX;pbSW&;~%l$GGJqK7>DL#`*ae5SU$lja6=r~g_$E+ ziCx>=Yi$(ZGOS_Xj^nB5FaR1PS@KZs|1APDFExo{#5n{B=dhA+cI`;EFS?V!=QnLT z`;KYlhe%I|eoaj@L7=zd%Na%0)mPi zj{yIa>r~gG|19UlO+`m*!6G1LX_*!Z#{p?0RrQp_Z1F0ZN(TFp0t^n1`-m6cNx&OB z$)JDtv;`Rl!-4L<1Ygid%LO*fGGJFQ@F3hzpR2)&U*bY(ou6WohFEBO7gvGbw%aY= zuK@yrxqlJ_LlgXhuKgGZ@i`)TtR>dgqR>4eLmKSl>i6M1!DZk~lsk0+wvx zb@L2z5tM%m9+JEmDY){cLrwtO&zBokw51W}%1#Mj-#cq=z|0~3eZj?Rv5SX#Key2Lf#|JA z;{kFiBTg>t*S|>RHUuTIkYp+AI}}yDRK_gzm;N{4kZbrL4Bj>UUTxNX5-Zv0fv5qk z5B+3M_xqyuLkNC6$nUKfy(#fSKZZlg5%@s)Jq%3av8nndcda=sS-OKf-2h(<0)1-%;v z1AAwL5{I`uB~ld~%~u4%7~PBve|?j1VpOW01G9HNecf6fsA%P7;mr>?O%@fA`rsJN+XpAWO`!Qj6mYzy;2cRuA=LCg^l+E~V^I3@VdIxS1vF8-7{F}>VUjr;J6{lH42 z#K>68eKv0L0nC_y+7KRn96MjwqyENQT{fg*&P6a9RIA(mJd z7y_T~*69oF(ClyK)3Q_5T(hpZspF13?R@agDn>%XKXZ{i-F^#YVpKp-&MX$uaO>3+ zGhD(?FkEtrkXgYv8+|=hsy{84SPAI`ia7I{=V35&0voa5X@fpSQ4VKhUC!(Z4iL70lsXG6^172hy;*F3d~tYZA)9oCMl$ z+gi2~$$Py|lz3RB=Ney=1aGK?K~gqf1oi0O#;BfWBm}uJ%CZ2d}6=?T!2OvV`u_y650- zOsIVMp_8{YnPjJtw7P?M8tq@07%L&DH=t5d5KUR`7B2vKrC&ZiJ)a%bWd6BwYNmR+ z$4u=t7JR*p}Mtlg|1J3JkTX1(apsr6VtOmSy7T?9QDo^Sb@uhS&|9Y zlo{+cGMMGh$}`!vpMBD}0v@F_b)6`3{*%|-C&QVqt z2r~p9!^*At3{UT!6s5Xgw_5}rw|Rm$z##01GfAy8Y1vmEwdiXZ0=#zntRnA4M^YDg zGRe3Qyd)hGIVaMwMs=PMxmnJ!zMGiT{W^1mqk*xFTo*%C`>kASCxX><%e91z%IC>Ma8(w9|+>_ zJheTv?XtevEbVMhYq=xo6e6=InG7+6_}gf_HApIQ7f9R0%hqA?2pcv??nWq|!Y#ya--gLM&4dkJ`s<8$CDP@7!V zZS>=H%A{q?ZcS)$OIc*hCsWPO{H7)pS<-mfzNm_WQrhV&_gk!Is~@JNB)88fV^9w` zXc3##OV&&9H!J;Q%sDcMl(7IrTM=0%e(J=3yxj*c^nEVjyZJ#v~@MB4Et^5T*M|1j8X}4hHu$=jElr z`DQ_UWpv6aw12JTZPP-Ntw|JRp7}5kAVm%Tlq%nvWOKM0B$v+P*Kb)Dtg#ubfMXY~ zvn26B?cYVeh8${aRt!WvwBTlEM+UL;%7Xd+@?Qk+!s_vvjXj?MKX5;e zVI=Y8FMs1N^eEZ+I$MMg+k;sBaS-nTnvIfyYKalaE&i{}zWq5eez! zes2eD+j#%ks;Ju8%AMK{`O}1`nP6;Z#@lr_uT<}uG3lFXCyOp<+1yrdmImfj@}&e5 zvf+yd1z_{n(62HYC7!lZ%b7te4Mu~^wOzpImje&1on$U9bi*Rd$MK-d8nK;L=o(ow;|`?<6~jkfpj!ZTrveWJtI^+R1} zL=$aQx$I7ohA62gzXvq7-9aQ-=)W*WQ{W*tQVCcG`h}FpAW6>4%9r9Jbe|H&0V~n8 z^;!ae|E16LX&I~AKQz6AfCDQ9gNol3SaLD9zN~kn*S-T;hhovK(2p|*os^p>!$!3_ zd8s$}EpC=U2u;q078F~G6t*&!=YD|Qk9k=FSR($xP1KoPOMp~j9 z11epzsr!lFfdZITE)0F_)gXa)ZdGzNk&7T&(8|1(qUP6kq&X5~U*bY9&B_~plSfnX zmWKeVC|4si*bwwzKw%j0vpG&}wya3vTL=AD2;cxYk`>u=yl)3{1h~t)xlD63GStSK zv-)%%TL#*r0=!v7qZ;+A360|F&TyUBpv*C;IE&Wq4kHbDDvZ6&;8&?c2+S9{0nCfZcrxz@@i&Swe7lWbhJ~SZWbAGIf0UycYhP@uB=^S`I&cLP6L*7F)IOaC9K5 zamSrh!lxNs>OM8x;Lej$tU@c(kxwQc;KSlwG6SfaLT6@35j+b$#!*y$DXlZ-8RYfp{rg?l z&o>!oAG3vX5;v^-y@+YR znLR>>E;J}e9!k!x9Wsn=C>#APT>DAFm9_2J(q{q*HKn1Ey6+!B8tS*ob^$GWoMw*v zaEJzi4hjOf;~t(18y)#i_xp0ztt*L5ER%W_dSFzRhWRlHvlQskq}V>K1a-a0J;VrI zK&q8qV656BU3Q56?wWs09fwqT$!j~SwnJwQH8wsAzz5_T#gK#$e|1G$6nOZHVqYeA z8jQ{wPe0sn#Y>g9`#_BtUmdg<(c=HOOFv}9dIGm$m9#{22-Q^HQayTU?F)HcyJGQf zo1fr(5p13*YqPZ(eOw9xSK9P!o7I|B(;K`}vs=;?kcs1ofSES$v(Rfjq17ZN+wsV8 zG3mpijQhEVr>g%k%DUE4W%0kWd9o6TRAJjX8xZIqw1SDlg!{yX4@yF-mT&{2^F#P) zkwz{HRdBcZoU!Kvhh*5Del@Tjl4|vRk{azCe-TM_&=^;s+X&A&j2SLScfXB`J(iEQ zIg+&C?X2&H07@Z1&O|?~q^i5(TI~B5_B*Re5A`5~esXO=pd{Ang=?@n+O!hBS0%;e z6i7=AT14A;5t&;9|cf+XF5j{Ax6ws;*!p`57%t#dZr`4&{)ZtfM`QItWso7~k3S z6HhmmWBispRBRQh53`~|{&N|BLE~d7aHEk1DO6IJ1oZh>9giMlRhm@Ozks+2J4Q{R z&_W-kf}x}PUszE@RLp~}%25TQ&Src7?~Txyya>I_5=Ms3Lhq#A_V~`z*PSet*AwEq ziC)paE&LUb^-k#-b_7flT77SBgUM;T+~M^s9dLi*no)tQ`4hR!a?;P;#1}p9eNSSs z?R~m0egsyo8f2*8 zHR2xSxa7}3G0Cd&Dt>V&T;<{U_q`z`5GR&G`5`32lF;^st$hbw6}5eQVny~K`s|gJ zc|}?d>dIUMzrm`(fVi4IfTFm0qQq!m3?FVy%*NK2pJ@qOAiRX^KWbXGfddS%G7D4< zeR}PD)yK4bEfbXOQ+2eAMyc@XRfKc0*KNomiOJHmrjg@7{wqJ<0T_O!p3h{2rMB;EKXd`TN4EjPBZpu9@sxw1JWkmqC~Sm8OkFz z%=d_~S}T(S+WX%x-vi{EgAlMv@-c~{kBU)PvyW}X18As8gwI}B0Mzj0g9nGLe`T$Hm;5i`pI{~a* zt8xQwvB%(2U*$T+gvLX?_HNeJ$Ns)9aKE*2XIBjZJIE+rpAWxu=4A8ztC(Yrwj+To z^lmaYz-2mITfQT%lDcW4vn55hQkO=V(xpDUyjHfDmG`FjwOfEd<~}`>iHK+N&;OOT zTjE>(nrm`-Cd}BcsjyTW>P{wcIlyc?3GNLaQ73CEYJ;xAsI{N{ z<^}x>vAvxFXrNK4@e;i$qF(*B@6TQffeVdxu;e&wgji__y zWpc#2tK>4{91T>eH%S(B^G~Bw=Ue1WQ;KxaHPAa;v^F={1(_=drj%XWIxlTCNuaIs z{b&a$g9$*MSj%4qz`|j7A4FNy(e?ytsuX+zolWmK8n$IZfNAB-GxV!-YNaJhfZy1v zS6spuJ9{zGc`85=g@n=s???sX)0KF;$zYk?)8Oq&gG3UM>Zvp9&2Vsp>XIrX7dgb1 zlrM^w$?WP*`&tq&okrT|Tfv1~D49?Mo$^&(obXQPe0^udY@^>DY1&7o)`WD4;Kd62 z8#VC?>Ta%P68&hiLOS$!G5VTctIdDTh34NcNs8o>jN;p19Ut1dr#Y{=F}<>7LGrRa z;i%Wun1zJlHBl2Q0NSXNGC3rz!plwypGC;vZCabis_NX5n7mnTHGyqX{N5-pXc}aChbI#h#9iOR0MpwS1SAl?8iU%VnZPBPPdLtVCv0 z*-TG&9m8X0D0XPjU9_e1dw*6krBK4R^af?$PPgwdblER<(qlF=p5~6~q9EQ)ndwNL zEtoXtKW197zP7;!6Iv_O=p+K4v0)|HPxITXY=oun)=g{EL_*W3VOhTHTzOd_xKtE*8 zIO*-~Do4m`uYeAm#&)i${f=CMzrOS7cvH!u2a#LdsuTNI!Ho1j@c1WK#DWC6UCY1$ z8XH4r)C~g;pK?hmZBtoIs``^HmquIk3mw7%ji~eyIAGK4`QLf?n&3DvCrZ64kF!T= zvJg#>7^mU>3;X%~KMm{%1KM8vF~w^9=T^|fpQCb(#n&Vi_W8jD&V{;>0!*JtZ!$K- zIP+qcDmb}56|+t=qQe`%@k2UE;v?>AyHyI{WAh;bXeM=BC<0G0*}hBlke?AT*neFPRPs3@C5Ml^GQiu!FnZ zr?46>9#?7$HsuY70ecViqpvG9%RLj?wy%=0Q@(3J{AW!Gh+$!M?>FBIACMKbE zi1dt9o*7sofiMV9{dXwx;RHC8ds`J^cu1Sf_Ia=5J%V53Cv)!!yxoGbC}~(=nftN( zx~qf(J!m_uccZOiO}$e0&6Ip@9#qxsmW@R+{2FQlen{*pc%iiFq>-gaQ6J zZe02OyvR_|*M{KfXQ!LzpO>XYA2z4NuLbi3#Pm+oRO8Lm{)c5u$!%-$ThbkeQ%)MpSF72~+qyBP9l#^w+ zghfg8$DaeL6V?{Es$nzi+24`|!v`;b4%6m1aQC;IbUQs--v0_`ja&aLRYZu&a1ihl z{wiKN;YB%Ob;U{v#QMTn^sX_jEL2l+I8#y|Tq2e!L|(jK6Ny7h@(S7Vpc^f0mVD`s z{0=4B+^$dNUHKWhzFy{l&$dHGk*UF*{;g{=S>ge#jVQ#DBgf06DQ27d4L~sWG0b)q zYb6aDsZPNrAELGS6wm@kc#q}Q;kaGD+V)1#M{`@Bb9H>$=4WveQ+cN4%@p>&7JbdU z)RLIYre+4zA`AEh5LTztDji|_jG%Nk4JA1jQ$Ar z`s)ilu^ehyk9LIDy-WAxLwpdqqBm>-GzJjx${D>99k*52GTO41@oR_e;i25l>!+K4 zYiSvrYWzBHR8m(8@Ah3L@Z%{IAgOJvBG7-sbk7lP8y#)7cTkHi{ze$lZ^(pEfn3Sq zWUy0*C~7aQmKU9>-$Ret*+uAV*AZ7Xe4Y(oGWu#1Kz8uZzkARv%k6^S5K*e_MsP>2 z4Z0vay-6kfy9@am-noL`-wHtdyL1Y@`O)UD1I4uSxRc7 zDeMr&BlHo+gph?$&EN(-^%g5p#jYujK&^3$wbHt6u%$_NX$y%RIEc|k4J9U081WW+ z3L=0uIu$=FKWE)}`yS$C$pDCSSF1$#W`mD;ByRGTdLmkazSlqmVCZqu&o>)hAL+Xc zx!|z~4rwsx#4>)v9KpwXzo!P7=>q;xRLs-_fuycKb?_<6)W~XQ`vhAMfJ{;VDQr+#hZ=+%ZY4M=v3?4F+P6d4TDKf@z-~)MR#R0f9%% z2(K8SzY&$76Es!D-0Z3ks0?Vi5*4?D0WwQF&a*#Xj0~n`25Mze2;&v~GaCb2%dx?_ zb@NgNa!KMAusX6cVku;OWVdI(7%(~|kh`&7 zVX}iG=6lrI2UJ0D2fwz%qLbfoWxH)~PDHMeTym**p=*=N?81S|Vr zP%pXjA-fo(=Qms~7Aw~5e10HjRix?9;30qZKRAWMJ$MY%7Sg>Lg{3V5%eBT^i@ znRoKYEPjJmvG>wQsgs3<)f(%sEEA}~!MQQBw)WIUv-Hpt;L)`#jLThnH2S-mT*1BC zFNSg5Ls;NBwN|AQLW|cQbU%`L>s|;+U%_IXyeIYsX{rF{SAwkB3pzdX5XPBQsO5#P zYOtpH=^~>{7C*Hk18T=TN{{p_2@9VuESuRd&sGVLfOp6&&quCh`g4dKcX}s8K>qai29#3?f$$VfC7d>ZeY=dIV^JJZJ$kU_}7zO zz>>EDcny|JDjZs3la3epBwW8TNI|lLh+Po^0H|C^=2Bol2pr7)Lj|qsE20>muA0_F zxTA*DYkEaxOGn4~%7|y$`*({Aay6jl=q)6UN_hORKeK0$JeV)>>_)Ar*pE)O&iU(r zWaAbF>;fr_V!Fek>e^-p01Iy~2%979HFmUEXQmo!0f|C>R{wP^-YshbjA3mxgWZ(l z;Wp&OTgs(A^Q=oizF8d0O&ND4nKTt9F-URyssPaMmT>AEB)e_?iMti72Mh1KZQc7I zI`suL-!!T-g++WR_L6XUKZ`-GKmd(*+n>Z%bdDw zRU_0own#^k1P1`B=>USEW51bN%(luY;3cnmPIs?cYs`C7$-V~XZZNJu#m1EzpA#=9 zGAi5PSdB$(`fqi&d6w~q11DwwLKI~rh(%iK%d3u~jTHH5L6?L8Oc_4^=3uA}E|tx= zFhcT-Pl73$(s8524+?S{pP@QV6?;G(ONBER#0crK$%TVBz}gf5JK4pH;p?J}vJ^NuqEIJrK0)RhFHF;OLyuNuV6NJz&N#&xyr^71>#qk_q$g`;8 zV&?nnzw3dpY6F1DRLeEj8}mAaqB@72zV`VsceuCfGCpuNTq_f197!rD)bSppib00P z%ARkDYR3GS*s7?f-%V48X2mRVTY){^6_x0VZ=K;Nih^9Np;zy82CsnX@}}5oy2i z{+!ruZdNp2A0htf{uR zt9o5K4c*cuWbD{K^yR>M3>H@jMXLC#EBtMcyM{MpwI&m}K`+ZbuMorDGQy>NlaB4r z0dSxXU)2j`23yxC1qzcPp*V(~k;x-TEJ#)&hpE%*B1?nWyWPRsG#e1AtIuMUZ^HU! zsODah14Ni_BlRn@=xrWg9uuJYKCowl!{f~cKTJOuS8t;jK9>#{l9O~rATEq}PXi7rd9eyC4+ z2pp3Ux`lkCYR}xt1mk_KD0Z3ATZA3_2Z5yUbUb`Li-UHdlDQB*h~286f3g!ej}WvM z#X0pqNp5QCKgC@?tc|wL`s~B+t6+;pRFl~uIjSwh%x*x~LT|8%D)A&dv^xk$YBt+} z+mxSorW5Xo$&Qnp!wC%UcZzm(d}ei=KPvj&eJysG5MRsZo6z_FyWr>hR(Zrdb)s>G z;%f4My-P$2;cP;}i;^TA8=C$4t9RHeI3pMF(vcI%262rI0aLH#^b!PnT5aD4gNquXs*89Z`#T4X zccEPD45D(-*Jgu`r=6LiPY7_*mtWQXHP<{VTppbONf`6=+E`{s$=?f6#ImtM;R|P0 zo_?~;HyEU@OG3z{HCdD;&L+$Ut$Q~D15h`27|{cUW`f*30lgXIC=v$xHV(e>S37Q3 z(mEDuts+~1qvPGynF{}F}p0D*vUwzBO8aV8bXRSj`oRym0q25Ffv zuRf!nMOxylPBWpxRQy%|?Mz$;#oL-^XH<5Q`8TO?epZ&h%m+XovYIyuK74^^w@EC_ zI6g?()`NhkZ}rmbWDrT6KYO)z+nt;u+Kbuqjs+ zxCOy0q`I=zlO!pZCyF-;JT27FAA;c7}dM*;y5n-TuXn z?C2fu@Zx^|1&DFQA^4ZOEh@4)7JTnUCZubiz5zaoi={^9V&|oYU)?1GZ9St6UKiQPuo9X^>#Nlr_ z9Ii@;=P#S|yjUaki)K0A{6IF)CCq4<oYgt=EQ6RK0LWY=m>3f-61^n%tZ!9S1S_J_QjHHzKRa8oJSwwn zaMCgr{1IXZ!&-tnM&bbL-mB0B9kbh3a*q!$qF9qvEHlYKaV$w6VF3~-BcBT3zQ-{O;Be93i;e*|gVH1# z{5wos4>mCcYv9W-eS9HqKi--t51{LN=P{{(Ph=^q^&zdnIS?SQuvjHd;(QxP$t1 zyd#Bn1sKzQarWV}xt&x7&!Dq@Rh8*RW@jC|0CYe`l~&Q{Tw&C6A*el(N-}QwHhCH0 zDF^sjg1Afpl49>9?2?|53#Jr*rRU{7k08XG=S4>Aw@P+|6loB*^&v35jGHP5;Ltj` zz)KLDG+eqg_V4pm5~~V2k`^=q7%X4A%!UrqBwGSEvp9>0 zk;Nc7->djxzIr*_Q_|WEQvpL&v0vy&%$?_eZ?S8aq_J;mYSyZIDeBK2%JWTR+5>fB zpqKZme!mB)DQU_F(JwL#c0NkR;UozGrB2{=jPbuMW>26zk61;6JPXnhmue6s2CTo> z1UTO#ge(dFtL8t*WyTK_mXnO#W^ztcwS2xGhEeH8s5G1p+x=Eui&Nhu|F$!T{&U_G zE(ZGQmlY{z8|gpMM^Cp~(pJ1F!P^sZ4C9@jU766P?s)H6;pHrs4dMZI<|KTCmj&~N z?Iu+mSN#w8lw4MC%0!$X%e#W}W{cTj{f>(zFXWI5^)>SPZauda`^wen2yy6HYRsMc zM@3?jkb3R_{i)w*T=Rsi{U`{hyqU>3AY0b7_DOJmA4d3D0Ljo|v!?_y*%YUWLBa?f zYBiYx2eA^VRpq4_t;l_rpYW&NDy2`2W-Q1hG)7bBdY!C^QMQ7fjVzsgvX*i z!=2$FIqAVlV@RSA3b-k}lyn zox#R!sxAIcugZZuxy!bz+vw1xIZ?Wf*{L1K>=vX@lICBYppc z{b<%r{G48{kVR1GH0j*)#>`jJe0ZIxG3fnJ{gGFs>vr>e1t(8^D&xZ*W)Ef{7qyRz zwLB0L;xYV?LjV50p1}YdlFVI&QPf}E*+hQ4&tL4(kLkwtQtYD$pVgG!{fdmP`Mv7r z6>@1`tKgw5?mxn`<+?hvmew*V-W^OVk*1 z#y!K4>KB5J2v}Qr4C10sIL!vp;XH|rw(Xj?#+T{vIzr?u74`-k#UPFIyo@6x*^>2{opHup zCye?Y;mk>-LBT{6XYpsno$H%d;q-LuR+|P(#g4eK+K(elm(L{)Mo-W zH9Vsl4vNOI&e}9}b*iH{bWF_uCs0u+pB&b3T$4O}*lr|=tOk6_(eX?zs5Y`?N1HCP zAd_0gBOH+Oz&YEwPDIf0Ew8hyfq@#5!QJMzWmC`~b(G$!8jciXA2+4-IeF8Mv?!HxZ5k}PXs!oMHm`KmG2C3((~`u#w5 z9pNggny*0Z#&|vM-Igj{l9?PW{=ZEARxYi-lJRN!*Rllz<0hqT;+AHDnIn22DpYWdOoXD4 z-PsBrzmGPLF=yIBjPt#;-NC>~HWSu8yVb1Wa!UFZOr9$e(y0Vf#;l4o==35V71)mo z?^ou|WVw;b4u|7P@Q{B`ZvZR=?ieLMLER5xhpABQ8uqs;gs=4sz1=I;|)5nZ!O`O&1oZZiE@WpU=Hl^OQ!I zUbj08)8kV>pkLGLs@AWhXsrudyVb5sz?M`C?s9DjeFPm$6nV_cm$btb7-fza&oPPl zQf)uq`;C5Ir+yf+q8FmagTt)Jsn)vo$CPl{Ad1=ri3r|Fz>gk-z+z0A8z$2nOn%}& zJ>5v9o6E;A1flW<%-B18kXrtquMy<0%`BqFF#^ghkbRg{ke996z2K|ju;A>gKC%|9 z>INKvtxMInI6AvxaJZu{TBci?JNHP>)c>lDNflkKi|j|h&{&VYIl@I6Xg3fcyfA7> zJiiOV_5Q+QktL!d*|>xxljPhh5AaYPV8?2Yu+u)e-u&pfd3psf{t_}3l@;6#p4Mz| zQB;xNErj>`u@#Qr&=iUxsvxkU$AMN9Uj%5~iSJ-U8R&N+!rAU3LrqK?W7p#)ea4RS zNFt0aMuM7z@aPfCs*b@1gE@{p1u!x@U*p$mHKM}!#AOxNmgiwIX*_{4o1p_Ooqybl zLv*W4sWueRG7+*x>%XwW3D?*7APXa+38S6GLqCt9KvQ;4+oxp%QR1zS#GJC#L^_1q zxh*Eoz$muR^I+Z;Lm+LhK!sH&LGI|**{zYhHS;ZAe8eB{eYyxwF>v$}VJ)AID-Q$_+MQJGva0Com+WVWVNRe=y4?^!Vc zU9{2ehOvop3EHZCz%Cm;-x~ns8+|;V?iMi;W~Xp1=2Xoo~%GqbD!LE=Q`GfEezc*rKm;_B0{EM8;xpl2|7;A&!Nq$}tOA zF+B)I$x{y`aAm~cSLuZnx~)M zS?OxuzdHVYM>uxo0tPYZF7W|fhUtWpDuhC0srZ7fz%ZoRq?MVFBrzfV(aT@x-x39@ zY&xHJE;K_U?ayaiJLBlmfu&gG(;ot zc!HMTx3qG=B&bTbj#T+BS(ao{@a9l{O;P~?qOFz5TcCEbYzweGGu8O5S}vNuV!65x zK-65Dfy+DmF-bpzl`sZac5KMAQqpV|)Qfv{W-P|Kb=nCD5*u_BH((l8en{mkjj@tT z@Q1`8iG;IK`@%=+BNu)-=Z>?dZ);U11IN*Pm50ewKNEcNdOd<4MiPq>F=nG=k0=xr zv@gxGU23x^ec~P#&b!X_FA76hbLJS_lt`bNe&Z`UE^1lSYPRi=-hqHGO14x}{5`$Z zbP&3gBsB~YbXMWacVIzzhq593&oXWsMwvTDA>t%JG>ZXl+Jy9CMaY`fREJf0YCtP& zMl9;&&-TNOHmlOTKI>rU!}a!T$HOgIl*A+vnH#($@hy`=-L=>q9Ilh^I((KB^5>eu zse`0~@DG^^YYrGW_>D;JBeDZwLSM5EdC7EX!DG3O8<7c>LyO(!&~IHeP&gvwB;sTr z9NHZLM;3AsUu8w0wD^2ww%&e08_D971_1iWE`f?g$*b8E`Ndhm^vbi0=PPHr9AV+! ziK-@Qj@ePnBN5=~PV?O$gXAEAkIx73yu);!K;xi2IK0tWQ@>Ho0WM@rHWM{SKZf7U zhz5x_OGCTr+H<2F?h!4L10x>a2e+w-JjM+%AN`Q%$1@DlnPB9OX+#ZDi2MXu7sFrH zTBDNMK$Q!<3KSmy!s?5f+vz{?8wD?b=_e??KReGmYhZM*;x@h5xaXQ`tOVb=h=^Sb zrcwXd_YuX`s&vZ=+RU~1OfDn5GuJmwofoJlD7m9DdhXO&0ktl*X+-|U zFx6z9f8nvwq3l7#`!pvt z_u-Cr)6!CRpz@>L1Zyfg*DrPjkXl3YoS!QN~(||q#T7tMgp|;cHV(@tq61{A6sBe9{26P&Z4&Hb;VHxz=jy0@0g!TV4Fc zbWKQ-6bfR5L8o$bQeHicQD&M61dHo=nSc>XwC4E^F9EVytQV--B)JUQwwaof@tK^q zM=MSEBS-~&I#<1b*bt*>-kBNZ>OybBNJ2E8W)&)|7P>34C&@#nMJ4!#FHR*l;7WiP zgaBEvlJu?14)D-A<0le+b?7>1X=w>DjqgNFdNhOxp&lO}G~ipZq1C6kAF#t!Qlydy zb*wDlqN%$9<(>kU7HsH)dk&JyBj`7)4$TGg2$?~fKy$l;6HCG zE&^PNSfh`QcSLQcd}e8C2fzIGe7g67dU)<(O6cHJnjkK1W@`@yxYpn_W!xHG6ZtZd zvs)Zbdm!O!6cYt7HHr5aA`oJ|9;5u9?7f9tpH9C9bE}mvEu`#!c20qx&NwO(_{UGo z&L>yMh$z{z{_9`0FGE_7y@T~8PUiHIW^qlZ>w!{~#^C5wv^2B*l2SNsuQ>5UU>*D9K`##7iUf#CU2W z%LWetp!W*&ITIHn{sDQ4MW|mZLwN+l4Zf2#1c!dznZS6F|3*F`r z?4s0~(nZBfh@O^67MQ50s8CRdgs6aA1or#%`@eiBm(Tb8dA(n+=Syq%h!bPnd;!gt z#o;O`ce+ES+d_gnMxkKYLn=p@;=41#M1sKObqC1 zHa>a(>2uC&DbKO~XbL9#w=G@lEv?_bVBG|DXxbs5r1ZE&%!TIzs0c9EMQKMW%`iFW z9BP6=k#{t5P93j{dy3Q`@cK0~1>ZTxQ&>(J_fR4Vg$>?c;jTLgyTc@Az118D3Qwwf z>P!JPa_ROqpvQs&nTGxVDHf$>nYFQW@m-7gZrGk{` z3Zp?gG5GN}{cBm_p4CM&yQf2Q$yKIXnIFbJ3*N08@}32P!z_XBjrQGM_I-RBDsl_a z^+E$#MZqUO@{4=gLONPsb2wY}aJp$$q3rnj;DwyVrEx<-=M1k8=NSfjnLfJGBc3=wa_vq zR7V5oVz8R__!$a)4JmgKL@KFCwXXCYGLkk&hJczl9KPf-m>P3*_iyML1xbe;xIRJ< zuwb6IfhwDz{N+SZFC{$fzDOgl!0!oNfkJ{prJV*L+F;P_6Dy;{(Y}2Ss|01z+|xaG z%aD(_3V1mJ$2H@ChTd*Jn3~ZV8nLiktDnYX2LGL^p+_6uVj|Lw+UKaeUQAaPM<7V% zPk(gx_3dkrYP`FfWCmlj4}80_&c7c9tqki^mFuLw6T3G4fQTW`vB^|unJ|&{sBqil zT_!6b+80i9>&EQX4tX-@`2RR~THegcG2Me!1Eq1g#n}2ApAqr<1CJQuPvVz-fmWgv z5&Z4SzcaSoz1+`xMuN)9b*yN2(2)Z-p%457VIuyf9e+rhXE#u{HhjM0OdQBQ-gm7E zMQMA`T9Nj`W_dbK-}0AXO7gWd?2`ONQmnvu^Tlgi8ifWupBC(X$+o;W)o??r;Ty<$XUcGP%(tE<#J%0- z@tcS;WT2mII`gm50~Z@Bh3{RUd#zKU0(~%qnb;svH!d$#3D;;VVc7`;x=r%odS%** zHnRqvb=sR>`LSml$~`SGYfsBCJ8N+IY6f+mc|=qPTJEN%cn|ca@<$fOzP)%2+T%{3 zRa`19P*)eIU`=PdeTDz&llb;2Jqgxx!C_W9Yv*q>B0yVV&3 zbZ|TRMsxeEH>`_b5GI%gyxbCdFy1!Dy<#Nm((ggawX`Y__e(}8RXB0Q-<{ZtnUvv1 z9c7FCpw{8w-ofhp(Q<#jhO72rP}pZQa7t3Tz+;(L*boq@U;b>iV=`$=VydG1LS7 zmdIR_OQPevU^={rgi#1(Y^R6te^tQIkq@m^y#pkyU#w| zWYXS&i?Yp9(ae=4aN^!XbqAG_^K5hq2JOUje-6K%$RhOg*$4w=)01RnZtjXtpEsZJ zNJojf-N0)eSb2CJVtf)4mnKR6n>DJXmqKYO|Kv+eiUtcfjx(i&I&NLEv$4|z2Hpp= zQ{eskZ`&$@*o#CQ1*AZt*)Vu1TewrJ>%rJ?3H+ESappR=b5VY6U>q~Qs%6FIdf-5% zoK%Jhk?f&L|DD@%bKO)V7VaG&k7xB9%r!~4D`2w#Ejr{DELKvWrX(1~(-h+UoP z&skTeW+$tB9N603J%-(Gu6f+moZDDiBxM8gfmAjknOm?G-+{18yi*ducoWEN+!8$< zi-m~#Ok?-Idv)PeQMf}UX@8FO_^qCdlVNuIXrn%moj~f!Shvj0;DK-1zuQlNY*5_TTabO zZ;l;3<#8o0<&ERAELrZfOoUZ}j4o~~2L~D#F*SJ3Z54N?7=*0N-I~_SC+Ck50CH0Z z$>2uX>E|l_W>6}>QImT?psphMjZQ`$2M=M9+~vE;khN9TRRhSm{ZXJSIE^J_0lMc+ zP!XZ>=NpcLmo1Ry&-F0~ku7kuBs*H;zqil~g_vKl_u&p(%;q*d?~ezr ztK3HWGPN0Sn!g}A@a#C8$H(Y3)mY5qEJGJr`nIWGqj9R>JbWjB>@>6 z8Pq`dCOMk*({1skMW}U{G)bc z;UxS|vuHZ{e-|efdfL?Ul?{JhL4H~xrKS0r5KAS{&#neB86t2o4EHMaPN0a1mmmvd zi_XC>)!CMQ8MttG*3!j4_~3=z(qf33h@S17-qs9W$0=K4M#Uk&fhJL?%J z#Db|@R1OK6g!8s8%b$*ku)F;GTsJf(0#1SosT#?iy>oE@M(stFoS|Yb-SS*; z(@X1sLFX8mlIa*Wfr>)i)Y&BCx7bR>#U`ySKkyzBL=cBw z;}cfE<`(q>&e)xb#;vcyfd?sNVDY9euEGbD+6d*_mPbov>|9xAyTP+P0Hpb$Tw`Qq5oT#W*7>EWwZ`&L>iDS}LhLq~B{E(l zk;SasVCYdU#O{TAb6QCY6w=mXp5E6@4mX%T2XQ}+ZZ(VXa1}TCn$YxQ*@B^=i>GV7 zF7XYV6Gwp2xJ-;j^>nLOOO9!H4fvPZKKq9=AVK4YV;>_vhv(^p01PKb0N_`|en@z_ zIe@5h9m&Ivp(PqwW%wcolvM4tS7;<0tO-h$nQwbB z{jck_Le)UJ>s!vBufM8JIF`QHhXnzdPHky$)NP?VE0~nVVm+4GDW9iz|BzdhUC#YJ zIP}YM`cD8ijlwC5%}I~CW^Y{9bNcxscXMJ32TT*dFXidV;4CzR1f=IrW1Q#RGaMzC z{(-!jPQah`b1~Pl6GCA=&;KL;C0c_lp9T#f2x1S8T~EB*xeXL%YV!mh-W zj0J6*3txbQkL}AwO;&iYfkkq2VfjRfslFS+s=Wu2kbNfgtLpM{maE;YwDjRpT>KSD z^%k8pO2)Chm1$Z#eg(g6kv8_&Ip8~QcaZG)1{>ow3}W{qY7Mr049XA%+GX!cQksg* znu^}m!T#hCDdlhiyMFk*ExV}^_|*P^P`aX`)C38~*KESFM=DdjaGpd~xC>~ThzI&d zU}ca?C?y#uO3s=@+sZLuXC~xEvo#{au3^g|X%e~d^vDHCa!1n>3ae9}F&5z*ziTQ? z>V;N;?Rub`16=@u+`m@Mk-QTG&p^D0edHLF4uIw}Fq=V6U-`K@BOqTz=M0%8(INyc zW_*ub3ktaf$|g4Q{<_KGmO=5N{w7~~WYYO;zgIZ33P>{wM+p<|x0?MyDK?Ex=AN~) zuJv?lSl-LOEhY3so{I*gWDQ+NFTW1;xEZAOvx3g@0+WynrnxDFYe z`zM;?vObi3Jt=*V@O+bD*#2p1b({p*3h}QLLZM(IQ4iIDOI`6y#6eG06+!0y0487sxJDM!dDeA1wHey>L-* zxILs#>!tBsP5Pq=BV971v4q8*%kNVB3STrkH@N$q2QMz$#rKz1s59F!r6!#%1KLWV zP%dJ!84u$&FSgcpfSM6%l}2iJ;2O^#km}wcs8}0(LF1A$FBN1*=p}5KbpFoUDa8ob zx0Zo$Ys5R#fn++Ytcc)xr>eZ)@>9DhDG`mT{X}3USf4Sd>VZxcYXz*mdug(itwQC!bAp_=ry#g%K z_@HOk%W60KIF_r;2HK$u8?nDV*JZVs2VIAyjkB9BZ|cerY|6~-{FJP_tDu~2p1H&< zP`XkVid8JwX%c%+6m<&+rNRAbK?_kz)|7sH7a-F9*+aW;fD7?$M|X_n8#;DhpdiBcx{!urOpW7PoMnv*bJ4!1CW$;xh32{Rfy4={AL;2_*$e()I)4y#y3Mosr)^T7F!W6t9Yha}WtJy)Z0ylBg{&rUv zyMMl31YyYT`6o=;KgEr4mcY2)N&nkh{T#bl2VEnR>(EBR52<^WkTHc0j z{-brA_rOWPiA+NY`V+IWt|Q}1a*9Fzd?gYFg+O9nDk_6x_X3-Hl(t)4zPmkjMRr$r z+C8vzN??M!VO$&IiVwh}sH(m1NT7%?_Obmac$uh21LkE(G9INtTh_ELnW?pp9{r^F zymcWH$+H|Cd^$2brQK$Fz?U)MtMv-b9W4JJ$U(x>a$24k14{&1V!eEX5u}0ge9d;v zOo(1qb3h9CHp)VS{SAmp{s!`sAtmhLD~npW?Cv@vXeP29%yYzHtgbX$333~hMU}V@ zIwMFWDH`qmMSy|d{8x*kTT0aQ)}H-UEzROVb%);+&xF^ zWBLvXmeM@^(a019r%W;1E*?;z5&X`4J7Iu=s-HkZXhs=I1x{<{SA=eu$28`@p16B~T1l`9 z3Mm)z&K~HEh3EJ6hM0u|sRf4Jac=lyY;MY4qc{Qg`5EvD)o_mYV$XxR#;JzMf`r9R z#Z8K$u%W~LzJ1crV$htD$L5bYMJGNB0fgfBFQ6K?fPj8`0h)4|QBRvo6_^bI_tf!^*$sb)>b>7|J) zJRxdN_EnTf1+oU=>1mun23&*G8fY06bB$|2E#HUs@ugyWj^-vIYwGZ!2k|Y93)IVv z3tz=Hh5H{<4U|N#o+f=?3ncsVXkCvm$JM5%KROtq6?-3;r8otvnKfVS4lpCUKu5e4 zve>e&rjz{pGE<8WdB zf#8i7zUofHL@cGR{so{vOS(+JB^uXvY!!J`!ncSvbt;@@XN69jeT@3_p*$#E17Qqg zK z)u3?e=V^4$ESaDkGMi^G8{3uTyz2qr`2hEHblG%e^yYRoh3uq6XlNAbGP0@?r9zO2 zp!K%l1&zvb<4c4 z2fd>8;xj8z!AMRZ${k+um^Lrcpr-L@j4B$4R!st($pPKdP=iayg_*(jk4>xv>O&eP6 z-(man$yulL4ZqcnMRay@ioY`;3XXQRWYpV_{%8NH_YiUL3<3AvOq|yK{^3t{q(z9M zd#2IrzgFH6Q~ET_s=dT>v1pV#3nhM^&L=3Y3lA;byNry~AX&IouvU`MqzM=_)bsWk z9t!B^*fHEO`%UwK4SlS>Vl|KF`v1q(=ePg zZQ3*Pf}o=<;xz2r&p&~m3ogPXf=pbSf6DRa?jM-|IDP3Hg^$8EKbjZbH|Xdj7g9Fy z()V-|i=TK%!KtAR*EX?3dfW@dE5M4Y&S*VY8OG3B2@=dN8!SDV3Yq^^&Jg=Z2*^%P zV+E20C@Dp#D7iZkM0W0xvzpXfHbVt^<&urSgImfli}*Jp?NyRdduy< zS_P7w>ZWS)i0gIJzFim6X9M_er~(dBMT?r6%|=_+jgBQ@mOg{xd<_O>FYX)PJ|vcp zQnCBt0Gq$Z8w%=!O2dtST$J3*RQ>EXLGufDrRMAOqrQm$YP)-32pCFbx77XXkbuSh zrG{i!Ahl!wPcDEvlzjKqpZFk#R!bwRm=z^f^RY8gD0iX^ItLube?lOhi#`&bO+rfQ zC`J)S9& zd{`6ngJpWD)ycgLDfWtya|^mEI~(_w>?vv#F!Nh zA)M8Q9W^~Y@?Gwjc|jgqNV&`>Z~C-3Egd**aa#{vHUmoGgU~qPao29KcOdY^IlA!x zEs!W1BBe!^WYABD&|o{eJaSPSy(kV1SH3C5H{j9geE(7xpClc`{Ax0G3|JYtzN|Vcd||-$8|kO{sEx6{WM5)Eebo#V+ow zs}aytEu#sFbNY@K&Lzd%%odM0Ax88zoFM1PSdmz^(Tf&mao9_%Rv>bL z$iTvRPZvka54(~YxsDyz9=UuRM8}jMA~f)LWl>s ziTs-~E`pp6JjFv$7Fv>U=@EVMJOtQP@M@THEn_H+$Mw;0q&#lIhLw++rF>JN_U6%? ztms(8uM)pDjRS1JS2ZUHB$cm%i29s6NZ61^M?b24)5sEJU|Q9;^h{!2$f^d`cW@%;3VBVmAY2EVtwp^(vZGDzd!E3=orefRDAL+ zglGW|N=|Em1%<2~>jS38uu4)|P=PQxO1PIeYAlP*^1ItqanniNqQ-n9ZQDsTG{BvKj{{324o2jBy~MV4asdW-6FiS!}Qr5^S0e z{o>RhSFLx3*bhaV%I-+%XfYY}7K~d;))!ZR+s7bHsk{Wl=wdsFyx^bdcJ2O@lJ{oN z5Zl<2GB>g=U&BFLz-e!EJd9(0pRB}I%m*5hVKh$bv{LcXyIaav-j64W6Y$ zkj<{Mln7O$4~z>c?G)Ucx#vEMI;oWIVv_!W{JbS$`Mb?VLYw2yqtabJ4s%B?lA7SMA~mn2_XM;q;fq^E%}$i3d(kPK}5llSh0 zhO^FJhtK!uKnqa1-|)vAE@-}3a9FQ*&bB@{viOjcvg>tv?bPDP`qry_=^M&=X|`xv zZEL~O|A;b^4}ksRoL^rPNvKAd+40<8qkHaOAEYn2s%yNOKcW*&u%lz*AccTI!fLk< z9#m;mEHgU^34r)p;VJyaT)Xn*0!wYrTo3YAm!OCmOA2KMg3>4BcJBrt>Nd* zAeqhG501gh>wx1A_q2-c7L=#aiX%*}qBj+t9I9@l$4TvmAB8L<5k*Vw-Ja3Pis&H~ zB5ePcp>Z&7KYdJv2_Bol*S)Iw_I^OcRiO6s$=(t{LfG!y=%7W%`A7=(npVF3*7sMq z{jK^fcV``#Y^>o?*Om(Mj*K5``G+heao=`}F!N%dNdSz%mCEo1vS;Be9(r4|V19G; z9D%|98(hQNb=sKF;1%wk*^qLf%$E23yNxp~GhD4JDy|Q#Ofg*?U{Uj#S>f<38zK&r zAWAL3!1Ve4m3!LT=Ea60o?;!lB#^tJXw=5*j~F7a9&06+7b@5`UnZV8fi) zM{`U+7J%OBXs+bH(^zGXU!N|k1zloZp)tiXfRG)azomF?O379H&~>vz>fp8T#zpoi z%l8akWv)%~Jp>l8=$_6Bj)f~}QfMwwq^a}>UsjB4BAG0P-I#AxjH=Qz;dUZ@xqjfF zzV{5Q6+I0q2$amFCDz445>N1wcZ#q7{^)@t&3_~p9BJr0QBATnEUp{{NtwV%Q=}j3 zvEQQ$9>qavkxQ;pe+_%^l8R=ZHzP12dwNay5|RBk$%Q@7^dcPCcyyOB6XaT^(>V2$ ze~gSAl5-m!tzZ~PV5^)ci{oRE!E==eI2%AU5&Ku20`yKk9ifo&oLB><TiLFm5zn`-_JM4o%|Af%I33=saF3&^BbtPf?KC6#j&lP*P!!i))+!^ z-2UUaGald)G=pCNd0XNIl-XWx7E?foqoAR4%yu+>rjw$pUrYiY@tltFl0(zJY6957 zacyw&Lg>$>i11axApEb8&Mnq0c!Z+$Hlm!ifTQEB}8MpMU8SyHWY%j8l4{?xhGmYNsaZzlW$ z`B4_1XZXQ#*Gs{m?}pKSPOJ<@2c5w~5g;KjlZN=an%I`E3fSu7dnm|Dorc2Nw*91L zaX87Y-!->|K5(K)wNkyd+cy%v5ZmNk0wVq0)0f}c$FdgzI+ka?p1E0{k=|HRbE5fy zjGOah(oWFL;yEe83uwuWGQHehf@o6?f?y7=e~69mpS)!R@xxT(P=;V;xk(r0I;vH) zPEp^um-pBS3}F5Yvz4G=m%7EpfgEI{6QGL#c7EWN--HwAR!w42I$fKpWVnhP$-F%u zvkPpBoF^k1zv#@=)a#or$~p08!DqD{8tJMHW3g4E|0)1PC9YWob>zbK>}}d@kg+A) z(_q9iwN2x?p-g5;ElkBa;UV8+IXRBgiRHRhnP=)O8gtK^!$EXdW(XrRqARRot>p`#`2A-iSv#DOx&SFy-*xnu@=R)wr$ z|3Ux!-!>JLwkkAE1(^$`P;uFbX5LF3XoYm~dPE|5`rDeM+NMYP9Cq!K0#vsU$*81w zEDr=BB!4n}S8N%bM6+Ommy3%mB3J1p_`(W1i9%k8AsKBiq}&pe1tUiF7NLDj&oKfp zMsF4!!SWV5N+_7aj+N3+y9_=ejo`RkC$uJ>_vv#L`A%axLFm7C7nI}2;k7#f!NL5B z?w#yVRv0BIqxBhg|HB17kBZaX&NzXj zhn2|(2)2w?%56m0#6poqE96AW=IbnagVcPJqZ)F7y@lOWz@y}}G%KFIlp0NgieJIK zC?U+@MC%4C;q+)9!+<@b6*E`#=8|!MZB$e_V`BFXrh|6x3K+K)moRifudz)gj~pW9 zwboAk`eE}6ObO}e9JQivZ~6i-e}jB+QhFkvD0R%c;%?IM++<+V15J~OA|NfI z%{LDNoTtRGv2iI!V_i8l*_!lm{Opohk@O$;DrTyk%B1c&;3^VMXL^w7l+Kbi3vQ&G z1#X9Xa%83o)k_qK>I=TA@nUy(AHIa-Rb(SH*u;_F(V_Vc94U&Oitl4{*S+>L}7Z@yOp&+cKH2 z>qlITKg~|IpZI;ISlERU8l9B3I;MX=Xe0)^GF*b=dl2HnC-aGR5Hs*B!2VVld)r0T z$hzF#(7QTM?2@rW7_Ky@Gu}D*Ee6%y1LY(KM`Tp=<*6>ABRz=k2gwy|Y=5J_1qmnQ&r7{f22w zaEMN_S2d8ve!V*;%66|93S*bR_NHCeT$da+H^bI`hkke`i{X7eTU^y*Hhz*?UN6yM^mxMp?4VK zB3;ER4a80x0-7p=Hm`MbW?;yqgDejZaFHwoP-*XDrd#gm%dn{s6_cDHhiiZ|x9_{p zE}Ny4YM!mQaOUKVD}qg1KfTF&<0SF&A!`z_b@B~<*g z>0;qKpNerNHhaG(_{j6|$1A}7UEStRp(czXFo3qP;bV?jG4FsfmkRuW3wX;0$qZG} zKuz9<4Di3k5b5dR<~~HR>(az5;!Lc28O;s?K`a8`=b>nTa)E8{)3nCsWPeO|6X$xr zLhC^4*$IKW(@(y;Y%?rH9~XM(@P_rA=3GFFw&k-l4#B-hkY6K2<+kEt}EoM2ePM= zyg^s2fCnHw4VYM?LA)yfT8WZ?B6iRyb%}r9N@SNfss8=j(gHwRcNw_-o9BTdpe;>4 zEY;+68Xa2#AQ{p&hrlyUK3}Jyt?uy!>YWu0{@sP-+HgR_QD_{n&BvLkET$K!BH0N@ zJtSik^$4hkH*2i|@MXantZHnvycBVo?aA88AUmZc%+7T9`ApsHR4~sVptVu`tCJ2``zV1)+?v z9^khpF$-qM#Hfhxwog01X*Kg*^I^0z1nD%8s@cg!hUXjgEVe8VSh&~K#v*WAepk_B z(@a7>BF1~?M4r-Bi)E=7qLK?0)D#@wyo`@W_ZVzm8{AbWktEV$QKo4tsEP3m@a`BL zl!w+qH(FV52t9mh9-NT^(lW~t6M$&OJ04j+W&$1v0I4Gg+L2O^!eB9Wznd=-?JEvm z?!J}@fPUBa=Hkz$`Cm<7zhre?;zZ`bOgbqiGNZwJ4|I-y^|k9rDd3=h{@xNwMNUGk zHLOot8ja)zm_WKv>i3G?CD4FAX1S`>xnl6q z-(tcQ_7^Vf-GhmT1}E3Z9CmrK6UxkRC;2hK$wM&LEiHNXb4<6qLM}dLKjz%WIf)f} zd@rrMRZ8`mfSa{K-a+ENq-~w?Z)#;`j^z50d@Hx%&*w*W=o;)zS31YaQ0^ut6=&4% zJ`)XB$+Un$2;zm&$9X~YBKTY!BFt>jDh3XQFlk=lfC`+!00&<9h^}L4z`30|r)cap zcB_WcS(y{e8pf+wN*Q41XQT^AVm-A38nS?Y@SrP9=c{*!>2LWA2ct@Oe$`hL-^U{mZe9QPvi-pl(9qp zB5$U%6nsr2DZ2QICQK0yAIUAs05a&4~ShO2nPR%I*@VXvMs`>{2q#qOIa*#4Aw z?h|jB%jXDC&4EuL^MkEX-R!*;Tp7?b6NcJ*AeG)h>7_+jtG1UCirMu6hc(61QT!e2 zK2CDDk{*NKl69#~M<;`^f=mrR@dL(}8Uo%Vvv%i3_hlZS!%4va$+TO@ECa`}UC`M1 z%W|O_C|;!edOi5R4OIV>lRv&jxs@R!m*Ip0&XL3U2SmQAbFnDNSunTb_6n}1NPe)D zOJ8Jnos|4%k-Rk+=_@&4HbYGYa43Da7GC`ovoOFJ!nCiJ!55cZOCbanUiS%njeFOh zE=(ZO7WbBVdE@pM15_y|S#j}L+Cv-1g5#e8ai-htn_D{e=rZRu1Qkj2xwI=}gKQI?NL*ZaD0=(G{x~a#!?#BxqA`@Sclf zzT%j0Wb8Wfg41vLr`>H@?Z^Rbm;~+ZU%LDI=@;{&Qn7<>Jl@PI}FwaM_7tV^F zM)kqAZEkr8y5A@G~`Gt)ky<6oN4b728misHPoBzF828&nS`+cS3ny0 z0J<(6`3I7#pj^EHDlo`f`Q!MT+77*yn#`l3g{?r|^>Pd@fjJVV+B=2oVzco%d>8J> z2V4EaT|Pa1n38OTGuyUeD=y_z0E&N@gy@)d6}q}!PQp-FW}%%Z8N3Sg6_Ci)nO}BZ zGW{@%e-=)VB$r&u!5g?Zz4yH1ge}?Gg^%BC$L)Xk)F`Oe@_D8)u-A zT_~74K{iw_uj`&hKi|Pc2GG{H!RZMRMiC6=D@2Tuj8#^pr%7DYTkNA}F~4tqQJ@F( zk;0^5P^?8tO6lJhe)fr3h=`!FZbId{U16koV;ayPSwx`EkJp|@1@$Xj(u zS^1WF0oM^+nnw4?EsC_07a|rV>sEy`Q**I`l%0xmMC-w9SOaS5@2c+J*eHUMN<^YzIIPiw5Yo`oaIdw&RMifhTVz7yq8aI+}?52tX1UeEJ|7k)@F^RBc@7x;>HwHx1*8%pI>0K?jp}>UG~!Hg zcQ@1*4I(P3h3o$Qq34sz5HU6%cE`XFCgcKg&$hpGl4rLvg0iEkg#=N z(sSnPDb&P`PZJq&+d4j7xX6{?ux-xsZKp@~z@!X0&$?Pnl)2sVehrS=zZc&U^wB@~ zhz`iCmplB5eau?gT;{DinoXr3vStEjn-J4>r&C`d*WZ{LnKfw@L`>nxWQtjHyxUEx zFbi$q;@nG+b`imbm?*_bYdj*>377hXpf8y%{-cVy#w*rxK4&M>i&dLId^$8URa;O% zYUwYKN?q&u1g6=FW#MHQb=5-;0l!6O5HCi+;gI2Q)@WU3J7 z34I#Yn!|@DKkJ-)Tf=Wn(BV6euV4}0dQqs4=YfRqE`qlA{m>9*#j_HBnSC%lec5AV zU7t`Oov+U-uwJf~<)3nn&)Tt%L3O2l*r^N|pkSF)R=eX)<_^!&_t}4^XLP|z6e%xu zG!fb|bWYMi2T6bd=3{TcVReg5AV@K;Q~4>_2#WQ|XR&|MGzj}LV%6I?`)cOFl^3Ny zdf>B{_XH5YMxZA$jhCp_UUtuSJO5RP#8-v%Pafm^P;bz18fwPnx&=ziRkBuav!&}F zh&5n+(AoZ3(0O(y7K2ZQ?M?hG)r>Goz*&xlp&HJfM~#LSe;z{w+2RzNWgEEE8Ja|lcLj|L6)w@DW~Hv^mm}ixw&O&hx~44=8F^SJJ*D+fA2m$j7I%p zA>0$LKA3}2dVh~U1BrC|pGL~8IQ`)l!RxY+k)X(JD@w?_{x&9JBlP+vx>snpb8uAN zOVEj)s(c&T^UmIlZRjGrkf-n!g81!EtFuT+oZ-!HI~4dXdniT&YNc)wpDM|zsUDca z$THEk#nZ>X*3kKqK+ajPwl+SGc@q7(PX?`a6x-I_8vzHqWY+SPPuZ^^RYR+1a8Qwx z^88@Mmrwg2w03n>#221w`nkDzaJ6sD14m6}{Mj z+X{*{q$}V|x|?gOOP~T?n_f50x#fCcGC}5})3USA^AG3XtcZe{pOIT?wp@8QY@uvB zIh7@E`zambo#1?j#J(CBSQ+|Lo;V81;hs({oI$}gZLdnT&ezySCb)7A4`yNw{NQXd z+W(pcd})}Lc)K8eO#Xv<&n3fRGs)!oW?a!fHSQ6L@jd`Tv}Cg*_OnZ=xv@y!9!ICY z(bSObyQK6At43)i=xu=@A^SpJX$qu|MV1S1oBAB&)Q>jBY46%FlU!??V|@1KZXGk@ zjwHb&0VmmM-hf87Vwp=C4CqYnxix`CyPpZETCiKxOT@PuCc=g?z>DW1p9_onYw=;u zu7?ZKg%kkp-Cqpj9;2C5_nnv`<&QvT1S1<*lr%7M|A7?wUx)DkBhbO$x9tI4C%+@S zXV!4D%US12hxv)x!O5=p7=f4SzffNU-e0A6{XgW)sF=sq28U9M@vm_BgxZKSB#bu)V;I!kYP%oz`lmn_VG9rszb-prlXUE3Xao7t7O9Y|a&ohP^5>cF)FWoFe~QJ{Mv zM!0toI91f|U^_$>KLOijkP1FKH|-X2)rcT_kK7HLja)_S^Ne~wG_15Jh(=Q`N>107 z0IEwA@1*ENBjtZbXH7D2C_CsyZDn{Z&mP#c)e z@=4E!fOxh#PX!Y8mjgEqX?%Jq54+VGzgkzkJf z!RGDKdPBxoQ^%KA4@~_7(a;s=IVYp5WMIEAZ<#rP5+V^1i|?$#{_JhbI$M7c`8n)H zR&B>p*@gGO0yCasNg>@MnIt+Vz7d8-5EOR*+gPUS(we(NWlR@JXYNHiZY$HO`uc*( zgk6NvFghjnb{|}H^c((2N1ojL@MF#^s$}7&!#lGkyLUqPifmBatc90ZBR zkPEdkuvx7s^o?xt2!Bv6CehSh;b1u`-hhzhH;vzQ2qdy+Fd)u?3z;|*_qdAPmxj`^ zPeygqUKjZy19|R75OidgVE%zzp{{-6Mvh21svmLvF|jwR+cyCGr*`Z$p^7zHKNA7^ z5G4tY)fL8?6}_Qfr_TdL8Lby%inROsG+$sM2&^e5d0q@7L4U{I8QYZgI;)8*J-Rsc z_@NwaQ3-e{E*=S@61*W=!N7_g8kjEfyv6id9;CUh;w1w$Prv88*hBt6%S@3wFdMuX z;2*tORHw-}Ll&)0(YW~&Ju9q7w1`XYnlRZ9xeyx)nh-$x@ucZjM1DF!Q zOBE6%6=dEc~Qf^w`Eok9ag1nIRrM+Ni(o_kDzNb5{0`0dO zF-UIw!s5s`XeM?tmjE?mf}Q**qpISFx0L>qzf@+FATr76$L~8w4u+Y*%egI8O%HP| z%*)+1(8^d}cn1IDRv!2y^n56t=`wTfzC|XV=k6S$vKKbOd;+U6m;~<>8B)&vMhH*4 zKAj7D6^gQ-iTM6<%nJ3I?sM4WSfBr~a=k(ZjAhkP|1LarG=+Pm#?d^pO+_(JGi3b^ KgT?=!vHt^0jrp+v literal 0 HcmV?d00001 diff --git a/src/assets/entry-surface/capability-automations-lime.png b/src/assets/entry-surface/capability-automations-lime.png new file mode 100644 index 0000000000000000000000000000000000000000..42e3d020da95a5231820d18ed26db555d2aace20 GIT binary patch literal 405544 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

    1uk_A75S4oV&g`}l!i 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�yY2c$Dz-dvlZX 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�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 literal 0 HcmV?d00001 diff --git a/src/assets/entry-surface/capability-skills-lime.png b/src/assets/entry-surface/capability-skills-lime.png new file mode 100644 index 0000000000000000000000000000000000000000..65a8a71325bc929bea7a0def7bd15cb12adeae83 GIT binary patch literal 466116 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℘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 RMxP*;Oe zFi^pV>z*Q!tcL?GpMYe4!ufi^Uiy8r8BEI!L;L8u{wMt^+@ZMlr#B^Sd~&6&>%^S= zAo^)#OyKQF;*kX@il!ao4OiQ;y~u{4-0)-VcyZ2AvOiq!d+D%*T`lMTPfSj^~+ zg!$;TeMmD>R(%Z;lN{VKt7mp$kJq}oWY8X>9V{BYcI{LIuo+kIo-}=Wb4HA!XC~bz zN=X*nGFGg1XhE`{fhPcM*(hM08(rCq{xkvtkjM0W=(_%xq1l`mxJm|~8?D3XO_>;e zG8pC%h@Vo5Ygu5#DA!tDYev-w1R5AxF}^0Oi-oOr6-|PX9&3kY*?h^ z46y|P1z+CCfA(p{Z#JFMF!C_lQk2|!OO?lG@ZvJ5)4+O2rh1F*MLC=xW=1ZUSFZs! z1+!Np0XCvjV*-Vz$R#WswdU8;1LSVE=$tZLada%8)cf{e`~P#F;^OfpqRBFufG+?$ zL98Qex}cKHrnze2>4&U&@=V>+_a8IMqkMXOM?ID%Goh-1iYaXWcVByDVEHVR>*-0%Uzb6#-4iJf<~4N%~B4$Tl(>Z{w=iI->LaQN@r0%olnfh2 zy5zCin{xWh0!0K@`aj4XtsVleK>Rjf0}Sx(i(;W*Qwv~69> zH?~;wS_fC%rJ1$1Q*Gvz1)fV@9GQ*9^dc@l2w&ZwQyI)!jxYC(2@Lcs#Au*W?=k(0 zRoK3*9D#eKThNLq%@XjHV(y0l@A9pG<=o4P#ZGSzhGhkFclGsYD!89VfVQkg(0M}p zGVgt^plc*4@k9D=1_k+_e5O}Ul^i!8+wT?9i!>owyUqwE@f&#!Z~+b^;B-+LT=1r} zE=EL4gc2oqej+n5%$7I>h_Ft^t1?a{#UGNsMP-MNdYU!!-d0B#V|UUJZ8M`8kB4IX z)DD|pp(WhDA7%rPA8&4<9;RtZVfw}^gM8ex%+Q>1$eS+hp zi^8CRV#@yg6)F_4C+G4?oT28rcizqupI}gSI?7`me-;m|VeAIwvo`X7&dzJ@AGOV~ z%2*;IQTLZAXdn_}5|3FhSju>D^iLlE-Uy;C7VQ@0i-m&7eLcZU zPucJ19JgVb>)pq+L#wsi=t6zpHRB}E>B{&rtzxcw^<9Io`bWL2p*61P@HS5?M8zaAb|~(R zuat8|*Vn26P-7DVU>L$3e_yF@=;)lD={P(i`pWPl2cUo?5C=-f;t5&n+JWLSXEe7j zQ1~^ScV^!nNd^t$09!R<{On#06wY#Ja>3rqb)6s78HF^^joHnsiNvR-*oVqtOFF6F z;#~6Z@;JPhT-6^29|9wY*(k~T?;-z$9bMZSFemr%C(aY!4_uMWj0ptEu7U8tveOU( zi#z0d4OGFb`f~CByp&q(jqA)>_wsPTykdH0OgLs4TxetO`?T?5zQUzsSKjH+<_c6% z?b28OI~{-~7Hjs=zr~-%lV$UdIl%E7*vQOnO|{XvDrd4|YBvyJ{k|eB#{m!y9k)yu z?M-|*hwq(puGLKj%Xx2)7~W4<7wA^-An_-^4({I=!L7aPqQ%zbN&JtftqYEj=%o;U zkv$QE^!{g_@sLlHbJqg(77Shn%oPC8Z@asz2rNxz=TwH2f;kNFh#D)UWF3t;l7%>>VZTCFZt);cYDQL& z50T?qL8-Kdq$KI{#NW3kHk(D<8;+ZM(o=7w#oPE9^(ES#>?~Rg%4thsn6EEAS?Y!G zMd+m08oK+*eUnAFyVCGHU(~Pg!SWOiM?gS4l{d%w+m>}NOdB3wN)M{+q%~w*EZF1n zk9%iO2j$UK`GOdJ)8Fu*bN68s@4Y#)Iv>MS*pJl?^V`Puv+5zQ9LZ2BSh42o-t$0E zMcR36UC!2vPtwhzR#nq|kvk~nNte>+w^wn+{0RV*n2;`*8jJGA;5w*ONN}uz12#x> z$P2Ju&5Ww2oBWAUR&#icN~}FwT6FN@%MGD7(=wcusvkdre0+4$q@*O`G28ws&JsFE zB)7rKejj4gwCA%w$|hd3H3p*h4LS5{E{oh;J&)$nP&o_lRXQbC+V{ z#eu^Bb& z{_gBvCC5r>z%NZClSrsAbu&Yt+y>%{PqVGh6m=+1 zsx$$;5BdN{8jf1_U|h{XF29;L4zJllL|>owK;U|!8OZsiJ(TitBIJw$In|I+_Y|Fx zorMeGjsdGx#_s);`J3AMPGElJ7>O@Gk$+lj)bOStTwalYs6ymZNNslPadgGuU64{v#xlnCl&@(hAi5? z4l4&1)7<;)0cNt$cmPZX9QHihN88CRx)|bkQDpkIChYZY z;@rirz(U_qS)`rBLe5*>J9O-8_3gSByo^P)jRJD$+x@JPz1a+bY_wu%ABQ}o7Mn5G zJ1O~zVQDwbD*3)*iw~&n{ob&~YNcj_lcI`sUhryD$+>Rdmo$3wFVYP4}b9dJQpe z&*}#{eH4Cx5hbge4m$w)u>vg8uOWsp0PopMHvNtMtV8$%jWI4xd@-2$pJqEFX@dUP z2FC)w;@z)^V?EhX5%qz7SCLCXhftw8iXpQvWP(6k7PI_vA#ipj>-1dwKAEhY$@IcW zkoiy@xbN&|r+@xt)gBPQc}0FlLF^t|xv%YplO!6xsMiRU*7ppu@KgaICUXa?NMq^S zT=W1|<=h;iRd5*_*OA$TV#XOls6T=6t~bWPz>_#+iNE}8`ld@sH4foAQKoh=fo2f? z6S+Cq#gLfmea3Umwydxm+x~xHRd46v_#H7obD=WpV!jlJ+U$da3X%Q2<_?!w?!eR* zJ}?<%NTW$Q(T4=Sp?;t{03%&C@o~Aj6ln4ZuKRfsLXqTE%@(g+ef^ZHB3RRlvq!ehKKpq(@fZc^Rm5$Z~EH8bADU=>Uz zq%-IgfF?S^)}F5Jh+iL;Hwj*N>(nFkZC^kxYzws+&4I0JC%wn1bx<3IH~H z?ley9ow++Q$`@WtAl@k}4<1cMD}1K5gusBq^+VRrE}zeHdOSjn-Qw|di+C}!uS_QMs$8OO*`Gi{nd7YZ10;j1G=*|ettjz1Nk znQWTDTvenm!f)pfc` z@Mo{IIfNTFZntZ^9!uvFa}@_`y2M=N#tpesZ#h7=PLQl}`7J}Dp0-TSv@Hpdf`UhY zIutcG9VRx+|)kZSsPG6MV*_Ra1tkuB3b$rRkCMh&SI? zdQWo9@uzNAYyhlilK9F+poN*9JV1cIC;~CS3IUGu^e)$#`6(KdUE3kUlH!afeH{W|pmjf{`pw>`#;rB@ftI$=7GFvvzp6ugmhCU~_ZQU>| zHFx#7#JHX5>0_$@uEIsyYQiAD-^~^Xyqacg@8hFcME5!F8T@H{1owP95{kGFf!c{U z+gPK`H!0J9yzffLkI$nu(Zbs(8#X|;JWudQ4}lM&<>>~0h;5Y0xM@qJJD7f1fOKfx zPi?NXIb1X_An?jd+@`hVIsXG-VWL^WpOE7(yc?yVlXz-glCCBX&3M8wFDyuOi#2J= z!@5*e!*Gp@J$sL&OE9&KY}l4GA$a_%pC;Z1&Q54vw+DQNQ8A}9ykwb!k)+*~!wMao z>LMlK(Mm;wdHIOF)1%0h1Ubn1Ju^gDnKk>Zl$cZ1ZMyPHSgZ!HL>9B#_1&((QHZm$ za>s5%bL|JV!<&fWdPSs5ls~m#ps}L@jGfnK!v4Rbv++yv-2XU+M^P-R!dt?KBS_n0CP#EiwY16 z3;~7I8wCXVU7h~`?)$p0>wA5^pYQu)L%W!UW_EkyE&oEf>}jP*}od$;=0>4(RB2{jh!kpEO?u#E@sgny6>XJ@-D! z?uWYm;L3;q3fDUJI2f!piu)%zY-!}$HZ|xHWAXr*8y=h)Yt!e;b_jHhez>C2lAKA& zMb|%^Wh&P^r^nMNeg5&n#1Bitdp8{+5OM2>E(x-2)|}94&1nlr8q-w}4A&IsIr8nr zl#7bLIVt!3TSc-U?$GdPT6v4k82_AzS&2uv=WA;^o{+waqNyq$bIOc9+{vPHJ_ z5Wv!L6*?`^Y<^5E;T2PNxi;1I1;}CPLYCjj>d$$49x|d=cI0$D4vYOJ^+O5^+{SXN4~#^A7?Xy3yBQ(O8|MA1U3aE^(|>9UGBX!ipP(l3!D{E zdB)3;Iq~s(OBUibg2zUmAo;E}PfKji;LV`Ga;*YLtM{@uS{q=q=FY4|1$$!&*e>=F zxq@CP7YEeW8HX{4(;Ev7(ZHmrTt6{SX}8^zd}Gd=p|qIa&p$$=af+7xGZ5v;#Xrb1 zc8CbRL!cVg1tPnm=1-Wl*Yv`u+_)p73y5e_M6VMvyc7Z?RV(P#@+U2TCr@zaP$g-+ zMOiVY5Z#1;C}EfoHuqIYtOC#PEI$S+*k?2HdWO2DhY4maD&vE43S5uA z^t5Ezvn1~#gK|N#PryuD=(6@+%9?|7i*n$hrvFaU0@Ltl1NO?P6p}%x`7tQ7_i#|2 zqby2vvQji%)U+BIw~-aO3SNf}66QjRX1|cGR_o1K01P;Ke9sw9tVaUu^#>l!krk$O z9Ndr)qB}hz;EO=?zdF^r<^$|8N7y|~H%aDR8yq^wwQ3CSVav{L)C0!85H;pr%*%_@cI z^#^k=ubrNEPSk)?^Vg0^bL+(`ZU)qrO`Nns3KV9ld{b#cg?817gwZ7x5h?^$)||`l z#9TsPN_jfMD5OIK*UnAy7Hy2hq>X{uZ4kNBgN@Vkt|98s3wIVZC=Y!1`^AtsCV7^b zw>>^~i`Q^KZ8{#~J8Bv5BMcO%N=Uu`a0)!(#ePL0`1%z(^BnJlA1paePsRk3>_-QC6kP_BeK6OOHy}HVSYe zu6!`UVE(_K(|-&siPEPLM#D@EMfcf)UAz4rJP_{yEn0d-JcwsBv@ZKQDeUyl;|E@8 zpxgKEYHkWIcD#OfYsc1bMhEk!i>ptzDl=}VEDyH!kkXsOSqc~gdAf_g|L&~g>)2ov znmEZF2hCf`?yLHL*(wuNauREhpg?ofxhuah z{s3KMg)7TBhvM}LWSb4N>Rf?-sfL_y)TuP8uw%4 zsg2oajQjB6|K>1iq8H398{ti=MRGAWaSKG z9*Xvxu^cy+fM>H9HOd$0LBi%EOP_3g#=ZMnwIs&Kr13RC&se9;<|8*gz({#$?X)u= zaO?i&4~x-rz?frqQMMuxQ>&ay9J(OLpnCuG8?H2d=q099iFbH#PtK-R-~7*bwf4r} zAzj`V<})(8076OT#jT2in-wYR8b&<@76R-Brcya21qQs}bA1LZbP21bpM5wsUKovZ zrME=W6V#qg$TZ0vPVC6qk(Fc_}2&V@rp zCDGHafUef_++$MuL%1x!$CBKFKzQdwP@_E}H!~81O^@_%);h;OJz{hp7u#x!4Rzie zCpel#&oAOX-d5Z`%-MIBDod6X!-=vifEJ?$Q1|cD!@{X43u8KY=_;|UQKzyn$;*Ha zb=7ky4|rvoXHyFrurC$g7cmFzxqMDD$%9qvPRE)OytqVsle7S(70VEnyZYv2R48k&)LF8Kk??SSupDCk+3d*R*$J#m+vL&)Hw41^d1AtCSE1FPGRk% zHW`NQ*cIoUmzo(%)Wv|GtQ@M|x`m+OmR?XC;w_oT<%`#}2Bt4tvVVGSe&Wp&gKO4! z{JS6gA&neljwtU}cUMEkt_v5qTJGIBVqkhDZvl#pfTMgP2CuK@p^n(x^ylIs24oqzk+{6EI&#NpJ14T} zp8w4Q&b7(=8Hg5uY&G(Le_7l_lpD)aD4`T=1kjA0jzX(r2iTy}l#-BJTwTLky6a~Q z6)bYs07)m%Omt^h8OH9{D%X>Q?z2v$ln`C9#p+I2PxpWtcV9(#1@aAF%~w08`f!(^ z26e4&EJ)X8G-bzmSRLsC$Mlhc!0(ZJ>L#nY2~J7p+XXdq81d0-RA z2)nx_eV0-i$}dt@uCR}T<98^Kw^Ew$#an8V4EOlul(5^yMv>R0tVy2JklFqxlu0et zPniyAi1zTQTQh`5M`IoMfGHtW9H>JRJzuXlRuTu}IZr;ygsqA`TovvIS66IH<`(yB z=$(thx5&}JZ9*gTTGstSZ?%*ZN2P=kOxanq?$48p-ThrO)$@?_8YSHyu z6P2PkQC#ba@~rJlq@(w%^Hq_HndNZ;*DLQbQ&@4Kp($WhDH>?VW1)y(hL>kWRXi;k zw?{lmFY}Ghfz!E_m3*Qvl6K5@(bfYgiWb(ME5Rcp`3!H{s}#?f6Q1OK?pDj90$VWQ znAhEtGW=&;KtEt8t_FOXK0ND9e}Fnzq-zSandOZKR~)*~qaY0w4zS2=f!Qw)(x~u$ zuRqH7FW0Bnq6TvO+hXj&EAo#@k|mZA<8kHvnvg@}%sHAxvq99T&92o2vMf3OUWxw~ zw?}RT?y+<;+Q0}C*a+hwP*isE1bL=cFMXTcb8xgQTN}9_lO4rtjwnN$J_{Y{Sy6zn z&kKqH-g^mORF+V8Lb(|z2^Mq4&42c(?!TFfWZg8X@&I>rdb=Ue!xl@(G$q+yo8OBQ zHRgng7=TMB@2jBtl63D7-OR&S9p3?cRk7OH64Q_itlQ8mI>752+^OpMjr75HLV075?73+dgeW)^!tTC|mcE_BmDEv#A##f3Ts2(p~K_ zU5RUzV0;!_#6HpI)FZsBkW?`OPlPLj%R5&R%+lDbj`&z&Z|?x*RFf-i{mpwFM#src zSBGg0__i3PNN<}SD{Fyfqo>1$)|q&dlh1t4fL4aee$n^?X&As{;tke(#IE(T+JlRaX(kV=_UlKLbel;3z%amZl<^xkLF6tPZ4`GpiPT`!&rEu0*lKVdCD)~Nn` z1{qe_wzypnSM&=`w%c%LtgOiwPSfv~9b{K$X_2F$<3SfW-!CN&*FXFv!8oil(Vu}+ zH+ZDif(#V0iP=S_9S=6Tb!Ecn!XF6Dt(23Od zteAZ!9B{m^$5OF1oEDnF!I$AiQs<4VHnRosmV8uIAjjX&rlS4JvI`LWh2DC4X*@Wi zAF`uPmO8;5jpy`b&V#kxb;tf3s9Byr>hbgaD*HuAlH0g9BkaJ#;@oQZxf+n(P+%yn z@bWp6KQuPf2KqFV7UL&{v!l;jGT~|P;)I~wN=3>e-y<|Qu+A2&>6PY?PUxEbj`1PA te}aGaF(K(7SFV7cE2f>~zPLQZd10DW_A!65X03njS~kmR91(wb_5Xz#1F--A literal 0 HcmV?d00001 diff --git a/src/components/AppSidebar.test.tsx b/src/components/AppSidebar.test.tsx index fc56f87d1..fc5fb9c20 100644 --- a/src/components/AppSidebar.test.tsx +++ b/src/components/AppSidebar.test.tsx @@ -125,13 +125,16 @@ describe("AppSidebar", () => { await flushEffects(); expect(container.textContent).toContain("能力"); - expect(container.textContent).toContain("视频"); expect(container.textContent).toContain("技能"); - expect(container.textContent).toContain("自动化"); - expect(container.textContent).toContain("IM 配置"); + expect(container.textContent).toContain("消息渠道"); + expect(container.textContent).toContain("资料"); + expect(container.textContent).toContain("资料库"); + expect(container.textContent).toContain("灵感库"); + expect(container.textContent).not.toContain("视频"); + expect(container.textContent).not.toContain("自动化"); }); - it("进入 IM 配置页时应高亮对应能力入口并保留能力分组标题", async () => { + it("进入消息渠道页时应高亮对应能力入口并保留能力分组标题", async () => { const container = mountSidebar({ currentPage: "channels", }); @@ -139,7 +142,7 @@ describe("AppSidebar", () => { expect(container.textContent).toContain("能力"); expect( - container.querySelector('button[aria-label="IM 配置"][aria-current="page"]'), + container.querySelector('button[aria-label="消息渠道"][aria-current="page"]'), ).not.toBeNull(); }); diff --git a/src/components/AppSidebar.tsx b/src/components/AppSidebar.tsx index 12d4b071a..8aab93916 100644 --- a/src/components/AppSidebar.tsx +++ b/src/components/AppSidebar.tsx @@ -44,6 +44,8 @@ import { TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; +import { hasTauriInvokeCapability } from "@/lib/tauri-runtime"; +import { scheduleMinimumDelayIdleTask } from "@/lib/utils/scheduleMinimumDelayIdleTask"; interface AppSidebarProps { currentPage: Page; @@ -56,28 +58,17 @@ type SidebarNavSection = SidebarNavSectionDefinition; const APP_SIDEBAR_COLLAPSED_STORAGE_KEY = "lime.app-sidebar.collapsed"; const SIDEBAR_PLUGIN_IDLE_TIMEOUT_MS = 1200; -const SIDEBAR_PLUGIN_FALLBACK_DELAY_MS = 180; +const SIDEBAR_PLUGIN_BROWSER_IDLE_TIMEOUT_MS = 6000; function scheduleSidebarPluginLoad(task: () => void): () => void { - if (typeof window === "undefined") { - return () => undefined; - } + const minimumDelayMs = hasTauriInvokeCapability() + ? SIDEBAR_PLUGIN_IDLE_TIMEOUT_MS + : SIDEBAR_PLUGIN_BROWSER_IDLE_TIMEOUT_MS; - if (typeof window.requestIdleCallback === "function") { - const idleId = window.requestIdleCallback(() => task(), { - timeout: SIDEBAR_PLUGIN_IDLE_TIMEOUT_MS, - }); - return () => { - if (typeof window.cancelIdleCallback === "function") { - window.cancelIdleCallback(idleId); - } - }; - } - - const timeoutId = window.setTimeout(task, SIDEBAR_PLUGIN_FALLBACK_DELAY_MS); - return () => { - window.clearTimeout(timeoutId); - }; + return scheduleMinimumDelayIdleTask(task, { + minimumDelayMs, + idleTimeoutMs: SIDEBAR_PLUGIN_IDLE_TIMEOUT_MS, + }); } const Container = styled.aside<{ @@ -85,31 +76,31 @@ const Container = styled.aside<{ $themeMode: "light" | "dark"; }>` --sidebar-surface-top: ${({ $themeMode }) => - $themeMode === "dark" ? "#15202b" : "#eef6f0"}; + $themeMode === "dark" ? "#15202b" : "#f6fbf4"}; --sidebar-surface-middle: ${({ $themeMode }) => - $themeMode === "dark" ? "#17232d" : "#f5f5ef"}; + $themeMode === "dark" ? "#17232d" : "#f9fcf6"}; --sidebar-surface-bottom: ${({ $themeMode }) => - $themeMode === "dark" ? "#1a2530" : "#f4f8f8"}; + $themeMode === "dark" ? "#1a2530" : "#fbfff5"}; --sidebar-foreground: ${({ $themeMode }) => - $themeMode === "dark" ? "#eef4f7" : "#1f2937"}; + $themeMode === "dark" ? "#eef4f7" : "#1a3b2b"}; --sidebar-muted: ${({ $themeMode }) => - $themeMode === "dark" ? "#a1afbd" : "#60707d"}; + $themeMode === "dark" ? "#a1afbd" : "#6b826b"}; --sidebar-border: ${({ $themeMode }) => - $themeMode === "dark" ? "#2d3a46" : "#d8e4dc"}; + $themeMode === "dark" ? "#2d3a46" : "#e2f0e2"}; --sidebar-divider: ${({ $themeMode }) => - $themeMode === "dark" ? "rgba(148, 163, 184, 0.14)" : "rgba(148, 163, 184, 0.18)"}; + $themeMode === "dark" ? "rgba(148, 163, 184, 0.14)" : "rgba(132, 204, 22, 0.15)"}; --sidebar-hover: ${({ $themeMode }) => - $themeMode === "dark" ? "#22303c" : "#e4ede6"}; + $themeMode === "dark" ? "#22303c" : "#eef7ee"}; --sidebar-active: ${({ $themeMode }) => - $themeMode === "dark" ? "#2a3e3b" : "#d9e9df"}; + $themeMode === "dark" ? "#2a3e3b" : "#e6f8ea"}; --sidebar-active-foreground: ${({ $themeMode }) => - $themeMode === "dark" ? "#dff4ea" : "#1b4332"}; + $themeMode === "dark" ? "#dff4ea" : "#166534"}; --sidebar-search-bg: ${({ $themeMode }) => - $themeMode === "dark" ? "#1f2b36" : "#fbfcf9"}; + $themeMode === "dark" ? "#1f2b36" : "#fcfff9"}; --sidebar-search-hover: ${({ $themeMode }) => - $themeMode === "dark" ? "#24313d" : "#f2f6f2"}; + $themeMode === "dark" ? "#24313d" : "#f4fdf4"}; --sidebar-search-border-hover: ${({ $themeMode }) => - $themeMode === "dark" ? "#3a4a57" : "#cfded4"}; + $themeMode === "dark" ? "#3a4a57" : "#bbf7d0"}; display: flex; flex-direction: column; width: ${({ $collapsed }) => ($collapsed ? "72px" : "248px")}; @@ -139,13 +130,13 @@ const Container = styled.aside<{ background: radial-gradient( circle at top left, - rgba(88, 160, 123, 0.14) 0%, - rgba(88, 160, 123, 0) 44% + rgba(132, 204, 22, 0.12) 0%, + rgba(132, 204, 22, 0) 44% ), radial-gradient( circle at bottom left, - rgba(109, 153, 219, 0.12) 0%, - rgba(109, 153, 219, 0) 36% + rgba(16, 185, 129, 0.1) 0%, + rgba(16, 185, 129, 0) 36% ); pointer-events: none; z-index: 0; diff --git a/src/components/agent/chat/AgentChatWorkspace.tsx b/src/components/agent/chat/AgentChatWorkspace.tsx index 315c2fb90..b09a33d60 100644 --- a/src/components/agent/chat/AgentChatWorkspace.tsx +++ b/src/components/agent/chat/AgentChatWorkspace.tsx @@ -56,6 +56,7 @@ import { getContent, getGeneralWorkbenchDocumentState, ensureWorkspaceReady, + getOrCreateDefaultProject, type Project, } from "@/lib/api/project"; import { @@ -74,6 +75,7 @@ import { setActiveContentTarget } from "@/lib/activeContentTarget"; import { recordWorkspaceRepair } from "@/lib/workspaceHealthTelemetry"; import { useImageGen } from "@/components/image-gen/useImageGen"; import { resolveMediaGenerationPreference } from "@/lib/mediaGeneration"; +import { scheduleMinimumDelayIdleTask } from "@/lib/utils/scheduleMinimumDelayIdleTask"; import { buildTeamMemoryShadowRequestMetadata, readTeamMemorySnapshot, @@ -90,7 +92,11 @@ import { type LayoutMode, type ThemeType, } from "@/lib/workspace/workbenchContract"; -import { normalizeProjectId } from "./utils/topicProjectResolution"; +import { + isDefaultProjectIdAlias, + normalizeProjectId, +} from "./utils/topicProjectResolution"; +import { isHiddenInternalArtifactPath } from "./utils/internalArtifactVisibility"; import { buildHarnessRequestMetadata } from "./utils/harnessRequestMetadata"; import { deriveHarnessSessionState } from "./utils/harnessState"; import { @@ -128,6 +134,7 @@ import { mergeThreadItems } from "./utils/threadTimelineView"; import { useWorkbenchStore } from "@/stores/useWorkbenchStore"; import { asRecord, + GENERAL_BROWSER_ASSIST_ARTIFACT_ID, mergeMessageArtifactsIntoStore, readFirstString, } from "./workspace/browserAssistArtifact"; @@ -159,6 +166,7 @@ import { useWorkspaceImageWorkbenchEventRuntime } from "./workspace/useWorkspace import { buildImageSkillLaunchRequestMetadata } from "./workspace/imageSkillLaunch"; import { useWorkspaceImageTaskPreviewRuntime } from "./workspace/useWorkspaceImageTaskPreviewRuntime"; import { useWorkspaceVideoTaskPreviewRuntime } from "./workspace/useWorkspaceVideoTaskPreviewRuntime"; +import { useWorkspaceVideoTaskActionRuntime } from "./workspace/useWorkspaceVideoTaskActionRuntime"; import { useWorkspaceRuntimeTeamDispatchPreviewRuntime } from "./workspace/useWorkspaceRuntimeTeamDispatchPreviewRuntime"; import { useWorkspaceSessionRestore } from "./workspace/useWorkspaceSessionRestore"; import { useWorkspaceResetRuntime } from "./workspace/useWorkspaceResetRuntime"; @@ -178,7 +186,11 @@ import { useWorkspaceTeamSessionRuntime } from "./workspace/useWorkspaceTeamSess import { useWorkspaceGeneralWorkbenchDocumentPersistenceRuntime } from "./workspace/useWorkspaceGeneralWorkbenchDocumentPersistenceRuntime"; import { useWorkspaceServiceSkillEntryActions } from "./workspace/useWorkspaceServiceSkillEntryActions"; import { useWorkspaceArtifactViewModeControl } from "./workspace/useWorkspaceArtifactViewModeControl"; -import { resolveArtifactProtocolFilePath } from "@/lib/artifact-protocol"; +import { + areArtifactProtocolPathsEquivalent, + normalizeArtifactProtocolPath, + resolveArtifactProtocolFilePath, +} from "@/lib/artifact-protocol"; import type { ArtifactDocumentV1 } from "@/lib/artifact-document"; import type { ArtifactTimelineOpenTarget } from "./utils/artifactTimelineNavigation"; import { @@ -203,6 +215,7 @@ import { ServiceSkillLaunchDialog } from "./service-skills/ServiceSkillLaunchDia import { AutomationJobDialog } from "@/components/settings-v2/system/automation/AutomationJobDialog"; const GENERAL_BROWSER_ASSIST_PROFILE_KEY = "general_browser_assist"; +const BLANK_HOME_DEFERRED_LOAD_MS = 6_000; function resolveDefaultSelectedArtifact( activeTheme: string, @@ -245,18 +258,11 @@ function resolveVideoCanvasStatusFromPreview( return "generating"; } -function normalizeTaskPreviewArtifactPath(value?: string | null): string { - if (typeof value !== "string") { - return ""; - } - return value.trim().replace(/\\/g, "/"); -} - function resolveTaskPreviewArtifact( message: Message, target: Extract, ): Artifact | null { - const normalizedArtifactPath = normalizeTaskPreviewArtifactPath( + const normalizedArtifactPath = normalizeArtifactProtocolPath( target.preview.kind === "video_generate" ? null : target.preview.artifactPath || null, @@ -265,16 +271,26 @@ function resolveTaskPreviewArtifact( if (normalizedArtifactPath) { const matchedArtifact = messageArtifacts.find( (artifact) => - normalizeTaskPreviewArtifactPath(resolveArtifactProtocolFilePath(artifact)) === - normalizedArtifactPath, + !isHiddenInternalArtifactPath(resolveArtifactProtocolFilePath(artifact)) && + (areArtifactProtocolPathsEquivalent( + resolveArtifactProtocolFilePath(artifact), + normalizedArtifactPath, + ) || + normalizeArtifactProtocolPath( + resolveArtifactProtocolFilePath(artifact), + ) === normalizedArtifactPath), ); if (matchedArtifact) { return matchedArtifact; } } - return messageArtifacts.length > 0 - ? (messageArtifacts[messageArtifacts.length - 1] ?? null) + const visibleArtifacts = messageArtifacts.filter( + (artifact) => + !isHiddenInternalArtifactPath(resolveArtifactProtocolFilePath(artifact)), + ); + return visibleArtifacts.length > 0 + ? (visibleArtifacts[visibleArtifacts.length - 1] ?? null) : null; } @@ -438,6 +454,7 @@ export function AgentChatWorkspace({ agentEntry === "new-task" && !contentId; const shouldPreserveBlankHomeSurface = shouldPreserveEntryThemeOnHome && normalizedEntryTheme === "general"; + const shouldDeferBlankHomeAuxiliaryLoads = shouldPreserveBlankHomeSurface; const [isInitialContentLoading, setIsInitialContentLoading] = useState( shouldBootstrapCanvasOnEntry, ); @@ -493,6 +510,80 @@ export function AgentChatWorkspace({ lockTheme, ]); + useEffect(() => { + if (!isDefaultProjectIdAlias(externalProjectId) || projectId) { + return; + } + + let cancelled = false; + const startedAt = Date.now(); + logAgentDebug("AgentChatPage", "resolveDefaultProjectAlias.start", { + externalProjectId: externalProjectId ?? null, + }); + + void (async () => { + try { + const defaultProject = await getOrCreateDefaultProject(); + let resolvedRootPath = defaultProject.rootPath; + + try { + const ensuredWorkspace = await ensureWorkspaceReady(defaultProject.id); + resolvedRootPath = ensuredWorkspace.rootPath || resolvedRootPath; + } catch (error) { + logAgentDebug( + "AgentChatPage", + "resolveDefaultProjectAlias.ensureWorkspaceReadyError", + { + error, + projectId: defaultProject.id, + }, + { level: "warn" }, + ); + } + + if (cancelled) { + return; + } + + applyProjectSelection(defaultProject.id); + setProject((current) => + current?.id === defaultProject.id && + current.rootPath === resolvedRootPath + ? current + : { + ...defaultProject, + rootPath: resolvedRootPath, + }, + ); + logAgentDebug("AgentChatPage", "resolveDefaultProjectAlias.success", { + durationMs: Date.now() - startedAt, + projectId: defaultProject.id, + rootPath: resolvedRootPath, + }); + } catch (error) { + if (cancelled) { + return; + } + + console.warn("[AgentChatPage] 默认工作区别名解析失败:", error); + logAgentDebug( + "AgentChatPage", + "resolveDefaultProjectAlias.error", + { + durationMs: Date.now() - startedAt, + error, + externalProjectId: externalProjectId ?? null, + }, + { level: "warn" }, + ); + } + })(); + + return () => { + cancelled = true; + }; + }, [applyProjectSelection, externalProjectId, projectId]); + // 画布状态(支持多种画布类型) const [canvasState, setCanvasState] = useState( () => { @@ -563,6 +654,10 @@ export function AgentChatWorkspace({ preferredProviderId: effectiveImageWorkbenchPreference.preferredProviderId, preferredModelId: effectiveImageWorkbenchPreference.preferredModelId, allowFallback: effectiveImageWorkbenchPreference.allowFallback, + providerLoadMode: shouldPreserveBlankHomeSurface ? "deferred" : "immediate", + providerDeferredDelayMs: shouldPreserveBlankHomeSurface + ? BLANK_HOME_DEFERRED_LOAD_MS + : undefined, }); const { availableProviders: imageWorkbenchProviders, @@ -637,7 +732,10 @@ export function AgentChatWorkspace({ skillsLoading, refreshSkills: loadSkills, } = useLimeSkills({ - autoLoad: "immediate", + autoLoad: shouldPreserveBlankHomeSurface ? "deferred" : "immediate", + deferredDelayMs: shouldPreserveBlankHomeSurface + ? BLANK_HOME_DEFERRED_LOAD_MS + : undefined, logScope: "AgentChatPage", onError: (error) => { console.warn("[AgentChatPage] 加载 skills 失败:", error); @@ -648,7 +746,13 @@ export function AgentChatWorkspace({ isLoading: serviceSkillsLoading, error: serviceSkillsError, recordUsage: recordServiceSkillUsage, - } = useServiceSkills(activeTheme === "general"); + } = useServiceSkills({ + enabled: activeTheme === "general", + loadMode: shouldPreserveBlankHomeSurface ? "deferred" : "immediate", + deferredDelayMs: shouldPreserveBlankHomeSurface + ? BLANK_HOME_DEFERRED_LOAD_MS + : undefined, + }); useEffect(() => { if (activeTheme !== "general" || !serviceSkillsError) { @@ -711,6 +815,33 @@ export function AgentChatWorkspace({ }, [setArtifacts], ); + const hasBrowserAssistArtifact = useMemo( + () => + artifacts.some( + (artifact) => + artifact.id === GENERAL_BROWSER_ASSIST_ARTIFACT_ID && + artifact.type === "browser_assist", + ), + [artifacts], + ); + const clearBrowserAssistCanvasArtifact = useCallback(() => { + setArtifacts((currentArtifacts) => { + const nextArtifacts = currentArtifacts.filter( + (artifact) => + !( + artifact.id === GENERAL_BROWSER_ASSIST_ARTIFACT_ID && + artifact.type === "browser_assist" + ), + ); + return nextArtifacts.length === currentArtifacts.length + ? currentArtifacts + : nextArtifacts; + }); + + if (selectedArtifactId === GENERAL_BROWSER_ASSIST_ARTIFACT_ID) { + setSelectedArtifactId(null); + } + }, [selectedArtifactId, setArtifacts, setSelectedArtifactId]); const defaultSelectedArtifact = useMemo( () => resolveDefaultSelectedArtifact(activeTheme, artifacts), [activeTheme, artifacts], @@ -831,17 +962,25 @@ export function AgentChatWorkspace({ setActiveTheme(theme); } - const memory = await getProjectMemory(projectId); - if (cancelled) { - return; + if (!shouldDeferBlankHomeAuxiliaryLoads) { + const memory = await getProjectMemory(projectId); + if (cancelled) { + return; + } + setProjectMemory(memory); + logAgentDebug("AgentChatPage", "loadData.memoryLoaded", { + charactersCount: memory?.characters?.length ?? 0, + durationMs: Date.now() - startedAt, + hasOutline: Boolean(memory?.outline?.length), + projectId, + }); + } else { + setProjectMemory(null); + logAgentDebug("AgentChatPage", "loadData.memoryDeferred", { + durationMs: Date.now() - startedAt, + projectId, + }); } - setProjectMemory(memory); - logAgentDebug("AgentChatPage", "loadData.memoryLoaded", { - charactersCount: memory?.characters?.length ?? 0, - durationMs: Date.now() - startedAt, - hasOutline: Boolean(memory?.outline?.length), - projectId, - }); if (!contentId) { logAgentDebug("AgentChatPage", "loadData.projectOnlyComplete", { @@ -1011,9 +1150,70 @@ export function AgentChatWorkspace({ contentId, lockTheme, initialTheme, + shouldDeferBlankHomeAuxiliaryLoads, shouldPreserveEntryThemeOnHome, ]); + useEffect(() => { + if (!shouldDeferBlankHomeAuxiliaryLoads) { + return; + } + + const normalizedProjectId = normalizeProjectId(projectId); + if (!normalizedProjectId) { + setProjectMemory(null); + return; + } + + let cancelled = false; + const cancelDeferredLoad = scheduleMinimumDelayIdleTask( + () => { + const startedAt = Date.now(); + logAgentDebug("AgentChatPage", "loadDeferredMemory.start", { + projectId: normalizedProjectId, + }); + void getProjectMemory(normalizedProjectId) + .then((memory) => { + if (cancelled) { + return; + } + setProjectMemory(memory); + logAgentDebug("AgentChatPage", "loadDeferredMemory.success", { + charactersCount: memory?.characters?.length ?? 0, + durationMs: Date.now() - startedAt, + hasOutline: Boolean(memory?.outline?.length), + projectId: normalizedProjectId, + }); + }) + .catch((error) => { + if (cancelled) { + return; + } + console.warn("[AgentChatPage] 延后加载项目 Memory 失败:", error); + logAgentDebug( + "AgentChatPage", + "loadDeferredMemory.error", + { + durationMs: Date.now() - startedAt, + error, + projectId: normalizedProjectId, + }, + { level: "warn" }, + ); + }); + }, + { + minimumDelayMs: BLANK_HOME_DEFERRED_LOAD_MS, + idleTimeoutMs: 1_500, + }, + ); + + return () => { + cancelled = true; + cancelDeferredLoad(); + }; + }, [projectId, shouldDeferBlankHomeAuxiliaryLoads]); + useEffect(() => { if (!shouldBootstrapCanvasOnEntry) { return; @@ -1039,43 +1239,68 @@ export function AgentChatWorkspace({ const normalizedId = normalizeProjectId(projectId); if (!normalizedId) return; - const startedAt = Date.now(); - logAgentDebug("AgentChatPage", "workspaceCheck.start", { - projectId: normalizedId, - }); - ensureWorkspaceReady(normalizedId) - .then(({ repaired, rootPath }) => { - if (repaired) { - recordWorkspaceRepair({ - workspaceId: normalizedId, - rootPath, - source: "agent_chat_page", - }); - console.info("[AgentChatPage] workspace 目录已自动修复:", rootPath); - } - logAgentDebug("AgentChatPage", "workspaceCheck.success", { - durationMs: Date.now() - startedAt, - projectId: normalizedId, - repaired, - rootPath, - }); - }) - .catch((err: unknown) => { - const message = err instanceof Error ? err.message : String(err); - console.warn("[AgentChatPage] workspace 目录检查失败:", message); - logAgentDebug( - "AgentChatPage", - "workspaceCheck.error", - { - durationMs: Date.now() - startedAt, - error: err, - projectId: normalizedId, - }, - { level: "warn" }, - ); - setWorkspaceHealthError(true); + let cancelled = false; + const runWorkspaceCheck = () => { + const startedAt = Date.now(); + logAgentDebug("AgentChatPage", "workspaceCheck.start", { + projectId: normalizedId, }); - }, [projectId]); + void ensureWorkspaceReady(normalizedId) + .then(({ repaired, rootPath }) => { + if (cancelled) { + return; + } + if (repaired) { + recordWorkspaceRepair({ + workspaceId: normalizedId, + rootPath, + source: "agent_chat_page", + }); + console.info("[AgentChatPage] workspace 目录已自动修复:", rootPath); + } + logAgentDebug("AgentChatPage", "workspaceCheck.success", { + durationMs: Date.now() - startedAt, + projectId: normalizedId, + repaired, + rootPath, + }); + }) + .catch((err: unknown) => { + if (cancelled) { + return; + } + const message = err instanceof Error ? err.message : String(err); + console.warn("[AgentChatPage] workspace 目录检查失败:", message); + logAgentDebug( + "AgentChatPage", + "workspaceCheck.error", + { + durationMs: Date.now() - startedAt, + error: err, + projectId: normalizedId, + }, + { level: "warn" }, + ); + setWorkspaceHealthError(true); + }); + }; + + const cancelDeferredCheck = shouldDeferBlankHomeAuxiliaryLoads + ? scheduleMinimumDelayIdleTask(runWorkspaceCheck, { + minimumDelayMs: BLANK_HOME_DEFERRED_LOAD_MS, + idleTimeoutMs: 1_500, + }) + : null; + + if (!cancelDeferredCheck) { + runWorkspaceCheck(); + } + + return () => { + cancelled = true; + cancelDeferredCheck?.(); + }; + }, [projectId, shouldDeferBlankHomeAuxiliaryLoads]); useEffect(() => { const normalizedProjectId = normalizeProjectId(projectId); @@ -1083,21 +1308,10 @@ export function AgentChatWorkspace({ return; } - if (project && project.id === normalizedProjectId && !project.isArchived) { - rememberProjectId(normalizedProjectId); + if (project?.id === normalizedProjectId && project.isArchived) { return; } - - getProject(normalizedProjectId) - .then((resolvedProject) => { - if (!resolvedProject || resolvedProject.isArchived) { - return; - } - rememberProjectId(resolvedProject.id); - }) - .catch((error) => { - console.warn("[AgentChatPage] 记录最近项目失败:", error); - }); + rememberProjectId(normalizedProjectId); }, [project, projectId, rememberProjectId]); const chatMode = useMemo( @@ -1198,6 +1412,12 @@ export function AgentChatWorkspace({ }, workspaceId: projectId ?? "", disableSessionRestore: shouldDisableSessionRestore, + initialTopicsLoadMode: shouldPreserveBlankHomeSurface + ? "deferred" + : "immediate", + initialTopicsDeferredDelayMs: shouldPreserveBlankHomeSurface + ? BLANK_HOME_DEFERRED_LOAD_MS + : undefined, getSyncedSessionRecentPreferences, }); activeSessionIdRef.current = sessionId; @@ -1439,6 +1659,31 @@ export function AgentChatWorkspace({ }, [], ); + useEffect(() => { + const normalizedSessionId = sessionId?.trim(); + const localSessionKey = localImageWorkbenchSessionKeyRef.current; + if (!normalizedSessionId || normalizedSessionId === localSessionKey) { + return; + } + + const localState = imageWorkbenchBySessionId[localSessionKey]; + if (!localState) { + return; + } + + updateImageWorkbenchStateForSession( + normalizedSessionId, + (current) => current, + { + fallbackState: localState, + removeSessionKeys: [localSessionKey], + }, + ); + }, [ + imageWorkbenchBySessionId, + sessionId, + updateImageWorkbenchStateForSession, + ]); const teamSessionRuntime = useWorkspaceTeamSessionRuntime({ sessionId, topics, @@ -2224,7 +2469,6 @@ export function AgentChatWorkspace({ const imageWorkbenchActionRuntime = useWorkspaceImageWorkbenchActionRuntime({ cancelImageTask: cancelMediaTaskArtifact, contentId, - createFreshSession, createImageGenerationTask: createImageGenerationTaskArtifact, getImageTask: getMediaTaskArtifact, currentImageWorkbenchState, @@ -2240,7 +2484,6 @@ export function AgentChatWorkspace({ setCanvasState, setInput, setLayoutMode, - updateImageWorkbenchStateForSession, updateCurrentImageWorkbenchState, }); const { handleImageWorkbenchCommand, resolveImageWorkbenchSkillRequest } = @@ -2436,7 +2679,7 @@ export function AgentChatWorkspace({ [displayMessages], ); - // 布局层按实际展示内容判断,避免 browser preflight / bootstrap 预览仍被视为空白态。 + // 布局层按实际展示内容判断,避免 bootstrap 预览等临时消息仍被视为空白态。 const hasDisplayMessages = displayMessages.length > 0; const hasMessages = hasDisplayMessages; const effectiveShowChatPanel = @@ -2496,11 +2739,13 @@ export function AgentChatWorkspace({ showTeamWorkspaceBoard: teamSessionRuntime.showTeamWorkspaceBoard, hasCurrentCanvasArtifact: Boolean(currentCanvasArtifact), currentCanvasArtifactType: currentCanvasArtifact?.type, + hasBrowserAssistArtifact, currentImageWorkbenchActive: currentImageWorkbenchState.active, onHasMessagesChange, dismissActiveTeamWorkbenchAutoOpen, suppressGeneralCanvasArtifactAutoOpen, suppressBrowserAssistCanvasAutoOpen, + clearBrowserAssistCanvasArtifact, setShowSidebar, setLayoutMode, setGeneralCanvasState, @@ -2693,6 +2938,7 @@ export function AgentChatWorkspace({ aspectRatio: normalizeVideoAspectRatio(preview.aspectRatio), resolution: normalizeVideoResolution(preview.resolution), status: resolveVideoCanvasStatusFromPreview(target), + selectedTaskId: preview.taskId, videoUrl: preview.videoUrl || undefined, errorMessage: preview.status === "failed" || preview.status === "cancelled" @@ -2709,14 +2955,14 @@ export function AgentChatWorkspace({ return; } - const normalizedArtifactPath = normalizeTaskPreviewArtifactPath( + const normalizedArtifactPath = normalizeArtifactProtocolPath( target.preview.artifactPath || null, ); if (normalizedArtifactPath) { const matchedTaskFile = taskFiles.find( (file) => - normalizeTaskPreviewArtifactPath(file.name) === - normalizedArtifactPath, + areArtifactProtocolPathsEquivalent(file.name, normalizedArtifactPath) || + normalizeArtifactProtocolPath(file.name) === normalizedArtifactPath, ); if (matchedTaskFile?.content?.trim()) { handleWorkspaceFileClick(matchedTaskFile.name, matchedTaskFile.content); @@ -2811,6 +3057,8 @@ export function AgentChatWorkspace({ contentId, projectRootPath: project?.rootPath || null, restoreFromWorkspace: shouldRestoreImageTasksFromWorkspace, + messages, + currentImageWorkbenchState, canvasState, setCanvasState, setChatMessages, @@ -2820,6 +3068,11 @@ export function AgentChatWorkspace({ messages, setChatMessages, }); + useWorkspaceVideoTaskActionRuntime({ + projectId, + contentId, + setChatMessages, + }); const shellChromeRuntime = useWorkspaceShellChromeRuntime({ agentEntry, @@ -3028,6 +3281,12 @@ export function AgentChatWorkspace({ }); const workspaceShellSceneRuntime = useWorkspaceConversationShellSceneRuntime({ + messageListEmptyStateVariant: + agentEntry === "claw" ? "task-center" : "default", + navbarContextVariant: + agentEntry === "claw" ? "task-center" : "default", + sidebarContextVariant: + agentEntry === "claw" ? "task-center" : "default", navigationActions, inputbarScene, canvasScene, diff --git a/src/components/agent/chat/commands/executor.ts b/src/components/agent/chat/commands/executor.ts index a40bf5f90..c53552fd9 100644 --- a/src/components/agent/chat/commands/executor.ts +++ b/src/components/agent/chat/commands/executor.ts @@ -32,11 +32,13 @@ export async function executeCodexSlashCommand( createFreshSession, appendAssistantMessage, notifyInfo, + onExecutedCommand, } = params; switch (command.definition.key) { case "compact": await compactSession(); + onExecutedCommand?.(command); return true; case "clear": if ( @@ -49,6 +51,7 @@ export async function executeCodexSlashCommand( return true; } clearMessages({ toastMessage: "已清空当前任务" }); + onExecutedCommand?.(command); return true; case "new": { if ( @@ -62,13 +65,16 @@ export async function executeCodexSlashCommand( } const sessionName = command.userInput.trim() || undefined; await createFreshSession(sessionName); + onExecutedCommand?.(command); return true; } case "help": appendAssistantMessage(buildCodexSlashHelpMessage()); + onExecutedCommand?.(command); return true; case "status": appendAssistantMessage(buildCodexSlashStatusMessage(statusSnapshot)); + onExecutedCommand?.(command); return true; case "model": if (command.userInput.trim()) { @@ -76,6 +82,7 @@ export async function executeCodexSlashCommand( return true; } appendAssistantMessage(buildCodexSlashModelMessage(statusSnapshot)); + onExecutedCommand?.(command); return true; case "review": case "diff": @@ -83,6 +90,7 @@ export async function executeCodexSlashCommand( const prompt = buildCodexSlashPrompt(command); if (prompt) { await sendPrompt(prompt); + onExecutedCommand?.(command); return true; } return false; diff --git a/src/components/agent/chat/commands/types.ts b/src/components/agent/chat/commands/types.ts index afb4eff0e..21dee389d 100644 --- a/src/components/agent/chat/commands/types.ts +++ b/src/components/agent/chat/commands/types.ts @@ -45,4 +45,5 @@ export interface ExecuteCodexSlashCommandParams { appendAssistantMessage: (content: string) => void; notifyInfo: (message: string) => void; notifySuccess: (message: string) => void; + onExecutedCommand?: (command: ParsedCodexSlashCommand) => void; } diff --git a/src/components/agent/chat/components/AgentThreadTimeline.test.tsx b/src/components/agent/chat/components/AgentThreadTimeline.test.tsx index 71a70e597..1e8f3d10f 100644 --- a/src/components/agent/chat/components/AgentThreadTimeline.test.tsx +++ b/src/components/agent/chat/components/AgentThreadTimeline.test.tsx @@ -379,6 +379,22 @@ describe("AgentThreadTimeline", () => { ); }); + it("不应把 .lime/tasks 下的内部任务快照 JSON 渲染到时间线里", () => { + const container = renderTimeline([ + createFileArtifactItem({ + id: "artifact-hidden-task-json", + path: ".lime/tasks/image_generate/task-image-1.json", + content: "{\"status\":\"running\"}", + metadata: {}, + }), + ]); + + expect( + container.querySelector('[data-testid="timeline-file-artifact-card"]'), + ).toBeNull(); + expect(container.textContent).not.toContain("task-image-1.json"); + }); + it("收到 timeline 聚焦请求时应自动展开并高亮目标项", () => { const container = renderTimeline( [ diff --git a/src/components/agent/chat/components/AgentThreadTimeline.tsx b/src/components/agent/chat/components/AgentThreadTimeline.tsx index 9f39389c7..1bd38f285 100644 --- a/src/components/agent/chat/components/AgentThreadTimeline.tsx +++ b/src/components/agent/chat/components/AgentThreadTimeline.tsx @@ -27,6 +27,7 @@ import { import type { AgentRuntimeThreadReadModel } from "@/lib/api/agentRuntime"; import { isActionRequestA2UICompatible } from "../utils/actionRequestA2UI"; import { resolveInternalImageTaskDisplayName } from "../utils/internalImagePlaceholder"; +import { isHiddenInternalArtifactPath } from "../utils/internalArtifactVisibility"; import { parseAIResponse } from "@/lib/workspace/a2ui"; import type { A2UIResponse } from "@/lib/workspace/a2ui"; import { TIMELINE_A2UI_TASK_CARD_PRESET } from "@/lib/workspace/a2ui"; @@ -801,6 +802,10 @@ function renderGroupItemDetails( } if (item.type === "file_artifact") { + if (isHiddenInternalArtifactPath(item.path)) { + return null; + } + return ( = ({ const visibleItems = useMemo( () => items.filter( - (item) => item.type !== "user_message" && item.type !== "agent_message", + (item) => + item.type !== "user_message" && + item.type !== "agent_message" && + !(item.type === "file_artifact" && isHiddenInternalArtifactPath(item.path)), ), [items], ); diff --git a/src/components/agent/chat/components/ChatNavbar.test.tsx b/src/components/agent/chat/components/ChatNavbar.test.tsx index 8f1cae64a..0b390744b 100644 --- a/src/components/agent/chat/components/ChatNavbar.test.tsx +++ b/src/components/agent/chat/components/ChatNavbar.test.tsx @@ -141,6 +141,31 @@ describe("ChatNavbar", () => { expect(container.querySelector('[data-testid="project-selector"]')).toBeNull(); }); + it("任务中心顶栏应展示轻量上下文提示", () => { + const container = renderChatNavbar({ + entryContextLabel: "任务中心", + entryContextHint: "回到进行中的任务、旧历史和最近工作现场。", + }); + + expect(container.textContent).toContain("任务中心"); + expect(container.textContent).toContain( + "回到进行中的任务、旧历史和最近工作现场。", + ); + }); + + it("紧凑顶栏应只保留任务中心标签,不额外展开说明", () => { + const container = renderChatNavbar({ + chrome: "workspace-compact", + entryContextLabel: "任务中心", + entryContextHint: "回到进行中的任务、旧历史和最近工作现场。", + }); + + expect(container.textContent).toContain("任务中心"); + expect(container.textContent).not.toContain( + "回到进行中的任务、旧历史和最近工作现场。", + ); + }); + it("点击顶栏按钮后应切换 Harness 面板显隐", () => { function HarnessToggleHarness() { const [visible, setVisible] = useState(false); diff --git a/src/components/agent/chat/components/ChatNavbar.tsx b/src/components/agent/chat/components/ChatNavbar.tsx index 6bf5b53dc..c2ba4ee7a 100644 --- a/src/components/agent/chat/components/ChatNavbar.tsx +++ b/src/components/agent/chat/components/ChatNavbar.tsx @@ -17,6 +17,8 @@ import { Navbar } from "../styles"; interface ChatNavbarProps { isRunning: boolean; chrome?: "full" | "workspace-compact"; + entryContextLabel?: string; + entryContextHint?: string; onToggleHistory: () => void; showHistoryToggle?: boolean; onToggleFullscreen: () => void; @@ -59,6 +61,8 @@ const toolbarTextButtonClassName = export const ChatNavbar: React.FC = ({ isRunning: _isRunning, chrome = "full", + entryContextLabel, + entryContextHint, onToggleHistory, showHistoryToggle = true, onToggleFullscreen: _onToggleFullscreen, @@ -111,6 +115,7 @@ export const ChatNavbar: React.FC = ({ const compactProjectSelectorClassName = isWorkspaceCompact ? "min-w-[184px] max-w-[248px]" : "min-w-[196px] max-w-[280px]"; + const showEntryContext = Boolean(entryContextLabel); return ( @@ -194,6 +199,26 @@ export const ChatNavbar: React.FC = ({ ) : null} ) : null} + + {showEntryContext ? ( +

    + ) : null}
    diff --git a/src/components/agent/chat/components/ChatSidebar.test.tsx b/src/components/agent/chat/components/ChatSidebar.test.tsx index c31078091..87bc29d1e 100644 --- a/src/components/agent/chat/components/ChatSidebar.test.tsx +++ b/src/components/agent/chat/components/ChatSidebar.test.tsx @@ -125,6 +125,71 @@ describe("ChatSidebar", () => { expect(container.textContent).toContain("任务一"); }); + it("任务中心侧栏空态应展示回访型文案", () => { + const container = renderSidebar({ + contextVariant: "task-center", + topics: [], + currentTopicId: null, + }); + + expect(container.textContent).toContain("工作现场"); + expect(container.textContent).toContain( + "回到进行中的任务、旧历史和最近工作现场。", + ); + expect(container.textContent).toContain("还没有进行中的任务"); + expect(container.textContent).toContain( + "从“新建任务”开始也很自然,创建后会在这里继续回访。", + ); + }); + + it("任务中心侧栏应使用回访型任务分组标题", () => { + const now = Date.now(); + const container = renderSidebar({ + contextVariant: "task-center", + currentTopicId: null, + topics: [ + { + ...defaultTopics[0], + id: "topic-running", + title: "进行中任务", + updatedAt: new Date(now), + status: "running", + sourceSessionId: "topic-running", + }, + { + ...defaultTopics[0], + id: "topic-waiting", + title: "待继续任务", + updatedAt: new Date(now - 1_000), + status: "waiting", + statusReason: "user_action", + sourceSessionId: "topic-waiting", + }, + { + ...defaultTopics[0], + id: "topic-recent", + title: "最近回访任务", + updatedAt: new Date(now - 2_000), + status: "done", + sourceSessionId: "topic-recent", + }, + { + ...defaultTopics[0], + id: "topic-older", + title: "更早任务", + updatedAt: new Date(now - 1000 * 60 * 60 * 24 * 5), + status: "done", + sourceSessionId: "topic-older", + }, + ], + }); + + expect(container.textContent).toContain("正在推进"); + expect(container.textContent).toContain("等你继续"); + expect(container.textContent).toContain("最近回访"); + expect(container.textContent).toContain("更早记录"); + }); + it("Team Runtime 和任务列表应处于同一滚动区域", () => { const container = renderSidebar({ childSubagentSessions: [ diff --git a/src/components/agent/chat/components/ChatSidebar.tsx b/src/components/agent/chat/components/ChatSidebar.tsx index 7e2fd668a..a758a74db 100644 --- a/src/components/agent/chat/components/ChatSidebar.tsx +++ b/src/components/agent/chat/components/ChatSidebar.tsx @@ -90,6 +90,8 @@ type TaskSectionKey = | "recent" | "older"; +type ChatSidebarContextVariant = "default" | "task-center"; + interface TaskCardViewModel { id: string; title: string; @@ -111,6 +113,7 @@ interface TaskSection { } interface ChatSidebarProps { + contextVariant?: ChatSidebarContextVariant; onNewChat: () => void; topics: Topic[]; currentTopicId: string | null; @@ -267,7 +270,10 @@ function resolveTaskStatus(params: { }; } -function buildTaskSections(items: TaskCardViewModel[]) { +function buildTaskSections( + items: TaskCardViewModel[], + contextVariant: ChatSidebarContextVariant, +) { const now = Date.now(); const running: TaskCardViewModel[] = []; const waiting: TaskCardViewModel[] = []; @@ -297,11 +303,26 @@ function buildTaskSections(items: TaskCardViewModel[]) { older.push(item); } + const titleSet = + contextVariant === "task-center" + ? { + running: "正在推进", + waiting: "等你继续", + recent: "最近回访", + older: "更早记录", + } + : { + running: "进行中", + waiting: "待处理", + recent: "最近完成", + older: "更早任务", + }; + return [ - { key: "running", title: "进行中", items: sortTaskItems(running) }, - { key: "waiting", title: "待处理", items: sortTaskItems(waiting) }, - { key: "recent", title: "最近完成", items: sortTaskItems(recent) }, - { key: "older", title: "更早任务", items: sortTaskItems(older) }, + { key: "running", title: titleSet.running, items: sortTaskItems(running) }, + { key: "waiting", title: titleSet.waiting, items: sortTaskItems(waiting) }, + { key: "recent", title: titleSet.recent, items: sortTaskItems(recent) }, + { key: "older", title: titleSet.older, items: sortTaskItems(older) }, ] satisfies TaskSection[]; } @@ -407,6 +428,7 @@ function buildCollapsedTeamSummary( } export const ChatSidebar: React.FC = ({ + contextVariant = "default", onNewChat, topics, currentTopicId, @@ -602,11 +624,25 @@ export const ChatSidebar: React.FC = ({ }, [searchKeyword, statusFilter, taskItems]); const sections = useMemo( - () => buildTaskSections(filteredTaskItems), - [filteredTaskItems], + () => buildTaskSections(filteredTaskItems, contextVariant), + [contextVariant, filteredTaskItems], ); const hasAnyTasks = topics.length > 0; const hasFilteredResults = filteredTaskItems.length > 0; + const taskHeadingLabel = + contextVariant === "task-center" ? "工作现场" : "任务"; + const taskHeadingHint = + contextVariant === "task-center" + ? "回到进行中的任务、旧历史和最近工作现场。" + : null; + const emptyStateTitle = + contextVariant === "task-center" ? "还没有进行中的任务" : "还没有任务"; + const emptyStateDescription = + contextVariant === "task-center" + ? "从“新建任务”开始也很自然,创建后会在这里继续回访。" + : "从“新建任务”开始输入需求,创建后会出现在这里。"; + const olderSectionMoreLabel = + contextVariant === "task-center" ? "查看更多旧历史" : "查看更多历史任务"; useEffect(() => { if (editingTopicId && editInputRef.current) { @@ -1024,16 +1060,25 @@ export const ChatSidebar: React.FC = ({
    -
    - 任务 -
    -
    - {searchKeyword.trim() - ? `${filteredTaskItems.length} 条结果` - : `${topics.length} 条`} +
    +
    +
    + {taskHeadingLabel} +
    + {taskHeadingHint ? ( +

    + {taskHeadingHint} +

    + ) : null} +
    +
    + {searchKeyword.trim() + ? `${filteredTaskItems.length} 个结果` + : `${topics.length} 个任务`} +
    @@ -1043,10 +1088,10 @@ export const ChatSidebar: React.FC = ({
    - 还没有任务 + {emptyStateTitle}

    - 从“新建任务”开始输入需求,创建后会出现在这里。 + {emptyStateDescription}

    ) : !hasFilteredResults ? ( @@ -1309,7 +1354,7 @@ export const ChatSidebar: React.FC = ({ onClick={() => setShowAllOlder(true)} className="w-full rounded-2xl border border-dashed border-slate-200 bg-white/75 px-3 py-2 text-sm font-medium text-slate-500 transition hover:border-slate-300 hover:text-slate-800 dark:border-white/10 dark:bg-white/5 dark:text-slate-300 dark:hover:border-white/20 dark:hover:text-white" > - 查看更多历史任务 + {olderSectionMoreLabel} ) : null} diff --git a/src/components/agent/chat/components/EmptyState.test.tsx b/src/components/agent/chat/components/EmptyState.test.tsx index 8b2d216b6..576821549 100644 --- a/src/components/agent/chat/components/EmptyState.test.tsx +++ b/src/components/agent/chat/components/EmptyState.test.tsx @@ -237,7 +237,7 @@ function createGithubSearchServiceSkill(): ServiceSkillHomeItem { } describe("EmptyState", () => { - it("新建任务首页应恢复 slogan,而不是任务引导标题", async () => { + it("首页应以 slogan 作为主视觉并保留创作语义", async () => { const container = renderEmptyState({ activeTheme: "general", }); @@ -246,10 +246,11 @@ describe("EmptyState", () => { await Promise.resolve(); }); - expect(container.textContent).toContain("新建任务"); + expect(container.textContent).toContain("创作"); expect(container.textContent).toContain("青柠一下,灵感即来"); - expect(container.textContent).toContain("从一句想法,到成稿、成图、成片、成事。"); - expect(container.textContent).not.toContain("开始一个新任务"); + expect(container.textContent).toContain("说一句目标,剩下的交给 Lime。"); + expect(container.textContent).toContain("成功做法会沉淀成技能"); + expect(container.textContent).not.toContain("新建任务"); }); it("通用首页应展示推荐方案并替换旧快速启动内容", async () => { @@ -263,17 +264,17 @@ describe("EmptyState", () => { }); expect(container.textContent).toContain("推荐方案"); - expect(container.textContent).toContain("浏览器协助办事"); expect(container.textContent).toContain("网页研究简报"); expect(container.textContent).toContain("内容主稿生成"); expect(container.textContent).toContain("前端概念方案"); expect(container.textContent).toContain("演示提纲草案"); + expect(container.textContent).toContain("浏览器协助办事"); expect(container.textContent).toContain("多代理拆任务"); expect(container.textContent).not.toContain("生成配图"); expect(container.textContent).not.toContain("Team 冒烟测试"); }); - it("通用首页能力卡应继续渲染 4 张能力占位图", async () => { + it("通用首页应继续渲染 4 个带视觉预览的支撑能力入口", async () => { const container = renderEmptyState({ activeTheme: "general", onLaunchBrowserAssist: vi.fn(), @@ -283,18 +284,53 @@ describe("EmptyState", () => { await Promise.resolve(); }); + const expectedLabels = [ + "技能", + "自动化", + "多代理", + "浏览器接入", + ]; const expectedAlts = [ "技能能力卡占位图", "自动化能力卡占位图", "多代理协作能力卡占位图", - "浏览器工作台能力卡占位图", + "浏览器接入能力卡占位图", ]; + for (const label of expectedLabels) { + expect(container.textContent).toContain(label); + } + for (const alt of expectedAlts) { const image = container.querySelector(`img[alt="${alt}"]`); expect(image).toBeTruthy(); expect(image?.getAttribute("src")).toBeTruthy(); } + + expect(container.textContent).not.toContain("连接浏览器"); + }); + + it("点击浏览器能力卡图片应触发浏览器接入", async () => { + const onLaunchBrowserAssist = vi.fn(); + const container = renderEmptyState({ + activeTheme: "general", + onLaunchBrowserAssist, + }); + + await act(async () => { + await Promise.resolve(); + }); + + const mediaButton = container.querySelector( + 'button[aria-label="连接浏览器"]', + ) as HTMLButtonElement | null; + expect(mediaButton).toBeTruthy(); + + act(() => { + mediaButton?.click(); + }); + + expect(onLaunchBrowserAssist).toHaveBeenCalledTimes(1); }); it("点击网页研究简报应开启联网搜索并记录最近使用", async () => { @@ -354,7 +390,7 @@ describe("EmptyState", () => { ); }); - it("点击浏览器协助办事应打开浏览器工作台并写入起始动作", async () => { + it("点击浏览器协助办事应触发浏览器接入并写入起始动作", async () => { const setInput = vi.fn<(value: string) => void>(); const onLaunchBrowserAssist = vi.fn(); const container = renderEmptyState({ @@ -849,9 +885,9 @@ describe("EmptyState", () => { await Promise.resolve(); }); - const launchButton = Array.from(container.querySelectorAll("button")).find( - (button) => button.textContent?.includes("打开浏览器工作台"), - ); + const launchButton = container.querySelector( + 'button[aria-label="连接浏览器"]', + ) as HTMLButtonElement | null; expect(launchButton).toBeTruthy(); act(() => { diff --git a/src/components/agent/chat/components/EmptyState.tsx b/src/components/agent/chat/components/EmptyState.tsx index 3054d97ca..1ca48db4d 100644 --- a/src/components/agent/chat/components/EmptyState.tsx +++ b/src/components/agent/chat/components/EmptyState.tsx @@ -29,7 +29,6 @@ import { EmptyStateQuickActions } from "./EmptyStateQuickActions"; import { EMPTY_STATE_CONTENT_WRAPPER_CLASSNAME, EMPTY_STATE_PAGE_CONTAINER_CLASSNAME, - EMPTY_STATE_SECONDARY_ACTION_BUTTON_CLASSNAME, } from "./emptyStateSurfaceTokens"; import { useActiveSkill } from "../skill-selection/useActiveSkill"; import type { SkillSelectionSourceProps } from "../skill-selection/skillSelectionBindings"; @@ -51,10 +50,10 @@ import { getSiteSkillAutoLaunchExample, hasAutoLaunchableSiteSkill, } from "../service-skills/siteSkillExamplePrompts"; -import capabilitySkillsPlaceholder from "@/assets/entry-surface/capability-skills-placeholder.svg?url"; -import capabilityAutomationsPlaceholder from "@/assets/entry-surface/capability-automations-placeholder.svg?url"; -import capabilityAgentTeamsPlaceholder from "@/assets/entry-surface/capability-agent-teams-placeholder.svg?url"; -import capabilityBrowserAssistPlaceholder from "@/assets/entry-surface/capability-browser-assist-placeholder.svg?url"; +import capabilitySkillsPlaceholder from "@/assets/entry-surface/capability-skills-lime.png"; +import capabilityAutomationsPlaceholder from "@/assets/entry-surface/capability-automations-lime.png"; +import capabilityAgentTeamsPlaceholder from "@/assets/entry-surface/capability-agent-teams-lime.png"; +import capabilityBrowserAssistPlaceholder from "@/assets/entry-surface/capability-browser-assist-lime.png"; const contentReveal = keyframes` from { @@ -76,6 +75,9 @@ const PageContainer = styled.div.attrs({ const ContentWrapper = styled.div.attrs({ className: EMPTY_STATE_CONTENT_WRAPPER_CLASSNAME, })` + display: flex; + flex: 1 1 auto; + min-height: 100%; animation: ${contentReveal} 560ms cubic-bezier(0.22, 1, 0.36, 1) both; @media (prefers-reduced-motion: reduce) { @@ -83,6 +85,92 @@ const ContentWrapper = styled.div.attrs({ } `; +const RecommendationShelf = styled.div` + display: flex; + align-items: center; + gap: 0.55rem; + min-width: 0; + padding: 0 0.3rem 0.1rem; +`; + +const RecommendationShelfHeader = styled.div` + display: flex; + align-items: center; + gap: 0.35rem; + flex-shrink: 0; +`; + +const RecommendationShelfList = styled.div` + display: flex; + align-items: center; + gap: 0; + min-width: 0; + overflow-x: auto; + overflow-y: hidden; + white-space: nowrap; + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } +`; + +const RecommendationShelfRow = styled.div` + position: relative; + display: inline-flex; + align-items: center; + gap: 0.3rem; + flex-shrink: 0; + + & + & { + margin-left: 0.55rem; + padding-left: 0.55rem; + } + + & + &::before { + content: ""; + position: absolute; + left: 0; + top: 50%; + width: 1px; + height: 0.72rem; + transform: translateY(-50%); + background: rgba(203, 213, 225, 0.9); + } +`; + +const RecommendationShelfButton = styled.button` + display: inline-flex; + align-items: center; + gap: 0.3rem; + border: none; + background: transparent; + padding: 0; + text-align: left; + color: rgb(100 116 139); + transition: color 180ms ease; + + &:hover { + color: rgb(15 23 42); + } +`; + +const RecommendationShelfTitle = styled.span` + white-space: nowrap; + font-size: 12px; + font-weight: 500; + line-height: 1.55; + color: currentColor; +`; + +const RecommendationShelfMeta = styled.span` + font-size: 9.5px; + font-weight: 600; + line-height: 1; + letter-spacing: 0.01em; + color: rgb(5 150 105 / 0.88); +`; + interface EmptyStateProps extends SkillSelectionSourceProps { input: string; setInput: (value: string) => void; @@ -160,11 +248,10 @@ const THEME_WORKBENCH_COPY: Record< } > = { general: { - title: "青柠一下,灵感即来", - description: - "从一句想法,到成稿、成图、成片、成事。", + title: "", + description: "说一句目标,剩下的交给 Lime。", supportingDescription: - "Claw 工作台会围绕一个目标持续对话、检索网页、补充素材,并把结果沉淀到右侧画布,而不是只停留在一次性提问。", + "文案、图片、视频、搜索、整理与网页执行可以围绕同一目标持续推进;成功做法会沉淀成技能,偏好、参考与成果会逐渐沉淀成个人资产。", }, }; @@ -411,7 +498,7 @@ export const EmptyState: React.FC = ({ }; const planEnabled = executionStrategy === "code_orchestrated"; - const executionModeLabel = planEnabled ? "Plan 已开启" : "直接执行"; + const executionModeLabel = planEnabled ? "编排模式已开启" : "直接开工"; const workbenchCopy = THEME_WORKBENCH_COPY[activeTheme] || THEME_WORKBENCH_COPY.general; @@ -480,17 +567,17 @@ export const EmptyState: React.FC = ({ const badges: Array<{ key: string; label: string; - tone?: "slate" | "sky" | "emerald" | "amber"; + tone?: "slate" | "sky" | "emerald" | "amber" | "lime"; }> = [ { key: "theme", label: GENERAL_CATEGORY_LABEL, - tone: "slate", + tone: "lime", }, { key: "execution", label: executionModeLabel, - tone: "sky", + tone: "lime", }, ]; @@ -498,7 +585,7 @@ export const EmptyState: React.FC = ({ badges.push({ key: "creation-mode", label: CREATION_MODE_CONFIG[creationMode].name, - tone: "emerald", + tone: "lime", }); } @@ -506,7 +593,7 @@ export const EmptyState: React.FC = ({ badges.push({ key: "web-search", label: "联网搜索已开启", - tone: "sky", + tone: "lime", }); } @@ -514,7 +601,7 @@ export const EmptyState: React.FC = ({ badges.push({ key: "skill", label: activeSkillDisplayLabel, - tone: "emerald", + tone: "lime", }); } @@ -537,72 +624,70 @@ export const EmptyState: React.FC = ({ icon: React.ReactNode; imageSrc?: string; imageAlt?: string; - tone?: "slate" | "sky" | "emerald" | "amber"; + tone?: "slate" | "sky" | "emerald" | "amber" | "lime"; action?: React.ReactNode; + onMediaAction?: () => void; + mediaActionLabel?: string; + mediaActionDisabled?: boolean; }> = [ { key: "skills", - eyebrow: "能力层", + eyebrow: "支撑能力", title: "技能", value: skillSummaryLabel, description: - "把技能当作任务能力层来用,可把固定工作流、提示链和工具调用打包进一次对话。", + "把跑通过的提示、步骤和工具组合沉淀下来,下次遇到同类任务可以直接复用。", icon: , imageSrc: capabilitySkillsPlaceholder, imageAlt: "技能能力卡占位图", - tone: "emerald", + tone: "lime", }, { key: "automation", - eyebrow: "能力层", + eyebrow: "支撑能力", title: "自动化", - value: planEnabled ? "Plan 编排已开启" : "按当前对话直接执行", + value: planEnabled ? "当前会按步骤推进" : "重复流程可持续跑起来", description: - "支持把复杂任务按步骤推进,适合长链路处理、批量执行和需要持续产出的工作流。", + "适合长链路处理、批量任务和持续产出,让重复动作不再每次都从头手动重做。", icon: , imageSrc: capabilityAutomationsPlaceholder, imageAlt: "自动化能力卡占位图", - tone: "sky", + tone: "lime", }, { key: "agent-teams", - eyebrow: "能力层", + eyebrow: "支撑能力", title: "多代理", - value: subagentEnabled ? "协作模式已开启" : "支持分工协作", + value: subagentEnabled ? "当前任务支持并行协作" : "复杂任务可拆成并行分工", description: - "需要并行研究、拆解方案或多角色协同时,可让任务由多个代理分工处理并回收结论。", + "当研究、方案和执行需要同时推进时,可把任务拆给多个代理并行处理,再统一回收结论。", icon: , imageSrc: capabilityAgentTeamsPlaceholder, imageAlt: "多代理协作能力卡占位图", - tone: "amber", + tone: "lime", }, ]; cards.push({ key: "browser", - eyebrow: "能力层", - title: "浏览器工作台", + eyebrow: "支撑能力", + title: "浏览器接入", value: browserAssistLoading - ? "正在准备浏览器会话" - : "网页登录 / 人工接管", + ? "正在检查连接状态" + : "CDP / 浏览器插件复用", description: - "需要处理登录、验证码或复杂网页操作时,可切到浏览器工作台接管真实浏览器。", + "登录、验证和网页动作可直接复用 CDP 或浏览器插件连接,不必再切到单独工作台。", icon: , imageSrc: capabilityBrowserAssistPlaceholder, - imageAlt: "浏览器工作台能力卡占位图", - tone: "slate", - action: onLaunchBrowserAssist ? ( - - ) : null, + imageAlt: "浏览器接入能力卡占位图", + tone: "lime", + onMediaAction: onLaunchBrowserAssist + ? () => { + void onLaunchBrowserAssist(); + } + : undefined, + mediaActionLabel: browserAssistLoading ? "浏览器连接准备中" : "连接浏览器", + mediaActionDisabled: browserAssistLoading, }); return cards; @@ -614,48 +699,6 @@ export const EmptyState: React.FC = ({ subagentEnabled, ]); - const workspaceFeatures = useMemo(() => { - const features = [ - { - key: "context", - title: "持续上下文", - description: - "一个任务可以连续推进,补充背景、改写结果和追问细节都留在同一会话里。", - }, - { - key: "canvas", - title: "画布承接结果", - description: - hasCanvasContent || hasContentId - ? "当前会话已经接入画布,生成内容可继续整理、扩写和汇总。" - : "生成结果不会只停留在消息气泡里,而是继续进入工作台承接后续整理与交付。", - }, - ]; - - if (isGeneralTheme && onLaunchBrowserAssist) { - features.push({ - key: "browser", - title: "网页任务可接管", - description: - "遇到登录、验证码或复杂网页操作时,可切换到浏览器工作台继续完成任务。", - }); - } else { - features.push({ - key: "quick-start", - title: "任务模板起步", - description: - "先点快速启动卡生成第一轮任务,再在输入框里继续细化,是更顺手的使用路径。", - }); - } - - return features; - }, [ - hasCanvasContent, - hasContentId, - isGeneralTheme, - onLaunchBrowserAssist, - ]); - const quickActionItems = useMemo( () => currentRecommendations.slice(0, 4).map(([shortLabel, fullPrompt]) => ({ @@ -782,31 +825,37 @@ export const EmptyState: React.FC = ({ ); const generalRecommendedSolutionsPanel = ( - ({ - key: solution.id, - title: solution.title, - description: solution.summary, - badge: solution.badge, - prompt: solution.prompt, - actionLabel: solution.actionLabel, - outputHint: solution.outputHint, - statusLabel: solution.statusLabel, - statusTone: solution.statusTone, - testId: `entry-recommended-${solution.id}`, - }))} - embedded - onAction={(item) => { - const solution = entryRecommendedSolutions.find( - (candidate) => candidate.id === item.key, - ); - if (solution) { - handleApplyEntryRecommendedSolution(solution); - } - }} - /> + + +
    + 推荐方案 +
    + {selectedTextPreview ? ( + + 当前会带上选中内容 + + ) : null} +
    + + + {entryRecommendedSolutions.map((solution) => ( + + { + handleApplyEntryRecommendedSolution(solution); + }} + > + {solution.title} + {solution.isRecent ? ( + {solution.badge} + ) : null} + + + ))} + +
    ); const headerControls = onProjectChange ? ( @@ -851,13 +900,13 @@ export const EmptyState: React.FC = ({ ` @@ -124,13 +208,21 @@ const SupportingShell = styled.div<{ $delay: number }>` const CardsShell = styled.div` display: grid; - gap: 0.75rem; + margin-top: auto; + gap: 0.7rem; + padding-top: clamp(1rem, 4vh, 2.6rem); grid-template-columns: repeat(1, minmax(0, 1fr)); + align-items: stretch; + grid-auto-rows: minmax(0, 1fr); - @media (min-width: 768px) { + @media (min-width: 720px) { grid-template-columns: repeat(2, minmax(0, 1fr)); } + @media (min-width: 1120px) { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + @media (max-height: 940px) { gap: 0.625rem; } @@ -140,6 +232,10 @@ const HeroCard = styled.article.attrs({ className: EMPTY_STATE_CARD_SURFACE_CLASSNAME, })<{ $index: number }>` position: relative; + display: flex; + height: 100%; + min-height: 210px; + flex-direction: column; transition: transform 220ms ease, box-shadow 220ms ease, @@ -147,27 +243,10 @@ const HeroCard = styled.article.attrs({ animation: ${cardReveal} 520ms cubic-bezier(0.22, 1, 0.36, 1) both; animation-delay: ${({ $index }) => `${160 + $index * 70}ms`}; - &::after { - content: ""; - position: absolute; - left: 1rem; - right: 1rem; - bottom: 0.9rem; - height: 1px; - background: linear-gradient( - 90deg, - rgba(16, 185, 129, 0) 0%, - rgba(16, 185, 129, 0.28) 32%, - rgba(56, 189, 248, 0.22) 70%, - rgba(56, 189, 248, 0) 100% - ); - opacity: 0.7; - } - &:hover { - transform: translateY(-4px); + transform: translateY(-2px); border-color: rgba(203, 213, 225, 0.96); - box-shadow: 0 18px 34px -28px rgba(15, 23, 42, 0.18); + box-shadow: 0 14px 28px -24px rgba(15, 23, 42, 0.14); } @media (prefers-reduced-motion: reduce) { @@ -176,51 +255,57 @@ const HeroCard = styled.article.attrs({ } @media (max-width: 1180px), (max-height: 940px) { - padding: 0.875rem; + padding: 0.8rem; .card-icon { - height: 2rem; - width: 2rem; - border-radius: 1rem; + height: 1.9rem; + width: 1.9rem; + border-radius: 0.95rem; } .card-content { - margin-top: 0.625rem; + margin-top: 0.5rem; + min-height: 0; } .card-title { - font-size: 0.95rem; + font-size: 0.92rem; line-height: 1.3; } - .card-value { - margin-top: 0.125rem; - } + } - .card-description { - -webkit-line-clamp: 2; - font-size: 11px; - line-height: 1.45; - } - - .card-preview { - margin-top: 0.75rem; - } - - .card-preview img { - height: 68px; - } + .card-media { + margin-top: auto; + padding-top: 0.8rem; } `; -const FeaturePanel = styled.div` - order: 5; - animation: ${cardReveal} 620ms cubic-bezier(0.22, 1, 0.36, 1) both; - animation-delay: 260ms; +const CardTitleRow = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; +`; - @media (prefers-reduced-motion: reduce) { - animation: none; - } +const CardValueText = styled.div` + margin-top: 0.2rem; + font-size: 11.5px; + font-weight: 600; + line-height: 1.5; + color: rgb(100 116 139); +`; + +const CardEyebrow = styled.span` + border-radius: 9999px; + border: 1px solid rgba(226, 232, 240, 0.88); + background: rgba(255, 255, 255, 0.92); + padding: 0.18rem 0.5rem; + font-size: 9px; + font-weight: 600; + line-height: 1; + letter-spacing: 0.02em; + color: rgb(148 163 184); `; export interface EmptyStateHeroBadge { @@ -240,22 +325,19 @@ export interface EmptyStateHeroCard { imageAlt?: string; tone?: "slate" | "sky" | "emerald" | "amber"; action?: ReactNode; -} - -export interface EmptyStateHeroFeature { - key: string; - title: string; - description: string; + onMediaAction?: () => void; + mediaActionLabel?: string; + mediaActionDisabled?: boolean; } interface EmptyStateHeroProps { eyebrow: string; title: string; + slogan?: string; description: string; supportingDescription?: string; badges: EmptyStateHeroBadge[]; cards: EmptyStateHeroCard[]; - features?: EmptyStateHeroFeature[]; prioritySlot?: ReactNode; supportingSlot?: ReactNode; headerControls?: ReactNode; @@ -264,11 +346,11 @@ interface EmptyStateHeroProps { export function EmptyStateHero({ eyebrow, title, + slogan, description, supportingDescription, badges, cards, - features = [], prioritySlot, supportingSlot, headerControls, @@ -276,124 +358,132 @@ export function EmptyStateHero({ return ( - - - -
    - {eyebrow} -
    - {headerControls} -
    + + + + + {eyebrow} + {headerControls} + - -

    - {title} -

    -

    - {description} -

    - {supportingDescription ? ( - {supportingDescription} - ) : null} -
    + + + {slogan ? {slogan} : null} + {title ? ( +

    + {title} +

    + ) : null} + {description} + {supportingDescription ? ( + {supportingDescription} + ) : null} +
    - {badges.length > 0 ? ( -
    - {badges.map((badge) => ( - - {badge.label} - - ))} -
    - ) : null} -
    - - - {cards.map((card, index) => ( - -
    -
    - {card.icon} -
    - - {card.eyebrow} - -
    - -
    -
    - {card.title} -
    -
    - {card.value} -
    -

    - {card.description} -

    -
    - - {card.imageSrc ? ( -
    - {card.imageAlt + {badges.length > 0 ? ( +
    + {badges.map((badge) => ( + + {badge.label} + + ))}
    ) : null} - {card.action ? ( -
    {card.action}
    - ) : null} - - ))} - - + + + + + {prioritySlot ? ( - + {prioritySlot} ) : null} {supportingSlot ? ( - + {supportingSlot} ) : null} - {features.length > 0 ? ( - -
    - {features.map((feature) => ( + + {cards.map((card, index) => ( + +
    -
    - {feature.title} -
    -

    - {feature.description} -

    + {card.icon}
    - ))} -
    - - ) : null} + {card.eyebrow} +
    + +
    + +
    + {card.title} +
    + +

    {card.value}

    +

    {card.description}

    +
    + } + /> + + {card.value} +
    + + {card.imageSrc || card.action ? ( +
    + {card.imageSrc ? ( + card.onMediaAction ? ( + + ) : ( +
    + {card.imageAlt +
    + ) + ) : null} + + {card.action ?
    {card.action}
    : null} +
    + ) : null} +
    + ))} +
    +
    ); diff --git a/src/components/agent/chat/components/ImageTaskViewer.test.tsx b/src/components/agent/chat/components/ImageTaskViewer.test.tsx index 6d5bcd235..6c6e951b1 100644 --- a/src/components/agent/chat/components/ImageTaskViewer.test.tsx +++ b/src/components/agent/chat/components/ImageTaskViewer.test.tsx @@ -136,6 +136,24 @@ describe("ImageTaskViewer", () => { expect(onOpenImage).toHaveBeenCalledWith("https://example.com/image-1.png"); }); + it("大图舞台应保留稳定内边距,避免图片贴近上下边线", () => { + const { container } = renderComponent(); + + const stage = container.querySelector( + '[data-testid="image-task-viewer-stage"]', + ) as HTMLDivElement | null; + const openButton = container.querySelector( + '[data-testid="image-task-viewer-open-image"]', + ) as HTMLButtonElement | null; + + expect(stage?.className).toContain("rounded-[20px]"); + expect(openButton?.className).toContain("rounded-[18px]"); + expect(openButton?.className).toContain("p-4"); + expect(openButton?.className).toContain("border-slate-200/80"); + expect(stage?.firstElementChild?.className).toContain("p-4"); + expect(stage?.firstElementChild?.className).toContain("pt-5"); + }); + it("结果图加载失败时应展示兜底文案并隐藏打开原图入口", () => { const { container } = renderComponent(); diff --git a/src/components/agent/chat/components/ImageTaskViewer.tsx b/src/components/agent/chat/components/ImageTaskViewer.tsx index 5086aa40c..b326e7477 100644 --- a/src/components/agent/chat/components/ImageTaskViewer.tsx +++ b/src/components/agent/chat/components/ImageTaskViewer.tsx @@ -1,4 +1,4 @@ -import { ArrowUpRight, LoaderCircle, Sparkles, X } from "lucide-react"; +import { LoaderCircle, Sparkles, X } from "lucide-react"; import { cn } from "@/lib/utils"; import { RenderableTaskImage } from "./RenderableTaskImage"; import type { ImageTaskViewerProps } from "./imageWorkbenchTypes"; @@ -302,78 +302,85 @@ export function ImageTaskViewer({
    -
    - {selectedOutput ? ( - ( - - )} - renderFallback={(reason) => ( -
    -
    - {reason === "empty" && - (selectedTask?.status === "running" || - selectedTask?.status === "routing" || - selectedTask?.status === "queued") ? ( - - ) : ( - - )} -
    - {reason === "error" - ? resolveImageUnavailableTitle(selectedTask?.status) - : statusLabel} -
    -
    - {reason === "error" - ? resolveImageUnavailableDescription(selectedTask?.mode) - : resolveEmptyStateDescription( - selectedTask?.status, - selectedTask?.failureMessage, - selectedTask?.mode, - )} -
    -
    -
    - )} - /> - ) : ( -
    -
    - {selectedTask?.status === "running" || - selectedTask?.status === "routing" || - selectedTask?.status === "queued" ? ( - - ) : ( - +
    +
    + {selectedOutput ? ( + ( + )} -
    - {statusLabel} -
    -
    - {resolveEmptyStateDescription( - selectedTask?.status, - selectedTask?.failureMessage, - selectedTask?.mode, + renderFallback={(reason) => ( +
    +
    + {reason === "empty" && + (selectedTask?.status === "running" || + selectedTask?.status === "routing" || + selectedTask?.status === "queued") ? ( + + ) : ( + + )} +
    + {reason === "error" + ? resolveImageUnavailableTitle(selectedTask?.status) + : statusLabel} +
    +
    + {reason === "error" + ? resolveImageUnavailableDescription(selectedTask?.mode) + : resolveEmptyStateDescription( + selectedTask?.status, + selectedTask?.failureMessage, + selectedTask?.mode, + )} +
    +
    +
    + )} + /> + ) : ( +
    +
    + {selectedTask?.status === "running" || + selectedTask?.status === "routing" || + selectedTask?.status === "queued" ? ( + + ) : ( + )} +
    + {statusLabel} +
    +
    + {resolveEmptyStateDescription( + selectedTask?.status, + selectedTask?.failureMessage, + selectedTask?.mode, + )} +
    -
    - )} + )} +
    {showSourcePanel ? ( diff --git a/src/components/agent/chat/components/ImageWorkbenchMessagePreview.tsx b/src/components/agent/chat/components/ImageWorkbenchMessagePreview.tsx index 5c063d844..f6fd64054 100644 --- a/src/components/agent/chat/components/ImageWorkbenchMessagePreview.tsx +++ b/src/components/agent/chat/components/ImageWorkbenchMessagePreview.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { ArrowUpRight, LoaderCircle, Sparkles } from "lucide-react"; +import { LoaderCircle, Sparkles } from "lucide-react"; import { emitImageWorkbenchFocus } from "@/lib/imageWorkbenchEvents"; import { cn } from "@/lib/utils"; import type { MessageImageWorkbenchPreview } from "../types"; @@ -10,20 +10,6 @@ interface ImageWorkbenchMessagePreviewProps { onOpen?: (preview: MessageImageWorkbenchPreview) => void; } -function resolveModeEyebrow( - mode?: MessageImageWorkbenchPreview["mode"], -): string { - switch (mode) { - case "edit": - return "Image Editing"; - case "variation": - return "Image Redraw"; - case "generate": - default: - return "Image Generation"; - } -} - function resolveResultLabel( mode?: MessageImageWorkbenchPreview["mode"], ): string { @@ -34,7 +20,7 @@ function resolveResultLabel( return "重绘结果"; case "generate": default: - return "图片"; + return "图片结果"; } } @@ -44,7 +30,7 @@ function resolveSourceLabel( return mode === "variation" ? "参考图" : "来源图"; } -function resolveStatusLabel(preview: MessageImageWorkbenchPreview): string { +function resolveStatusPrefix(preview: MessageImageWorkbenchPreview): string { switch (preview.status) { case "complete": switch (preview.mode) { @@ -91,25 +77,42 @@ function resolveStatusLabel(preview: MessageImageWorkbenchPreview): string { } } -function resolveStatusTone(preview: MessageImageWorkbenchPreview): string { +function resolveStatusAccentClass( + preview: MessageImageWorkbenchPreview, +): string { switch (preview.status) { case "complete": - return "border-emerald-200 bg-emerald-50 text-emerald-700"; + return "bg-emerald-500"; case "partial": - return "border-amber-200 bg-amber-50 text-amber-700"; + return "bg-amber-500"; case "cancelled": - return "border-slate-200 bg-slate-100 text-slate-600"; + return "bg-slate-400"; case "failed": - return "border-rose-200 bg-rose-50 text-rose-700"; + return "bg-rose-500"; case "running": default: - return "border-sky-200 bg-sky-50 text-sky-700"; + return "bg-sky-500"; } } +function isTransitionStatusMessage(statusMessage: string): boolean { + return ( + statusMessage.includes("正在同步") || + statusMessage.includes("同步任务状态") || + statusMessage.includes("同步到对话") || + statusMessage.includes("异步队列") + ); +} + function resolveDescription(preview: MessageImageWorkbenchPreview): string { const statusMessage = preview.statusMessage?.trim(); - if (statusMessage) { + if ( + statusMessage && + !( + preview.status !== "running" && + isTransitionStatusMessage(statusMessage) + ) + ) { return statusMessage; } @@ -118,35 +121,33 @@ function resolveDescription(preview: MessageImageWorkbenchPreview): string { switch (preview.status) { case "complete": return preview.imageCount && preview.imageCount > 1 - ? `已返回 ${preview.imageCount} 张${resultLabel},打开查看即可。` - : `${resultLabel}已经完成,打开查看即可。`; + ? `已返回 ${preview.imageCount} 张${resultLabel},可在右侧继续查看与使用。` + : `${resultLabel}已经完成,可在右侧继续查看与使用。`; case "partial": return preview.imageCount && preview.imageCount > 0 ? `已返回 ${preview.imageCount} 张${resultLabel},剩余结果未完成。` - : `${resultLabel}任务返回了部分结果。`; + : `${resultLabel}已同步一部分,可在右侧继续查看。`; case "cancelled": return "任务已经取消,当前不会继续生成新的图片结果。"; case "failed": return preview.retryable === false ? "当前错误需要先调整配置或参数。" - : "这次没有拿到可用结果,请稍后重试。"; + : "这次没有拿到可用结果,请调整描述后重试。"; case "running": default: switch (preview.mode) { case "edit": - return "图片编辑中,完成后会直接替换成真实结果。"; + return "正在处理修图,完成后会自动替换成真实结果。"; case "variation": - return "图片重绘中,完成后会直接替换成真实结果。"; + return "正在处理重绘,完成后会自动替换成真实结果。"; case "generate": default: - return "图片生成中,完成后会直接替换成真实结果。"; + return "正在生成图片,完成后会自动替换成真实结果。"; } } } -function resolvePlaceholderLabel( - preview: MessageImageWorkbenchPreview, -): string { +function resolvePlaceholderLabel(preview: MessageImageWorkbenchPreview): string { if (preview.status === "failed") { return "暂未生成成功"; } @@ -156,7 +157,7 @@ function resolvePlaceholderLabel( if (preview.status === "complete" || preview.status === "partial") { return "结果已同步"; } - return resolveStatusLabel(preview); + return resolveStatusPrefix(preview); } function resolveImageUnavailableLabel( @@ -168,14 +169,16 @@ function resolveImageUnavailableLabel( return resolvePlaceholderLabel(preview); } -function shouldShowSourcePanel(preview: MessageImageWorkbenchPreview): boolean { +function shouldShowSourceFootnote( + preview: MessageImageWorkbenchPreview, +): boolean { return Boolean( preview.mode === "edit" || - preview.mode === "variation" || - preview.sourceImageUrl?.trim() || - preview.sourceImagePrompt?.trim() || - preview.sourceImageRef?.trim() || - preview.sourceImageCount, + preview.mode === "variation" || + preview.sourceImageUrl?.trim() || + preview.sourceImagePrompt?.trim() || + preview.sourceImageRef?.trim() || + preview.sourceImageCount, ); } @@ -201,16 +204,41 @@ function resolveSourceSummary(preview: MessageImageWorkbenchPreview): string { : "当前任务会基于已有图片结果继续完成修图。"; } -function resolveSourcePlaceholderLabel( +function resolveSourceFootnote( preview: MessageImageWorkbenchPreview, -): string { - return preview.mode === "variation" ? "参考图待同步" : "来源图待同步"; +): string | null { + if (!shouldShowSourceFootnote(preview)) { + return null; + } + + return `${resolveSourceLabel(preview.mode)}:${resolveSourceSummary(preview)}`; +} + +function renderPlaceholder(preview: MessageImageWorkbenchPreview, reason: string) { + return ( +
    +
    + {reason === "empty" && preview.status === "running" ? ( + + ) : ( + + )} +
    + {reason === "error" + ? resolveImageUnavailableLabel(preview) + : resolvePlaceholderLabel(preview)} +
    +
    +
    + ); } export const ImageWorkbenchMessagePreview: React.FC< ImageWorkbenchMessagePreviewProps > = ({ preview, onOpen }) => { - const showSourcePanel = shouldShowSourcePanel(preview); + const sourceFootnote = resolveSourceFootnote(preview); + const statusPrefix = resolveStatusPrefix(preview); + const statusDescription = resolveDescription(preview); return ( ); diff --git a/src/components/agent/chat/components/Inputbar/components/InputbarCore.test.tsx b/src/components/agent/chat/components/Inputbar/components/InputbarCore.test.tsx index d5025de36..0de6b42a7 100644 --- a/src/components/agent/chat/components/Inputbar/components/InputbarCore.test.tsx +++ b/src/components/agent/chat/components/Inputbar/components/InputbarCore.test.tsx @@ -116,6 +116,15 @@ const renderInputbarCore = async ( }; describe("InputbarCore", () => { + it("挂载时不应主动预取语音配置", async () => { + await renderInputbarCore({ + visualVariant: "default", + toolMode: "default", + }); + + expect(mockGetVoiceInputConfig).not.toHaveBeenCalled(); + }); + it("主题工作台未聚焦时应使用单行紧凑态,点击展开,移出后收起", async () => { const container = await renderInputbarCore(); const textarea = container.querySelector( @@ -222,6 +231,7 @@ describe("InputbarCore", () => { await Promise.resolve(); }); + expect(mockGetVoiceInputConfig).toHaveBeenCalledTimes(1); expect(mockStartRecording).toHaveBeenCalledTimes(1); const stopDictationButton = container.querySelector( diff --git a/src/components/agent/chat/components/Inputbar/components/InputbarCore.tsx b/src/components/agent/chat/components/Inputbar/components/InputbarCore.tsx index eb46074d3..442bb76da 100644 --- a/src/components/agent/chat/components/Inputbar/components/InputbarCore.tsx +++ b/src/components/agent/chat/components/Inputbar/components/InputbarCore.tsx @@ -112,6 +112,7 @@ export const InputbarCore: React.FC = ({ const isFloatingVariant = visualVariant === "floating"; const { dictationEnabled, + voiceConfigLoaded, dictationState, isDictating, isDictationBusy, @@ -176,7 +177,7 @@ export const InputbarCore: React.FC = ({ : "语音识别中" : isDictating ? "停止语音输入" - : dictationEnabled + : dictationEnabled || !voiceConfigLoaded ? "开始语音输入" : "语音输入未启用"; @@ -247,11 +248,11 @@ export const InputbarCore: React.FC = ({ isFullscreen={isFullscreen} fillHeightWhenFullscreen hasAdditionalContent={pendingImages.length > 0} - maxAutoHeight={isTextareaExpanded ? 320 : isFloatingVariant ? 160 : 120} + maxAutoHeight={isTextareaExpanded ? 360 : isFloatingVariant ? 240 : 120} textareaRef={resolvedTextareaRef} onEscape={() => onToolClick("fullscreen")} allowSendWhileLoading - rows={isTextareaExpanded ? 6 : 1} + rows={isTextareaExpanded ? 7 : isFloatingVariant ? 3 : 1} placeholder={ placeholder || (isFullscreen diff --git a/src/components/agent/chat/components/Inputbar/components/InputbarModelExtra.tsx b/src/components/agent/chat/components/Inputbar/components/InputbarModelExtra.tsx index 23e93e6da..63499cbc9 100644 --- a/src/components/agent/chat/components/Inputbar/components/InputbarModelExtra.tsx +++ b/src/components/agent/chat/components/Inputbar/components/InputbarModelExtra.tsx @@ -1,6 +1,7 @@ import React from "react"; import { Badge } from "@/components/ui/badge"; import type { AsterSessionExecutionRuntime } from "@/lib/api/agentRuntime"; +import { hasTauriInvokeCapability } from "@/lib/tauri-runtime"; import { ChatModelSelector } from "../../ChatModelSelector"; import { getOutputSchemaRuntimeLabel } from "../../../utils/sessionExecutionRuntime"; @@ -28,6 +29,9 @@ export const InputbarModelExtra: React.FC = ({ if (isFullscreen || !providerType || !model) { return null; } + const selectorBackgroundPreload = hasTauriInvokeCapability() + ? "immediate" + : "disabled"; const outputSchemaLabel = getOutputSchemaRuntimeLabel( executionRuntime?.output_schema_runtime, @@ -44,6 +48,7 @@ export const InputbarModelExtra: React.FC = ({ compactTrigger popoverSide="top" onManageProviders={onManageProviders} + backgroundPreload={selectorBackgroundPreload} /> {outputSchemaLabel ? ( ("idle"); const [dictationEnabled, setDictationEnabled] = useState(false); const [soundEnabled, setSoundEnabled] = useState(false); + const [voiceConfigLoaded, setVoiceConfigLoaded] = useState(false); const textRef = useRef(text); const dictationStateRef = useRef("idle"); const voiceConfigRef = useRef(null); @@ -75,23 +76,7 @@ export function useInputbarDictation({ }, [dictationState]); useEffect(() => { - let cancelled = false; - - getVoiceInputConfig() - .then((config) => { - if (cancelled) { - return; - } - voiceConfigRef.current = config; - setDictationEnabled(config.enabled); - setSoundEnabled(config.sound_enabled); - }) - .catch((error) => { - console.error("[输入栏] 加载语音输入配置失败:", error); - }); - return () => { - cancelled = true; if (dictationStateRef.current === "listening") { void cancelRecording().catch((error) => { console.error("[输入栏] 卸载时取消录音失败:", error); @@ -126,6 +111,7 @@ export function useInputbarDictation({ voiceConfigRef.current = config; setDictationEnabled(config.enabled); setSoundEnabled(config.sound_enabled); + setVoiceConfigLoaded(true); return config; }, []); @@ -230,6 +216,7 @@ export function useInputbarDictation({ return { dictationEnabled, + voiceConfigLoaded, dictationState, isDictating: dictationState === "listening", isDictationBusy: dictationState !== "idle", diff --git a/src/components/agent/chat/components/Inputbar/styles.ts b/src/components/agent/chat/components/Inputbar/styles.ts index acc40451c..e407e62e0 100644 --- a/src/components/agent/chat/components/Inputbar/styles.ts +++ b/src/components/agent/chat/components/Inputbar/styles.ts @@ -39,24 +39,24 @@ export const Container = styled.div` export const InputBarContainer = styled.div` position: relative; - border: 1px solid #d7e0ea; + border: 1px solid #dcfce7; border-radius: 22px; padding: 10px 12px 10px 10px; - background: linear-gradient(180deg, #fbfdff 0%, #f5f8fb 100%); + background: linear-gradient(180deg, #fdfffb 0%, #f4fbf5 100%); box-shadow: - 0 10px 28px rgba(15, 23, 42, 0.06), - inset 0 1px 0 rgba(255, 255, 255, 0.85); + 0 10px 28px rgba(22, 101, 52, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.9); transition: border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; &:focus-within { - border-color: #c5d3e2; - background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%); + border-color: #bbf7d0; + background: linear-gradient(180deg, #ffffff 0%, #f0fdf4 100%); box-shadow: - 0 0 0 3px rgba(191, 219, 254, 0.32), - 0 14px 32px rgba(15, 23, 42, 0.08), + 0 0 0 3px rgba(134, 239, 172, 0.35), + 0 14px 32px rgba(22, 101, 52, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.92); } @@ -67,12 +67,12 @@ export const InputBarContainer = styled.div` &.floating-composer { border-radius: 20px; - padding: 8px 10px; - background: linear-gradient(180deg, #fcfdff 0%, #f7f9fc 100%); - border-color: #d7e0ea; + padding: 16px 18px 14px 16px; + background: linear-gradient(180deg, #fcfffc 0%, #f4fcf5 100%); + border-color: #d1fae5; box-shadow: - 0 10px 26px rgba(15, 23, 42, 0.08), - inset 0 1px 0 rgba(255, 255, 255, 0.78); + 0 16px 32px rgba(22, 101, 52, 0.05), + inset 0 1px 0 rgba(255, 255, 255, 0.85); } &.floating-composer.floating-collapsed { @@ -81,12 +81,12 @@ export const InputBarContainer = styled.div` } &.floating-composer:focus-within { - background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%); - border-color: #c5d3e2; + background: linear-gradient(180deg, #ffffff 0%, #ecfdf5 100%); + border-color: #a7f3d0; box-shadow: - 0 0 0 3px rgba(191, 219, 254, 0.38), - 0 12px 28px rgba(15, 23, 42, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.86); + 0 0 0 3px rgba(110, 231, 183, 0.38), + 0 18px 34px rgba(22, 101, 52, 0.08), + inset 0 1px 0 rgba(255, 255, 255, 0.88); } `; @@ -127,9 +127,9 @@ export const StyledTextarea = styled.textarea` min-height: 34px; &.floating-composer { - font-size: 13px; - line-height: 1.4; - min-height: 28px; + font-size: 16px; + line-height: 1.65; + min-height: 98px; } &.floating-composer.floating-collapsed { @@ -141,7 +141,7 @@ export const StyledTextarea = styled.textarea` } &.composer-expanded { - min-height: 168px; + min-height: 188px; } &::placeholder { @@ -171,8 +171,8 @@ export const BottomBar = styled.div` border-top: 1px solid rgba(148, 163, 184, 0.22); &.floating-composer { - padding-top: 8px; - margin-top: 8px; + padding-top: 10px; + margin-top: 10px; gap: 10px; } diff --git a/src/components/agent/chat/components/MessageList.test.tsx b/src/components/agent/chat/components/MessageList.test.tsx index 64fe50dde..4fb9644d9 100644 --- a/src/components/agent/chat/components/MessageList.test.tsx +++ b/src/components/agent/chat/components/MessageList.test.tsx @@ -6,6 +6,7 @@ import { MessageList } from "./MessageList"; import type { Message } from "../types"; const IMAGE_WORKBENCH_FOCUS_EVENT = "lime:image-workbench-focus"; +const VIDEO_WORKBENCH_TASK_ACTION_EVENT = "lime:video-workbench-task-action"; vi.mock("./MarkdownRenderer", () => ({ MarkdownRenderer: ({ content }: { content: string }) => ( @@ -152,6 +153,20 @@ describe("MessageList", () => { expect(container.textContent).not.toContain("开始一段新的对话吧"); }); + it("任务中心空列表时应展示回访型空态而不是普通新对话文案", () => { + const container = render([], { + emptyStateVariant: "task-center", + }); + + expect( + container.querySelector('[data-testid="message-list-empty-task-center"]'), + ).not.toBeNull(); + expect(container.textContent).toContain("任务中心"); + expect(container.textContent).toContain("回到进行中的任务和最近工作现场"); + expect(container.textContent).toContain("左侧会继续显示最近任务"); + expect(container.textContent).not.toContain("开始一段新的对话吧"); + }); + it("应过滤空白 user 消息,避免渲染空白气泡", () => { const now = new Date(); const messages: Message[] = [ @@ -245,9 +260,11 @@ describe("MessageList", () => { '[data-testid="image-workbench-message-preview-task-1"]', ) as HTMLButtonElement | null; - expect(previewCard?.textContent).toContain("Image Generation"); - expect(previewCard?.textContent).toContain("打开查看"); - expect(previewCard?.textContent).toContain("1024x1024"); + expect(previewCard?.textContent).toContain("一颗戴耳机的青柠"); + expect(previewCard?.textContent).toContain("已生成"); + expect(previewCard?.textContent).toContain("可在右侧继续查看与使用"); + expect(previewCard?.className).not.toContain("max-w-[620px]"); + expect(previewCard?.className).toContain("max-w-[360px]"); act(() => { previewCard?.click(); @@ -313,6 +330,137 @@ describe("MessageList", () => { ); }); + it("失败的视频任务卡应提供重新生成动作,并通过事件总线下发而不是误触发打开工作区", () => { + const now = new Date(); + const onOpenMessagePreview = vi.fn(); + const messages: Message[] = [ + { + id: "msg-assistant-video-failed", + role: "assistant", + content: "视频任务失败。", + timestamp: now, + taskPreview: { + kind: "video_generate", + taskId: "task-video-failed-1", + taskType: "video_generate", + prompt: "新品发布会短视频,镜头缓慢推进主角产品", + status: "failed", + durationSeconds: 15, + aspectRatio: "16:9", + resolution: "720p", + projectId: "project-video-1", + contentId: "content-video-1", + }, + }, + ]; + + let actionDetail: Record | null = null; + const handleAction = (event: Event) => { + if (!(event instanceof CustomEvent)) { + return; + } + actionDetail = event.detail as Record; + }; + window.addEventListener(VIDEO_WORKBENCH_TASK_ACTION_EVENT, handleAction); + + const container = render(messages, { onOpenMessagePreview }); + const actionButton = container.querySelector( + '[data-testid="task-message-preview-action-task-video-failed-1-retry"]', + ) as HTMLButtonElement | null; + + expect(actionButton?.textContent).toContain("重新生成"); + + act(() => { + actionButton?.click(); + }); + + expect(actionDetail).toEqual({ + action: "retry", + taskId: "task-video-failed-1", + projectId: "project-video-1", + contentId: "content-video-1", + }); + expect(onOpenMessagePreview).not.toHaveBeenCalled(); + + window.removeEventListener(VIDEO_WORKBENCH_TASK_ACTION_EVENT, handleAction); + }); + + it("进行中的视频任务卡应提供取消动作,并继续保留打开工作区能力", () => { + const now = new Date(); + const onOpenMessagePreview = vi.fn(); + const messages: Message[] = [ + { + id: "msg-assistant-video-running-action", + role: "assistant", + content: "视频任务进行中。", + timestamp: now, + taskPreview: { + kind: "video_generate", + taskId: "task-video-running-action-1", + taskType: "video_generate", + prompt: "新品发布会短视频,镜头缓慢推进主角产品", + status: "running", + progress: 18, + durationSeconds: 15, + aspectRatio: "16:9", + resolution: "720p", + projectId: "project-video-1", + contentId: "content-video-1", + }, + }, + ]; + + let actionDetail: Record | null = null; + const handleAction = (event: Event) => { + if (!(event instanceof CustomEvent)) { + return; + } + actionDetail = event.detail as Record; + }; + window.addEventListener(VIDEO_WORKBENCH_TASK_ACTION_EVENT, handleAction); + + const container = render(messages, { onOpenMessagePreview }); + const previewCard = container.querySelector( + '[data-testid="task-message-preview-task-video-running-action-1"]', + ) as HTMLButtonElement | null; + const actionButton = container.querySelector( + '[data-testid="task-message-preview-action-task-video-running-action-1-cancel"]', + ) as HTMLButtonElement | null; + + expect(actionButton?.textContent).toContain("取消任务"); + + act(() => { + actionButton?.click(); + }); + + expect(actionDetail).toEqual({ + action: "cancel", + taskId: "task-video-running-action-1", + projectId: "project-video-1", + contentId: "content-video-1", + }); + expect(onOpenMessagePreview).not.toHaveBeenCalled(); + + act(() => { + previewCard?.click(); + }); + + expect(onOpenMessagePreview).toHaveBeenCalledWith( + { + kind: "task", + preview: expect.objectContaining({ + kind: "video_generate", + taskId: "task-video-running-action-1", + }), + }, + expect.objectContaining({ + id: "msg-assistant-video-running-action", + }), + ); + + window.removeEventListener(VIDEO_WORKBENCH_TASK_ACTION_EVENT, handleAction); + }); + it("通用任务消息卡应在聊天区渲染预览并支持打开对应产物", () => { const now = new Date(); const onOpenMessagePreview = vi.fn(); @@ -450,18 +598,11 @@ describe("MessageList", () => { const previewCard = container.querySelector( '[data-testid="image-workbench-message-preview-task-edit-1"]', ); - const sourcePanel = container.querySelector( - '[data-testid="image-workbench-message-preview-source-task-edit-1"]', - ); - expect(previewCard?.textContent).toContain("Image Editing"); expect(previewCard?.textContent).toContain("已修图"); - expect(sourcePanel?.textContent).toContain("来源图"); - expect(sourcePanel?.textContent).toContain("原始街景海报"); - expect(sourcePanel?.textContent).toContain("img-source-1"); - expect( - sourcePanel?.querySelector('img[src="https://example.com/source.png"]'), - ).toBeTruthy(); + expect(previewCard?.textContent).toContain("来源图"); + expect(previewCard?.textContent).toContain("原始街景海报"); + expect(previewCard?.textContent).not.toContain("Image Editing"); }); it("图片任务完成但图片仍在工作台时,不应继续显示生成中占位", () => { @@ -489,10 +630,43 @@ describe("MessageList", () => { ); expect(previewCard?.textContent).toContain("结果已同步"); - expect(previewCard?.textContent).toContain("打开查看"); + expect(previewCard?.textContent).toContain("已生成"); + expect(previewCard?.textContent).toContain("可在右侧继续查看与使用"); expect(previewCard?.textContent).not.toContain("图片任务卡"); }); + it("图片任务已经完成时,不应继续向用户暴露同步中的过渡文案", () => { + const now = new Date(); + const messages: Message[] = [ + { + id: "msg-assistant-image-workbench-complete-sync-copy", + role: "assistant", + content: "图片任务已完成。", + timestamp: now, + imageWorkbenchPreview: { + taskId: "task-complete-sync-copy", + prompt: "广州塔清晨薄雾氛围图", + status: "complete", + imageUrl: "https://example.com/guangzhou-tower-morning.png", + imageCount: 1, + statusMessage: "图片任务已提交,正在同步任务状态。", + projectId: "project-1", + contentId: "content-1", + }, + }, + ]; + + const container = render(messages); + const previewCard = container.querySelector( + '[data-testid="image-workbench-message-preview-task-complete-sync-copy"]', + ); + + expect(previewCard?.textContent).toContain("已生成"); + expect(previewCard?.textContent).toContain("可在右侧继续查看与使用"); + expect(previewCard?.textContent).not.toContain("正在同步任务状态"); + expect(previewCard?.textContent).not.toContain("图片任务已提交"); + }); + it("失败的图片任务卡应收敛为静态状态卡,不再展示操作按钮", () => { const now = new Date(); const messages: Message[] = [ @@ -517,7 +691,7 @@ describe("MessageList", () => { ); expect(previewCard?.textContent).toContain("生成失败"); - expect(previewCard?.textContent).toContain("稍后重试"); + expect(previewCard?.textContent).toContain("调整描述后重试"); expect( container.querySelector( '[data-testid="image-workbench-message-preview-action-task-failed-1-retry"]', @@ -551,7 +725,6 @@ describe("MessageList", () => { expect(container.textContent).toContain( "任务已进入队列,等待图片服务分配执行槽位。", ); - expect(container.textContent).toContain("第 2 次"); expect( container.querySelector( '[data-testid="image-workbench-message-preview-action-task-running-1-cancel"]', @@ -616,7 +789,7 @@ describe("MessageList", () => { expect(previewCard?.textContent).toContain("已取消"); expect(previewCard?.textContent).toContain("任务已取消"); - expect(previewCard?.textContent).toContain("打开查看"); + expect(previewCard?.textContent).not.toContain("打开查看"); expect( container.querySelector( '[data-testid="image-workbench-message-preview-action-task-cancelled-1-retry"]', @@ -1444,6 +1617,38 @@ describe("MessageList", () => { ); }); + it("不应把 .lime/tasks 下的内部任务快照 JSON 渲染成用户可见产物卡片", () => { + const now = new Date(); + const messages: Message[] = [ + { + id: "msg-assistant-hidden-task-json", + role: "assistant", + content: "图片任务进行中", + timestamp: now, + artifacts: [ + { + id: "artifact-hidden-task-json", + type: "code", + title: "task-image-1.json", + content: "{\"status\":\"running\"}", + status: "complete", + meta: { + filePath: ".lime/tasks/image_generate/task-image-1.json", + filename: "task-image-1.json", + }, + position: { start: 0, end: 0 }, + createdAt: now.getTime(), + updatedAt: now.getTime(), + }, + ], + }, + ]; + + const container = render(messages); + expect(container.textContent).toContain("图片任务进行中"); + expect(container.textContent).not.toContain("task-image-1.json"); + }); + it("应先渲染思考与过程,再渲染正文,最后再落产物", () => { const now = new Date(); const messages: Message[] = [ diff --git a/src/components/agent/chat/components/MessageList.tsx b/src/components/agent/chat/components/MessageList.tsx index e0535841d..94d8a3366 100644 --- a/src/components/agent/chat/components/MessageList.tsx +++ b/src/components/agent/chat/components/MessageList.tsx @@ -39,6 +39,7 @@ import { sanitizeContentPartsForDisplay, sanitizeMessageTextForDisplay, } from "../utils/internalImagePlaceholder"; +import { isHiddenInternalArtifactPath } from "../utils/internalArtifactVisibility"; import { isInternalRoutingTurnSummaryText } from "../utils/turnSummaryPresentation"; import { Message, @@ -63,6 +64,7 @@ import type { ArtifactTimelineOpenTarget } from "../utils/artifactTimelineNaviga interface MessageListProps { messages: Message[]; + emptyStateVariant?: "default" | "task-center"; turns?: AgentThreadTurn[]; threadItems?: AgentThreadItem[]; currentTurnId?: string | null; @@ -229,6 +231,7 @@ function isInlineCoveredTimelineItem( const MessageListInner: React.FC = ({ messages, + emptyStateVariant = "default", turns = [], threadItems = [], currentTurnId = null, @@ -260,6 +263,7 @@ const MessageListInner: React.FC = ({ const scrollRef = useRef(null); const containerRef = useRef(null); const previousVisibleMessageCountRef = useRef(null); + const isTaskCenterEmptyState = emptyStateVariant === "task-center"; const [copiedId, setCopiedId] = useState(null); const [isUserScrolling, setIsUserScrolling] = useState(false); const [shouldAutoScroll, setShouldAutoScroll] = useState(true); @@ -690,13 +694,18 @@ const MessageListInner: React.FC = ({ }; const renderArtifactCards = (artifacts: Artifact[] | undefined) => { - if (!artifacts || artifacts.length === 0) { + const visibleArtifacts = + artifacts?.filter( + (artifact) => + !isHiddenInternalArtifactPath(resolveArtifactProtocolFilePath(artifact)), + ) || []; + if (visibleArtifacts.length === 0) { return null; } return (
    - {artifacts.map((artifact) => { + {visibleArtifacts.map((artifact) => { const filePath = resolveArtifactProtocolFilePath(artifact); const writePhase = resolveArtifactWritePhase(artifact); const statusLabel = formatArtifactWritePhaseLabel(writePhase); @@ -779,14 +788,54 @@ const MessageListInner: React.FC = ({
    ) : ( -
    - Lime -

    开始一段新的对话吧

    -
    + isTaskCenterEmptyState ? ( +
    +
    +
    +
    + Lime +
    + + 任务中心 + +
    + +
    +

    + 回到进行中的任务和最近工作现场 +

    +

    + 这里会承接最近会话、进行中的任务和刚恢复的工作内容。要开始一个全新目标,随时回到“新建任务”。 +

    +
    + +
    + + 左侧会继续显示最近任务 + + + 恢复中的会话会自动回到这里 + +
    +
    +
    + ) : ( +
    + Lime +

    开始一段新的对话吧

    +
    + ) ))} {messageGroups.map((group, groupIndex) => { diff --git a/src/components/agent/chat/components/TaskMessagePreview.tsx b/src/components/agent/chat/components/TaskMessagePreview.tsx index 99a9b6c33..0cf4bf70f 100644 --- a/src/components/agent/chat/components/TaskMessagePreview.tsx +++ b/src/components/agent/chat/components/TaskMessagePreview.tsx @@ -9,6 +9,7 @@ import { PlayCircle, Search, } from "lucide-react"; +import { emitVideoWorkbenchTaskAction } from "@/lib/videoWorkbenchEvents"; import { cn } from "@/lib/utils"; import type { MessageTaskPreview } from "../types"; @@ -218,97 +219,141 @@ function renderVideoTaskPreview( onOpen?: (preview: MessageTaskPreview) => void, metaItems: string[] = [], ) { + const actionButtons = + preview.status === "running" + ? [ + { + key: "cancel" as const, + label: "取消任务", + }, + ] + : (preview.status === "failed" || preview.status === "cancelled") && + preview.retryable !== false + ? [ + { + key: "retry" as const, + label: "重新生成", + }, + ] + : []; + return ( - + + + {actionButtons.length > 0 ? ( +
    + {actionButtons.map((action) => ( + + ))} +
    + ) : null} +
    ); } diff --git a/src/components/agent/chat/components/TokenUsageDisplay.test.tsx b/src/components/agent/chat/components/TokenUsageDisplay.test.tsx new file mode 100644 index 000000000..091285856 --- /dev/null +++ b/src/components/agent/chat/components/TokenUsageDisplay.test.tsx @@ -0,0 +1,78 @@ +import React from "react"; +import { act } from "react"; +import { createRoot, type Root } from "react-dom/client"; +import { afterEach, describe, expect, it } from "vitest"; +import { TokenUsageDisplay } from "./TokenUsageDisplay"; + +const mountedRoots: Array<{ container: HTMLDivElement; root: Root }> = []; + +afterEach(() => { + while (mountedRoots.length > 0) { + const mounted = mountedRoots.pop(); + if (!mounted) { + continue; + } + act(() => { + mounted.root.unmount(); + }); + mounted.container.remove(); + } +}); + +describe("TokenUsageDisplay", () => { + it("应渲染总 token 数提示", () => { + const container = document.createElement("div"); + document.body.appendChild(container); + const root = createRoot(container); + mountedRoots.push({ container, root }); + + act(() => { + root.render( + , + ); + }); + + expect(container.textContent).toContain("31.0K tokens"); + }); + + it("应在不同数量级下渲染紧凑 token 文案", () => { + const container = document.createElement("div"); + document.body.appendChild(container); + const root = createRoot(container); + mountedRoots.push({ container, root }); + + act(() => { + root.render( +
    + + + +
    , + ); + }); + + expect(container.textContent).toContain("999 tokens"); + expect(container.textContent).toContain("1.2K tokens"); + expect(container.textContent).toContain("1.2M tokens"); + }); +}); diff --git a/src/components/agent/chat/components/TokenUsageDisplay.tsx b/src/components/agent/chat/components/TokenUsageDisplay.tsx index 9e5f40178..56b70de6b 100644 --- a/src/components/agent/chat/components/TokenUsageDisplay.tsx +++ b/src/components/agent/chat/components/TokenUsageDisplay.tsx @@ -10,11 +10,17 @@ import styled from "styled-components"; import { Coins } from "lucide-react"; import type { AgentTokenUsage as TokenUsage } from "@/lib/api/agentProtocol"; +const COMPACT_UNITS = [ + { threshold: 1_000_000_000, suffix: "B" }, + { threshold: 1_000_000, suffix: "M" }, + { threshold: 1_000, suffix: "K" }, +] as const; + const UsageContainer = styled.div` display: inline-flex; align-items: center; - gap: 6px; - padding: 4px 10px; + gap: 5px; + padding: 3px 8px; border-radius: 6px; background-color: hsl(var(--muted) / 0.5); font-size: 11px; @@ -25,7 +31,7 @@ const UsageContainer = styled.div` const UsageIcon = styled(Coins)` width: 12px; height: 12px; - opacity: 0.7; + opacity: 0.55; `; const UsageText = styled.span` @@ -34,15 +40,26 @@ const UsageText = styled.span` "Courier New", monospace; `; -const Separator = styled.span` - opacity: 0.5; -`; - interface TokenUsageDisplayProps { usage: TokenUsage; className?: string; } +function formatCompactTokenCount(value: number): string { + if (!Number.isFinite(value)) { + return "0"; + } + + const normalized = Math.max(0, value); + for (const unit of COMPACT_UNITS) { + if (normalized >= unit.threshold) { + return `${(normalized / unit.threshold).toFixed(1)}${unit.suffix}`; + } + } + + return normalized.toLocaleString(); +} + /** * Token 使用量显示组件 * @@ -57,11 +74,7 @@ export const TokenUsageDisplay: React.FC = ({ return ( - {usage.input_tokens.toLocaleString()} in - / - {usage.output_tokens.toLocaleString()} out - · - {total.toLocaleString()} total + {formatCompactTokenCount(total)} tokens ); }; diff --git a/src/components/agent/chat/components/ToolCallDisplay.test.tsx b/src/components/agent/chat/components/ToolCallDisplay.test.tsx index ed0a86cf5..dfea66d72 100644 --- a/src/components/agent/chat/components/ToolCallDisplay.test.tsx +++ b/src/components/agent/chat/components/ToolCallDisplay.test.tsx @@ -321,6 +321,12 @@ describe("ToolCallDisplay", () => { content_id: "content-1", project_id: "project-1", title: "GitHub MCP 搜索结果", + project_root_path: "/Users/coso/.proxycast/projects/project-1", + markdown_relative_path: + "exports/x-article-export/github-mcp/index.md", + images_relative_dir: + "exports/x-article-export/github-mcp/images", + image_count: 7, }, saved_project_id: "project-1", saved_by: "context_project", @@ -344,6 +350,15 @@ describe("ToolCallDisplay", () => { expect(container.textContent).toContain( "结果已自动保存到项目 project-1:GitHub MCP 搜索结果 · 来自当前项目上下文", ); + expect(container.textContent).toContain( + "项目目录:/Users/coso/.proxycast/projects/project-1", + ); + expect(container.textContent).toContain( + "Markdown 文件:exports/x-article-export/github-mcp/index.md", + ); + expect(container.textContent).toContain( + "图片资源:7 张 · exports/x-article-export/github-mcp/images", + ); expect(container.textContent).toContain("脚本来源:服务端脚本 · 2026-03-25"); }); diff --git a/src/components/agent/chat/components/ToolCallDisplay.tsx b/src/components/agent/chat/components/ToolCallDisplay.tsx index a0aed815a..9ef917282 100644 --- a/src/components/agent/chat/components/ToolCallDisplay.tsx +++ b/src/components/agent/chat/components/ToolCallDisplay.tsx @@ -260,11 +260,39 @@ function readFirstNonEmptyString( return undefined; } +function readFirstFiniteNumber( + candidates: Array | null | undefined>, + keys: string[], +): number | undefined { + for (const candidate of candidates) { + if (!candidate) continue; + for (const key of keys) { + const value = candidate[key]; + if (typeof value === "number" && Number.isFinite(value)) { + return value; + } + if (typeof value === "string" && value.trim()) { + const parsed = Number(value.trim()); + if (Number.isFinite(parsed)) { + return parsed; + } + } + } + } + return undefined; +} + interface SiteToolResultSummary { savedContent?: { contentId?: string; projectId?: string; title?: string; + projectRootPath?: string; + bundleRelativeDir?: string; + markdownRelativePath?: string; + imagesRelativeDir?: string; + metaRelativePath?: string; + imageCount?: number; }; savedProjectId?: string; savedBy?: string; @@ -361,19 +389,43 @@ function normalizeSiteToolResultSummary( } return { - savedContent: hasSavedContent - ? { - contentId: readFirstNonEmptyString([savedContentRecord], [ - "content_id", - "contentId", + savedContent: hasSavedContent + ? { + contentId: readFirstNonEmptyString([savedContentRecord], [ + "content_id", + "contentId", ]), projectId: readFirstNonEmptyString([savedContentRecord], [ "project_id", "projectId", ]), - title: readFirstNonEmptyString([savedContentRecord], ["title"]), - } - : undefined, + title: readFirstNonEmptyString([savedContentRecord], ["title"]), + projectRootPath: readFirstNonEmptyString([savedContentRecord], [ + "project_root_path", + "projectRootPath", + ]), + bundleRelativeDir: readFirstNonEmptyString([savedContentRecord], [ + "bundle_relative_dir", + "bundleRelativeDir", + ]), + markdownRelativePath: readFirstNonEmptyString([savedContentRecord], [ + "markdown_relative_path", + "markdownRelativePath", + ]), + imagesRelativeDir: readFirstNonEmptyString([savedContentRecord], [ + "images_relative_dir", + "imagesRelativeDir", + ]), + metaRelativePath: readFirstNonEmptyString([savedContentRecord], [ + "meta_relative_path", + "metaRelativePath", + ]), + imageCount: readFirstFiniteNumber([savedContentRecord], [ + "image_count", + "imageCount", + ]), + } + : undefined, savedProjectId, savedBy: readFirstNonEmptyString(candidates, ["saved_by", "savedBy"]), saveSkippedProjectId, @@ -790,6 +842,33 @@ export const ToolCallDisplay: React.FC = ({ }); } + if (siteResultSummary.savedContent?.projectRootPath) { + notices.push({ + key: "site-save-project-root", + text: `项目目录:${siteResultSummary.savedContent.projectRootPath}`, + tone: "neutral", + }); + } + + if (siteResultSummary.savedContent?.markdownRelativePath) { + notices.push({ + key: "site-save-markdown-path", + text: `Markdown 文件:${siteResultSummary.savedContent.markdownRelativePath}`, + tone: "neutral", + }); + } + + if (typeof siteResultSummary.savedContent?.imageCount === "number") { + const imageDir = siteResultSummary.savedContent.imagesRelativeDir; + notices.push({ + key: "site-save-images", + text: `图片资源:${siteResultSummary.savedContent.imageCount} 张${ + imageDir ? ` · ${imageDir}` : "" + }`, + tone: "neutral", + }); + } + if (siteResultSummary.saveSkippedProjectId) { let text = toolCall.status === "failed" diff --git a/src/components/agent/chat/components/emptyStateSurfaceTokens.ts b/src/components/agent/chat/components/emptyStateSurfaceTokens.ts index 094dd0502..9fc800f68 100644 --- a/src/components/agent/chat/components/emptyStateSurfaceTokens.ts +++ b/src/components/agent/chat/components/emptyStateSurfaceTokens.ts @@ -1,4 +1,4 @@ -export type EmptyStateTone = "slate" | "sky" | "emerald" | "amber"; +export type EmptyStateTone = "slate" | "sky" | "emerald" | "amber" | "lime"; export const EMPTY_STATE_PANEL_CLASSNAME = "rounded-[26px] border border-slate-200/80 bg-white p-4 shadow-sm shadow-slate-950/5 md:p-5"; @@ -18,6 +18,7 @@ export const EMPTY_STATE_BADGE_TONE_CLASSNAMES: Record = sky: "border-sky-200 bg-sky-50/90 text-sky-700", emerald: "border-emerald-200 bg-emerald-50/90 text-emerald-700", amber: "border-amber-200 bg-amber-50/90 text-amber-700", + lime: "border-lime-200 bg-lime-50/90 text-lime-700", }; export const EMPTY_STATE_ICON_TONE_CLASSNAMES: Record = @@ -26,6 +27,7 @@ export const EMPTY_STATE_ICON_TONE_CLASSNAMES: Record = sky: "border-sky-200 bg-sky-100/90 text-sky-700", emerald: "border-emerald-200 bg-emerald-100/90 text-emerald-700", amber: "border-amber-200 bg-amber-100/90 text-amber-700", + lime: "border-lime-200 bg-lime-100/90 text-lime-700", }; export const EMPTY_STATE_META_PILL_CLASSNAME = @@ -44,10 +46,10 @@ export const EMPTY_STATE_RECOMMENDATION_CARD_CLASSNAME = "group flex min-w-0 flex-col items-start gap-2 rounded-[20px] border border-slate-200/80 bg-[linear-gradient(180deg,rgba(255,255,255,0.97)_0%,rgba(248,250,252,0.9)_100%)] px-3.5 py-3.5 text-left shadow-sm shadow-slate-950/5 transition-colors hover:border-slate-300 hover:bg-white"; export const EMPTY_STATE_PAGE_CONTAINER_CLASSNAME = - "relative flex flex-1 flex-col items-stretch justify-start overflow-y-auto bg-[linear-gradient(135deg,rgba(244,250,255,0.94)_0%,rgba(248,250,252,0.98)_44%,rgba(244,250,247,0.96)_100%)] px-3 pb-5 pt-[clamp(8px,1.1vw,12px)] md:px-4"; + "relative flex min-h-full flex-1 flex-col items-stretch justify-start overflow-y-auto bg-transparent px-2 pb-5 pt-[clamp(2px,0.6vw,6px)] md:px-3"; export const EMPTY_STATE_CONTENT_WRAPPER_CLASSNAME = - "relative z-[1] mx-auto flex w-full max-w-[1240px] flex-col items-stretch gap-2.5"; + "relative z-[1] mx-auto flex min-h-full w-full max-w-[1360px] flex-1 flex-col items-stretch gap-3"; export const EMPTY_STATE_THEME_TABS_CONTAINER_CLASSNAME = "flex w-full max-w-full flex-nowrap justify-start gap-1.5 overflow-x-auto overflow-y-hidden rounded-[20px] border border-slate-200/80 bg-slate-50 p-[5px] shadow-[0_10px_24px_-22px_rgba(15,23,42,0.18)] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"; @@ -70,6 +72,8 @@ const EMPTY_STATE_TOOL_TOGGLE_TONE_CLASSNAMES: Record = "border-emerald-300 bg-emerald-50 text-emerald-700 hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700", amber: "border-amber-300 bg-amber-50 text-amber-700 hover:border-amber-300 hover:bg-amber-50 hover:text-amber-700", + lime: + "border-lime-300 bg-lime-50 text-lime-700 hover:border-lime-300 hover:bg-lime-50 hover:text-lime-700", }; export function getEmptyStateIconToolButtonClassName( diff --git a/src/components/agent/chat/hooks/agentChatHistory.test.ts b/src/components/agent/chat/hooks/agentChatHistory.test.ts index f7ea86dff..9bb9a36c5 100644 --- a/src/components/agent/chat/hooks/agentChatHistory.test.ts +++ b/src/components/agent/chat/hooks/agentChatHistory.test.ts @@ -126,6 +126,185 @@ describe("agentChatHistory", () => { expect(messages[0]?.thinkingContent).toBe("先列提纲,再展开正文"); }); + it("应从历史 assistant 消息恢复 token usage", () => { + const detail: AsterSessionDetail = { + id: "session-usage", + created_at: 1, + updated_at: 2, + messages: [ + { + role: "assistant", + timestamp: 1710000300, + content: [{ type: "output_text", text: "图片已经生成完成" } as never], + usage: { + input_tokens: 12000, + output_tokens: 19000, + }, + }, + ], + }; + + const messages = hydrateSessionDetailMessages(detail, "session-usage"); + + expect(messages[0]?.usage).toEqual({ + input_tokens: 12000, + output_tokens: 19000, + }); + }); + + it("应从历史 tool_response 恢复图片任务预览,并保留同一任务的连续 assistant 轨迹", () => { + const detail: AsterSessionDetail = { + id: "session-history-image-task-preview", + created_at: 1, + updated_at: 2, + messages: [ + { + role: "assistant", + timestamp: 1710000400, + content: [ + { type: "text", text: "正在生成广州塔夜景海报" } as never, + { + type: "tool_request", + id: "tool-image-history-1", + tool_name: "bash", + arguments: { + command: + 'lime media image generate --prompt "广州塔夜景海报" --size 1536x1024 --count 1', + }, + } as never, + ], + }, + { + role: "tool", + timestamp: 1710000401, + content: [ + { + type: "tool_response", + id: "tool-image-history-1", + success: true, + output: "图片任务已提交", + metadata: { + task_id: "task-image-history-1", + task_type: "image_generate", + status: "succeeded", + project_id: "project-history-1", + content_id: "content-history-1", + requested_count: 1, + received_count: 1, + }, + } as never, + ], + }, + ], + }; + + const messages = hydrateSessionDetailMessages( + detail, + "session-history-image-task-preview", + ); + + expect(messages).toHaveLength(1); + expect(messages[0]).toMatchObject({ + role: "assistant", + imageWorkbenchPreview: { + taskId: "task-image-history-1", + prompt: "广州塔夜景海报", + status: "complete", + size: "1536x1024", + imageCount: 1, + projectId: "project-history-1", + contentId: "content-history-1", + }, + }); + expect(messages[0]?.contentParts).toEqual( + expect.arrayContaining([ + expect.objectContaining({ type: "text" }), + expect.objectContaining({ + type: "tool_use", + toolCall: expect.objectContaining({ + id: "tool-image-history-1", + status: "completed", + }), + }), + ]), + ); + }); + + it("应从历史 tool_response 恢复视频任务预览,并保留视频结果地址与时长信息", () => { + const detail: AsterSessionDetail = { + id: "session-history-video-task-preview", + created_at: 1, + updated_at: 2, + messages: [ + { + role: "assistant", + timestamp: 1710000500, + content: [ + { type: "text", text: "正在生成广州塔城市短片" } as never, + { + type: "tool_request", + id: "tool-video-history-1", + tool_name: "bash", + arguments: { + command: + 'lime media video generate --prompt "广州塔城市短片" --duration 15 --aspect-ratio 16:9 --resolution 720p', + }, + } as never, + ], + }, + { + role: "tool", + timestamp: 1710000501, + content: [ + { + type: "tool_response", + id: "tool-video-history-1", + success: true, + output: "视频任务已完成", + metadata: { + task_id: "task-video-history-1", + task_type: "video_generate", + status: "succeeded", + project_id: "project-video-history-1", + content_id: "content-video-history-1", + result: { + videos: [ + { + url: "https://example.com/history-video.mp4", + duration_ms: 15000, + }, + ], + }, + }, + } as never, + ], + }, + ], + }; + + const messages = hydrateSessionDetailMessages( + detail, + "session-history-video-task-preview", + ); + + expect(messages).toHaveLength(1); + expect(messages[0]).toMatchObject({ + role: "assistant", + taskPreview: { + kind: "video_generate", + taskId: "task-video-history-1", + status: "complete", + prompt: "广州塔城市短片", + durationSeconds: 15, + aspectRatio: "16:9", + resolution: "720p", + projectId: "project-video-history-1", + contentId: "content-video-history-1", + videoUrl: "https://example.com/history-video.mp4", + }, + }); + }); + it("应从内容片段中提取合并后的 thinkingContent", () => { expect( extractThinkingContentFromParts([ @@ -204,4 +383,49 @@ describe("agentChatHistory", () => { expect(mergedMessages).toEqual(localMessages); }); + + it("同会话刷新详情时应保留本地 assistant 的 token usage", () => { + const localMessages = [ + { + id: "local-user-1", + role: "user" as const, + content: "请整理成可继续编辑的文稿", + timestamp: new Date("2026-04-07T00:00:00.000Z"), + }, + { + id: "local-assistant-1", + role: "assistant" as const, + content: "已同步到工作区,可继续在画布里阅读、编辑和定位到对应区块。", + timestamp: new Date("2026-04-07T00:00:01.000Z"), + usage: { + input_tokens: 20480, + output_tokens: 10240, + }, + }, + ]; + const hydratedMessages = [ + { + id: "history-user-1", + role: "user" as const, + content: "请整理成可继续编辑的文稿", + timestamp: new Date("2026-04-07T00:00:02.000Z"), + }, + { + id: "history-assistant-1", + role: "assistant" as const, + content: "已同步到工作区,可继续在画布里阅读、编辑和定位到对应区块。", + timestamp: new Date("2026-04-07T00:00:03.000Z"), + }, + ]; + + const mergedMessages = mergeHydratedMessagesWithLocalState( + localMessages, + hydratedMessages, + ); + + expect(mergedMessages[1]?.usage).toEqual({ + input_tokens: 20480, + output_tokens: 10240, + }); + }); }); diff --git a/src/components/agent/chat/hooks/agentChatHistory.ts b/src/components/agent/chat/hooks/agentChatHistory.ts index 9a9fa78a6..4d75cc99a 100644 --- a/src/components/agent/chat/hooks/agentChatHistory.ts +++ b/src/components/agent/chat/hooks/agentChatHistory.ts @@ -1,8 +1,21 @@ -import type { AgentContextTraceStep as ContextTraceStep } from "@/lib/api/agentProtocol"; -import type { Message, MessageImage, ContentPart } from "../types"; +import type { + AgentContextTraceStep as ContextTraceStep, + AgentTokenUsage, +} from "@/lib/api/agentProtocol"; +import type { + ContentPart, + Message, + MessageImage, + MessageImageWorkbenchPreview, + MessageTaskPreview, +} from "../types"; import type { AsterSessionDetail } from "@/lib/api/agentRuntime"; import { resolveArtifactProtocolFilePath } from "@/lib/artifact-protocol"; import { mergeArtifacts } from "../utils/messageArtifacts"; +import { + buildImageTaskPreviewFromToolResult, + buildTaskPreviewFromToolResult, +} from "../utils/taskPreviewFromToolResult"; import { extractLimeToolMetadataBlock, isToolResultSuccessful, @@ -54,6 +67,30 @@ export const normalizeHistoryMessages = (messages: Message[]): Message[] => .map((msg) => normalizeHistoryMessage(msg)) .filter((msg): msg is Message => msg !== null); +const normalizeHistoryUsage = (usage: unknown): AgentTokenUsage | undefined => { + if (!usage || typeof usage !== "object") { + return undefined; + } + + const inputTokens = (usage as { input_tokens?: unknown }).input_tokens; + const outputTokens = (usage as { output_tokens?: unknown }).output_tokens; + if ( + typeof inputTokens !== "number" || + typeof outputTokens !== "number" || + !Number.isFinite(inputTokens) || + !Number.isFinite(outputTokens) || + inputTokens < 0 || + outputTokens < 0 + ) { + return undefined; + } + + return { + input_tokens: inputTokens, + output_tokens: outputTokens, + }; +}; + export const hasLegacyFallbackToolNames = (messages: Message[]): boolean => messages.some((message) => (message.toolCalls || []).some((toolCall) => @@ -135,6 +172,147 @@ export const extractThinkingContentFromParts = ( return thinkingText || undefined; }; +function mergeImageWorkbenchPreview( + previous?: MessageImageWorkbenchPreview, + next?: MessageImageWorkbenchPreview, +): MessageImageWorkbenchPreview | undefined { + if (!previous) { + return next; + } + if (!next) { + return previous; + } + if (previous.taskId !== next.taskId) { + return next; + } + return { + ...previous, + ...next, + }; +} + +function mergeTaskPreview( + previous?: MessageTaskPreview, + next?: MessageTaskPreview, +): MessageTaskPreview | undefined { + if (!previous) { + return next; + } + if (!next) { + return previous; + } + if (previous.taskId !== next.taskId) { + return next; + } + return { + ...previous, + ...next, + }; +} + +function normalizePreviewSignatureValue(value: unknown): string { + if (typeof value === "string") { + return normalizeSignatureText(value); + } + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + return ""; +} + +function imageWorkbenchPreviewSignature( + preview?: MessageImageWorkbenchPreview, +): string { + if (!preview) { + return ""; + } + + return [ + preview.taskId, + preview.prompt, + preview.mode, + preview.status, + preview.projectId, + preview.contentId, + preview.imageUrl, + preview.imageCount, + preview.sourceImageUrl, + preview.sourceImagePrompt, + preview.sourceImageRef, + preview.sourceImageCount, + preview.size, + preview.phase, + preview.statusMessage, + preview.retryable, + preview.attemptCount, + preview.placeholderText, + ] + .map(normalizePreviewSignatureValue) + .join(":"); +} + +function taskPreviewSignature(preview?: MessageTaskPreview): string { + if (!preview) { + return ""; + } + + const videoFields = + preview.kind === "video_generate" + ? [ + preview.videoUrl, + preview.thumbnailUrl, + preview.durationSeconds, + preview.aspectRatio, + preview.resolution, + preview.progress, + preview.retryable, + ] + : []; + const metaItems = + "metaItems" in preview && Array.isArray(preview.metaItems) + ? preview.metaItems.map((item) => normalizeSignatureText(item)).join("|") + : ""; + const imageCandidates = + "imageCandidates" in preview && Array.isArray(preview.imageCandidates) + ? preview.imageCandidates + .map((candidate) => + [ + candidate.id, + candidate.thumbnailUrl, + candidate.contentUrl, + candidate.hostPageUrl, + candidate.width, + candidate.height, + candidate.name, + ] + .map(normalizePreviewSignatureValue) + .join(":"), + ) + .join("|") + : ""; + + return [ + preview.kind, + preview.taskId, + preview.taskType, + preview.prompt, + "title" in preview ? preview.title : "", + preview.status, + preview.projectId, + preview.contentId, + "artifactPath" in preview ? preview.artifactPath : "", + "providerId" in preview ? preview.providerId : "", + "model" in preview ? preview.model : "", + preview.phase, + preview.statusMessage, + ...videoFields, + metaItems, + imageCandidates, + ] + .map(normalizePreviewSignatureValue) + .join(":"); +} + export const mergeAdjacentAssistantMessages = ( messages: Message[], ): Message[] => { @@ -223,6 +401,14 @@ export const mergeAdjacentAssistantMessages = ( ...(previous.artifacts || []), ...(current.artifacts || []), ]); + const imageWorkbenchPreview = mergeImageWorkbenchPreview( + previous.imageWorkbenchPreview, + current.imageWorkbenchPreview, + ); + const taskPreview = mergeTaskPreview( + previous.taskPreview, + current.taskPreview, + ); merged[merged.length - 1] = { ...previous, @@ -231,6 +417,8 @@ export const mergeAdjacentAssistantMessages = ( toolCalls: toolCalls.length > 0 ? toolCalls : undefined, contextTrace: contextTrace.length > 0 ? contextTrace : undefined, artifacts: artifacts.length > 0 ? artifacts : undefined, + imageWorkbenchPreview, + taskPreview, timestamp: current.timestamp, isThinking: false, thinkingContent: extractThinkingContentFromParts(contentParts), @@ -268,6 +456,38 @@ const findMatchingLocalUserMessageIndex = ( return -1; }; +const findMatchingLocalAssistantMessageIndex = ( + localAssistantMessages: Message[], + targetMessage: Message, + startIndex: number, +): number => { + const targetSignature = buildHistoryMessageSignature({ + ...targetMessage, + usage: undefined, + }); + + for ( + let index = startIndex; + index < localAssistantMessages.length; + index += 1 + ) { + const candidate = localAssistantMessages[index]; + if (!candidate) { + continue; + } + + const candidateSignature = buildHistoryMessageSignature({ + ...candidate, + usage: undefined, + }); + if (candidateSignature === targetSignature) { + return index; + } + } + + return -1; +}; + export const mergeHydratedMessagesWithLocalState = ( localMessages: Message[], hydratedMessages: Message[], @@ -279,14 +499,90 @@ export const mergeHydratedMessagesWithLocalState = ( const localUserMessages = localMessages.filter( (message) => message.role === "user", ); + const localAssistantMessages = localMessages.filter( + (message) => message.role === "assistant", + ); + const localImagePreviewByTaskId = new Map< + string, + MessageImageWorkbenchPreview + >(); + const localTaskPreviewByTaskId = new Map(); - if (localUserMessages.length === 0) { + localMessages.forEach((message) => { + if (message.role !== "assistant") { + return; + } + + const imageTaskId = message.imageWorkbenchPreview?.taskId; + if (imageTaskId) { + localImagePreviewByTaskId.set( + imageTaskId, + message.imageWorkbenchPreview as MessageImageWorkbenchPreview, + ); + } + + const taskPreviewId = message.taskPreview?.taskId; + if (taskPreviewId) { + localTaskPreviewByTaskId.set( + taskPreviewId, + message.taskPreview as MessageTaskPreview, + ); + } + }); + + if ( + localUserMessages.length === 0 && + localAssistantMessages.length === 0 && + localImagePreviewByTaskId.size === 0 && + localTaskPreviewByTaskId.size === 0 + ) { return hydratedMessages; } let localUserCursor = 0; + let localAssistantCursor = 0; return hydratedMessages.map((message) => { + if (message.role === "assistant") { + const matchedAssistantIndex = findMatchingLocalAssistantMessageIndex( + localAssistantMessages, + message, + localAssistantCursor, + ); + const localAssistantMessage = + matchedAssistantIndex >= 0 + ? localAssistantMessages[matchedAssistantIndex] + : undefined; + if (matchedAssistantIndex >= 0) { + localAssistantCursor = matchedAssistantIndex + 1; + } + + const localImagePreview = message.imageWorkbenchPreview?.taskId + ? localImagePreviewByTaskId.get(message.imageWorkbenchPreview.taskId) + : undefined; + const localTaskPreview = message.taskPreview?.taskId + ? localTaskPreviewByTaskId.get(message.taskPreview.taskId) + : undefined; + + if ( + !localImagePreview && + !localTaskPreview && + !localAssistantMessage?.usage + ) { + return message; + } + + return { + ...message, + usage: message.usage ?? localAssistantMessage?.usage, + imageWorkbenchPreview: mergeImageWorkbenchPreview( + localImagePreview, + message.imageWorkbenchPreview, + ), + taskPreview: mergeTaskPreview(localTaskPreview, message.taskPreview), + }; + } + if (message.role !== "user") { return message; } @@ -385,6 +681,9 @@ const messageArtifactsSignature = ( }; const buildHistoryMessageSignature = (message: Message): string => { + const usageSignature = message.usage + ? `${message.usage.input_tokens}:${message.usage.output_tokens}` + : ""; return [ message.role, normalizeSignatureText(message.content), @@ -392,6 +691,9 @@ const buildHistoryMessageSignature = (message: Message): string => { messageToolCallsSignature(message.toolCalls), messageContentPartsSignature(message.contentParts), messageArtifactsSignature(message.artifacts), + imageWorkbenchPreviewSignature(message.imageWorkbenchPreview), + taskPreviewSignature(message.taskPreview), + usageSignature, ].join("::"); }; @@ -425,6 +727,7 @@ export const hydrateSessionDetailMessages = ( topicId: string, ): Message[] => { const historyToolNameById = new Map(); + const historyToolArgumentsById = new Map(); const loadedMessages: Message[] = detail.messages .filter( @@ -438,6 +741,8 @@ export const hydrateSessionDetailMessages = ( const images: MessageImage[] = []; const messageTimestamp = new Date(msg.timestamp * 1000); const rawParts = Array.isArray(msg.content) ? msg.content : []; + let imageWorkbenchPreview: MessageImageWorkbenchPreview | undefined; + let taskPreview: MessageTaskPreview | undefined; const appendText = (value: unknown) => { if (typeof value !== "string") return; @@ -526,6 +831,7 @@ export const hydrateSessionDetailMessages = ( startTime: messageTimestamp, }; historyToolNameById.set(part.id, toolName); + historyToolArgumentsById.set(part.id, toolCall.arguments); toolCalls.push(toolCall); contentParts.push({ type: "tool_use", toolCall }); continue; @@ -554,6 +860,13 @@ export const hydrateSessionDetailMessages = ( ), }; const success = isToolResultSuccessful(normalizedResult); + const normalizedResultRecord = + normalizedResult && + typeof normalizedResult === "object" && + !Array.isArray(normalizedResult) + ? (normalizedResult as Record) + : undefined; + const toolArguments = historyToolArgumentsById.get(part.id); const toolCall = { id: part.id, name: toolName, @@ -567,6 +880,26 @@ export const hydrateSessionDetailMessages = ( }; toolCalls.push(toolCall); contentParts.push({ type: "tool_use", toolCall }); + imageWorkbenchPreview = mergeImageWorkbenchPreview( + imageWorkbenchPreview, + buildImageTaskPreviewFromToolResult({ + toolId: part.id, + toolName, + toolArguments, + toolResult: normalizedResultRecord, + fallbackPrompt: textParts.join("\n").trim(), + }) || undefined, + ); + taskPreview = mergeTaskPreview( + taskPreview, + buildTaskPreviewFromToolResult({ + toolId: part.id, + toolName, + toolArguments, + toolResult: normalizedResultRecord, + fallbackPrompt: textParts.join("\n").trim(), + }) || undefined, + ); continue; } @@ -592,6 +925,7 @@ export const hydrateSessionDetailMessages = ( const rawContent = textParts.join("\n").trim(); let normalizedRole = msg.role === "tool" ? "assistant" : (msg.role as "user" | "assistant"); + const usage = normalizeHistoryUsage(msg.usage); const content = sanitizeMessageTextForDisplay(rawContent, { role: normalizedRole, hasImages: images.length > 0, @@ -635,9 +969,12 @@ export const hydrateSessionDetailMessages = ( toolCalls: toolCalls.length > 0 ? toolCalls : undefined, timestamp: messageTimestamp, isThinking: false, + usage: normalizedRole === "assistant" ? usage : undefined, thinkingContent: extractThinkingContentFromParts( sanitizedContentParts, ), + imageWorkbenchPreview, + taskPreview, }, ]; }); diff --git a/src/components/agent/chat/hooks/agentChatSendMessage.test.ts b/src/components/agent/chat/hooks/agentChatSendMessage.test.ts index f4dbb0c4b..8c8d40126 100644 --- a/src/components/agent/chat/hooks/agentChatSendMessage.test.ts +++ b/src/components/agent/chat/hooks/agentChatSendMessage.test.ts @@ -1,6 +1,11 @@ -import { describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import type { SendMessageFn } from "./agentChatShared"; import { createAgentChatSendMessage } from "./agentChatSendMessage"; +import { listSlashEntryUsage } from "../skill-selection/slashEntryUsage"; + +beforeEach(() => { + window.localStorage.clear(); +}); describe("createAgentChatSendMessage", () => { it("普通消息应直接透传到 rawSendMessage", async () => { @@ -74,6 +79,12 @@ describe("createAgentChatSendMessage", () => { expect(appendAssistantMessage).toHaveBeenCalledWith( expect.stringContaining("自动路由"), ); + expect(listSlashEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "command", + entryId: "status", + }), + ]); }); it("命中 prompt slash 命令时应转换 prompt 后透传", async () => { @@ -102,6 +113,12 @@ describe("createAgentChatSendMessage", () => { expect(rawSendMessage).toHaveBeenCalledTimes(1); expect(rawSendMessage.mock.calls[0]?.[0]).toContain("请对以下对象进行代码审查"); expect(rawSendMessage.mock.calls[0]?.[0]).toContain("src-tauri"); + expect(listSlashEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "command", + entryId: "review", + }), + ]); }); it("skipUserMessage 为 true 时应绕过 slash 分流", async () => { diff --git a/src/components/agent/chat/hooks/agentChatSendMessage.ts b/src/components/agent/chat/hooks/agentChatSendMessage.ts index 04f517226..e20d939d5 100644 --- a/src/components/agent/chat/hooks/agentChatSendMessage.ts +++ b/src/components/agent/chat/hooks/agentChatSendMessage.ts @@ -3,6 +3,7 @@ import { executeCodexSlashCommand, parseCodexSlashCommand, } from "../commands"; +import { recordSlashEntryUsage } from "../skill-selection/slashEntryUsage"; import type { ClearMessagesOptions, SendMessageFn, @@ -77,6 +78,16 @@ export function createAgentChatSendMessage( appendAssistantMessage, notifyInfo, notifySuccess, + onExecutedCommand: (command) => { + if (command.definition.support !== "supported") { + return; + } + + recordSlashEntryUsage({ + kind: "command", + entryId: command.definition.key, + }); + }, }); if (handled) { return; diff --git a/src/components/agent/chat/hooks/agentChatShared.ts b/src/components/agent/chat/hooks/agentChatShared.ts index 5b24b8f62..da9f17f39 100644 --- a/src/components/agent/chat/hooks/agentChatShared.ts +++ b/src/components/agent/chat/hooks/agentChatShared.ts @@ -47,6 +47,8 @@ export interface UseAsterAgentChatOptions { ) => void; workspaceId: string; disableSessionRestore?: boolean; + initialTopicsLoadMode?: "immediate" | "deferred"; + initialTopicsDeferredDelayMs?: number; getSyncedSessionRecentPreferences?: ( sessionId: string, ) => ChatToolPreferences | null; diff --git a/src/components/agent/chat/hooks/agentStreamEventProcessor.ts b/src/components/agent/chat/hooks/agentStreamEventProcessor.ts index 198db5e95..56c61a3cd 100644 --- a/src/components/agent/chat/hooks/agentStreamEventProcessor.ts +++ b/src/components/agent/chat/hooks/agentStreamEventProcessor.ts @@ -12,6 +12,7 @@ import type { Artifact } from "@/lib/artifact/types"; import { extractArtifactProtocolPaths, extractArtifactProtocolPathsFromValue, + isArtifactProtocolImagePath, resolveArtifactProtocolDocumentPayload, resolveArtifactProtocolFilePath, resolveArtifactProtocolPreviewText, @@ -118,6 +119,18 @@ function extractPatchPath(rawText?: string): string | undefined { return undefined; } +function shouldSkipBinaryArtifactWrite(params: { + filePath: string; + content: string; + source: WriteArtifactContext["source"]; +}): boolean { + return ( + params.content.length === 0 && + isArtifactProtocolImagePath(params.filePath) && + (params.source === "tool_result" || params.source === "artifact_snapshot") + ); +} + function extractPatchText( toolArgs: Record | null, ): string | undefined { @@ -765,6 +778,16 @@ export function handleToolEndEvent({ } for (const artifactPath of artifactPaths) { + if ( + shouldSkipBinaryArtifactWrite({ + filePath: artifactPath, + content: "", + source: "tool_result", + }) + ) { + continue; + } + const writeContext: WriteArtifactContext = { artifactId: `artifact:${assistantMsgId}:${artifactPath}`, source: "tool_result", @@ -822,6 +845,15 @@ export function handleArtifactSnapshotEvent({ const metadata = data.artifact.metadata; const snapshotContent = typeof data.artifact.content === "string" ? data.artifact.content : ""; + if ( + shouldSkipBinaryArtifactWrite({ + filePath: artifactPath, + content: snapshotContent, + source: "artifact_snapshot", + }) + ) { + return; + } const writeContext: WriteArtifactContext = { artifactId: data.artifact.artifactId || `artifact:${assistantMsgId}:${artifactPath}`, diff --git a/src/components/agent/chat/hooks/agentStreamRuntimeHandler.test.ts b/src/components/agent/chat/hooks/agentStreamRuntimeHandler.test.ts new file mode 100644 index 000000000..71d488854 --- /dev/null +++ b/src/components/agent/chat/hooks/agentStreamRuntimeHandler.test.ts @@ -0,0 +1,85 @@ +import { describe, expect, it, vi } from "vitest"; +import type { AgentEvent } from "@/lib/api/agentProtocol"; +import type { Message } from "../types"; +import { handleTurnStreamEvent } from "./agentStreamRuntimeHandler"; + +describe("agentStreamRuntimeHandler", () => { + it("收到 final_done 时应把 usage 写回 assistant 消息", () => { + let messages: Message[] = [ + { + id: "assistant-1", + role: "assistant", + content: "图片已经生成完成", + timestamp: new Date("2026-04-07T10:00:00.000Z"), + isThinking: true, + }, + ]; + + const setMessages = vi.fn( + (value: Message[] | ((prev: Message[]) => Message[])) => { + messages = typeof value === "function" ? value(messages) : value; + }, + ); + + handleTurnStreamEvent({ + data: { + type: "final_done", + usage: { + input_tokens: 12_000, + output_tokens: 19_000, + }, + } as AgentEvent, + requestState: { + accumulatedContent: "图片已经生成完成", + queuedTurnId: null, + requestLogId: null, + requestStartedAt: 0, + requestFinished: false, + }, + callbacks: { + activateStream: () => {}, + isStreamActivated: () => true, + clearOptimisticItem: () => {}, + clearOptimisticTurn: () => {}, + disposeListener: () => {}, + removeQueuedDraftMessages: () => {}, + clearActiveStreamIfMatch: () => true, + upsertQueuedTurn: () => {}, + removeQueuedTurnState: () => {}, + playToolcallSound: () => {}, + playTypewriterSound: () => {}, + appendThinkingToParts: (parts) => parts, + }, + eventName: "agent-runtime-test", + pendingTurnKey: "pending-turn", + pendingItemKey: "pending-item", + assistantMsgId: "assistant-1", + activeSessionId: "session-1", + resolvedWorkspaceId: "workspace-1", + effectiveExecutionStrategy: "react", + content: "图片已经生成完成", + runtime: {} as never, + warnedKeysRef: { current: new Set() }, + actionLoggedKeys: new Set(), + toolLogIdByToolId: new Map(), + toolStartedAtByToolId: new Map(), + toolNameByToolId: new Map(), + setMessages: setMessages as never, + setPendingActions: vi.fn() as never, + setThreadItems: vi.fn() as never, + setThreadTurns: vi.fn() as never, + setCurrentTurnId: vi.fn() as never, + setExecutionRuntime: vi.fn() as never, + setIsSending: vi.fn() as never, + }); + + expect(setMessages).toHaveBeenCalled(); + expect(messages[0]).toMatchObject({ + isThinking: false, + usage: { + input_tokens: 12_000, + output_tokens: 19_000, + }, + }); + }); +}); diff --git a/src/components/agent/chat/hooks/agentStreamRuntimeHandler.ts b/src/components/agent/chat/hooks/agentStreamRuntimeHandler.ts index 46ca6c564..ef502ed0f 100644 --- a/src/components/agent/chat/hooks/agentStreamRuntimeHandler.ts +++ b/src/components/agent/chat/hooks/agentStreamRuntimeHandler.ts @@ -34,6 +34,7 @@ import { buildFailedAgentRuntimeStatus, formatAgentRuntimeStatusSummary, } from "../utils/agentRuntimeStatus"; +import { resolveAgentRuntimeErrorPresentation } from "../utils/agentRuntimeErrorPresentation"; import { normalizeLegacyRuntimeStatusTitle } from "@/lib/api/agentTextNormalization"; import { resolveRuntimeWarningToastPresentation } from "./runtimeWarningPresentation"; import { buildQueuedRuntimeStatus } from "./agentStreamSubmitDraft"; @@ -349,7 +350,8 @@ export function handleTurnStreamEvent({ ...data.status, title: normalizeLegacyRuntimeStatusTitle(data.status.title), }; - const nextSummaryText = formatAgentRuntimeStatusSummary(normalizedStatus); + const nextSummaryText = + formatAgentRuntimeStatusSummary(normalizedStatus); const updatedAt = new Date().toISOString(); setThreadItems((prev) => { const runtimeSummaryItem = @@ -362,7 +364,10 @@ export function handleTurnStreamEvent({ item.type === "turn_summary" && item.status === "in_progress", ); - if (!runtimeSummaryItem || runtimeSummaryItem.type !== "turn_summary") { + if ( + !runtimeSummaryItem || + runtimeSummaryItem.type !== "turn_summary" + ) { return prev; } @@ -431,7 +436,10 @@ export function handleTurnStreamEvent({ ...msg, content: requestState.accumulatedContent, thinkingContent: undefined, - contentParts: appendTextToParts(msg.contentParts || [], data.text), + contentParts: appendTextToParts( + msg.contentParts || [], + data.text, + ), } : msg, ), @@ -516,7 +524,9 @@ export function handleTurnStreamEvent({ case "final_done": { clearOptimisticItem(); clearOptimisticTurn(); - removeQueuedTurnState(requestState.queuedTurnId ? [requestState.queuedTurnId] : []); + removeQueuedTurnState( + requestState.queuedTurnId ? [requestState.queuedTurnId] : [], + ); finishRequestLog(requestState, { eventType: "chat_request_complete", status: "success", @@ -537,6 +547,7 @@ export function handleTurnStreamEvent({ isThinking: false, content: finalContent, runtimeStatus: undefined, + usage: data.usage ?? msg.usage, } : msg, ), @@ -548,7 +559,9 @@ export function handleTurnStreamEvent({ case "error": { markFailedTimelineState(data.message); - removeQueuedTurnState(requestState.queuedTurnId ? [requestState.queuedTurnId] : []); + removeQueuedTurnState( + requestState.queuedTurnId ? [requestState.queuedTurnId] : [], + ); finishRequestLog(requestState, { eventType: "chat_request_error", status: "error", @@ -562,7 +575,9 @@ export function handleTurnStreamEvent({ ) { toast.warning("请求过于频繁,请稍后重试"); } else { - toast.error(`响应错误: ${data.message}`); + toast.error( + resolveAgentRuntimeErrorPresentation(data.message).toastMessage, + ); } setMessages((prev) => prev.map((msg) => diff --git a/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.test.ts b/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.test.ts new file mode 100644 index 000000000..bcb5e146d --- /dev/null +++ b/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.test.ts @@ -0,0 +1,128 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import type { PreparedAgentStreamUserInputSend } from "./agentStreamUserInputSendPreparation"; +import { maybeHandleSlashSkillBeforeSend } from "./agentStreamSlashSkillPreflight"; + +const { + mockParseSkillSlashCommand, + mockTryExecuteSlashSkillCommand, +} = vi.hoisted(() => ({ + mockParseSkillSlashCommand: vi.fn(), + mockTryExecuteSlashSkillCommand: vi.fn(), +})); + +vi.mock("./skillCommand", () => ({ + parseSkillSlashCommand: (...args: unknown[]) => + mockParseSkillSlashCommand(...args), + tryExecuteSlashSkillCommand: (...args: unknown[]) => + mockTryExecuteSlashSkillCommand(...args), +})); + +function createPreparedSend( + overrides: Partial = {}, +): PreparedAgentStreamUserInputSend { + return { + content: "/legacy_content_post 写一版主稿", + images: [], + skipUserMessage: false, + expectingQueue: false, + effectiveExecutionStrategy: "react", + effectiveProviderType: "openai", + effectiveModel: "gpt-5.4", + syncedSessionModelPreference: null, + assistantMsgId: "assistant-1", + userMsgId: "user-1", + assistantMsg: { + id: "assistant-1", + role: "assistant", + content: "", + timestamp: new Date("2026-04-07T12:00:00.000Z"), + contentParts: [], + }, + ...overrides, + }; +} + +function createEnv() { + return { + ensureSession: async () => "session-1", + sessionIdRef: { current: null }, + activeStreamRef: { current: null }, + listenerMapRef: { current: new Map() }, + setMessages: vi.fn(), + setIsSending: vi.fn(), + setActiveStream: vi.fn(), + clearActiveStreamIfMatch: vi.fn(() => false), + playTypewriterSound: vi.fn(), + playToolcallSound: vi.fn(), + onWriteFile: vi.fn(), + } as never; +} + +describe("agentStreamSlashSkillPreflight", () => { + beforeEach(() => { + vi.clearAllMocks(); + mockParseSkillSlashCommand.mockReturnValue({ + skillName: "legacy_content_post", + userInput: "写一版主稿", + }); + mockTryExecuteSlashSkillCommand.mockResolvedValue(true); + }); + + it.each([ + { + key: "service_scene_launch", + launch: { + kind: "cloud_scene", + service_scene_run: { + scene_key: "campaign-launch", + }, + }, + }, + { + key: "service_skill_launch", + launch: { + kind: "site_adapter", + skill_id: "x-article-export", + }, + }, + ])( + "已携带 $key metadata 时不应再回退旧 slash skill preflight", + async ({ key, launch }) => { + const env = createEnv(); + const handled = await maybeHandleSlashSkillBeforeSend({ + preparedSend: createPreparedSend({ + content: + key === "service_scene_launch" + ? "/campaign-launch 帮我做一版新品活动方案" + : "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + requestMetadata: { + harness: { + [key]: launch, + }, + }, + }), + env, + }); + + expect(handled).toBe(false); + expect(mockParseSkillSlashCommand).not.toHaveBeenCalled(); + expect(mockTryExecuteSlashSkillCommand).not.toHaveBeenCalled(); + expect(env.setActiveStream).not.toHaveBeenCalled(); + }, + ); + + it("未携带结构化 scene metadata 时仍应继续尝试旧 slash skill", async () => { + const env = createEnv(); + const handled = await maybeHandleSlashSkillBeforeSend({ + preparedSend: createPreparedSend(), + env, + }); + + expect(handled).toBe(true); + expect(mockParseSkillSlashCommand).toHaveBeenCalledWith( + "/legacy_content_post 写一版主稿", + ); + expect(mockTryExecuteSlashSkillCommand).toHaveBeenCalledTimes(1); + expect(env.setActiveStream).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.ts b/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.ts index 57f642ba3..9d2c02395 100644 --- a/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.ts +++ b/src/components/agent/chat/hooks/agentStreamSlashSkillPreflight.ts @@ -2,6 +2,7 @@ import { parseSkillSlashCommand, tryExecuteSlashSkillCommand, } from "./skillCommand"; +import { extractExistingHarnessMetadata } from "../utils/harnessRequestMetadata"; import type { PreparedAgentStreamUserInputSend } from "./agentStreamUserInputSendPreparation"; import type { AgentStreamPreparedSendEnv } from "./agentStreamPreparedSendEnv"; @@ -25,6 +26,31 @@ interface MaybeHandleSlashSkillBeforeSendOptions { env: SlashSkillPreflightEnv; } +function asRecord(value: unknown): Record | undefined { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return undefined; + } + + return value as Record; +} + +function hasStructuredSlashLaunchMetadata( + requestMetadata?: Record, +): boolean { + const harness = extractExistingHarnessMetadata(requestMetadata); + if (!harness) { + return false; + } + + const launch = + asRecord(harness.service_scene_launch) ?? + asRecord(harness.serviceSceneLaunch) ?? + asRecord(harness.service_skill_launch) ?? + asRecord(harness.serviceSkillLaunch); + + return Boolean(launch && Object.keys(launch).length > 0); +} + export async function maybeHandleSlashSkillBeforeSend( options: MaybeHandleSlashSkillBeforeSendOptions, ): Promise { @@ -42,6 +68,10 @@ export async function maybeHandleSlashSkillBeforeSend( return false; } + if (hasStructuredSlashLaunchMetadata(preparedSend.requestMetadata)) { + return false; + } + const parsedSkillCommand = parseSkillSlashCommand(content); if (!parsedSkillCommand) { return false; diff --git a/src/components/agent/chat/hooks/agentStreamSubmitFailure.ts b/src/components/agent/chat/hooks/agentStreamSubmitFailure.ts index 365b20c7e..98ae34c97 100644 --- a/src/components/agent/chat/hooks/agentStreamSubmitFailure.ts +++ b/src/components/agent/chat/hooks/agentStreamSubmitFailure.ts @@ -7,6 +7,7 @@ import { buildFailedAgentMessageContent, buildFailedAgentRuntimeStatus, } from "../utils/agentRuntimeStatus"; +import { resolveAgentRuntimeErrorPresentation } from "../utils/agentRuntimeErrorPresentation"; import { isWorkspacePathErrorMessage } from "./agentChatCoreUtils"; import type { ActiveStreamState, StreamRequestState } from "./agentStreamSubmissionLifecycle"; import type { WorkspacePathMissingState } from "./agentChatShared"; @@ -78,7 +79,12 @@ export function handleAgentStreamSubmitFailure( } else if (isWorkspacePathErrorMessage(errMsg)) { setWorkspacePathMissing({ content, images }); } else { - toast.error(`发送失败: ${error}`); + const presentation = resolveAgentRuntimeErrorPresentation(errMsg); + toast.error( + presentation.toastMessage.startsWith("响应错误:") + ? presentation.toastMessage.replace(/^响应错误:/, "发送失败:") + : presentation.toastMessage, + ); } markOptimisticFailure(errMsg); diff --git a/src/components/agent/chat/hooks/index.ts b/src/components/agent/chat/hooks/index.ts index d404925e2..365422faa 100644 --- a/src/components/agent/chat/hooks/index.ts +++ b/src/components/agent/chat/hooks/index.ts @@ -19,6 +19,8 @@ interface UseAgentChatUnifiedOptions { ) => void; workspaceId: string; disableSessionRestore?: boolean; + initialTopicsLoadMode?: "immediate" | "deferred"; + initialTopicsDeferredDelayMs?: number; getSyncedSessionRecentPreferences?: ( sessionId: string, ) => import("../utils/chatToolPreferences").ChatToolPreferences | null; diff --git a/src/components/agent/chat/hooks/skillCommand.test.ts b/src/components/agent/chat/hooks/skillCommand.test.ts index d863a8f6b..74eac5168 100644 --- a/src/components/agent/chat/hooks/skillCommand.test.ts +++ b/src/components/agent/chat/hooks/skillCommand.test.ts @@ -2,6 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { Dispatch, SetStateAction } from "react"; import type { UnlistenFn } from "@tauri-apps/api/event"; import type { Message } from "../types"; +import { listSlashEntryUsage } from "../skill-selection/slashEntryUsage"; const { mockSafeListen, @@ -68,6 +69,7 @@ function buildBaseMessage(id = "assistant-1"): Message { beforeEach(() => { vi.clearAllMocks(); + window.localStorage.clear(); mockParseAgentEvent.mockImplementation((payload: unknown) => payload); mockListExecutableSkills.mockResolvedValue([ { @@ -82,6 +84,7 @@ beforeEach(() => { }); afterEach(() => { + window.localStorage.clear(); vi.clearAllMocks(); }); @@ -95,6 +98,14 @@ describe("tryExecuteSlashSkillCommand 社媒主链路", () => { }); }); + it("中文 scene slash 不应被旧 slash skill 解析器误判", () => { + expect( + parseSkillSlashCommand( + "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + ), + ).toBeNull(); + }); + it("当后端连续发出 write_file 工具事件时应写入主稿与辅助产物", async () => { const store = createMessageStore([buildBaseMessage()]); const onWriteFile = vi.fn(); @@ -233,6 +244,44 @@ describe("tryExecuteSlashSkillCommand 社媒主链路", () => { expect(onWriteFile).not.toHaveBeenCalled(); }); + it("slash skill 真正执行成功后应写入最近使用", async () => { + const store = createMessageStore([buildBaseMessage()]); + + mockExecuteSkill.mockResolvedValue({ + success: true, + output: "Skill 执行完成", + steps_completed: [], + }); + + const handled = await tryExecuteSlashSkillCommand({ + command: { + skillName: "content_post_with_cover", + userInput: "写一版主稿", + }, + rawContent: "/content_post_with_cover 写一版主稿", + assistantMsgId: "assistant-1", + providerType: "anthropic", + model: "claude-sonnet-4-20250514", + ensureSession: async () => "session-1", + setMessages: store.setMessages, + setIsSending: vi.fn(), + setCurrentAssistantMsgId: vi.fn(), + setStreamUnlisten: vi.fn(), + setActiveSessionIdForStop: vi.fn(), + isExecutionCancelled: () => false, + playTypewriterSound: vi.fn(), + playToolcallSound: vi.fn(), + }); + + expect(handled).toBe(true); + expect(listSlashEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "skill", + entryId: "content_post_with_cover", + }), + ]); + }); + it("收到 artifact_snapshot 时应立刻透传给 onWriteFile", async () => { const store = createMessageStore([buildBaseMessage()]); const onWriteFile = vi.fn(); diff --git a/src/components/agent/chat/hooks/skillCommand.ts b/src/components/agent/chat/hooks/skillCommand.ts index 50817a67f..95c7cc728 100644 --- a/src/components/agent/chat/hooks/skillCommand.ts +++ b/src/components/agent/chat/hooks/skillCommand.ts @@ -23,6 +23,7 @@ import { isToolResultSuccessful, normalizeIncomingToolResult, } from "./agentChatToolResult"; +import { recordSlashEntryUsage } from "../skill-selection/slashEntryUsage"; import { CONTENT_POST_OUTPUT_DIR, CONTENT_POST_SKILL_KEY, @@ -127,7 +128,7 @@ function buildSocialPostFallbackPath( export function parseSkillSlashCommand( content: string, ): ParsedSkillCommand | null { - const skillMatch = content.match(/^\/([a-zA-Z0-9_-]+)\s*([\s\S]*)$/); + const skillMatch = content.match(/^\/([a-zA-Z0-9_-]+)(?:\s+([\s\S]*))?$/); if (!skillMatch) { return null; } @@ -913,6 +914,13 @@ ${failureText}` onWriteFile(finalContent, fallbackPath); } + if (!failure) { + recordSlashEntryUsage({ + kind: "skill", + entryId: command.skillName, + }); + } + cleanup(); return true; } catch (error) { diff --git a/src/components/agent/chat/hooks/useAgentSession.ts b/src/components/agent/chat/hooks/useAgentSession.ts index 2b2670282..6887cd2a9 100644 --- a/src/components/agent/chat/hooks/useAgentSession.ts +++ b/src/components/agent/chat/hooks/useAgentSession.ts @@ -61,11 +61,16 @@ import { } from "./agentSessionRefresh"; import type { AgentAccessMode } from "./agentChatStorage"; import { normalizeLegacyThreadItems } from "@/lib/api/agentTextNormalization"; +import { scheduleMinimumDelayIdleTask } from "@/lib/utils/scheduleMinimumDelayIdleTask"; + +const INITIAL_TOPICS_IDLE_TIMEOUT_MS = 1_500; interface UseAgentSessionOptions { runtime: AgentRuntimeAdapter; workspaceId: string; disableSessionRestore: boolean; + initialTopicsLoadMode: "immediate" | "deferred"; + initialTopicsDeferredDelayMs?: number; preserveRestoredMessages: boolean; executionStrategy: AsterExecutionStrategy; accessMode: AgentAccessMode; @@ -110,6 +115,8 @@ export function useAgentSession(options: UseAgentSessionOptions) { runtime, workspaceId, disableSessionRestore, + initialTopicsLoadMode, + initialTopicsDeferredDelayMs, preserveRestoredMessages, executionStrategy, accessMode, @@ -412,53 +419,75 @@ export function useAgentSession(options: UseAgentSessionOptions) { return; } - setTopicsReady(false); - const startedAt = Date.now(); - logAgentDebug("useAgentSession", "listSessions.start", { - workspaceId, - }); - runtime - .listSessions() - .then((sessions) => { - if (cancelled) { - return; - } - const topicList = - filterSessionsByWorkspace(sessions).map(mapSessionToTopic); - logAgentDebug("useAgentSession", "listSessions.success", { - durationMs: Date.now() - startedAt, - sessionsCount: sessions.length, - topicsCount: topicList.length, - workspaceId, - }); - setTopics(topicList); - }) - .catch((error) => { - if (cancelled) { - return; - } - console.error("[AsterChat] 加载话题失败:", error); - logAgentDebug( - "useAgentSession", - "listSessions.error", - { - durationMs: Date.now() - startedAt, - error, - workspaceId, - }, - { level: "error" }, - ); - }) - .finally(() => { - if (!cancelled) { - setTopicsReady(true); - } + const runListSessions = () => { + setTopicsReady(false); + const startedAt = Date.now(); + logAgentDebug("useAgentSession", "listSessions.start", { + workspaceId, }); + runtime + .listSessions() + .then((sessions) => { + if (cancelled) { + return; + } + const topicList = + filterSessionsByWorkspace(sessions).map(mapSessionToTopic); + logAgentDebug("useAgentSession", "listSessions.success", { + durationMs: Date.now() - startedAt, + sessionsCount: sessions.length, + topicsCount: topicList.length, + workspaceId, + }); + setTopics(topicList); + }) + .catch((error) => { + if (cancelled) { + return; + } + console.error("[AsterChat] 加载话题失败:", error); + logAgentDebug( + "useAgentSession", + "listSessions.error", + { + durationMs: Date.now() - startedAt, + error, + workspaceId, + }, + { level: "error" }, + ); + }) + .finally(() => { + if (!cancelled) { + setTopicsReady(true); + } + }); + }; + + if (initialTopicsLoadMode === "deferred") { + setTopicsReady(true); + const cancelDeferredLoad = scheduleMinimumDelayIdleTask(runListSessions, { + minimumDelayMs: initialTopicsDeferredDelayMs, + idleTimeoutMs: INITIAL_TOPICS_IDLE_TIMEOUT_MS, + }); + return () => { + cancelled = true; + cancelDeferredLoad(); + }; + } + + runListSessions(); return () => { cancelled = true; }; - }, [filterSessionsByWorkspace, runtime, workspaceId]); + }, [ + filterSessionsByWorkspace, + initialTopicsDeferredDelayMs, + initialTopicsLoadMode, + runtime, + workspaceId, + ]); const loadTopics = useCallback(async () => { if (!workspaceId?.trim()) { diff --git a/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx b/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx index 24599feca..68137ff7e 100644 --- a/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx +++ b/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx @@ -2045,6 +2045,69 @@ describe("useAsterAgentChat thread timeline", () => { } }); + it("stream error 命中 Provider 登录态失效时应展示友好提示", async () => { + const workspaceId = "ws-thread-provider-session-expired"; + const rawErrorMessage = + "Agent provider execution failed: Request failed: Bad request (400): Invalid schema for function 'SendMessage': In context=('properties', 'message', 'oneOf', '2'), array schema missing items"; + const friendlyErrorMessage = + "当前 Provider 登录态已失效,常见原因是 Token 已过期。请前往设置重新登录或刷新凭证后重试。"; + seedSession(workspaceId, "session-thread-provider-session-expired"); + const harness = mountHook(workspaceId); + const stream = captureTurnStream(); + + try { + await flushEffects(); + + await act(async () => { + await harness + .getValue() + .sendMessage("请继续处理", [], false, false, false, "react"); + }); + + act(() => { + stream.emit({ + type: "turn_started", + turn: { + id: "turn-provider-session-expired-1", + thread_id: "session-thread-provider-session-expired", + prompt_text: "请继续处理", + status: "running", + started_at: "2026-04-07T10:00:00.000Z", + created_at: "2026-04-07T10:00:00.000Z", + updated_at: "2026-04-07T10:00:00.000Z", + }, + }); + stream.emit({ + type: "error", + message: rawErrorMessage, + }); + }); + + const assistantMessage = [...harness.getValue().messages] + .reverse() + .find((msg) => msg.role === "assistant"); + + expect(assistantMessage?.content).toContain( + `执行失败:${friendlyErrorMessage}`, + ); + expect(assistantMessage?.runtimeStatus).toMatchObject({ + phase: "failed", + title: "当前处理失败", + detail: friendlyErrorMessage, + }); + expect(harness.getValue().turns).toEqual([ + expect.objectContaining({ + id: "turn-provider-session-expired-1", + status: "failed", + error_message: rawErrorMessage, + }), + ]); + expect(mockToast.error).toHaveBeenCalledWith(friendlyErrorMessage); + } finally { + harness.unmount(); + } + }); + it("手动压缩上下文时即使没有 assistant 正文也应完成时间线更新", async () => { const workspaceId = "ws-context-compaction"; seedSession(workspaceId, "session-context-compaction"); @@ -4494,6 +4557,45 @@ describe("useAsterAgentChat action_required 渲染链路", () => { } }); + it("空内容的图片 artifact_snapshot 不应进入通用 artifact 列表", async () => { + const workspaceId = "ws-image-artifact-snapshot-skip"; + seedSession(workspaceId, "session-image-artifact-snapshot-skip"); + const harness = mountHook(workspaceId); + const stream = captureTurnStream(); + + try { + await flushEffects(); + + await act(async () => { + await harness + .getValue() + .sendMessage("生成图片", [], false, false, false, "react"); + }); + + act(() => { + stream.emit({ + type: "artifact_snapshot", + artifact: { + artifactId: "artifact-image-output-1", + filePath: "/tmp/lime/output_image.jpg", + content: "", + metadata: { + complete: true, + }, + }, + }); + }); + + const assistantMessage = [...harness.getValue().messages] + .reverse() + .find((msg) => msg.role === "assistant"); + + expect(assistantMessage?.artifacts || []).toHaveLength(0); + } finally { + harness.unmount(); + } + }); + it("搜索工具来源应在后续 artifact_snapshot 中沉淀到同一文档", async () => { const workspaceId = "ws-artifact-sources-before-snapshot"; seedSession(workspaceId, "session-artifact-sources-before-snapshot"); @@ -5672,6 +5774,88 @@ describe("useAsterAgentChat 偏好持久化", () => { } }); + it("切换话题时应从历史 tool_response 元数据恢复图片任务预览", async () => { + const workspaceId = "ws-history-tool-image-task-preview"; + const now = Math.floor(Date.now() / 1000); + mockGetAgentRuntimeSession.mockResolvedValue({ + id: "topic-tool-image-task-preview", + execution_strategy: "react", + messages: [ + { + role: "assistant", + timestamp: now, + content: [ + { type: "text", text: "正在生成珠江夜景封面" }, + { + type: "tool_request", + id: "tool-image-task-preview-1", + tool_name: "bash", + arguments: { + command: + 'lime media image generate --prompt "珠江夜景封面" --size 1024x1024 --count 1', + }, + }, + ], + }, + { + role: "tool", + timestamp: now + 1, + content: [ + { + type: "tool_response", + id: "tool-image-task-preview-1", + success: true, + output: "图片任务已提交", + metadata: { + task_id: "task-image-history-preview-1", + task_type: "image_generate", + status: "succeeded", + project_id: "project-history-preview-1", + content_id: "content-history-preview-1", + requested_count: 1, + received_count: 1, + }, + }, + ], + }, + ], + }); + + const harness = mountHook(workspaceId); + + try { + await flushEffects(); + await act(async () => { + await harness.getValue().switchTopic("topic-tool-image-task-preview"); + }); + + const value = harness.getValue(); + expect(value.messages).toHaveLength(1); + expect(value.messages[0]).toMatchObject({ + role: "assistant", + imageWorkbenchPreview: { + taskId: "task-image-history-preview-1", + prompt: "珠江夜景封面", + status: "complete", + size: "1024x1024", + imageCount: 1, + projectId: "project-history-preview-1", + contentId: "content-history-preview-1", + }, + }); + expect( + value.messages[0]?.contentParts?.some( + (part) => + part.type === "tool_use" && + part.toolCall.id === "tool-image-task-preview-1" && + part.toolCall.status === "completed", + ), + ).toBe(true); + } finally { + harness.unmount(); + } + }); + it("切换话题时应清洗 tool_response error 中的 Lime 元数据块", async () => { const workspaceId = "ws-history-tool-error-metadata"; const now = Math.floor(Date.now() / 1000); diff --git a/src/components/agent/chat/hooks/useAsterAgentChat.ts b/src/components/agent/chat/hooks/useAsterAgentChat.ts index d3b24988b..98c44619a 100644 --- a/src/components/agent/chat/hooks/useAsterAgentChat.ts +++ b/src/components/agent/chat/hooks/useAsterAgentChat.ts @@ -39,6 +39,8 @@ export function useAsterAgentChat(options: UseAsterAgentChatRuntimeOptions) { onWriteFile, workspaceId, disableSessionRestore = false, + initialTopicsLoadMode = "immediate", + initialTopicsDeferredDelayMs, getSyncedSessionRecentPreferences, runtimeAdapter, preserveRestoredMessages = false, @@ -74,6 +76,8 @@ export function useAsterAgentChat(options: UseAsterAgentChatRuntimeOptions) { runtime, workspaceId, disableSessionRestore, + initialTopicsLoadMode, + initialTopicsDeferredDelayMs, preserveRestoredMessages, executionStrategy: context.executionStrategy, accessMode: context.accessMode, diff --git a/src/components/agent/chat/hooks/useGeneralWorkbenchSendBoundary.test.tsx b/src/components/agent/chat/hooks/useGeneralWorkbenchSendBoundary.test.tsx index 074386704..d116eb073 100644 --- a/src/components/agent/chat/hooks/useGeneralWorkbenchSendBoundary.test.tsx +++ b/src/components/agent/chat/hooks/useGeneralWorkbenchSendBoundary.test.tsx @@ -121,7 +121,7 @@ describe("useGeneralWorkbenchSendBoundary", () => { } }); - it("需要真实浏览器时应仅保留 requirement 检测,不再启动前置引导", () => { + it("需要真实浏览器时应仅保留 requirement 检测,不再恢复旧状态机", () => { const harness = mountHook(); try { diff --git a/src/components/agent/chat/hooks/useLimeSkills.test.tsx b/src/components/agent/chat/hooks/useLimeSkills.test.tsx index 3d904ae35..0bd2baf8b 100644 --- a/src/components/agent/chat/hooks/useLimeSkills.test.tsx +++ b/src/components/agent/chat/hooks/useLimeSkills.test.tsx @@ -157,12 +157,19 @@ describe("useLimeSkills", () => { vi.clearAllMocks(); }); - it("deferred 模式应在 idle/fallback 阶段加载本地 skills", async () => { + it("deferred 模式应在最小延迟后才加载本地 skills", async () => { const harness = mountHook({ autoLoad: "deferred", logScope: "TestScope" }); try { act(() => { - vi.advanceTimersByTime(200); + vi.advanceTimersByTime(1499); + }); + await flushEffects(); + + expect(mockGetLocal).not.toHaveBeenCalled(); + + act(() => { + vi.advanceTimersByTime(1); }); await flushEffects(); diff --git a/src/components/agent/chat/hooks/useLimeSkills.ts b/src/components/agent/chat/hooks/useLimeSkills.ts index 5e09e92a1..23f608e71 100644 --- a/src/components/agent/chat/hooks/useLimeSkills.ts +++ b/src/components/agent/chat/hooks/useLimeSkills.ts @@ -1,35 +1,13 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { logAgentDebug } from "@/lib/agentDebug"; import { skillsApi, type Skill } from "@/lib/api/skills"; +import { scheduleMinimumDelayIdleTask } from "@/lib/utils/scheduleMinimumDelayIdleTask"; const SKILLS_IDLE_TIMEOUT_MS = 1_500; -const SKILLS_FALLBACK_DELAY_MS = 180; - -function scheduleDeferredSkillsLoad(task: () => void): () => void { - if (typeof window === "undefined") { - task(); - return () => undefined; - } - - if (typeof window.requestIdleCallback === "function") { - const idleId = window.requestIdleCallback(() => task(), { - timeout: SKILLS_IDLE_TIMEOUT_MS, - }); - return () => { - if (typeof window.cancelIdleCallback === "function") { - window.cancelIdleCallback(idleId); - } - }; - } - - const timeoutId = window.setTimeout(task, SKILLS_FALLBACK_DELAY_MS); - return () => { - window.clearTimeout(timeoutId); - }; -} interface UseLimeSkillsOptions { autoLoad?: "immediate" | "deferred" | false; + deferredDelayMs?: number; logScope?: string; onError?: (error: unknown) => void; } @@ -37,6 +15,7 @@ interface UseLimeSkillsOptions { export function useLimeSkills(options: UseLimeSkillsOptions = {}) { const { autoLoad = "immediate", + deferredDelayMs = SKILLS_IDLE_TIMEOUT_MS, logScope = "useLimeSkills", onError, } = options; @@ -114,14 +93,20 @@ export function useLimeSkills(options: UseLimeSkillsOptions = {}) { } if (autoLoad === "deferred") { - return scheduleDeferredSkillsLoad(() => { - void refreshSkills(false); - }); + return scheduleMinimumDelayIdleTask( + () => { + void refreshSkills(false); + }, + { + minimumDelayMs: deferredDelayMs, + idleTimeoutMs: SKILLS_IDLE_TIMEOUT_MS, + }, + ); } void refreshSkills(false); return; - }, [autoLoad, refreshSkills]); + }, [autoLoad, deferredDelayMs, refreshSkills]); useEffect(() => { return () => { diff --git a/src/components/agent/chat/hooks/useTrayModelShortcuts.ts b/src/components/agent/chat/hooks/useTrayModelShortcuts.ts index b5321bab7..207645641 100644 --- a/src/components/agent/chat/hooks/useTrayModelShortcuts.ts +++ b/src/components/agent/chat/hooks/useTrayModelShortcuts.ts @@ -23,6 +23,7 @@ import { import { buildProviderModelsFromRegistry } from "@/lib/model/providerModelsCatalog"; import { filterModelsByTheme } from "../utils/modelThemePolicy"; import { getProviderModelCompatibilityIssue } from "../utils/providerModelCompatibility"; +import { hasTauriInvokeCapability } from "@/lib/tauri-runtime"; interface UseTrayModelShortcutsOptions { providerType: string; @@ -342,6 +343,7 @@ export function useTrayModelShortcuts({ activeTheme, deferInitialSync = false, }: UseTrayModelShortcutsOptions) { + const traySyncEnabled = hasTauriInvokeCapability(); const lastSyncedSignatureRef = useRef(""); const initialSyncHandledRef = useRef(false); const latestSelectionRef = useRef({ @@ -365,6 +367,10 @@ export function useTrayModelShortcuts({ }, [model, providerType, setModel, setProviderType]); useEffect(() => { + if (!traySyncEnabled) { + return; + } + const normalizedProviderType = providerType.trim(); const normalizedModel = model.trim(); const normalizedTheme = activeTheme?.trim() || ""; @@ -413,9 +419,13 @@ export function useTrayModelShortcuts({ cancelled = true; cleanupScheduledTask?.(); }; - }, [activeTheme, deferInitialSync, model, providerType]); + }, [activeTheme, deferInitialSync, model, providerType, traySyncEnabled]); useEffect(() => { + if (!traySyncEnabled) { + return; + } + let cancelled = false; let dispose: (() => void) | null = null; @@ -461,5 +471,5 @@ export function useTrayModelShortcuts({ dispose(); } }; - }, []); + }, [traySyncEnabled]); } diff --git a/src/components/agent/chat/hooks/useWechatRuntimeModelSync.ts b/src/components/agent/chat/hooks/useWechatRuntimeModelSync.ts index 0a916b6f9..be0de0738 100644 --- a/src/components/agent/chat/hooks/useWechatRuntimeModelSync.ts +++ b/src/components/agent/chat/hooks/useWechatRuntimeModelSync.ts @@ -1,5 +1,6 @@ import { useEffect } from "react"; import { wechatChannelSetRuntimeModel } from "@/lib/api/channelsRuntime"; +import { hasTauriInvokeCapability } from "@/lib/tauri-runtime"; let lastSyncedWechatRuntimeModelKey: string | null = null; @@ -14,7 +15,13 @@ export function useWechatRuntimeModelSync({ modelId, source, }: UseWechatRuntimeModelSyncOptions) { + const syncEnabled = hasTauriInvokeCapability(); + useEffect(() => { + if (!syncEnabled) { + return; + } + const normalizedProviderId = providerId?.trim() || ""; const normalizedModelId = modelId?.trim() || ""; const selectionKey = @@ -54,5 +61,5 @@ export function useWechatRuntimeModelSync({ return () => { cancelled = true; }; - }, [modelId, providerId, source]); + }, [modelId, providerId, source, syncEnabled]); } diff --git a/src/components/agent/chat/index.test.tsx b/src/components/agent/chat/index.test.tsx index dde98e1ac..f32bf35ad 100644 --- a/src/components/agent/chat/index.test.tsx +++ b/src/components/agent/chat/index.test.tsx @@ -1423,6 +1423,34 @@ describe("AgentChatPage 话题切换项目恢复", () => { expect(workspaceHookOrder).toBeLessThan(switchTopicOrder); }); + it("默认工作区别名应在进入页面时归一为真实项目 ID", async () => { + mockGetOrCreateDefaultProject.mockResolvedValue( + createProject("project-default-real"), + ); + mockEnsureWorkspaceReady.mockResolvedValue({ + workspaceId: "project-default-real", + rootPath: "/tmp/project-default-real", + existed: true, + created: false, + repaired: false, + relocated: false, + previousRootPath: null, + warning: null, + }); + + renderPage({ projectId: "default" }); + await flushEffects(); + + expect(mockGetOrCreateDefaultProject).toHaveBeenCalledTimes(1); + expect(mockEnsureWorkspaceReady).toHaveBeenCalledWith( + "project-default-real", + ); + expect(observedWorkspaceIds).not.toContain("default"); + expect(observedWorkspaceIds[observedWorkspaceIds.length - 1]).toBe( + "project-default-real", + ); + }); + it("存在 newChatAt 时手动选项目不应被重置", async () => { const container = renderPage({ newChatAt: 1234567890 }); await flushEffects(); diff --git a/src/components/agent/chat/service-skills/types.ts b/src/components/agent/chat/service-skills/types.ts index 500f0f0a8..b2b2dac74 100644 --- a/src/components/agent/chat/service-skills/types.ts +++ b/src/components/agent/chat/service-skills/types.ts @@ -10,6 +10,7 @@ import type { ServiceSkillPromptTemplateKey, ServiceSkillReadinessRequirements, ServiceSkillRunnerType, + ServiceSkillSceneBinding, ServiceSkillSlotDefinition, ServiceSkillSlotOption, ServiceSkillSlotType, @@ -34,6 +35,7 @@ export type { ServiceSkillPromptTemplateKey, ServiceSkillReadinessRequirements, ServiceSkillRunnerType, + ServiceSkillSceneBinding, ServiceSkillSlotDefinition, ServiceSkillSlotOption, ServiceSkillSlotType, diff --git a/src/components/agent/chat/service-skills/useServiceSkills.test.tsx b/src/components/agent/chat/service-skills/useServiceSkills.test.tsx index 1ec7a0fad..c54f901be 100644 --- a/src/components/agent/chat/service-skills/useServiceSkills.test.tsx +++ b/src/components/agent/chat/service-skills/useServiceSkills.test.tsx @@ -138,7 +138,9 @@ function buildLegacySiteCatalog(): SkillCatalog { }; } -function mountHook(): HookHarness { +function mountHook( + options: Parameters[0] = true, +): HookHarness { const container = document.createElement("div"); document.body.appendChild(container); const root = createRoot(container); @@ -146,7 +148,7 @@ function mountHook(): HookHarness { let hookValue: ReturnType | null = null; function TestComponent() { - hookValue = useServiceSkills(); + hookValue = useServiceSkills(options); return null; } @@ -215,6 +217,7 @@ describe("useServiceSkills", () => { delete window.__LIME_SESSION_TOKEN__; vi.unstubAllGlobals(); vi.restoreAllMocks(); + vi.useRealTimers(); }); it("目录更新事件后应刷新技能列表并保留分组元数据", async () => { diff --git a/src/components/agent/chat/service-skills/useServiceSkills.ts b/src/components/agent/chat/service-skills/useServiceSkills.ts index 33c12910c..00214c205 100644 --- a/src/components/agent/chat/service-skills/useServiceSkills.ts +++ b/src/components/agent/chat/service-skills/useServiceSkills.ts @@ -25,6 +25,7 @@ import { getServiceSkillRunnerLabel, getServiceSkillRunnerTone, } from "./skillPresentation"; +import { scheduleMinimumDelayIdleTask } from "@/lib/utils/scheduleMinimumDelayIdleTask"; import { supportsServiceSkillLocalAutomation } from "./automationDraft"; import { getServiceSkillUsageMap, recordServiceSkillUsage } from "./storage"; import type { @@ -35,6 +36,8 @@ import type { ServiceSkillHomeItem, } from "./types"; +const SERVICE_SKILLS_IDLE_TIMEOUT_MS = 1_500; + function shouldExposeServiceSkillHomeItem(item: SkillCatalogItem): boolean { if (item.execution.kind === "site_adapter") { return false; @@ -136,7 +139,21 @@ interface UseServiceSkillsResult { recordUsage: (input: RecordServiceSkillUsageInput) => void; } -export function useServiceSkills(enabled = true): UseServiceSkillsResult { +interface UseServiceSkillsOptions { + enabled?: boolean; + loadMode?: "immediate" | "deferred"; + deferredDelayMs?: number; +} + +export function useServiceSkills( + options: UseServiceSkillsOptions | boolean = true, +): UseServiceSkillsResult { + const normalizedOptions = + typeof options === "boolean" ? { enabled: options } : options; + const enabled = normalizedOptions.enabled ?? true; + const loadMode = normalizedOptions.loadMode ?? "immediate"; + const deferredDelayMs = + normalizedOptions.deferredDelayMs ?? SERVICE_SKILLS_IDLE_TIMEOUT_MS; const [items, setItems] = useState([]); const [groups, setGroups] = useState([]); const [automationStatusMap, setAutomationStatusMap] = useState< @@ -243,8 +260,21 @@ export function useServiceSkills(enabled = true): UseServiceSkillsResult { }, [applyCatalogSnapshot, enabled, loadCurrentCatalog]); useEffect(() => { + if (loadMode === "deferred") { + return scheduleMinimumDelayIdleTask( + () => { + void refresh(); + }, + { + minimumDelayMs: deferredDelayMs, + idleTimeoutMs: SERVICE_SKILLS_IDLE_TIMEOUT_MS, + }, + ); + } + void refresh(); - }, [refresh]); + return; + }, [deferredDelayMs, loadMode, refresh]); useEffect(() => { if (!enabled) { diff --git a/src/components/agent/chat/skill-selection/CharacterMention.test.tsx b/src/components/agent/chat/skill-selection/CharacterMention.test.tsx index 89f89f0a1..5201b61ae 100644 --- a/src/components/agent/chat/skill-selection/CharacterMention.test.tsx +++ b/src/components/agent/chat/skill-selection/CharacterMention.test.tsx @@ -14,6 +14,10 @@ import { import { filterMentionableServiceSkills } from "@/components/agent/chat/service-skills/entryAdapter"; import type { ServiceSkillHomeItem } from "@/components/agent/chat/service-skills/types"; import type { BuiltinInputCommand } from "./builtinCommands"; +import { recordMentionEntryUsage } from "./mentionEntryUsage"; +import { recordSlashEntryUsage } from "./slashEntryUsage"; + +const mockListServiceSkills = vi.hoisted(() => vi.fn()); vi.mock("sonner", () => ({ toast: { @@ -21,6 +25,16 @@ vi.mock("sonner", () => ({ }, })); +vi.mock("@/lib/api/serviceSkills", async (importOriginal) => { + const actual = + await importOriginal(); + + return { + ...actual, + listServiceSkills: () => mockListServiceSkills(), + }; +}); + vi.mock("@/components/ui/popover", () => { const Popover = ({ open, @@ -171,6 +185,10 @@ afterEach(() => { vi.clearAllMocks(); }); +beforeEach(() => { + mockListServiceSkills.mockResolvedValue([]); +}); + interface HarnessProps { characters?: Character[]; skills?: Skill[]; @@ -178,7 +196,10 @@ interface HarnessProps { syncValue?: boolean; onNavigateToSettings?: () => void; onChangeSpy?: (value: string) => void; - onSelectBuiltinCommand?: (command: BuiltinInputCommand) => void; + onSelectBuiltinCommand?: ( + command: BuiltinInputCommand, + options?: { replayText?: string }, + ) => void; onSelectServiceSkill?: (skill: ServiceSkillHomeItem) => void; } @@ -354,6 +375,53 @@ function createServiceSkill( }; } +function createXArticleSceneServiceSkill( + overrides: Partial = {}, +): ServiceSkillHomeItem { + return createServiceSkill({ + id: "x-article-export", + skillKey: "x-article-export", + title: "X 文章转存", + summary: "复用 X 登录态把长文导出成 Markdown。", + category: "站点采集", + outputHint: "Markdown 正文 + 图片目录", + source: "local_custom", + runnerType: "instant", + defaultExecutorBinding: "browser_assist", + executionLocation: "client_default", + slotSchema: [ + { + key: "article_url", + label: "X 文章链接", + type: "url", + required: true, + placeholder: "https://x.com/<账号>/article/<文章ID>", + }, + ], + sceneBinding: { + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + aliases: ["x文章转存", "x转存"], + }, + siteCapabilityBinding: { + adapterName: "x/article-export", + autoRun: true, + requireAttachedSession: true, + saveMode: "project_resource", + slotArgMap: { + article_url: "url", + }, + }, + runnerLabel: "浏览器站点执行", + runnerTone: "emerald", + runnerDescription: "直接复用浏览器登录态执行。", + actionLabel: "启动采集", + ...overrides, + }); +} + function buildCatalogWithSceneEntry(): SkillCatalog { const seeded = getSeededSkillCatalog(); @@ -384,6 +452,35 @@ function buildCatalogWithSceneEntry(): SkillCatalog { }; } +function buildCatalogWithXSceneEntry(): SkillCatalog { + const seeded = getSeededSkillCatalog(); + + return { + ...seeded, + tenantId: "tenant-x-scene-demo", + version: "tenant-x-scene-demo-2026-04-07", + syncedAt: "2026-04-07T12:00:00.000Z", + entries: [ + ...seeded.entries.filter( + (entry) => + entry.kind !== "scene" || + entry.sceneKey !== "x-article-export", + ), + { + id: "scene:x-article-export", + kind: "scene", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + aliases: ["x文章转存", "x转存"], + linkedSkillId: "x-article-export", + executionKind: "site_adapter", + }, + ], + }; +} + describe("CharacterMention", () => { it("输入 @ 当次应弹出提及面板(不依赖受控 value 同步)", async () => { const container = renderHarness({ @@ -904,12 +1001,319 @@ describe("CharacterMention", () => { await typeAtAndWait(textarea); - expect(document.body.textContent).toContain("技能组 · 通用技能"); - expect(document.body.textContent).toContain("技能组 · GitHub"); + expect(document.body.textContent).toContain("推荐技能"); expect(document.body.textContent).toContain("每日趋势摘要"); expect(document.body.textContent).toContain("GitHub 仓库雷达"); }); + it("最近使用的服务技能应优先显示在独立分组,且不在技能组里重复", async () => { + const recentSkill = createServiceSkill({ + id: "recent-trend-briefing", + title: "最近趋势摘要", + recentUsedAt: 1_712_345_678_000, + isRecent: true, + }); + const regularSkill = createServiceSkill({ + id: "regular-trend-briefing", + title: "常规趋势摘要", + }); + const container = renderHarness({ + serviceSkills: [recentSkill, regularSkill], + }); + const textarea = getTextarea(container); + + await typeAtAndWait(textarea); + + expect(document.body.textContent).toContain("最近使用"); + expect(document.body.textContent).toContain("推荐技能"); + + const recentButtons = Array.from( + document.body.querySelectorAll("button"), + ).filter((button) => button.textContent?.includes("最近趋势摘要")); + expect(recentButtons).toHaveLength(1); + + const regularButtons = Array.from( + document.body.querySelectorAll("button"), + ).filter((button) => button.textContent?.includes("常规趋势摘要")); + expect(regularButtons).toHaveLength(1); + }); + + it("@ 空查询时应优先显示最近使用的内建命令,且不在内建命令分组重复", async () => { + act(() => { + recordMentionEntryUsage({ + kind: "builtin_command", + entryId: "research", + usedAt: 1_712_345_678_900, + }); + }); + + const container = renderHarness(); + const textarea = getTextarea(container); + + await typeAtAndWait(textarea); + + expect(document.body.textContent).toContain("最近使用"); + + const recentCommandButtons = Array.from( + document.body.querySelectorAll("button"), + ).filter((button) => button.textContent?.includes("@搜索")); + expect(recentCommandButtons).toHaveLength(1); + }); + + it("选择最近使用的 @命令时应回填上次成功草稿", async () => { + const replayText = "关键词:AI Agent 融资 站点:36Kr"; + act(() => { + recordMentionEntryUsage({ + kind: "builtin_command", + entryId: "research", + usedAt: 1_712_345_678_900, + replayText, + }); + }); + + const onChangeSpy = vi.fn<(value: string) => void>(); + const onSelectBuiltinCommand = vi.fn< + (command: BuiltinInputCommand, options?: { replayText?: string }) => void + >(); + const container = renderHarness({ + onChangeSpy, + onSelectBuiltinCommand, + }); + const textarea = getTextarea(container); + + await typeAtAndWait(textarea); + + expect(document.body.textContent).toContain(`上次输入:${replayText}`); + + const recentCommandButton = Array.from( + document.body.querySelectorAll("button"), + ).find((button) => button.textContent?.includes("@搜索")); + expect(recentCommandButton).toBeTruthy(); + + act(() => { + recentCommandButton?.click(); + }); + + expect(onChangeSpy).toHaveBeenLastCalledWith(replayText); + expect(onSelectBuiltinCommand).toHaveBeenCalledWith( + expect.objectContaining({ + key: "research", + }), + expect.objectContaining({ + replayText, + }), + ); + }); + + it("@ 搜索时不应显示最近使用,而应回到普通命令结果", async () => { + act(() => { + recordMentionEntryUsage({ + kind: "builtin_command", + entryId: "research", + usedAt: 1_712_345_678_900, + }); + }); + + const container = renderHarness(); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@搜"; + textarea.setSelectionRange(2, 2); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).not.toContain("最近使用"); + expect(document.body.textContent).toContain("内建命令"); + expect(document.body.textContent).toContain("@搜索"); + }); + + it("只有最近使用的服务技能时,不应同时出现空态文案", async () => { + const container = renderHarness({ + serviceSkills: [ + createServiceSkill({ + id: "recent-trend-briefing", + title: "最近趋势摘要", + recentUsedAt: 1_712_345_678_000, + isRecent: true, + }), + ], + }); + const textarea = getTextarea(container); + + await typeAtAndWait(textarea); + + expect(document.body.textContent).toContain("最近使用"); + expect(document.body.textContent).toContain("最近趋势摘要"); + expect(document.body.textContent).not.toContain("暂无可用角色或技能"); + }); + + it("输入 @ 查询服务技能时,应回到按技能组展示搜索结果", async () => { + const container = renderHarness({ + serviceSkills: [ + createServiceSkill({ + id: "github-repo-radar", + title: "GitHub 仓库雷达", + aliases: ["仓库雷达", "GitHub 搜索"], + groupKey: "github", + recentUsedAt: 1_712_345_678_000, + isRecent: true, + runnerType: "instant", + defaultExecutorBinding: "browser_assist", + runnerLabel: "浏览器协助", + runnerTone: "sky", + runnerDescription: "进入真实浏览器执行只读采集。", + actionLabel: "填写参数", + }), + ], + }); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@git"; + textarea.setSelectionRange(4, 4); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).not.toContain("最近使用"); + expect(document.body.textContent).not.toContain("推荐技能"); + expect(document.body.textContent).toContain("技能组 · GitHub"); + expect(document.body.textContent).toContain("GitHub 仓库雷达"); + }); + + it("输入 @网 时应展示新的内建网页命令", async () => { + const container = renderHarness(); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@网"; + textarea.setSelectionRange(2, 2); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).toContain("内建命令"); + expect(document.body.textContent).toContain("@网页"); + }); + + it("输入 @P 时应展示新的内建 PPT 命令", async () => { + const container = renderHarness(); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@P"; + textarea.setSelectionRange(2, 2); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).toContain("内建命令"); + expect(document.body.textContent).toContain("@PPT"); + }); + + it("输入 @表 时应展示新的内建表单命令", async () => { + const container = renderHarness(); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@表"; + textarea.setSelectionRange(2, 2); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).toContain("内建命令"); + expect(document.body.textContent).toContain("@表单"); + }); + + it("输入 @代 时应展示新的内建代码命令", async () => { + const container = renderHarness(); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@代"; + textarea.setSelectionRange(2, 2); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).toContain("内建命令"); + expect(document.body.textContent).toContain("@代码"); + }); + + it("输入 @发 时应展示新的内建发布命令", async () => { + const container = renderHarness(); + const textarea = getTextarea(container); + + await act(async () => { + await import("./CharacterMentionPanel"); + }); + + act(() => { + textarea.focus(); + textarea.value = "@发"; + textarea.setSelectionRange(2, 2); + textarea.dispatchEvent(new Event("input", { bubbles: true })); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(document.body.textContent).toContain("内建命令"); + expect(document.body.textContent).toContain("@发布"); + }); + it("服务技能过滤应支持命中别名", () => { const filtered = filterMentionableServiceSkills( [ @@ -988,9 +1392,10 @@ describe("CharacterMention", () => { await typeSlashAndWait(textarea); - expect(document.body.textContent).toContain("Lime 命令"); + expect(document.body.textContent).toContain("快捷操作"); expect(document.body.textContent).toContain("/compact"); expect(document.body.textContent).toContain("/review"); + expect(document.body.textContent).not.toContain("/quit"); }); it("统一目录中的 scene 应出现在 slash 面板里", async () => { @@ -1010,6 +1415,81 @@ describe("CharacterMention", () => { ); }); + it("搜索未接入的 slash 命令时,应单独显示暂未接入分组", async () => { + const container = renderHarness(); + const textarea = getTextarea(container); + + await typeSlashAndWait(textarea, "/qui"); + + expect(document.body.textContent).not.toContain("快捷操作"); + expect(document.body.textContent).toContain("暂未接入"); + expect(document.body.textContent).toContain("/quit"); + }); + + it("slash 空查询时应优先显示最近使用,且不在原分组重复", async () => { + act(() => { + saveSkillCatalog(buildCatalogWithSceneEntry(), "bootstrap_sync"); + recordSlashEntryUsage({ + kind: "command", + entryId: "compact", + usedAt: 1_712_345_678_900, + }); + recordSlashEntryUsage({ + kind: "scene", + entryId: "campaign-launch", + usedAt: 1_712_345_678_800, + }); + recordSlashEntryUsage({ + kind: "skill", + entryId: "skill-a", + usedAt: 1_712_345_678_700, + }); + }); + + const container = renderHarness({ + skills: [createSkill("技能A", "skill-a", true)], + }); + const textarea = getTextarea(container); + + await typeSlashAndWait(textarea); + + expect(document.body.textContent).toContain("最近使用"); + + const compactButtons = Array.from( + document.body.querySelectorAll("button"), + ).filter((button) => button.textContent?.includes("/compact")); + expect(compactButtons).toHaveLength(1); + + const sceneButtons = Array.from( + document.body.querySelectorAll("button"), + ).filter((button) => button.textContent?.includes("/campaign-launch")); + expect(sceneButtons).toHaveLength(1); + + const skillButtons = Array.from( + document.body.querySelectorAll("button"), + ).filter((button) => button.textContent?.includes("技能A")); + expect(skillButtons).toHaveLength(1); + }); + + it("slash 搜索时不应显示最近使用,而应回到搜索结果分组", async () => { + act(() => { + recordSlashEntryUsage({ + kind: "command", + entryId: "compact", + usedAt: 1_712_345_678_900, + }); + }); + + const container = renderHarness(); + const textarea = getTextarea(container); + + await typeSlashAndWait(textarea, "/com"); + + expect(document.body.textContent).not.toContain("最近使用"); + expect(document.body.textContent).toContain("Lime 命令"); + expect(document.body.textContent).toContain("/compact"); + }); + it("slash 面板选择 Lime 命令时应回填到输入框", async () => { const onChangeSpy = vi.fn<(value: string) => void>(); const container = renderHarness({ @@ -1056,6 +1536,43 @@ describe("CharacterMention", () => { expect(onChangeSpy).toHaveBeenCalledWith("/campaign-launch "); }); + it("slash 面板选择带必填参数的 scene 时应交给服务技能弹窗接管", async () => { + act(() => { + saveSkillCatalog(buildCatalogWithXSceneEntry(), "bootstrap_sync"); + }); + mockListServiceSkills.mockResolvedValueOnce([ + createXArticleSceneServiceSkill(), + ]); + + const onChangeSpy = vi.fn<(value: string) => void>(); + const onSelectServiceSkill = vi.fn<(skill: ServiceSkillHomeItem) => void>(); + const container = renderHarness({ + onChangeSpy, + onSelectServiceSkill, + }); + const textarea = getTextarea(container); + + await typeSlashAndWait(textarea, "/x文"); + + const sceneButton = Array.from( + document.body.querySelectorAll("button"), + ).find((button) => button.textContent?.includes("/x文章转存")); + expect(sceneButton).toBeTruthy(); + + await act(async () => { + sceneButton?.click(); + await Promise.resolve(); + }); + + expect(onSelectServiceSkill).toHaveBeenCalledWith( + expect.objectContaining({ + id: "x-article-export", + title: "X 文章转存", + }), + ); + expect(onChangeSpy).not.toHaveBeenCalled(); + }); + it("slash 面板选择已安装技能时应直接回填 slash skill", async () => { const onChangeSpy = vi.fn<(value: string) => void>(); const container = renderHarness({ diff --git a/src/components/agent/chat/skill-selection/CharacterMention.tsx b/src/components/agent/chat/skill-selection/CharacterMention.tsx index ca385f349..993042364 100644 --- a/src/components/agent/chat/skill-selection/CharacterMention.tsx +++ b/src/components/agent/chat/skill-selection/CharacterMention.tsx @@ -19,7 +19,17 @@ import { getSkillCatalog, subscribeSkillCatalogChanged, } from "@/lib/api/skillCatalog"; +import { + listServiceSkills, + type ServiceSkillItem, +} from "@/lib/api/serviceSkills"; import { filterMentionableServiceSkills } from "@/components/agent/chat/service-skills/entryAdapter"; +import { + getServiceSkillActionLabel, + getServiceSkillRunnerDescription, + getServiceSkillRunnerLabel, + getServiceSkillRunnerTone, +} from "@/components/agent/chat/service-skills/skillPresentation"; import type { ServiceSkillHomeItem } from "@/components/agent/chat/service-skills/types"; import { toast } from "sonner"; import { @@ -39,6 +49,7 @@ import { LazyCharacterMentionPanel, preloadCharacterMentionPanel, } from "./characterMentionPanelLoader"; +import { recordSlashEntryUsage } from "./slashEntryUsage"; import { partitionMentionableSkills } from "./skillQuery"; import { useIdleModulePreload } from "./useIdleModulePreload"; @@ -62,7 +73,10 @@ interface CharacterMentionProps { /** 选择技能目录项回调 */ onSelectServiceSkill?: (skill: ServiceSkillHomeItem) => void; /** 选择内建命令回调 */ - onSelectBuiltinCommand?: (command: BuiltinInputCommand) => void; + onSelectBuiltinCommand?: ( + command: BuiltinInputCommand, + options?: BuiltinCommandSelectionOptions, + ) => void; /** 跳转到设置页安装技能 */ onNavigateToSettings?: () => void; } @@ -75,6 +89,10 @@ interface ActiveTrigger { query: string; } +interface BuiltinCommandSelectionOptions { + replayText?: string; +} + function resolveMentionTrigger(textBeforeCursor: string): ActiveTrigger | null { const lastAtIndex = textBeforeCursor.lastIndexOf("@"); if (lastAtIndex === -1) { @@ -128,6 +146,94 @@ function resolveActiveTrigger( : slashTrigger; } +function normalizeReplayText(value: string | undefined): string | null { + const trimmed = value?.trim(); + return trimmed ? trimmed : null; +} + +function mergeTriggerSelectionText(params: { + leadingText: string; + insertedText: string; + trailingText: string; +}): { value: string; cursorPos: number } { + const normalizedInsertedText = params.insertedText.trim(); + if (!normalizedInsertedText) { + return { + value: `${params.leadingText}${params.trailingText}`, + cursorPos: params.leadingText.length, + }; + } + + const needsLeadingSpace = + params.leadingText.length > 0 && !/[\s\n]$/.test(params.leadingText); + const needsTrailingSpace = + params.trailingText.length > 0 && !/^[\s\n]/.test(params.trailingText); + const mergedInsertedText = `${needsLeadingSpace ? " " : ""}${normalizedInsertedText}${ + needsTrailingSpace ? " " : "" + }`; + + return { + value: `${params.leadingText}${mergedInsertedText}${params.trailingText}`, + cursorPos: params.leadingText.length + mergedInsertedText.length, + }; +} + +function normalizeSceneToken(value?: string | null): string { + if (typeof value !== "string") { + return ""; + } + + return value.trim().replace(/^\/+/, "").toLowerCase(); +} + +function toServiceSkillHomeItem( + skill: ServiceSkillItem, +): ServiceSkillHomeItem { + return { + ...skill, + badge: skill.source === "cloud_catalog" ? "云目录" : "本地技能", + recentUsedAt: null, + isRecent: false, + runnerLabel: getServiceSkillRunnerLabel(skill), + runnerTone: getServiceSkillRunnerTone(skill), + runnerDescription: getServiceSkillRunnerDescription(skill), + actionLabel: getServiceSkillActionLabel(skill), + automationStatus: null, + cloudStatus: + skill.executionLocation === "cloud_required" ? null : undefined, + }; +} + +function matchesSceneBoundServiceSkill( + skill: ServiceSkillItem, + command: RuntimeSceneSlashCommand, +): boolean { + const binding = skill.sceneBinding; + if (!binding) { + return false; + } + + const commandTokens = new Set( + [command.key, command.commandPrefix, ...(command.aliases ?? [])] + .map((value) => normalizeSceneToken(value)) + .filter(Boolean), + ); + if (commandTokens.size === 0) { + return false; + } + + if (commandTokens.has(normalizeSceneToken(binding.sceneKey))) { + return true; + } + if (commandTokens.has(normalizeSceneToken(binding.commandPrefix))) { + return true; + } + + return (binding.aliases ?? []).some((alias) => + commandTokens.has(normalizeSceneToken(alias)), + ); +} + export function CharacterMention({ characters, skills = [], @@ -387,6 +493,10 @@ export function CharacterMention({ textAfterCursor; onChange(newValue); setShowMentions(false); + recordSlashEntryUsage({ + kind: "skill", + entryId: skill.key, + }); setTimeout(() => { textarea.focus(); @@ -438,7 +548,10 @@ export function CharacterMention({ }); }; - const handleSelectBuiltinCommand = (command: BuiltinInputCommand) => { + const handleSelectBuiltinCommand = ( + command: BuiltinInputCommand, + options?: BuiltinCommandSelectionOptions, + ) => { const textarea = inputRef.current; if (!textarea) return; @@ -450,32 +563,59 @@ export function CharacterMention({ return; } + const leadingText = currentValue.slice(0, activeTrigger.triggerIndex); + const replayText = normalizeReplayText(options?.replayText); + if (onSelectBuiltinCommand) { - const newValue = - currentValue.slice(0, activeTrigger.triggerIndex) + textAfterCursor; - onChange(newValue.trimEnd() === "" ? "" : newValue); + const nextSelection = replayText + ? mergeTriggerSelectionText({ + leadingText, + insertedText: replayText, + trailingText: textAfterCursor, + }) + : { + value: `${leadingText}${textAfterCursor}`, + cursorPos: Math.max(0, activeTrigger.triggerIndex), + }; + const normalizedValue = + nextSelection.value.trimEnd() === "" ? "" : nextSelection.value; + + onChange(normalizedValue); setShowMentions(false); - onSelectBuiltinCommand(command); + if (options?.replayText) { + onSelectBuiltinCommand(command, options); + } else { + onSelectBuiltinCommand(command); + } setTimeout(() => { textarea.focus(); - const newCursorPos = Math.max(0, activeTrigger.triggerIndex); + const newCursorPos = Math.min( + nextSelection.cursorPos, + normalizedValue.length, + ); textarea.setSelectionRange(newCursorPos, newCursorPos); }, 0); return; } - const newValue = - currentValue.slice(0, activeTrigger.triggerIndex) + - `${command.commandPrefix} ` + - textAfterCursor; - onChange(newValue); + const nextSelection = replayText + ? mergeTriggerSelectionText({ + leadingText, + insertedText: `${command.commandPrefix} ${replayText}`, + trailingText: textAfterCursor, + }) + : { + value: `${leadingText}${command.commandPrefix} ${textAfterCursor}`, + cursorPos: activeTrigger.triggerIndex + command.commandPrefix.length + 1, + }; + + onChange(nextSelection.value); setShowMentions(false); setTimeout(() => { textarea.focus(); - const newCursorPos = - activeTrigger.triggerIndex + command.commandPrefix.length + 1; + const newCursorPos = nextSelection.cursorPos; textarea.setSelectionRange(newCursorPos, newCursorPos); }, 0); }; @@ -540,6 +680,12 @@ export function CharacterMention({ onChange(newValue); setShowMentions(false); + if (command.support === "supported") { + recordSlashEntryUsage({ + kind: "command", + entryId: command.key, + }); + } setTimeout(() => { textarea.focus(); @@ -549,9 +695,40 @@ export function CharacterMention({ }, 0); }; - const handleSelectRuntimeSceneCommand = ( + const handleSelectRuntimeSceneCommand = async ( command: RuntimeSceneSlashCommand, ) => { + if (onSelectServiceSkill) { + const matchedVisibleSkill = serviceSkills.find((skill) => + matchesSceneBoundServiceSkill(skill, command), + ); + const matchedSkill = + matchedVisibleSkill || + (await (async () => { + try { + const runtimeSkills = await listServiceSkills(); + const runtimeMatchedSkill = runtimeSkills.find((skill) => + matchesSceneBoundServiceSkill(skill, command), + ); + return runtimeMatchedSkill + ? toServiceSkillHomeItem(runtimeMatchedSkill) + : null; + } catch { + return null; + } + })()); + + if (matchedSkill && matchedSkill.slotSchema.some((slot) => slot.required)) { + onSelectServiceSkill(matchedSkill); + setShowMentions(false); + recordSlashEntryUsage({ + kind: "scene", + entryId: command.key, + }); + return; + } + } + const textarea = inputRef.current; if (!textarea) return; @@ -570,6 +747,10 @@ export function CharacterMention({ onChange(newValue); setShowMentions(false); + recordSlashEntryUsage({ + kind: "scene", + entryId: command.key, + }); setTimeout(() => { textarea.focus(); diff --git a/src/components/agent/chat/skill-selection/CharacterMentionPanel.tsx b/src/components/agent/chat/skill-selection/CharacterMentionPanel.tsx index 570d7c56b..da56b15fe 100644 --- a/src/components/agent/chat/skill-selection/CharacterMentionPanel.tsx +++ b/src/components/agent/chat/skill-selection/CharacterMentionPanel.tsx @@ -22,6 +22,15 @@ import type { BuiltinInputCommand, RuntimeSceneSlashCommand, } from "./builtinCommands"; +import { + getMentionEntryUsageMap, + getMentionEntryUsageRecordKey, +} from "./mentionEntryUsage"; +import { + getSlashEntryUsageMap, + getSlashEntryUsageRecordKey, + type SlashEntryUsageKind, +} from "./slashEntryUsage"; interface MentionServiceSkillGroup { key: string; @@ -30,6 +39,92 @@ interface MentionServiceSkillGroup { skills: ServiceSkillHomeItem[]; } +interface RecentSlashEntry { + key: string; + kind: SlashEntryUsageKind; + kindLabel: string; + commandPrefix: string; + title: string; + description: string; + usedAt: number; +} + +interface RecentMentionEntry { + key: string; + kind: "builtin_command" | "service_skill"; + kindLabel: string; + title: string; + description: string; + usedAt: number; + replayText?: string; + commandKey?: string; + commandPrefix?: string; + skillId?: string; +} + +const FEATURED_SERVICE_SKILL_LIMIT = 4; +const RECENT_REPLAY_TEXT_PREVIEW_LIMIT = 48; + +function compareRecentServiceSkills( + left: ServiceSkillHomeItem, + right: ServiceSkillHomeItem, +): number { + const leftUsedAt = left.recentUsedAt ?? 0; + const rightUsedAt = right.recentUsedAt ?? 0; + if (leftUsedAt !== rightUsedAt) { + return rightUsedAt - leftUsedAt; + } + return left.title.localeCompare(right.title, "zh-CN"); +} + +function compareRecentSlashEntries( + left: RecentSlashEntry, + right: RecentSlashEntry, +): number { + if (left.usedAt !== right.usedAt) { + return right.usedAt - left.usedAt; + } + return left.commandPrefix.localeCompare(right.commandPrefix, "zh-CN"); +} + +function compareRecentMentionEntries( + left: RecentMentionEntry, + right: RecentMentionEntry, +): number { + if (left.usedAt !== right.usedAt) { + return right.usedAt - left.usedAt; + } + return left.title.localeCompare(right.title, "zh-CN"); +} + +function resolveRecentBuiltinCommandDescription( + command: BuiltinInputCommand, + replayText?: string, +): string { + const normalizedReplayText = replayText?.replace(/\s+/g, " ").trim(); + if (normalizedReplayText) { + const preview = + normalizedReplayText.length <= RECENT_REPLAY_TEXT_PREVIEW_LIMIT + ? normalizedReplayText + : `${normalizedReplayText + .slice(0, RECENT_REPLAY_TEXT_PREVIEW_LIMIT) + .trimEnd()}...`; + return `上次输入:${preview}`; + } + + if (command.description?.trim()) { + return `${command.label} · ${command.description}`; + } + return command.label; +} + +function resolveRecentSlashSkillDescription(skill: Skill): string { + if (skill.description?.trim()) { + return `${skill.name} · ${skill.description}`; + } + return skill.name; +} + const SERVICE_SKILL_GROUP_META: Record< string, { title: string; sort: number } @@ -98,7 +193,10 @@ interface CharacterMentionPanelProps { availableSkills: Skill[]; commandRef: React.RefObject; onQueryChange: (query: string) => void; - onSelectBuiltinCommand: (command: BuiltinInputCommand) => void; + onSelectBuiltinCommand: ( + command: BuiltinInputCommand, + options?: { replayText?: string }, + ) => void; onSelectServiceSkill: (skill: ServiceSkillHomeItem) => void; onSelectSlashCommand: (command: CodexSlashCommandDefinition) => void; onSelectSceneCommand: (command: RuntimeSceneSlashCommand) => void; @@ -129,22 +227,271 @@ export const CharacterMentionPanel: React.FC = ({ onSelectAvailableSkill, onNavigateToSettings, }) => { - const visibleBuiltinCommands = mode === "mention" ? builtinCommands : []; - const visibleServiceSkillGroups = React.useMemo( + const isEmptyQuery = mentionQuery.trim().length === 0; + const allSupportedSlashCommands = React.useMemo( () => - mode === "mention" ? groupMentionServiceSkills(mentionServiceSkills) : [], - [mentionServiceSkills, mode], + mode === "slash" + ? slashCommands.filter((command) => command.support === "supported") + : [], + [mode, slashCommands], ); + const visibleRecentSlashEntries = React.useMemo(() => { + if (mode !== "slash" || !isEmptyQuery) { + return []; + } + + const usageMap = getSlashEntryUsageMap(); + const recentEntries: RecentSlashEntry[] = []; + + for (const command of allSupportedSlashCommands) { + const recentRecord = usageMap.get( + getSlashEntryUsageRecordKey("command", command.key), + ); + if (!recentRecord) { + continue; + } + + recentEntries.push({ + key: `command:${command.key}`, + kind: "command", + kindLabel: "快捷操作", + commandPrefix: command.commandPrefix, + title: command.label, + description: command.description, + usedAt: recentRecord.usedAt, + }); + } + + for (const command of sceneCommands) { + const recentRecord = usageMap.get( + getSlashEntryUsageRecordKey("scene", command.key), + ); + if (!recentRecord) { + continue; + } + + recentEntries.push({ + key: `scene:${command.key}`, + kind: "scene", + kindLabel: "场景", + commandPrefix: command.commandPrefix, + title: command.label, + description: command.description, + usedAt: recentRecord.usedAt, + }); + } + + for (const skill of installedSkills) { + const recentRecord = usageMap.get( + getSlashEntryUsageRecordKey("skill", skill.key), + ); + if (!recentRecord) { + continue; + } + + recentEntries.push({ + key: `skill:${skill.key}`, + kind: "skill", + kindLabel: "技能", + commandPrefix: `/${skill.key}`, + title: skill.name, + description: resolveRecentSlashSkillDescription(skill), + usedAt: recentRecord.usedAt, + }); + } + + return recentEntries.sort(compareRecentSlashEntries); + }, [allSupportedSlashCommands, installedSkills, isEmptyQuery, mode, sceneCommands]); + const recentSlashCommandKeys = React.useMemo( + () => + new Set( + visibleRecentSlashEntries + .filter((entry) => entry.kind === "command") + .map((entry) => entry.commandPrefix), + ), + [visibleRecentSlashEntries], + ); + const recentSlashSceneKeys = React.useMemo( + () => + new Set( + visibleRecentSlashEntries + .filter((entry) => entry.kind === "scene") + .map((entry) => entry.commandPrefix), + ), + [visibleRecentSlashEntries], + ); + const recentSlashSkillKeys = React.useMemo( + () => + new Set( + visibleRecentSlashEntries + .filter((entry) => entry.kind === "skill") + .map((entry) => entry.commandPrefix), + ), + [visibleRecentSlashEntries], + ); + const visibleSupportedSlashCommands = React.useMemo( + () => + allSupportedSlashCommands.filter( + (command) => !recentSlashCommandKeys.has(command.commandPrefix), + ), + [allSupportedSlashCommands, recentSlashCommandKeys], + ); + const visibleUnsupportedSlashCommands = React.useMemo( + () => + mode === "slash" && !isEmptyQuery + ? slashCommands.filter((command) => command.support === "unsupported") + : [], + [isEmptyQuery, mode, slashCommands], + ); + const visibleRecentServiceSkills = React.useMemo(() => { + if (mode !== "mention" || !isEmptyQuery) { + return []; + } + + return mentionServiceSkills + .filter((skill) => skill.isRecent && skill.recentUsedAt) + .sort(compareRecentServiceSkills); + }, [isEmptyQuery, mentionServiceSkills, mode]); + const visibleRecentMentionEntries = React.useMemo(() => { + if (mode !== "mention" || !isEmptyQuery) { + return []; + } + + const usageMap = getMentionEntryUsageMap(); + const recentEntries: RecentMentionEntry[] = []; + + for (const command of builtinCommands) { + const recentRecord = usageMap.get( + getMentionEntryUsageRecordKey("builtin_command", command.key), + ); + if (!recentRecord) { + continue; + } + + recentEntries.push({ + key: `builtin-command:${command.key}`, + kind: "builtin_command", + kindLabel: "命令", + title: command.commandPrefix, + description: resolveRecentBuiltinCommandDescription( + command, + recentRecord.replayText, + ), + usedAt: recentRecord.usedAt, + replayText: recentRecord.replayText, + commandKey: command.key, + commandPrefix: command.commandPrefix, + }); + } + + for (const skill of visibleRecentServiceSkills) { + if (!skill.recentUsedAt) { + continue; + } + + recentEntries.push({ + key: `service-skill:${skill.id}`, + kind: "service_skill", + kindLabel: "技能", + title: skill.title, + description: resolveServiceSkillEntryDescription(skill), + usedAt: skill.recentUsedAt, + skillId: skill.id, + }); + } + + return recentEntries.sort(compareRecentMentionEntries); + }, [ + builtinCommands, + isEmptyQuery, + mode, + visibleRecentServiceSkills, + ]); + const recentMentionCommandKeys = React.useMemo( + () => + new Set( + visibleRecentMentionEntries + .filter((entry) => entry.kind === "builtin_command") + .map((entry) => entry.commandKey) + .filter((entry): entry is string => Boolean(entry)), + ), + [visibleRecentMentionEntries], + ); + const visibleBuiltinCommands = React.useMemo(() => { + if (mode !== "mention") { + return []; + } + + if (!isEmptyQuery) { + return builtinCommands; + } + + return builtinCommands.filter((command) => !recentMentionCommandKeys.has(command.key)); + }, [builtinCommands, isEmptyQuery, mode, recentMentionCommandKeys]); + const visibleFeaturedServiceSkills = React.useMemo(() => { + if (mode !== "mention" || !isEmptyQuery) { + return []; + } + + const recentSkillIds = new Set( + visibleRecentServiceSkills.map((skill) => skill.id), + ); + + return mentionServiceSkills + .filter((skill) => !recentSkillIds.has(skill.id)) + .slice(0, FEATURED_SERVICE_SKILL_LIMIT); + }, [isEmptyQuery, mentionServiceSkills, mode, visibleRecentServiceSkills]); + const visibleServiceSkillGroups = React.useMemo(() => { + if (mode !== "mention") { + return []; + } + + const excludedSkillIds = new Set( + visibleRecentServiceSkills.map((skill) => skill.id), + ); + for (const skill of visibleFeaturedServiceSkills) { + excludedSkillIds.add(skill.id); + } + + return groupMentionServiceSkills( + mentionServiceSkills.filter((skill) => !excludedSkillIds.has(skill.id)), + ); + }, [ + mentionServiceSkills, + mode, + visibleFeaturedServiceSkills, + visibleRecentServiceSkills, + ]); const visibleCharacters = mode === "mention" ? filteredCharacters : []; - const visibleSlashCommands = mode === "slash" ? slashCommands : []; - const visibleSceneCommands = mode === "slash" ? sceneCommands : []; + const visibleSceneCommands = React.useMemo( + () => + mode === "slash" + ? sceneCommands.filter( + (command) => !recentSlashSceneKeys.has(command.commandPrefix), + ) + : [], + [mode, recentSlashSceneKeys, sceneCommands], + ); + const visibleInstalledSkills = React.useMemo(() => { + if (mode !== "slash" || !isEmptyQuery) { + return installedSkills; + } + + return installedSkills.filter( + (skill) => !recentSlashSkillKeys.has(`/${skill.key}`), + ); + }, [installedSkills, isEmptyQuery, mode, recentSlashSkillKeys]); const hasFilteredResults = - visibleSlashCommands.length > 0 || + visibleRecentSlashEntries.length > 0 || + visibleSupportedSlashCommands.length > 0 || + visibleUnsupportedSlashCommands.length > 0 || visibleSceneCommands.length > 0 || + visibleRecentMentionEntries.length > 0 || visibleBuiltinCommands.length > 0 || + visibleFeaturedServiceSkills.length > 0 || visibleServiceSkillGroups.length > 0 || visibleCharacters.length > 0 || - installedSkills.length > 0 || + visibleInstalledSkills.length > 0 || availableSkills.length > 0; return ( @@ -174,9 +521,142 @@ export const CharacterMentionPanel: React.FC = ({ ) : null}
    ) : null} - {visibleSlashCommands.length > 0 ? ( - - {visibleSlashCommands.map((command) => ( + {visibleRecentMentionEntries.length > 0 ? ( + + {visibleRecentMentionEntries.map((entry) => { + if (entry.kind === "builtin_command") { + return ( + { + const command = builtinCommands.find( + (item) => item.key === entry.commandKey, + ); + if (command) { + if (entry.replayText) { + onSelectBuiltinCommand(command, { + replayText: entry.replayText, + }); + } else { + onSelectBuiltinCommand(command); + } + } + }} + className="cursor-pointer" + > + +
    +
    +
    {entry.commandPrefix}
    + + {entry.kindLabel} + +
    +
    + {entry.description} +
    +
    +
    + ); + } + + return ( + { + const skill = mentionServiceSkills.find( + (item) => item.id === entry.skillId, + ); + if (skill) { + onSelectServiceSkill(skill); + } + }} + className="cursor-pointer" + > + +
    +
    +
    {entry.title}
    + + {entry.kindLabel} + +
    +
    + {entry.description} +
    +
    +
    + ); + })} +
    + ) : null} + {visibleRecentSlashEntries.length > 0 ? ( + + {visibleRecentSlashEntries.map((entry) => { + const iconClassName = + entry.kind === "command" + ? "mr-2 h-4 w-4 text-emerald-600" + : entry.kind === "scene" + ? "mr-2 h-4 w-4 text-sky-600" + : "mr-2 h-4 w-4 text-primary"; + + return ( + { + if (entry.kind === "command") { + const command = allSupportedSlashCommands.find( + (item) => item.commandPrefix === entry.commandPrefix, + ); + if (command) { + onSelectSlashCommand(command); + } + return; + } + + if (entry.kind === "scene") { + const sceneCommand = sceneCommands.find( + (item) => item.commandPrefix === entry.commandPrefix, + ); + if (sceneCommand) { + onSelectSceneCommand(sceneCommand); + } + return; + } + + const skill = installedSkills.find( + (item) => `/${item.key}` === entry.commandPrefix, + ); + if (skill) { + onSelectInstalledSkill(skill); + } + }} + className="cursor-pointer" + > + {entry.kind === "command" ? ( + + ) : ( + + )} +
    +
    +
    {entry.commandPrefix}
    + + {entry.kindLabel} + +
    +
    + {entry.description} +
    +
    +
    + ); + })} +
    + ) : null} + {visibleSupportedSlashCommands.length > 0 ? ( + + {visibleSupportedSlashCommands.map((command) => ( onSelectSlashCommand(command)} @@ -200,6 +680,30 @@ export const CharacterMentionPanel: React.FC = ({ ))} ) : null} + {visibleUnsupportedSlashCommands.length > 0 ? ( + + {visibleUnsupportedSlashCommands.map((command) => ( + onSelectSlashCommand(command)} + className="cursor-pointer" + > + +
    +
    + {command.commandPrefix} + + 暂未支持 + +
    +
    + {command.description} +
    +
    +
    + ))} +
    + ) : null} {visibleSceneCommands.length > 0 ? ( {visibleSceneCommands.map((command) => ( @@ -238,6 +742,25 @@ export const CharacterMentionPanel: React.FC = ({ ))} ) : null} + {visibleFeaturedServiceSkills.length > 0 ? ( + + {visibleFeaturedServiceSkills.map((skill) => ( + onSelectServiceSkill(skill)} + className="cursor-pointer" + > + +
    +
    {skill.title}
    +
    + {resolveServiceSkillEntryDescription(skill)} +
    +
    +
    + ))} +
    + ) : null} {visibleServiceSkillGroups.map((group) => ( {group.skills.map((skill) => ( @@ -283,9 +806,9 @@ export const CharacterMentionPanel: React.FC = ({ ))} ) : null} - {installedSkills.length > 0 ? ( + {visibleInstalledSkills.length > 0 ? ( - {installedSkills.map((skill) => ( + {visibleInstalledSkills.map((skill) => ( onSelectInstalledSkill(skill)} diff --git a/src/components/agent/chat/skill-selection/mentionEntryUsage.ts b/src/components/agent/chat/skill-selection/mentionEntryUsage.ts new file mode 100644 index 000000000..dd3b1c787 --- /dev/null +++ b/src/components/agent/chat/skill-selection/mentionEntryUsage.ts @@ -0,0 +1,125 @@ +export type MentionEntryUsageKind = "builtin_command"; + +export interface MentionEntryUsageRecord { + kind: MentionEntryUsageKind; + entryId: string; + usedAt: number; + replayText?: string; +} + +export interface RecordMentionEntryUsageInput { + kind: MentionEntryUsageKind; + entryId: string; + usedAt?: number; + replayText?: string; +} + +const MENTION_ENTRY_USAGE_STORAGE_KEY = "lime:mention-entry-usage:v1"; +const MAX_MENTION_ENTRY_USAGE_RECORDS = 12; +const MAX_MENTION_ENTRY_REPLAY_TEXT_LENGTH = 400; + +export function getMentionEntryUsageRecordKey( + kind: MentionEntryUsageKind, + entryId: string, +): string { + return `${kind}:${entryId}`; +} + +function isValidMentionEntryUsageRecord( + value: unknown, +): value is MentionEntryUsageRecord { + if (!value || typeof value !== "object") { + return false; + } + + const record = value as Partial; + return ( + record.kind === "builtin_command" && + typeof record.entryId === "string" && + record.entryId.length > 0 && + typeof record.usedAt === "number" && + Number.isFinite(record.usedAt) && + (record.replayText === undefined || typeof record.replayText === "string") + ); +} + +function normalizeMentionEntryReplayText( + value: string | undefined, +): string | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + + return trimmed.slice(0, MAX_MENTION_ENTRY_REPLAY_TEXT_LENGTH).trim(); +} + +export function listMentionEntryUsage(): MentionEntryUsageRecord[] { + if (typeof window === "undefined") { + return []; + } + + try { + const raw = window.localStorage.getItem(MENTION_ENTRY_USAGE_STORAGE_KEY); + if (!raw) { + return []; + } + + const parsed = JSON.parse(raw); + if (!Array.isArray(parsed)) { + return []; + } + + return parsed + .filter(isValidMentionEntryUsageRecord) + .sort((left, right) => right.usedAt - left.usedAt) + .slice(0, MAX_MENTION_ENTRY_USAGE_RECORDS); + } catch { + return []; + } +} + +export function getMentionEntryUsageMap(): Map { + return new Map( + listMentionEntryUsage().map((record) => [ + getMentionEntryUsageRecordKey(record.kind, record.entryId), + record, + ]), + ); +} + +export function recordMentionEntryUsage( + input: RecordMentionEntryUsageInput, +): MentionEntryUsageRecord[] { + const nextRecord: MentionEntryUsageRecord = { + kind: input.kind, + entryId: input.entryId, + usedAt: input.usedAt ?? Date.now(), + replayText: normalizeMentionEntryReplayText(input.replayText), + }; + + const nextRecords = [ + nextRecord, + ...listMentionEntryUsage().filter( + (record) => + !( + record.kind === nextRecord.kind && record.entryId === nextRecord.entryId + ), + ), + ].slice(0, MAX_MENTION_ENTRY_USAGE_RECORDS); + + if (typeof window === "undefined") { + return nextRecords; + } + + try { + window.localStorage.setItem( + MENTION_ENTRY_USAGE_STORAGE_KEY, + JSON.stringify(nextRecords), + ); + } catch { + // ignore write errors + } + + return nextRecords; +} diff --git a/src/components/agent/chat/skill-selection/slashEntryUsage.ts b/src/components/agent/chat/skill-selection/slashEntryUsage.ts new file mode 100644 index 000000000..3f99a64c8 --- /dev/null +++ b/src/components/agent/chat/skill-selection/slashEntryUsage.ts @@ -0,0 +1,111 @@ +export type SlashEntryUsageKind = "command" | "scene" | "skill"; + +export interface SlashEntryUsageRecord { + kind: SlashEntryUsageKind; + entryId: string; + usedAt: number; +} + +export interface RecordSlashEntryUsageInput { + kind: SlashEntryUsageKind; + entryId: string; + usedAt?: number; +} + +const SLASH_ENTRY_USAGE_STORAGE_KEY = "lime:slash-entry-usage:v1"; +const MAX_SLASH_ENTRY_USAGE_RECORDS = 12; + +export function getSlashEntryUsageRecordKey( + kind: SlashEntryUsageKind, + entryId: string, +): string { + return `${kind}:${entryId}`; +} + +function isValidSlashEntryUsageRecord( + value: unknown, +): value is SlashEntryUsageRecord { + if (!value || typeof value !== "object") { + return false; + } + + const record = value as Partial; + return ( + (record.kind === "command" || + record.kind === "scene" || + record.kind === "skill") && + typeof record.entryId === "string" && + record.entryId.length > 0 && + typeof record.usedAt === "number" && + Number.isFinite(record.usedAt) + ); +} + +export function listSlashEntryUsage(): SlashEntryUsageRecord[] { + if (typeof window === "undefined") { + return []; + } + + try { + const raw = window.localStorage.getItem(SLASH_ENTRY_USAGE_STORAGE_KEY); + if (!raw) { + return []; + } + + const parsed = JSON.parse(raw); + if (!Array.isArray(parsed)) { + return []; + } + + return parsed + .filter(isValidSlashEntryUsageRecord) + .sort((left, right) => right.usedAt - left.usedAt) + .slice(0, MAX_SLASH_ENTRY_USAGE_RECORDS); + } catch { + return []; + } +} + +export function getSlashEntryUsageMap(): Map { + return new Map( + listSlashEntryUsage().map((record) => [ + getSlashEntryUsageRecordKey(record.kind, record.entryId), + record, + ]), + ); +} + +export function recordSlashEntryUsage( + input: RecordSlashEntryUsageInput, +): SlashEntryUsageRecord[] { + const nextRecord: SlashEntryUsageRecord = { + kind: input.kind, + entryId: input.entryId, + usedAt: input.usedAt ?? Date.now(), + }; + + const nextRecords = [ + nextRecord, + ...listSlashEntryUsage().filter( + (record) => + !( + record.kind === nextRecord.kind && record.entryId === nextRecord.entryId + ), + ), + ].slice(0, MAX_SLASH_ENTRY_USAGE_RECORDS); + + if (typeof window === "undefined") { + return nextRecords; + } + + try { + window.localStorage.setItem( + SLASH_ENTRY_USAGE_STORAGE_KEY, + JSON.stringify(nextRecords), + ); + } catch { + // ignore write errors + } + + return nextRecords; +} diff --git a/src/components/agent/chat/utils/agentRuntimeErrorPresentation.test.ts b/src/components/agent/chat/utils/agentRuntimeErrorPresentation.test.ts new file mode 100644 index 000000000..0ea12b9ec --- /dev/null +++ b/src/components/agent/chat/utils/agentRuntimeErrorPresentation.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from "vitest"; + +import { resolveAgentRuntimeErrorPresentation } from "./agentRuntimeErrorPresentation"; + +describe("agentRuntimeErrorPresentation", () => { + it("普通错误应保留原始文案", () => { + expect(resolveAgentRuntimeErrorPresentation("模型执行失败")).toEqual({ + displayMessage: "模型执行失败", + toastMessage: "响应错误: 模型执行失败", + }); + }); + + it("鉴权失效错误应转换为友好提示", () => { + expect( + resolveAgentRuntimeErrorPresentation( + "Request failed: 401 unauthorized, token expired", + ), + ).toEqual({ + displayMessage: + "当前 Provider 鉴权已失效,请前往设置检查登录态、API Key 或重新授权后重试。", + toastMessage: + "当前 Provider 鉴权已失效,请前往设置检查登录态、API Key 或重新授权后重试。", + }); + }); + + it("SendMessage schema 错误应转换为登录态失效提示", () => { + expect( + resolveAgentRuntimeErrorPresentation( + "Agent provider execution failed: Request failed: Bad request (400): Invalid schema for function 'SendMessage': In context=('properties', 'message', 'oneOf', '2'), array schema missing items", + ), + ).toEqual({ + displayMessage: + "当前 Provider 登录态已失效,常见原因是 Token 已过期。请前往设置重新登录或刷新凭证后重试。", + toastMessage: + "当前 Provider 登录态已失效,常见原因是 Token 已过期。请前往设置重新登录或刷新凭证后重试。", + }); + }); +}); diff --git a/src/components/agent/chat/utils/agentRuntimeErrorPresentation.ts b/src/components/agent/chat/utils/agentRuntimeErrorPresentation.ts new file mode 100644 index 000000000..8fe1a3ca7 --- /dev/null +++ b/src/components/agent/chat/utils/agentRuntimeErrorPresentation.ts @@ -0,0 +1,101 @@ +const DEFAULT_RUNTIME_ERROR_MESSAGE = "执行链路返回失败,请查看详情后重试。"; + +const PROVIDER_AUTH_ERROR_MESSAGE = + "当前 Provider 鉴权已失效,请前往设置检查登录态、API Key 或重新授权后重试。"; + +const PROVIDER_SESSION_EXPIRED_ERROR_MESSAGE = + "当前 Provider 登录态已失效,常见原因是 Token 已过期。请前往设置重新登录或刷新凭证后重试。"; + +const PROVIDER_CHANNEL_ERROR_MESSAGE = + "当前模型通道暂不可用,常见原因是登录态 / Token 已过期或渠道异常。请先刷新凭证,必要时切换模型后重试。"; + +function normalizeRuntimeErrorMessage(errorMessage: string): string { + const normalized = errorMessage.trim(); + return normalized || DEFAULT_RUNTIME_ERROR_MESSAGE; +} + +function looksLikeHttpStatus(message: string, status: "401" | "403"): boolean { + return new RegExp(`(^|\\D)${status}(\\D|$)`).test(message); +} + +function includesAny(message: string, candidates: readonly string[]): boolean { + return candidates.some((candidate) => message.includes(candidate)); +} + +function isLikelyProviderAuthError(message: string): boolean { + return ( + looksLikeHttpStatus(message, "401") || + looksLikeHttpStatus(message, "403") || + includesAny(message, [ + "unauthorized", + "forbidden", + "authentication failed", + "auth failed", + "authorization expired", + "credential expired", + "invalid api key", + "api key not valid", + "bad credentials", + "no access token", + "refresh token", + "session expired", + "token expired", + "login expired", + "reauth", + "凭证已过期", + "授权已过期", + "鉴权未通过", + "鉴权失败", + "认证失败", + "权限不足", + "token 过期", + "需要重新登录", + "请重新登录", + ]) + ); +} + +function isLikelyProviderSessionExpiredError(message: string): boolean { + return ( + message.includes("invalid schema for function 'sendmessage'") && + message.includes("array schema missing items") + ); +} + +function isLikelyProviderChannelError(message: string): boolean { + return message.includes("no available channel for model"); +} + +export function resolveAgentRuntimeErrorPresentation(errorMessage: string): { + displayMessage: string; + toastMessage: string; +} { + const normalizedMessage = normalizeRuntimeErrorMessage(errorMessage); + const lowerMessage = normalizedMessage.toLowerCase(); + + if (isLikelyProviderSessionExpiredError(lowerMessage)) { + return { + displayMessage: PROVIDER_SESSION_EXPIRED_ERROR_MESSAGE, + toastMessage: PROVIDER_SESSION_EXPIRED_ERROR_MESSAGE, + }; + } + + if (isLikelyProviderChannelError(lowerMessage)) { + return { + displayMessage: PROVIDER_CHANNEL_ERROR_MESSAGE, + toastMessage: PROVIDER_CHANNEL_ERROR_MESSAGE, + }; + } + + if (isLikelyProviderAuthError(lowerMessage)) { + return { + displayMessage: PROVIDER_AUTH_ERROR_MESSAGE, + toastMessage: PROVIDER_AUTH_ERROR_MESSAGE, + }; + } + + return { + displayMessage: normalizedMessage, + toastMessage: `响应错误: ${normalizedMessage}`, + }; +} diff --git a/src/components/agent/chat/utils/agentRuntimeStatus.ts b/src/components/agent/chat/utils/agentRuntimeStatus.ts index d7515be4a..420ba1f1c 100644 --- a/src/components/agent/chat/utils/agentRuntimeStatus.ts +++ b/src/components/agent/chat/utils/agentRuntimeStatus.ts @@ -1,6 +1,7 @@ import type { AsterExecutionStrategy } from "@/lib/api/agentRuntime"; import type { AgentContextTraceStep as ContextTraceStep } from "@/lib/api/agentProtocol"; import type { AgentRuntimeStatus } from "../types"; +import { resolveAgentRuntimeErrorPresentation } from "./agentRuntimeErrorPresentation"; function buildExecutionLabel(strategy: AsterExecutionStrategy): string { switch (strategy) { @@ -16,8 +17,7 @@ function buildExecutionLabel(strategy: AsterExecutionStrategy): string { } function normalizeRuntimeErrorDetail(errorMessage: string): string { - const detail = errorMessage.trim(); - return detail || "执行链路返回失败,请查看详情后重试。"; + return resolveAgentRuntimeErrorPresentation(errorMessage).displayMessage; } export function buildInitialAgentRuntimeStatus(options: { diff --git a/src/components/agent/chat/utils/codeWorkbenchCommand.test.ts b/src/components/agent/chat/utils/codeWorkbenchCommand.test.ts new file mode 100644 index 000000000..0cae01596 --- /dev/null +++ b/src/components/agent/chat/utils/codeWorkbenchCommand.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from "vitest"; +import { parseCodeWorkbenchCommand } from "./codeWorkbenchCommand"; + +describe("parseCodeWorkbenchCommand", () => { + it("应解析带显式任务类型的 @代码 命令", () => { + const result = parseCodeWorkbenchCommand( + "@代码 类型:重构 重构聊天区时间线组件,合并重复状态分支并补测试", + ); + + expect(result).toMatchObject({ + trigger: "@代码", + taskType: "refactor", + prompt: "重构聊天区时间线组件,合并重复状态分支并补测试", + }); + }); + + it("应兼容英文触发并识别 code review 意图", () => { + const result = parseCodeWorkbenchCommand( + "@code review src/components/agent/chat/workspace/useWorkspaceSendActions.ts 的发送边界", + ); + + expect(result).toMatchObject({ + trigger: "@code", + taskType: "code_review", + prompt: + "src/components/agent/chat/workspace/useWorkspaceSendActions.ts 的发送边界", + }); + }); + + it("未显式声明类型时也应从正文推断 bug fix 意图", () => { + const result = parseCodeWorkbenchCommand( + "@开发 帮我修复消息历史切换后图片卡片丢失的问题", + ); + + expect(result).toMatchObject({ + trigger: "@开发", + taskType: "bug_fix", + prompt: "帮我修复消息历史切换后图片卡片丢失的问题", + }); + }); + + it("非代码命令应返回空", () => { + expect(parseCodeWorkbenchCommand("@表单 帮我做一个报名表")).toBeNull(); + }); +}); diff --git a/src/components/agent/chat/utils/codeWorkbenchCommand.ts b/src/components/agent/chat/utils/codeWorkbenchCommand.ts new file mode 100644 index 000000000..503af04d6 --- /dev/null +++ b/src/components/agent/chat/utils/codeWorkbenchCommand.ts @@ -0,0 +1,168 @@ +export type CodeWorkbenchCommandTrigger = + | "@代码" + | "@code" + | "@coding" + | "@开发"; + +export type CodeWorkbenchTaskType = + | "code_review" + | "bug_fix" + | "implementation" + | "refactor" + | "explain"; + +export interface ParsedCodeWorkbenchCommand { + rawText: string; + trigger: CodeWorkbenchCommandTrigger; + body: string; + prompt: string; + taskType?: CodeWorkbenchTaskType; +} + +const CODE_COMMAND_PREFIX_REGEX = + /^\s*(@代码|@code|@coding|@开发)(?:\s+|$)([\s\S]*)$/i; +const EXPLICIT_TASK_TYPE_REGEX = + /(?:类型|任务|任务类型|type|task|kind|模式|mode)\s*[::=]?\s*(代码评审|代码审查|code(?:\s+review)?|review|修复|修\s*bug|bug(?:\s+fix)?|fix(?:\s+bug)?|debug|实现|开发|implementation|implement|build|重构|refactor|解释|讲解|说明|分析代码|explain)(?=$|[\s,,。;;::])/i; +const LEADING_TASK_TYPE_REGEX = + /^(代码评审|代码审查|code(?:\s+review)?|review|修复|修\s*bug|bug(?:\s+fix)?|fix(?:\s+bug)?|debug|实现|开发|implementation|implement|build|重构|refactor|解释|讲解|说明|分析代码|explain)(?=$|[\s,,。;;::])/i; + +function trimDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+|[,\s,。;;::]+$/g, "").trim(); +} + +function normalizeTrigger(value: string): CodeWorkbenchCommandTrigger { + const normalized = value.trim().toLowerCase(); + if (normalized === "@code") { + return "@code"; + } + if (normalized === "@coding") { + return "@coding"; + } + if (normalized === "@开发") { + return "@开发"; + } + return "@代码"; +} + +function normalizeTaskType( + value: string | undefined, +): CodeWorkbenchTaskType | undefined { + const normalized = value?.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + + if ( + normalized === "代码评审" || + normalized === "代码审查" || + normalized === "code review" || + normalized === "code" || + normalized === "review" + ) { + return "code_review"; + } + if ( + normalized === "修复" || + normalized === "修 bug" || + normalized === "修bug" || + normalized === "bug fix" || + normalized === "bug" || + normalized === "fix bug" || + normalized === "debug" + ) { + return "bug_fix"; + } + if ( + normalized === "实现" || + normalized === "开发" || + normalized === "implementation" || + normalized === "implement" || + normalized === "build" + ) { + return "implementation"; + } + if (normalized === "重构" || normalized === "refactor") { + return "refactor"; + } + if ( + normalized === "解释" || + normalized === "讲解" || + normalized === "说明" || + normalized === "分析代码" || + normalized === "explain" + ) { + return "explain"; + } + return undefined; +} + +function inferTaskType(body: string): CodeWorkbenchTaskType | undefined { + const normalized = body.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + + if ( + /(?:代码评审|代码审查|code\s+review|\breview\b)/i.test(normalized) + ) { + return "code_review"; + } + if (/(?:修复|修\s*bug|bug\s+fix|fix\s+bug|\bdebug\b|\bbug\b)/i.test(normalized)) { + return "bug_fix"; + } + if (/(?:重构|\brefactor\b)/i.test(normalized)) { + return "refactor"; + } + if (/(?:解释|讲解|说明|分析代码|\bexplain\b)/i.test(normalized)) { + return "explain"; + } + if ( + /(?:实现|开发|\bimplementation\b|\bimplement\b|\bbuild\b)/i.test( + normalized, + ) + ) { + return "implementation"; + } + return undefined; +} + +function stripPromptDecorations(body: string, leadingTaskType?: string): string { + const leadingTaskTypeRegex = leadingTaskType + ? new RegExp( + `^${leadingTaskType.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?=$|[\\s,,。;;::])`, + "i", + ) + : /^$/; + + return trimDecorations( + body + .replace(EXPLICIT_TASK_TYPE_REGEX, " ") + .trimStart() + .replace(leadingTaskTypeRegex, "") + .replace(/\s+/g, " "), + ); +} + +export function parseCodeWorkbenchCommand( + text: string, +): ParsedCodeWorkbenchCommand | null { + const matched = text.match(CODE_COMMAND_PREFIX_REGEX); + if (!matched) { + return null; + } + + const body = (matched[2] || "").trim(); + const explicitTaskType = body.match(EXPLICIT_TASK_TYPE_REGEX)?.[1]?.trim(); + const leadingTaskType = body.match(LEADING_TASK_TYPE_REGEX)?.[1]?.trim(); + const taskType = + normalizeTaskType(explicitTaskType || leadingTaskType) || inferTaskType(body); + const prompt = stripPromptDecorations(body, explicitTaskType || leadingTaskType); + + return { + rawText: text, + trigger: normalizeTrigger(matched[1] || ""), + body, + prompt: prompt || body, + taskType, + }; +} diff --git a/src/components/agent/chat/utils/formWorkbenchCommand.test.ts b/src/components/agent/chat/utils/formWorkbenchCommand.test.ts new file mode 100644 index 000000000..aa72f4414 --- /dev/null +++ b/src/components/agent/chat/utils/formWorkbenchCommand.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from "vitest"; +import { parseFormWorkbenchCommand } from "./formWorkbenchCommand"; + +describe("parseFormWorkbenchCommand", () => { + it("应解析带类型、风格、受众和字段数的 @表单 命令", () => { + const result = parseFormWorkbenchCommand( + "@表单 类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表", + ); + + expect(result).toMatchObject({ + trigger: "@表单", + formType: "registration_form", + style: "简洁专业", + audience: "活动嘉宾", + fieldCount: 8, + prompt: "帮我做一个 AI Workshop 报名表", + }); + }); + + it("应兼容 @form 英文触发", () => { + const result = parseFormWorkbenchCommand( + "@form survey form for beta users with product satisfaction and feature requests", + ); + + expect(result).toMatchObject({ + trigger: "@form", + formType: "survey_form", + prompt: "for beta users with product satisfaction and feature requests", + }); + }); + + it("没有显式字段时也应保留表单生成意图", () => { + const result = parseFormWorkbenchCommand( + "@问卷 帮我整理一个面向内部员工满意度调研的匿名问卷", + ); + + expect(result).toMatchObject({ + trigger: "@问卷", + formType: undefined, + prompt: "帮我整理一个面向内部员工满意度调研的匿名问卷", + }); + }); + + it("非表单命令应返回空", () => { + expect(parseFormWorkbenchCommand("@网页 帮我做个官网")).toBeNull(); + }); +}); diff --git a/src/components/agent/chat/utils/formWorkbenchCommand.ts b/src/components/agent/chat/utils/formWorkbenchCommand.ts new file mode 100644 index 000000000..024f2a82e --- /dev/null +++ b/src/components/agent/chat/utils/formWorkbenchCommand.ts @@ -0,0 +1,236 @@ +export type FormWorkbenchCommandTrigger = + | "@表单" + | "@form" + | "@survey" + | "@问卷"; + +export type FormType = + | "survey_form" + | "lead_form" + | "registration_form" + | "feedback_form" + | "application_form"; + +export interface ParsedFormWorkbenchCommand { + rawText: string; + trigger: FormWorkbenchCommandTrigger; + body: string; + prompt: string; + formType?: FormType; + style?: string; + audience?: string; + fieldCount?: number; +} + +const FORM_COMMAND_PREFIX_REGEX = + /^\s*(@表单|@form|@survey|@问卷)(?:\s+|$)([\s\S]*)$/i; +const EXPLICIT_FORM_TYPE_REGEX = + /(?:类型|表单类型|type)\s*[::=]?\s*(问卷表单|调查表单|线索表单|报名表单|反馈表单|申请表单|survey(?:\s+form)?|lead(?:\s+form)?|registration(?:\s+form)?|feedback(?:\s+form)?|application(?:\s+form)?)(?=$|[\s,,。;;::])/i; +const LEADING_FORM_TYPE_REGEX = + /^(问卷表单|调查表单|线索表单|报名表单|反馈表单|申请表单|survey(?:\s+form)?|lead(?:\s+form)?|registration(?:\s+form)?|feedback(?:\s+form)?|application(?:\s+form)?)(?=$|[\s,,。;;::])/i; +const LEADING_EXPLICIT_FORM_TYPE_REGEX = + /^(?:类型|表单类型|type)\s*[::=]?\s*(问卷表单|调查表单|线索表单|报名表单|反馈表单|申请表单|survey(?:\s+form)?|lead(?:\s+form)?|registration(?:\s+form)?|feedback(?:\s+form)?|application(?:\s+form)?)(?=$|[\s,,。;;::])/i; +const FORM_PROMPT_BOUNDARY_PATTERN = + String.raw`(?:\s+(?:帮我|给我|请|生成|制作|设计|整理|输出|做一个|做个|create|generate|build|draft))`; +const LEADING_EXPLICIT_STYLE_REGEX = new RegExp( + String.raw`^(?:风格|style)\s*[::=]?\s*(.+?)(?=$|[,,。;;\n]|(?:\s+(?:受众|对象|audience|字段数|题数|问题数|fields?|questions?|类型|表单类型|type)\s*[::=]?)|${FORM_PROMPT_BOUNDARY_PATTERN})`, + "i", +); +const LEADING_EXPLICIT_AUDIENCE_REGEX = new RegExp( + String.raw`^(?:受众|对象|audience)\s*[::=]?\s*(.+?)(?=$|[,,。;;\n]|(?:\s+(?:风格|style|字段数|题数|问题数|fields?|questions?|类型|表单类型|type)\s*[::=]?)|${FORM_PROMPT_BOUNDARY_PATTERN})`, + "i", +); +const LEADING_EXPLICIT_FIELD_COUNT_REGEX = + /^(?:字段数|题数|问题数|fields?|questions?)\s*[::=]?\s*(\d{1,2})/i; +const PROMPT_PREFIX_REGEX = + /^\s*(生成|制作|设计|整理|输出|做一个|做个|create|generate|build|draft)(?:\s|$|[::])*/i; + +function normalizeTrigger(value: string): FormWorkbenchCommandTrigger { + const normalized = value.trim().toLowerCase(); + if (normalized === "@form") { + return "@form"; + } + if (normalized === "@survey") { + return "@survey"; + } + if (normalized === "@问卷") { + return "@问卷"; + } + return "@表单"; +} + +function trimDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+|[,\s,。;;::]+$/g, "").trim(); +} + +function trimLeadingDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+/g, "").trimStart(); +} + +function normalizeFormType(value: string | undefined): FormType | undefined { + const normalized = value?.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + + if ( + normalized === "问卷表单" || + normalized === "调查表单" || + normalized === "survey" || + normalized === "survey form" + ) { + return "survey_form"; + } + if (normalized === "线索表单" || normalized === "lead" || normalized === "lead form") { + return "lead_form"; + } + if ( + normalized === "报名表单" || + normalized === "registration" || + normalized === "registration form" + ) { + return "registration_form"; + } + if ( + normalized === "反馈表单" || + normalized === "feedback" || + normalized === "feedback form" + ) { + return "feedback_form"; + } + if ( + normalized === "申请表单" || + normalized === "application" || + normalized === "application form" + ) { + return "application_form"; + } + return undefined; +} + +function stripField(body: string, regex: RegExp): string { + return body.replace(regex, " "); +} + +function consumeLeadingFormFields(body: string): { + formType?: FormType; + style?: string; + audience?: string; + fieldCount?: number; + promptBody: string; +} { + let remaining = body.trim(); + let formType = normalizeFormType(remaining.match(LEADING_FORM_TYPE_REGEX)?.[1]?.trim()); + let style: string | undefined; + let audience: string | undefined; + let fieldCount: number | undefined; + + if (formType) { + remaining = trimLeadingDecorations(stripField(remaining, LEADING_FORM_TYPE_REGEX)); + } + + while (remaining) { + const explicitFormType = normalizeFormType( + remaining.match(LEADING_EXPLICIT_FORM_TYPE_REGEX)?.[1]?.trim(), + ); + if (explicitFormType) { + formType = formType || explicitFormType; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_FORM_TYPE_REGEX), + ); + continue; + } + + const explicitStyle = trimDecorations( + remaining.match(LEADING_EXPLICIT_STYLE_REGEX)?.[1] || "", + ); + if (explicitStyle) { + style = style || explicitStyle; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_STYLE_REGEX), + ); + continue; + } + + const explicitAudience = trimDecorations( + remaining.match(LEADING_EXPLICIT_AUDIENCE_REGEX)?.[1] || "", + ); + if (explicitAudience) { + audience = audience || explicitAudience; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_AUDIENCE_REGEX), + ); + continue; + } + + const fieldCountRaw = + remaining.match(LEADING_EXPLICIT_FIELD_COUNT_REGEX)?.[1]?.trim(); + if (fieldCountRaw) { + const parsedFieldCount = Number.parseInt(fieldCountRaw, 10); + fieldCount = + Number.isFinite(parsedFieldCount) && parsedFieldCount > 0 + ? Math.max(1, parsedFieldCount) + : fieldCount; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_FIELD_COUNT_REGEX), + ); + continue; + } + + break; + } + + return { + formType, + style, + audience, + fieldCount, + promptBody: remaining, + }; +} + +function stripPromptDecorations(body: string, formType?: string): string { + const leadingFormTypeRegex = formType + ? new RegExp( + `^${formType.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?=$|[\\s,,。;;::])`, + "i", + ) + : /^$/; + + return trimDecorations( + body + .replace(leadingFormTypeRegex, "") + .replace(PROMPT_PREFIX_REGEX, "") + .replace(/\s+/g, " "), + ); +} + +export function parseFormWorkbenchCommand( + text: string, +): ParsedFormWorkbenchCommand | null { + const matched = text.match(FORM_COMMAND_PREFIX_REGEX); + if (!matched) { + return null; + } + + const body = (matched[2] || "").trim(); + const { formType, style, audience, fieldCount, promptBody } = + consumeLeadingFormFields(body); + const explicitFormType = body.match(EXPLICIT_FORM_TYPE_REGEX)?.[1]?.trim(); + const leadingFormType = body.match(LEADING_FORM_TYPE_REGEX)?.[1]?.trim(); + const prompt = stripPromptDecorations( + promptBody, + explicitFormType || leadingFormType, + ); + + return { + rawText: text, + trigger: normalizeTrigger(matched[1] || ""), + body, + prompt, + formType, + style: style || undefined, + audience: audience || undefined, + fieldCount, + }; +} diff --git a/src/components/agent/chat/utils/internalArtifactVisibility.test.ts b/src/components/agent/chat/utils/internalArtifactVisibility.test.ts new file mode 100644 index 000000000..acc3d19bd --- /dev/null +++ b/src/components/agent/chat/utils/internalArtifactVisibility.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from "vitest"; +import { isHiddenInternalArtifactPath } from "./internalArtifactVisibility"; + +describe("isHiddenInternalArtifactPath", () => { + it("应隐藏 .lime/tasks 下的内部任务快照 JSON", () => { + expect( + isHiddenInternalArtifactPath(".lime/tasks/image_generate/task-image-1.json"), + ).toBe(true); + expect( + isHiddenInternalArtifactPath( + "/workspace/demo/.lime/tasks/image_generate/task-image-1.json", + ), + ).toBe(true); + }); + + it("不应隐藏用户可消费的正式产物", () => { + expect( + isHiddenInternalArtifactPath("content-posts/demo.publish-pack.json"), + ).toBe(false); + expect( + isHiddenInternalArtifactPath(".lime/artifacts/thread-1/report.artifact.json"), + ).toBe(false); + expect(isHiddenInternalArtifactPath("content-posts/demo-cover.png")).toBe( + false, + ); + }); +}); diff --git a/src/components/agent/chat/utils/internalArtifactVisibility.ts b/src/components/agent/chat/utils/internalArtifactVisibility.ts new file mode 100644 index 000000000..e4c47e6d4 --- /dev/null +++ b/src/components/agent/chat/utils/internalArtifactVisibility.ts @@ -0,0 +1,17 @@ +import { normalizeArtifactProtocolPath } from "@/lib/artifact-protocol"; + +function normalizeArtifactPath(path?: string | null): string { + return path ? normalizeArtifactProtocolPath(path) : ""; +} + +export function isHiddenInternalArtifactPath(path?: string | null): boolean { + const normalizedPath = normalizeArtifactPath(path); + if (!normalizedPath || !normalizedPath.endsWith(".json")) { + return false; + } + + return ( + normalizedPath.startsWith(".lime/tasks/") || + normalizedPath.includes("/.lime/tasks/") + ); +} diff --git a/src/components/agent/chat/utils/messageArtifacts.test.ts b/src/components/agent/chat/utils/messageArtifacts.test.ts index 7039b236e..8914341d8 100644 --- a/src/components/agent/chat/utils/messageArtifacts.test.ts +++ b/src/components/agent/chat/utils/messageArtifacts.test.ts @@ -4,6 +4,8 @@ import type { Artifact } from "@/lib/artifact/types"; import { ARTIFACT_DOCUMENT_SCHEMA_VERSION } from "@/lib/artifact-document"; import { buildArtifactFromWrite, + findMessageArtifact, + mergeArtifacts, resolveDefaultArtifactViewMode, } from "./messageArtifacts"; @@ -247,3 +249,60 @@ describe("messageArtifacts.resolveDefaultArtifactViewMode", () => { ).toBe("preview"); }); }); + +describe("messageArtifacts 路径归一", () => { + it("应把文件名、相对路径与绝对路径视作同一个 artifact", () => { + const message = { + artifacts: [ + createArtifact({ + id: "artifact-output-image", + title: "output_image.jpg", + meta: { + filePath: + "/Users/coso/Documents/dev/ai/aiclientproxy/lime/.lime/tasks/image/output_image.jpg", + filename: "output_image.jpg", + }, + }), + ], + }; + + expect( + findMessageArtifact(message, { + filePath: "output_image.jpg", + })?.id, + ).toBe("artifact-output-image"); + expect( + findMessageArtifact(message, { + filePath: ".lime/tasks/image/output_image.jpg", + })?.id, + ).toBe("artifact-output-image"); + }); + + it("应在 mergeArtifacts 时收敛同一路径的重复 artifact 并保留更完整路径", () => { + const merged = mergeArtifacts([ + createArtifact({ + id: "artifact-image-short", + title: "output_image.jpg", + meta: { + filePath: "output_image.jpg", + filename: "output_image.jpg", + }, + }), + createArtifact({ + id: "artifact-image-absolute", + title: "output_image.jpg", + updatedAt: 3, + meta: { + filePath: + "/Users/coso/Documents/dev/ai/aiclientproxy/lime/.lime/tasks/image/output_image.jpg", + filename: "output_image.jpg", + }, + }), + ]); + + expect(merged).toHaveLength(1); + expect(merged[0]?.meta.filePath).toBe( + "/Users/coso/Documents/dev/ai/aiclientproxy/lime/.lime/tasks/image/output_image.jpg", + ); + }); +}); diff --git a/src/components/agent/chat/utils/messageArtifacts.ts b/src/components/agent/chat/utils/messageArtifacts.ts index a518d7392..a8c558201 100644 --- a/src/components/agent/chat/utils/messageArtifacts.ts +++ b/src/components/agent/chat/utils/messageArtifacts.ts @@ -5,7 +5,9 @@ import type { ArtifactType, } from "@/lib/artifact/types"; import { + areArtifactProtocolPathsEquivalent, hasArtifactProtocolDocumentMetadata, + normalizeArtifactProtocolPath, resolveArtifactProtocolDocumentPayload, resolveArtifactProtocolFilePath, resolveArtifactProtocolPreviewText, @@ -71,7 +73,7 @@ const ARTIFACT_TYPE_ALIASES: Record = { const ARTIFACT_PREVIEW_MAX_CHARS = 240; function normalizePath(path: string): string { - return path.replace(/\\/g, "/").trim(); + return normalizeArtifactProtocolPath(path); } function fileNameFromPath(path: string): string { @@ -193,7 +195,7 @@ export function findMessageArtifact( const artifactPath = normalizePath( resolveArtifactProtocolFilePath(artifact), ); - return artifactPath === normalizedPath; + return areArtifactProtocolPathsEquivalent(artifactPath, normalizedPath); }); } @@ -422,9 +424,17 @@ export function upsertMessageArtifact( artifact: Artifact, ): Message { const currentArtifacts = message.artifacts || []; - const existingIndex = currentArtifacts.findIndex( - (item) => item.id === artifact.id, - ); + const artifactPath = resolveArtifactProtocolFilePath(artifact); + const existingIndex = currentArtifacts.findIndex((item) => { + if (item.id === artifact.id) { + return true; + } + + return areArtifactProtocolPathsEquivalent( + resolveArtifactProtocolFilePath(item), + artifactPath, + ); + }); if (existingIndex < 0) { return { @@ -434,12 +444,20 @@ export function upsertMessageArtifact( } const nextArtifacts = [...currentArtifacts]; + const existing = nextArtifacts[existingIndex]; + const existingPath = resolveArtifactProtocolFilePath(existing); + const preferredPath = + normalizePath(artifactPath).length >= normalizePath(existingPath).length + ? artifactPath + : existingPath; nextArtifacts[existingIndex] = { - ...nextArtifacts[existingIndex], + ...existing, ...artifact, meta: { - ...nextArtifacts[existingIndex].meta, + ...existing.meta, ...artifact.meta, + filePath: preferredPath, + filename: fileNameFromPath(preferredPath), }, updatedAt: artifact.updatedAt, }; @@ -484,27 +502,46 @@ export function updateMessageArtifactsStatus( } export function mergeArtifacts(artifacts: Artifact[]): Artifact[] { - const merged = new Map(); + const merged: Artifact[] = []; for (const artifact of artifacts) { - const existing = merged.get(artifact.id); - if (!existing) { - merged.set(artifact.id, artifact); + const artifactPath = resolveArtifactProtocolFilePath(artifact); + const existingIndex = merged.findIndex((existingArtifact) => { + if (existingArtifact.id === artifact.id) { + return true; + } + + return areArtifactProtocolPathsEquivalent( + resolveArtifactProtocolFilePath(existingArtifact), + artifactPath, + ); + }); + + if (existingIndex < 0) { + merged.push(artifact); continue; } - merged.set(artifact.id, { + const existing = merged[existingIndex]; + const existingPath = resolveArtifactProtocolFilePath(existing); + const preferredPath = + normalizePath(artifactPath).length >= normalizePath(existingPath).length + ? artifactPath + : existingPath; + merged[existingIndex] = { ...existing, ...artifact, meta: { ...existing.meta, ...artifact.meta, + filePath: preferredPath, + filename: fileNameFromPath(preferredPath), }, updatedAt: Math.max(existing.updatedAt, artifact.updatedAt), - }); + }; } - return Array.from(merged.values()).sort((left, right) => { + return merged.sort((left, right) => { if (left.updatedAt !== right.updatedAt) { return left.updatedAt - right.updatedAt; } diff --git a/src/components/agent/chat/utils/presentationWorkbenchCommand.test.ts b/src/components/agent/chat/utils/presentationWorkbenchCommand.test.ts new file mode 100644 index 000000000..5bf6625bf --- /dev/null +++ b/src/components/agent/chat/utils/presentationWorkbenchCommand.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from "vitest"; +import { parsePresentationWorkbenchCommand } from "./presentationWorkbenchCommand"; + +describe("parsePresentationWorkbenchCommand", () => { + it("应解析带类型、风格、受众和页数的 @PPT 命令", () => { + const result = parsePresentationWorkbenchCommand( + "@PPT 类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿", + ); + + expect(result).toMatchObject({ + trigger: "@PPT", + deckType: "pitch_deck", + style: "极简科技", + audience: "投资人", + slideCount: 10, + prompt: "帮我做一个 AI 助手创业项目融资演示稿", + }); + }); + + it("应兼容 @slides 英文触发", () => { + const result = parsePresentationWorkbenchCommand( + "@slides pitch deck for an AI note startup audience: seed investors", + ); + + expect(result).toMatchObject({ + trigger: "@slides", + deckType: "pitch_deck", + prompt: "for an AI note startup audience: seed investors", + }); + }); + + it("没有显式字段时也应保留演示稿生成意图", () => { + const result = parsePresentationWorkbenchCommand( + "@演示 帮我整理一份面向内部复盘会的项目汇报稿", + ); + + expect(result).toMatchObject({ + trigger: "@演示", + deckType: undefined, + prompt: "帮我整理一份面向内部复盘会的项目汇报稿", + }); + }); + + it("非演示命令应返回空", () => { + expect(parsePresentationWorkbenchCommand("@网页 帮我做个官网")).toBeNull(); + }); +}); diff --git a/src/components/agent/chat/utils/presentationWorkbenchCommand.ts b/src/components/agent/chat/utils/presentationWorkbenchCommand.ts new file mode 100644 index 000000000..fc869cdc3 --- /dev/null +++ b/src/components/agent/chat/utils/presentationWorkbenchCommand.ts @@ -0,0 +1,245 @@ +export type PresentationWorkbenchCommandTrigger = + | "@PPT" + | "@ppt" + | "@slides" + | "@演示"; + +export type PresentationDeckType = + | "pitch_deck" + | "sales_deck" + | "training_deck" + | "report_deck" + | "proposal_deck"; + +export interface ParsedPresentationWorkbenchCommand { + rawText: string; + trigger: PresentationWorkbenchCommandTrigger; + body: string; + prompt: string; + deckType?: PresentationDeckType; + style?: string; + audience?: string; + slideCount?: number; +} + +const PRESENTATION_COMMAND_PREFIX_REGEX = + /^\s*(@PPT|@ppt|@slides|@演示)(?:\s+|$)([\s\S]*)$/i; +const EXPLICIT_DECK_TYPE_REGEX = + /(?:类型|演示类型|type)\s*[::=]?\s*(路演PPT|融资PPT|销售PPT|培训PPT|汇报PPT|方案PPT|pitch(?:\s+deck)?|sales(?:\s+deck)?|training(?:\s+deck)?|report(?:\s+deck)?|proposal(?:\s+deck)?)(?=$|[\s,,。;;::])/i; +const LEADING_DECK_TYPE_REGEX = + /^(路演PPT|融资PPT|销售PPT|培训PPT|汇报PPT|方案PPT|pitch(?:\s+deck)?|sales(?:\s+deck)?|training(?:\s+deck)?|report(?:\s+deck)?|proposal(?:\s+deck)?)(?=$|[\s,,。;;::])/i; +const LEADING_EXPLICIT_DECK_TYPE_REGEX = + /^(?:类型|演示类型|type)\s*[::=]?\s*(路演PPT|融资PPT|销售PPT|培训PPT|汇报PPT|方案PPT|pitch(?:\s+deck)?|sales(?:\s+deck)?|training(?:\s+deck)?|report(?:\s+deck)?|proposal(?:\s+deck)?)(?=$|[\s,,。;;::])/i; +const PRESENTATION_PROMPT_BOUNDARY_PATTERN = + String.raw`(?:\s+(?:帮我|给我|请|生成|制作|整理|输出|做一个|做个|create|generate|build|draft))`; +const LEADING_EXPLICIT_STYLE_REGEX = new RegExp( + String.raw`^(?:风格|style)\s*[::=]?\s*(.+?)(?=$|[,,。;;\n]|(?:\s+(?:受众|对象|audience|页数|页|slides?|类型|演示类型|type)\s*[::=]?)|${PRESENTATION_PROMPT_BOUNDARY_PATTERN})`, + "i", +); +const LEADING_EXPLICIT_AUDIENCE_REGEX = new RegExp( + String.raw`^(?:受众|对象|audience)\s*[::=]?\s*(.+?)(?=$|[,,。;;\n]|(?:\s+(?:风格|style|页数|页|slides?|类型|演示类型|type)\s*[::=]?)|${PRESENTATION_PROMPT_BOUNDARY_PATTERN})`, + "i", +); +const LEADING_EXPLICIT_SLIDE_COUNT_REGEX = + /^(?:页数|页|slides?)\s*[::=]?\s*(\d{1,2})/i; +const PROMPT_PREFIX_REGEX = + /^\s*(生成|制作|整理|输出|做一个|做个|create|generate|build|draft)(?:\s|$|[::])*/i; + +function normalizeTrigger(value: string): PresentationWorkbenchCommandTrigger { + const normalized = value.trim().toLowerCase(); + if (normalized === "@ppt") { + return "@PPT"; + } + if (normalized === "@slides") { + return "@slides"; + } + if (normalized === "@演示") { + return "@演示"; + } + return "@PPT"; +} + +function trimDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+|[,\s,。;;::]+$/g, "").trim(); +} + +function trimLeadingDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+/g, "").trimStart(); +} + +function normalizeDeckType( + value: string | undefined, +): PresentationDeckType | undefined { + const normalized = value?.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + + if ( + normalized === "路演ppt" || + normalized === "融资ppt" || + normalized === "pitch" || + normalized === "pitch deck" + ) { + return "pitch_deck"; + } + if (normalized === "销售ppt" || normalized === "sales" || normalized === "sales deck") { + return "sales_deck"; + } + if ( + normalized === "培训ppt" || + normalized === "training" || + normalized === "training deck" + ) { + return "training_deck"; + } + if ( + normalized === "汇报ppt" || + normalized === "report" || + normalized === "report deck" + ) { + return "report_deck"; + } + if ( + normalized === "方案ppt" || + normalized === "proposal" || + normalized === "proposal deck" + ) { + return "proposal_deck"; + } + return undefined; +} + +function stripField(body: string, regex: RegExp): string { + return body.replace(regex, " "); +} + +function consumeLeadingPresentationFields(body: string): { + deckType?: PresentationDeckType; + style?: string; + audience?: string; + slideCount?: number; + promptBody: string; +} { + let remaining = body.trim(); + let deckType = normalizeDeckType(remaining.match(LEADING_DECK_TYPE_REGEX)?.[1]?.trim()); + let style: string | undefined; + let audience: string | undefined; + let slideCount: number | undefined; + + if (deckType) { + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_DECK_TYPE_REGEX), + ); + } + + while (remaining) { + const explicitDeckType = normalizeDeckType( + remaining.match(LEADING_EXPLICIT_DECK_TYPE_REGEX)?.[1]?.trim(), + ); + if (explicitDeckType) { + deckType = deckType || explicitDeckType; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_DECK_TYPE_REGEX), + ); + continue; + } + + const explicitStyle = trimDecorations( + remaining.match(LEADING_EXPLICIT_STYLE_REGEX)?.[1] || "", + ); + if (explicitStyle) { + style = style || explicitStyle; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_STYLE_REGEX), + ); + continue; + } + + const explicitAudience = trimDecorations( + remaining.match(LEADING_EXPLICIT_AUDIENCE_REGEX)?.[1] || "", + ); + if (explicitAudience) { + audience = audience || explicitAudience; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_AUDIENCE_REGEX), + ); + continue; + } + + const slideCountRaw = + remaining.match(LEADING_EXPLICIT_SLIDE_COUNT_REGEX)?.[1]?.trim(); + if (slideCountRaw) { + const parsedSlideCount = Number.parseInt(slideCountRaw, 10); + slideCount = + Number.isFinite(parsedSlideCount) && parsedSlideCount > 0 + ? Math.max(1, parsedSlideCount) + : slideCount; + remaining = trimLeadingDecorations( + stripField(remaining, LEADING_EXPLICIT_SLIDE_COUNT_REGEX), + ); + continue; + } + + break; + } + + return { + deckType, + style, + audience, + slideCount, + promptBody: remaining, + }; +} + +function stripPromptDecorations(body: string, deckType?: string): string { + const leadingDeckTypeRegex = deckType + ? new RegExp( + `^${deckType.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?=$|[\\s,,。;;::])`, + "i", + ) + : /^$/; + + return trimDecorations( + body + .replace(leadingDeckTypeRegex, "") + .replace(PROMPT_PREFIX_REGEX, "") + .replace(/\s+/g, " "), + ); +} + +export function parsePresentationWorkbenchCommand( + text: string, +): ParsedPresentationWorkbenchCommand | null { + const matched = text.match(PRESENTATION_COMMAND_PREFIX_REGEX); + if (!matched) { + return null; + } + + const body = (matched[2] || "").trim(); + const { + deckType, + style, + audience, + slideCount, + promptBody, + } = consumeLeadingPresentationFields(body); + const explicitDeckType = body.match(EXPLICIT_DECK_TYPE_REGEX)?.[1]?.trim(); + const leadingDeckType = body.match(LEADING_DECK_TYPE_REGEX)?.[1]?.trim(); + const prompt = stripPromptDecorations( + promptBody, + explicitDeckType || leadingDeckType, + ); + + return { + rawText: text, + trigger: normalizeTrigger(matched[1] || ""), + body, + prompt, + deckType, + style: style || undefined, + audience: audience || undefined, + slideCount, + }; +} diff --git a/src/components/agent/chat/utils/publishWorkbenchCommand.test.ts b/src/components/agent/chat/utils/publishWorkbenchCommand.test.ts new file mode 100644 index 000000000..d035acff0 --- /dev/null +++ b/src/components/agent/chat/utils/publishWorkbenchCommand.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, it } from "vitest"; +import { parsePublishWorkbenchCommand } from "./publishWorkbenchCommand"; + +describe("parsePublishWorkbenchCommand", () => { + it("应解析带显式平台的 @发布 命令", () => { + const result = parsePublishWorkbenchCommand( + "@发布 平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本", + ); + + expect(result).toMatchObject({ + trigger: "@发布", + platformType: "wechat_official_account", + platformLabel: "微信公众号后台", + prompt: "帮我把这篇文章整理成可直接发布的版本", + }); + }); + + it("应兼容英文触发与英文平台名", () => { + const result = parsePublishWorkbenchCommand( + "@publish xiaohongshu turn this draft into a ready-to-post version", + ); + + expect(result).toMatchObject({ + trigger: "@publish", + platformType: "xiaohongshu", + platformLabel: "小红书", + prompt: "turn this draft into a ready-to-post version", + }); + }); + + it("没有显式平台时也应保留发布意图", () => { + const result = parsePublishWorkbenchCommand( + "@发文 请帮我整理这篇稿子,并给出发布前检查清单", + ); + + expect(result).toMatchObject({ + trigger: "@发文", + platformType: undefined, + prompt: "请帮我整理这篇稿子,并给出发布前检查清单", + }); + }); + + it("非发布命令应返回空", () => { + expect(parsePublishWorkbenchCommand("@表单 做个报名表")).toBeNull(); + }); +}); diff --git a/src/components/agent/chat/utils/publishWorkbenchCommand.ts b/src/components/agent/chat/utils/publishWorkbenchCommand.ts new file mode 100644 index 000000000..70048f20c --- /dev/null +++ b/src/components/agent/chat/utils/publishWorkbenchCommand.ts @@ -0,0 +1,138 @@ +export type PublishWorkbenchCommandTrigger = + | "@发布" + | "@publish" + | "@发文" + | "@投稿"; + +export type PublishPlatformType = + | "wechat_official_account" + | "xiaohongshu" + | "zhihu" + | "douyin" + | "bilibili"; + +export interface ParsedPublishWorkbenchCommand { + rawText: string; + trigger: PublishWorkbenchCommandTrigger; + body: string; + prompt: string; + platformType?: PublishPlatformType; + platformLabel?: string; +} + +const PUBLISH_COMMAND_PREFIX_REGEX = + /^\s*(@发布|@publish|@发文|@投稿)(?:\s+|$)([\s\S]*)$/i; +const EXPLICIT_PLATFORM_REGEX = + /(?:平台|渠道|platform|channel)\s*[::=]?\s*(微信公众号后台|微信公众平台|公众号后台|公众号|小红书|知乎|抖音|B站|bilibili|wechat|wechat official account|xiaohongshu|zhihu|douyin)(?=$|[\s,,。;;::])/i; +const LEADING_PLATFORM_REGEX = + /^(微信公众号后台|微信公众平台|公众号后台|公众号|小红书|知乎|抖音|B站|bilibili|wechat|wechat official account|xiaohongshu|zhihu|douyin)(?=$|[\s,,。;;::])/i; + +function trimDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+|[,\s,。;;::]+$/g, "").trim(); +} + +function normalizeTrigger(value: string): PublishWorkbenchCommandTrigger { + const normalized = value.trim().toLowerCase(); + if (normalized === "@publish") { + return "@publish"; + } + if (normalized === "@发文") { + return "@发文"; + } + if (normalized === "@投稿") { + return "@投稿"; + } + return "@发布"; +} + +function normalizePlatform(value?: string): { + platformType?: PublishPlatformType; + platformLabel?: string; +} { + const normalized = value?.trim().toLowerCase(); + if (!normalized) { + return {}; + } + + if ( + normalized === "微信公众号后台" || + normalized === "微信公众平台" || + normalized === "公众号后台" || + normalized === "公众号" || + normalized === "wechat" || + normalized === "wechat official account" + ) { + return { + platformType: "wechat_official_account", + platformLabel: "微信公众号后台", + }; + } + if (normalized === "小红书" || normalized === "xiaohongshu") { + return { + platformType: "xiaohongshu", + platformLabel: "小红书", + }; + } + if (normalized === "知乎" || normalized === "zhihu") { + return { + platformType: "zhihu", + platformLabel: "知乎", + }; + } + if (normalized === "抖音" || normalized === "douyin") { + return { + platformType: "douyin", + platformLabel: "抖音", + }; + } + if (normalized === "b站" || normalized === "bilibili") { + return { + platformType: "bilibili", + platformLabel: "B站", + }; + } + return {}; +} + +function stripPromptDecorations(body: string, platformText?: string): string { + const leadingPlatformRegex = platformText + ? new RegExp( + `^${platformText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?=$|[\\s,,。;;::])`, + "i", + ) + : /^$/; + + return trimDecorations( + body + .replace(EXPLICIT_PLATFORM_REGEX, " ") + .trimStart() + .replace(leadingPlatformRegex, "") + .replace(/\s+/g, " "), + ); +} + +export function parsePublishWorkbenchCommand( + text: string, +): ParsedPublishWorkbenchCommand | null { + const matched = text.match(PUBLISH_COMMAND_PREFIX_REGEX); + if (!matched) { + return null; + } + + const body = (matched[2] || "").trim(); + const explicitPlatform = body.match(EXPLICIT_PLATFORM_REGEX)?.[1]?.trim(); + const leadingPlatform = body.match(LEADING_PLATFORM_REGEX)?.[1]?.trim(); + const { platformType, platformLabel } = normalizePlatform( + explicitPlatform || leadingPlatform, + ); + const prompt = stripPromptDecorations(body, explicitPlatform || leadingPlatform); + + return { + rawText: text, + trigger: normalizeTrigger(matched[1] || ""), + body, + prompt: prompt || body, + platformType, + platformLabel, + }; +} diff --git a/src/components/agent/chat/utils/taskPreviewFromToolResult.test.ts b/src/components/agent/chat/utils/taskPreviewFromToolResult.test.ts new file mode 100644 index 000000000..4811da94b --- /dev/null +++ b/src/components/agent/chat/utils/taskPreviewFromToolResult.test.ts @@ -0,0 +1,179 @@ +import { describe, expect, it } from "vitest"; +import { + buildImageTaskPreviewFromToolResult, + buildTaskPreviewFromToolResult, +} from "./taskPreviewFromToolResult"; + +describe("buildImageTaskPreviewFromToolResult", () => { + it("应在图片任务完成后输出更友好的完成态摘要", () => { + const preview = buildImageTaskPreviewFromToolResult({ + toolId: "tool-1", + toolName: "Bash", + toolArguments: JSON.stringify({ + command: 'lime media image generate --prompt "未来感青柠实验室"', + }), + toolResult: { + metadata: { + task_id: "task-1", + task_type: "image_generate", + status: "succeeded", + prompt: "未来感青柠实验室", + size: "1024x1024", + project_id: "project-1", + content_id: "content-1", + requested_count: 2, + received_count: 2, + }, + }, + fallbackPrompt: "@配图 未来感青柠实验室", + }); + + expect(preview).toMatchObject({ + taskId: "task-1", + prompt: "未来感青柠实验室", + status: "complete", + imageCount: 2, + size: "1024x1024", + projectId: "project-1", + contentId: "content-1", + phase: "succeeded", + statusMessage: "图片已生成完成,共 2 张。", + }); + }); + + it("应在图片任务失败时输出失败态摘要", () => { + const preview = buildImageTaskPreviewFromToolResult({ + toolId: "tool-2", + toolName: "Bash", + toolArguments: JSON.stringify({ + command: 'lime media image generate --prompt "未来感青柠实验室"', + }), + toolResult: { + metadata: { + task_id: "task-2", + task_type: "image_generate", + status: "failed", + }, + }, + fallbackPrompt: "@配图 未来感青柠实验室", + }); + + expect(preview).toMatchObject({ + taskId: "task-2", + status: "failed", + phase: "failed", + statusMessage: "图片任务执行失败,请查看工具结果或任务详情。", + }); + }); + + it("图片任务完成但尚未带回数量时,应输出面向用户的完成态文案", () => { + const preview = buildImageTaskPreviewFromToolResult({ + toolId: "tool-3", + toolName: "Bash", + toolArguments: JSON.stringify({ + command: 'lime media image generate --prompt "清晨广州塔"', + }), + toolResult: { + metadata: { + task_id: "task-3", + task_type: "image_generate", + status: "succeeded", + prompt: "清晨广州塔", + size: "1024x1024", + }, + }, + fallbackPrompt: "@配图 清晨广州塔", + }); + + expect(preview).toMatchObject({ + taskId: "task-3", + status: "complete", + phase: "succeeded", + statusMessage: "图片结果已生成完成,可在右侧查看与使用。", + }); + }); + + it("图片任务刚提交时,应输出用户可理解的排队态文案", () => { + const preview = buildImageTaskPreviewFromToolResult({ + toolId: "tool-4", + toolName: "Bash", + toolArguments: JSON.stringify({ + command: 'lime media image generate --prompt "广州塔夜景"', + }), + toolResult: { + metadata: { + task_id: "task-4", + task_type: "image_generate", + status: "queued", + prompt: "广州塔夜景", + }, + }, + fallbackPrompt: "@配图 广州塔夜景", + }); + + expect(preview).toMatchObject({ + taskId: "task-4", + status: "running", + phase: "queued", + statusMessage: "图片任务已提交,正在排队处理。", + }); + }); +}); + +describe("buildTaskPreviewFromToolResult video", () => { + it("视频任务完成但尚未带回结果地址时,应输出完成态同步文案", () => { + const preview = buildTaskPreviewFromToolResult({ + toolId: "tool-video-1", + toolName: "Bash", + toolArguments: JSON.stringify({ + command: + 'lime media video generate --prompt "广州塔城市宣传片" --duration 15 --aspect-ratio 16:9 --resolution 720p', + }), + toolResult: { + metadata: { + task_id: "task-video-1", + task_type: "video_generate", + status: "succeeded", + prompt: "广州塔城市宣传片", + }, + }, + fallbackPrompt: "@视频 15秒 广州塔城市宣传片,16:9,720p", + }); + + expect(preview).toMatchObject({ + kind: "video_generate", + taskId: "task-video-1", + status: "complete", + phase: "succeeded", + statusMessage: "视频已经生成完成,正在同步最终结果。", + }); + }); + + it("视频任务排队中时,应输出用户可理解的排队态文案", () => { + const preview = buildTaskPreviewFromToolResult({ + toolId: "tool-video-2", + toolName: "Bash", + toolArguments: JSON.stringify({ + command: + 'lime media video generate --prompt "新品发布短视频" --duration 15 --aspect-ratio 16:9 --resolution 720p', + }), + toolResult: { + metadata: { + task_id: "task-video-2", + task_type: "video_generate", + status: "queued", + prompt: "新品发布短视频", + }, + }, + fallbackPrompt: "@视频 15秒 新品发布短视频,16:9,720p", + }); + + expect(preview).toMatchObject({ + kind: "video_generate", + taskId: "task-video-2", + status: "running", + phase: "queued", + statusMessage: "视频任务已进入排队队列,稍后会自动开始生成。", + }); + }); +}); diff --git a/src/components/agent/chat/utils/taskPreviewFromToolResult.ts b/src/components/agent/chat/utils/taskPreviewFromToolResult.ts index c9dd2bd4c..9c14e9b37 100644 --- a/src/components/agent/chat/utils/taskPreviewFromToolResult.ts +++ b/src/components/agent/chat/utils/taskPreviewFromToolResult.ts @@ -149,6 +149,18 @@ function resolveTaskPreviewStatus( function resolveTaskPreviewPhase(status: string | undefined): string { switch ((status || "").trim().toLowerCase()) { + case "completed": + case "success": + case "succeeded": + return "succeeded"; + case "partial": + return "partial"; + case "failed": + case "error": + return "failed"; + case "cancelled": + case "canceled": + return "cancelled"; case "queued": case "pending_submit": case "pending": @@ -414,9 +426,7 @@ function readWebImageSearchResult(params: ToolResultPreviewParams): { `图片候选 ${index + 1}`, }; }) - .filter( - (item): item is MessageTaskPreviewImageCandidate => item !== null, - ); + .filter((item): item is MessageTaskPreviewImageCandidate => item !== null); if (hits.length === 0) { return null; @@ -642,18 +652,60 @@ export function buildImageTaskPreviewFromToolResult( params.toolArguments, ); const status = readMetadataString([metadata], ["status"]); + const previewStatus = resolveTaskPreviewStatus(status); + const requestedCount = + parsedArguments.imageCount || + readMetadataPositiveNumber( + [metadata], + [ + "requested_count", + "requestedCount", + "count", + "image_count", + "imageCount", + ], + ); + const receivedCount = readMetadataPositiveNumber( + [metadata], + ["received_count", "receivedCount"], + ); + const resolvedImageCount = + previewStatus === "running" + ? requestedCount + : receivedCount || requestedCount; + const statusMessage = + previewStatus === "complete" + ? receivedCount && receivedCount > 0 + ? `图片已生成完成,共 ${receivedCount} 张。` + : "图片结果已生成完成,可在右侧查看与使用。" + : previewStatus === "partial" + ? receivedCount && receivedCount > 0 + ? `图片已返回部分结果,共 ${receivedCount} 张。` + : "图片已返回部分结果,可在右侧继续查看。" + : previewStatus === "failed" + ? "图片任务执行失败,请查看工具结果或任务详情。" + : previewStatus === "cancelled" + ? "图片任务已取消。" + : "图片任务已提交,正在排队处理。"; return { taskId, prompt: parsedArguments.prompt || + readMetadataString([metadata], ["prompt"]) || params.fallbackPrompt.trim() || "图片任务进行中", - status: resolveTaskPreviewStatus(status), - imageCount: parsedArguments.imageCount, - size: parsedArguments.size, + status: previewStatus, + projectId: + readMetadataString([metadata], ["project_id", "projectId"]) || null, + contentId: + readMetadataString([metadata], ["content_id", "contentId"]) || null, + imageCount: resolvedImageCount, + size: + parsedArguments.size || + readMetadataString([metadata], ["size", "resolution"]), phase: resolveTaskPreviewPhase(status), - statusMessage: "任务已提交到异步队列,正在同步任务状态。", + statusMessage, }; } @@ -662,9 +714,10 @@ function buildVideoTaskPreviewFromToolResult( ): MessageVideoTaskPreview | null { const resultRecord = asRecord(params.toolResult); const metadata = asRecord(resultRecord?.metadata); - const taskResult = asRecord(resultRecord?.result); + const taskResult = + asRecord(resultRecord?.result) || asRecord(metadata?.result); const firstVideo = readFirstArrayRecord( - [taskResult, resultRecord], + [taskResult, metadata, resultRecord], ["videos", "results"], ); const taskId = readMetadataString( @@ -693,11 +746,11 @@ function buildVideoTaskPreviewFromToolResult( ["status"], ); const videoUrl = readMetadataString( - [firstVideo, taskResult, resultRecord], + [firstVideo, taskResult, metadata, resultRecord], ["url", "result_url", "resultUrl"], ); const thumbnailUrl = readMetadataString( - [firstVideo, taskResult, resultRecord], + [firstVideo, taskResult, metadata, resultRecord], ["thumbnail_url", "thumbnailUrl", "poster_url", "posterUrl"], ); const durationMs = readMetadataPositiveNumber( @@ -707,6 +760,27 @@ function buildVideoTaskPreviewFromToolResult( const durationSeconds = parsedArguments.durationSeconds || (durationMs ? Math.max(1, Math.round(durationMs / 1000)) : undefined); + const previewStatus = resolveTaskPreviewStatus(status); + const phase = resolveTaskPreviewPhase(status); + const statusMessage = + previewStatus === "complete" + ? videoUrl + ? "视频结果已同步,打开查看即可继续预览。" + : "视频已经生成完成,正在同步最终结果。" + : previewStatus === "partial" + ? videoUrl + ? "视频已返回部分结果,打开查看可继续确认当前片段。" + : "视频已返回部分结果,工作区正在补齐剩余结果。" + : previewStatus === "failed" + ? readMetadataString( + [metadata, resultRecord, taskResult], + ["error", "error_message", "errorMessage"], + ) || "视频生成失败,请稍后重试。" + : previewStatus === "cancelled" + ? "视频任务已取消,当前不会继续生成新的结果。" + : phase === "queued" + ? "视频任务已进入排队队列,稍后会自动开始生成。" + : "视频任务正在生成中,工作区会继续同步最新状态。"; return { kind: "video_generate", @@ -751,10 +825,8 @@ function buildVideoTaskPreviewFromToolResult( parsedArguments.model || readMetadataString([metadata, resultRecord, taskResult], ["model"]) || null, - phase: resolveTaskPreviewPhase(status), - statusMessage: videoUrl - ? "视频结果已同步,打开查看即可继续预览。" - : "视频任务已提交到异步队列,正在同步任务状态。", + phase, + statusMessage, }; } diff --git a/src/components/agent/chat/utils/topicProjectResolution.test.ts b/src/components/agent/chat/utils/topicProjectResolution.test.ts index a49fbe433..3ea2cdac1 100644 --- a/src/components/agent/chat/utils/topicProjectResolution.test.ts +++ b/src/components/agent/chat/utils/topicProjectResolution.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; import { + isDefaultProjectIdAlias, isLockedProjectConflict, normalizeProjectId, resolveTopicProjectId, @@ -12,6 +13,8 @@ describe("normalizeProjectId", () => { expect(normalizeProjectId(" ")).toBeNull(); expect(normalizeProjectId("__invalid__")).toBeNull(); expect(normalizeProjectId("[object Promise]")).toBeNull(); + expect(normalizeProjectId("default")).toBeNull(); + expect(normalizeProjectId(" Default ")).toBeNull(); }); it("应返回合法项目 ID", () => { @@ -19,6 +22,14 @@ describe("normalizeProjectId", () => { }); }); +describe("isDefaultProjectIdAlias", () => { + it("应识别默认工作区别名", () => { + expect(isDefaultProjectIdAlias("default")).toBe(true); + expect(isDefaultProjectIdAlias(" Default ")).toBe(true); + expect(isDefaultProjectIdAlias("project-1")).toBe(false); + }); +}); + describe("resolveTopicProjectId", () => { it("应优先使用话题绑定项目", () => { expect( diff --git a/src/components/agent/chat/utils/topicProjectResolution.ts b/src/components/agent/chat/utils/topicProjectResolution.ts index ff9029b48..272f92373 100644 --- a/src/components/agent/chat/utils/topicProjectResolution.ts +++ b/src/components/agent/chat/utils/topicProjectResolution.ts @@ -5,6 +5,14 @@ export interface ResolveTopicProjectIdOptions { } const INVALID_PROJECT_IDS = new Set(["__invalid__", "[object Promise]"]); +const DEFAULT_PROJECT_ID_ALIAS = "default"; + +export function isDefaultProjectIdAlias(projectId: unknown): boolean { + return ( + typeof projectId === "string" && + projectId.trim().toLowerCase() === DEFAULT_PROJECT_ID_ALIAS + ); +} export function normalizeProjectId(projectId: unknown): string | null { if (typeof projectId !== "string") { @@ -12,7 +20,11 @@ export function normalizeProjectId(projectId: unknown): string | null { } const normalized = projectId.trim(); - if (!normalized || INVALID_PROJECT_IDS.has(normalized)) { + if ( + !normalized || + INVALID_PROJECT_IDS.has(normalized) || + isDefaultProjectIdAlias(normalized) + ) { return null; } diff --git a/src/components/agent/chat/utils/webpageWorkbenchCommand.test.ts b/src/components/agent/chat/utils/webpageWorkbenchCommand.test.ts new file mode 100644 index 000000000..926499726 --- /dev/null +++ b/src/components/agent/chat/utils/webpageWorkbenchCommand.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, it } from "vitest"; +import { parseWebpageWorkbenchCommand } from "./webpageWorkbenchCommand"; + +describe("parseWebpageWorkbenchCommand", () => { + it("应解析带页面类型、风格和技术约束的 @网页 命令", () => { + const result = parseWebpageWorkbenchCommand( + "@网页 类型:落地页 风格:未来感 技术:原生 HTML 帮我做一个 AI 代码助手官网", + ); + + expect(result).toMatchObject({ + trigger: "@网页", + pageType: "landing_page", + style: "未来感", + techStack: "原生 HTML", + prompt: "帮我做一个 AI 代码助手官网", + }); + }); + + it("应兼容 @webpage 英文触发", () => { + const result = parseWebpageWorkbenchCommand( + "@webpage landing page for an AI note app with calm editorial style", + ); + + expect(result).toMatchObject({ + trigger: "@webpage", + pageType: "landing_page", + prompt: "for an AI note app with calm editorial style", + }); + }); + + it("没有显式字段时也应保留网页生成意图", () => { + const result = parseWebpageWorkbenchCommand( + "@网页 帮我生成一个新品发布活动页,突出预约按钮和核心卖点", + ); + + expect(result).toMatchObject({ + trigger: "@网页", + pageType: undefined, + prompt: "帮我生成一个新品发布活动页,突出预约按钮和核心卖点", + }); + }); + + it("非网页命令应返回空", () => { + expect(parseWebpageWorkbenchCommand("@排版 帮我整理这段文案")).toBeNull(); + }); +}); diff --git a/src/components/agent/chat/utils/webpageWorkbenchCommand.ts b/src/components/agent/chat/utils/webpageWorkbenchCommand.ts new file mode 100644 index 000000000..84662717f --- /dev/null +++ b/src/components/agent/chat/utils/webpageWorkbenchCommand.ts @@ -0,0 +1,168 @@ +export type WebpageWorkbenchCommandTrigger = + | "@网页" + | "@webpage" + | "@landing"; + +export type WebpageType = + | "landing_page" + | "homepage" + | "campaign_page" + | "product_page" + | "docs_page" + | "portfolio" + | "resume_page"; + +export interface ParsedWebpageWorkbenchCommand { + rawText: string; + trigger: WebpageWorkbenchCommandTrigger; + body: string; + prompt: string; + pageType?: WebpageType; + style?: string; + techStack?: string; +} + +const WEBPAGE_COMMAND_PREFIX_REGEX = + /^\s*(@网页|@webpage|@landing)(?:\s+|$)([\s\S]*)$/i; +const EXPLICIT_PAGE_TYPE_REGEX = + /(?:类型|页面类型|type)\s*[::=]?\s*(落地页|landing(?:\s+page)?|官网|首页|home(?:\s+page)?|活动页|campaign(?:\s+page)?|产品页|product(?:\s+page)?|文档页|docs?(?:\s+page)?|作品集|portfolio|简历页|resume(?:\s+page)?)(?=$|[\s,,。;;::])/i; +const LEADING_PAGE_TYPE_REGEX = + /^(落地页|landing(?:\s+page)?|官网|首页|home(?:\s+page)?|活动页|campaign(?:\s+page)?|产品页|product(?:\s+page)?|文档页|docs?(?:\s+page)?|作品集|portfolio|简历页|resume(?:\s+page)?)(?=$|[\s,,。;;::])/i; +const PROMPT_BOUNDARY_PATTERN = + String.raw`(?:\s+(?:帮我|给我|请|生成|制作|搭建|做一个|做个|create|generate|build))`; +const EXPLICIT_STYLE_REGEX = + new RegExp( + String.raw`(?:风格|style)\s*[::=]?\s*(.+?)(?=$|[,,。;;\n]|(?:\s+(?:技术|栈|tech|stack|framework|类型|页面类型|type)\s*[::=]?)|${PROMPT_BOUNDARY_PATTERN})`, + "i", + ); +const EXPLICIT_TECH_STACK_REGEX = + new RegExp( + String.raw`(?:技术|栈|tech|stack|framework)\s*[::=]?\s*(.+?)(?=$|[,,。;;\n]|(?:\s+(?:风格|style|类型|页面类型|type)\s*[::=]?)|${PROMPT_BOUNDARY_PATTERN})`, + "i", + ); +const PROMPT_PREFIX_REGEX = + /^\s*(生成|制作|搭建|做一个|做个|create|generate|build)(?:\s|$|[::])*/i; + +function normalizeTrigger(value: string): WebpageWorkbenchCommandTrigger { + const normalized = value.trim().toLowerCase(); + if (normalized === "@webpage") { + return "@webpage"; + } + if (normalized === "@landing") { + return "@landing"; + } + return "@网页"; +} + +function trimDecorations(value: string): string { + return value.replace(/^[,\s,。;;::]+|[,\s,。;;::]+$/g, "").trim(); +} + +function normalizePageType(value: string | undefined): WebpageType | undefined { + const normalized = value?.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + + if (normalized === "落地页" || normalized === "landing page" || normalized === "landing") { + return "landing_page"; + } + if ( + normalized === "官网" || + normalized === "首页" || + normalized === "home page" || + normalized === "homepage" || + normalized === "home" + ) { + return "homepage"; + } + if ( + normalized === "活动页" || + normalized === "campaign" || + normalized === "campaign page" + ) { + return "campaign_page"; + } + if ( + normalized === "产品页" || + normalized === "product" || + normalized === "product page" + ) { + return "product_page"; + } + if ( + normalized === "文档页" || + normalized === "docs" || + normalized === "doc" || + normalized === "docs page" || + normalized === "doc page" + ) { + return "docs_page"; + } + if (normalized === "作品集" || normalized === "portfolio") { + return "portfolio"; + } + if ( + normalized === "简历页" || + normalized === "resume" || + normalized === "resume page" + ) { + return "resume_page"; + } + return undefined; +} + +function stripField(body: string, regex: RegExp): string { + return body.replace(regex, " "); +} + +function stripPromptDecorations(body: string, pageType?: string): string { + const leadingPageTypeRegex = pageType + ? new RegExp( + `^${pageType.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?=$|[\\s,,。;;::])`, + "i", + ) + : /^$/; + + return trimDecorations( + stripField( + stripField( + stripField( + body.replace(leadingPageTypeRegex, "").replace(PROMPT_PREFIX_REGEX, ""), + EXPLICIT_PAGE_TYPE_REGEX, + ), + EXPLICIT_STYLE_REGEX, + ), + EXPLICIT_TECH_STACK_REGEX, + ) + .replace(PROMPT_PREFIX_REGEX, "") + .replace(/\s+/g, " "), + ); +} + +export function parseWebpageWorkbenchCommand( + text: string, +): ParsedWebpageWorkbenchCommand | null { + const matched = text.match(WEBPAGE_COMMAND_PREFIX_REGEX); + if (!matched) { + return null; + } + + const body = (matched[2] || "").trim(); + const explicitPageType = body.match(EXPLICIT_PAGE_TYPE_REGEX)?.[1]?.trim(); + const leadingPageType = body.match(LEADING_PAGE_TYPE_REGEX)?.[1]?.trim(); + const pageType = normalizePageType(explicitPageType || leadingPageType); + const style = trimDecorations(body.match(EXPLICIT_STYLE_REGEX)?.[1] || ""); + const techStack = trimDecorations(body.match(EXPLICIT_TECH_STACK_REGEX)?.[1] || ""); + const prompt = stripPromptDecorations(body, explicitPageType || leadingPageType); + + return { + rawText: text, + trigger: normalizeTrigger(matched[1] || ""), + body, + prompt, + pageType, + style: style || undefined, + techStack: techStack || undefined, + }; +} diff --git a/src/components/agent/chat/workspace/ServiceSkillExecutionCard.test.tsx b/src/components/agent/chat/workspace/ServiceSkillExecutionCard.test.tsx index ff96e826e..3de492bb7 100644 --- a/src/components/agent/chat/workspace/ServiceSkillExecutionCard.test.tsx +++ b/src/components/agent/chat/workspace/ServiceSkillExecutionCard.test.tsx @@ -103,12 +103,27 @@ describe("ServiceSkillExecutionCard", () => { content_id: "content-1", project_id: "project-1", title: "GitHub 仓库线索", + project_root_path: "/Users/coso/.proxycast/projects/project-1", + markdown_relative_path: + "exports/x-article-export/github-mcp/index.md", + images_relative_dir: + "exports/x-article-export/github-mcp/images", + image_count: 7, }, }, }, }); expect(container.textContent).toContain("已沉淀内容:GitHub 仓库线索"); + expect(container.textContent).toContain( + "项目目录:/Users/coso/.proxycast/projects/project-1", + ); + expect(container.textContent).toContain( + "Markdown 文件:exports/x-article-export/github-mcp/index.md", + ); + expect(container.textContent).toContain( + "图片资源:7 张 · exports/x-article-export/github-mcp/images", + ); expect( container.querySelector( '[data-testid="service-skill-execution-open-browser-runtime"]', diff --git a/src/components/agent/chat/workspace/ServiceSkillExecutionCard.tsx b/src/components/agent/chat/workspace/ServiceSkillExecutionCard.tsx index ccaeb69fd..4b96b101a 100644 --- a/src/components/agent/chat/workspace/ServiceSkillExecutionCard.tsx +++ b/src/components/agent/chat/workspace/ServiceSkillExecutionCard.tsx @@ -30,6 +30,13 @@ export function ServiceSkillExecutionCard({ } const resultTitle = state.result?.saved_content?.title?.trim(); + const projectRootPath = + state.result?.saved_content?.project_root_path?.trim() || ""; + const markdownRelativePath = + state.result?.saved_content?.markdown_relative_path?.trim() || ""; + const imagesRelativeDir = + state.result?.saved_content?.images_relative_dir?.trim() || ""; + const imageCount = state.result?.saved_content?.image_count; return (
    ) : null} + {projectRootPath ? ( +

    + 项目目录:{projectRootPath} +

    + ) : null} + {markdownRelativePath ? ( +

    + Markdown 文件:{markdownRelativePath} +

    + ) : null} + {typeof imageCount === "number" ? ( +

    + 图片资源:{imageCount} 张 + {imagesRelativeDir ? ` · ${imagesRelativeDir}` : ""} +

    + ) : null} {state.sourceUrl ? (

    来源页面:{state.sourceUrl} diff --git a/src/components/agent/chat/workspace/WorkspaceConversationScene.tsx b/src/components/agent/chat/workspace/WorkspaceConversationScene.tsx index 83a3b0a8f..9c1473e00 100644 --- a/src/components/agent/chat/workspace/WorkspaceConversationScene.tsx +++ b/src/components/agent/chat/workspace/WorkspaceConversationScene.tsx @@ -107,6 +107,7 @@ interface WorkspaceConversationSceneProps extends WorkspaceMainSceneProps { navbarVisible: boolean; isRunning: boolean; navbarChrome: ComponentProps["chrome"]; + navbarContextVariant?: "default" | "task-center"; onToggleHistory: NonNullable["onToggleHistory"]>; showHistoryToggle: boolean; onBackToProjectManagement?: ComponentProps< @@ -195,6 +196,7 @@ export function WorkspaceConversationScene({ navbarVisible, isRunning, navbarChrome, + navbarContextVariant = "default", onToggleHistory, showHistoryToggle, onBackToProjectManagement, @@ -304,6 +306,7 @@ export function WorkspaceConversationScene({ visible: navbarVisible, isRunning, chrome: navbarChrome, + navbarContextVariant, onToggleHistory, showHistoryToggle, onBackToProjectManagement, diff --git a/src/components/agent/chat/workspace/WorkspaceShellScene.tsx b/src/components/agent/chat/workspace/WorkspaceShellScene.tsx index 31ad6f22d..20f1d8200 100644 --- a/src/components/agent/chat/workspace/WorkspaceShellScene.tsx +++ b/src/components/agent/chat/workspace/WorkspaceShellScene.tsx @@ -9,6 +9,7 @@ type WorkspacePageShellProps = Omit< >; interface WorkspaceShellSceneProps extends WorkspacePageShellProps { + sidebarContextVariant?: ComponentProps["contextVariant"]; currentTopicId: ComponentProps["currentTopicId"]; topics: ComponentProps["topics"]; onNewChat: ComponentProps["onNewChat"]; @@ -44,6 +45,7 @@ export function WorkspaceShellScene({ showGeneralWorkbenchLeftExpandButton, onExpandGeneralWorkbenchSidebar, mainAreaNode, + sidebarContextVariant = "default", currentTopicId, topics, onNewChat, @@ -64,6 +66,7 @@ export function WorkspaceShellScene({ const chatSidebarProps = !isThemeWorkbench && showChatPanel && showSidebar ? buildWorkspaceChatSidebarProps({ + contextVariant: sidebarContextVariant, onNewChat, topics, currentTopicId, diff --git a/src/components/agent/chat/workspace/chatSurfaceProps.ts b/src/components/agent/chat/workspace/chatSurfaceProps.ts index 6450c1b5c..898de8635 100644 --- a/src/components/agent/chat/workspace/chatSurfaceProps.ts +++ b/src/components/agent/chat/workspace/chatSurfaceProps.ts @@ -228,6 +228,7 @@ interface BuildWorkspaceNavbarPropsParams { visible: boolean; isRunning: boolean; chrome: ComponentProps["chrome"]; + navbarContextVariant?: "default" | "task-center"; onToggleHistory: NonNullable["onToggleHistory"]>; showHistoryToggle: boolean; onBackToProjectManagement?: ComponentProps< @@ -263,6 +264,7 @@ export function buildWorkspaceNavbarProps({ visible, isRunning, chrome, + navbarContextVariant = "default", onToggleHistory, showHistoryToggle, onBackToProjectManagement, @@ -289,9 +291,18 @@ export function buildWorkspaceNavbarProps({ return null; } + const entryContextCopy = + navbarContextVariant === "task-center" + ? { + entryContextLabel: "任务中心", + entryContextHint: "回到进行中的任务、旧历史和最近工作现场。", + } + : {}; + return { isRunning, chrome, + ...entryContextCopy, onToggleHistory, showHistoryToggle, onToggleFullscreen: () => undefined, diff --git a/src/components/agent/chat/workspace/serviceSkillSceneLaunch.test.ts b/src/components/agent/chat/workspace/serviceSkillSceneLaunch.test.ts index 7f44201de..6851a0302 100644 --- a/src/components/agent/chat/workspace/serviceSkillSceneLaunch.test.ts +++ b/src/components/agent/chat/workspace/serviceSkillSceneLaunch.test.ts @@ -9,7 +9,10 @@ import { const mockGetSkillCatalog = vi.hoisted(() => vi.fn()); const mockListSkillCatalogSceneEntries = vi.hoisted(() => vi.fn()); +const mockListServiceSkills = vi.hoisted(() => vi.fn()); +const mockGetOrCreateDefaultProject = vi.hoisted(() => vi.fn()); const mockResolveOemCloudRuntimeContext = vi.hoisted(() => vi.fn()); +const mockSiteGetAdapterLaunchReadiness = vi.hoisted(() => vi.fn()); vi.mock("@/lib/api/skillCatalog", () => ({ getSkillCatalog: () => mockGetSkillCatalog(), @@ -17,10 +20,23 @@ vi.mock("@/lib/api/skillCatalog", () => ({ mockListSkillCatalogSceneEntries(catalog), })); +vi.mock("@/lib/api/serviceSkills", () => ({ + listServiceSkills: () => mockListServiceSkills(), +})); + +vi.mock("@/lib/api/project", () => ({ + getOrCreateDefaultProject: () => mockGetOrCreateDefaultProject(), +})); + vi.mock("@/lib/api/oemCloudRuntime", () => ({ resolveOemCloudRuntimeContext: () => mockResolveOemCloudRuntimeContext(), })); +vi.mock("@/lib/webview-api", () => ({ + siteGetAdapterLaunchReadiness: (...args: unknown[]) => + mockSiteGetAdapterLaunchReadiness(...args), +})); + function createCloudSceneSkill(): ServiceSkillHomeItem { return { id: "cloud-video-dubbing", @@ -46,20 +62,85 @@ function createCloudSceneSkill(): ServiceSkillHomeItem { }; } +function createXArticleExportSkill(): ServiceSkillHomeItem { + return { + id: "x-article-export", + skillKey: "x-article-export", + title: "X 文章转存", + summary: "复用 X 登录态把长文导出成 Markdown 和图片目录。", + category: "站点采集", + outputHint: "Markdown 正文 + 图片目录", + source: "local_custom", + runnerType: "instant", + defaultExecutorBinding: "browser_assist", + executionLocation: "client_default", + version: "seed-v1", + badge: "本地技能", + recentUsedAt: null, + isRecent: false, + runnerLabel: "浏览器站点执行", + runnerTone: "emerald", + runnerDescription: "直接复用浏览器登录态执行。", + actionLabel: "启动采集", + automationStatus: null, + slotSchema: [ + { + key: "article_url", + label: "X 文章链接", + type: "url", + required: true, + placeholder: "https://x.com/<账号>/article/<文章ID>", + }, + ], + readinessRequirements: { + requiresBrowser: true, + requiresProject: true, + }, + siteCapabilityBinding: { + adapterName: "x/article-export", + autoRun: true, + requireAttachedSession: true, + saveMode: "project_resource", + slotArgMap: { + article_url: "url", + }, + }, + sceneBinding: { + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + aliases: ["x文章转存", "x转存"], + }, + }; +} + describe("serviceSkillSceneLaunch", () => { beforeEach(() => { vi.clearAllMocks(); mockGetSkillCatalog.mockResolvedValue({ entries: [] }); mockListSkillCatalogSceneEntries.mockReturnValue([]); + mockListServiceSkills.mockResolvedValue([]); + mockGetOrCreateDefaultProject.mockResolvedValue({ + id: "project-default", + }); mockResolveOemCloudRuntimeContext.mockReturnValue(null); + mockSiteGetAdapterLaunchReadiness.mockResolvedValue(null); }); it("应解析 slash scene 命令", () => { - expect(parseRuntimeSceneCommand("/campaign-launch 帮我做一版新品活动方案")) - .toEqual({ - sceneKey: "campaign-launch", - userInput: "帮我做一版新品活动方案", - }); + expect( + parseRuntimeSceneCommand("/campaign-launch 帮我做一版新品活动方案"), + ).toEqual({ + sceneKey: "campaign-launch", + userInput: "帮我做一版新品活动方案", + }); + expect( + parseRuntimeSceneCommand("/x文章转存 https://x.com/a/article/1"), + ).toEqual({ + sceneKey: "x文章转存", + userInput: "https://x.com/a/article/1", + }); expect(parseRuntimeSceneCommand("campaign-launch")).toBeNull(); }); @@ -70,8 +151,12 @@ describe("serviceSkillSceneLaunch", () => { aliases: ["campaign", "launch"], }; - expect(matchesRuntimeSceneEntry(entry as never, "campaign-launch")).toBe(true); - expect(matchesRuntimeSceneEntry(entry as never, "/campaign-launch")).toBe(true); + expect(matchesRuntimeSceneEntry(entry as never, "campaign-launch")).toBe( + true, + ); + expect(matchesRuntimeSceneEntry(entry as never, "/campaign-launch")).toBe( + true, + ); expect(matchesRuntimeSceneEntry(entry as never, "campaign")).toBe(true); expect(matchesRuntimeSceneEntry(entry as never, "other")).toBe(false); }); @@ -137,4 +222,152 @@ describe("serviceSkillSceneLaunch", () => { }, }); }); + + it("site skill scene 应根据 skill 声明注入 service_skill_launch metadata", async () => { + mockGetSkillCatalog.mockResolvedValueOnce({ entries: [] }); + mockListSkillCatalogSceneEntries.mockReturnValueOnce([ + { + id: "scene:x-article-export", + kind: "scene", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + aliases: ["x文章转存", "x转存"], + linkedSkillId: "x-article-export", + executionKind: "site_adapter", + }, + ]); + mockSiteGetAdapterLaunchReadiness.mockResolvedValueOnce({ + status: "ready", + domain: "x.com", + profile_key: "existing-session-x", + target_id: "target-x-article", + message: "已复用当前附着的 X 会话", + report_hint: "将自动打开目标文章页。", + }); + + const request = await resolveRuntimeSceneLaunchRequest({ + rawText: + "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + serviceSkills: [createXArticleExportSkill()], + projectId: "project-1", + contentId: "content-1", + }); + + expect(request).not.toBeNull(); + const requestMetadata = buildServiceSceneLaunchRequestMetadata( + { + harness: { + chat_mode: "general", + }, + }, + request!.requestContext, + ); + + expect(requestMetadata).toMatchObject({ + harness: { + chat_mode: "general", + browser_requirement: "required", + browser_assist: { + enabled: true, + profile_key: "existing-session-x", + preferred_backend: "lime_extension_bridge", + auto_launch: false, + stream_mode: "both", + }, + service_skill_launch: { + kind: "site_adapter", + skill_id: "x-article-export", + adapter_name: "x/article-export", + save_mode: "project_resource", + project_id: "project-1", + content_id: undefined, + args: { + url: "https://x.com/GoogleCloudTech/article/2033953579824758855", + }, + launch_readiness: { + status: "ready", + profile_key: "existing-session-x", + target_id: "target-x-article", + domain: "x.com", + message: "已复用当前附着的 X 会话", + report_hint: "将自动打开目标文章页。", + }, + }, + }, + }); + }); + + it("site skill scene 缺少当前项目时应回退默认项目", async () => { + mockGetSkillCatalog.mockResolvedValueOnce({ entries: [] }); + mockListSkillCatalogSceneEntries.mockReturnValueOnce([ + { + id: "scene:x-article-export", + kind: "scene", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + aliases: ["x文章转存", "x转存"], + linkedSkillId: "x-article-export", + executionKind: "site_adapter", + }, + ]); + + const request = await resolveRuntimeSceneLaunchRequest({ + rawText: + "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + serviceSkills: [createXArticleExportSkill()], + projectId: null, + contentId: null, + }); + + expect(mockGetOrCreateDefaultProject).toHaveBeenCalledTimes(1); + expect(request).not.toBeNull(); + const requestMetadata = buildServiceSceneLaunchRequestMetadata( + undefined, + request!.requestContext, + ); + + expect(requestMetadata).toMatchObject({ + harness: { + service_skill_launch: { + project_id: "project-default", + adapter_name: "x/article-export", + }, + }, + }); + }); + + it("当前首页列表未暴露 scene 绑定 skill 时,应回退完整技能目录解析", async () => { + mockGetSkillCatalog.mockResolvedValueOnce({ entries: [] }); + mockListSkillCatalogSceneEntries.mockReturnValueOnce([ + { + id: "scene:x-article-export", + kind: "scene", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + linkedSkillId: "x-article-export", + executionKind: "site_adapter", + }, + ]); + mockListServiceSkills.mockResolvedValueOnce([createXArticleExportSkill()]); + + const request = await resolveRuntimeSceneLaunchRequest({ + rawText: + "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + serviceSkills: [], + projectId: "project-1", + }); + + expect(request?.skill.id).toBe("x-article-export"); + expect(request?.requestContext).toMatchObject({ + kind: "site_adapter", + adapterName: "x/article-export", + projectId: "project-1", + }); + }); }); diff --git a/src/components/agent/chat/workspace/serviceSkillSceneLaunch.ts b/src/components/agent/chat/workspace/serviceSkillSceneLaunch.ts index 3e16de506..3a08cbecf 100644 --- a/src/components/agent/chat/workspace/serviceSkillSceneLaunch.ts +++ b/src/components/agent/chat/workspace/serviceSkillSceneLaunch.ts @@ -3,8 +3,20 @@ import { listSkillCatalogSceneEntries, type SkillCatalogSceneEntry, } from "@/lib/api/skillCatalog"; +import { + listServiceSkills, + type ServiceSkillItem, +} from "@/lib/api/serviceSkills"; +import { getOrCreateDefaultProject } from "@/lib/api/project"; import { resolveOemCloudRuntimeContext } from "@/lib/api/oemCloudRuntime"; -import type { ServiceSkillHomeItem } from "../service-skills/types"; +import { siteGetAdapterLaunchReadiness } from "@/lib/webview-api"; +import { + buildServiceSkillClawLaunchContext, + buildServiceSkillClawLaunchRequestMetadata, + isServiceSkillSiteCapabilityBound, + type ServiceSkillClawLaunchContext, +} from "../service-skills/siteCapabilityBinding"; +import type { ServiceSkillSlotValues } from "../service-skills/types"; function asRecord(value: unknown): Record | undefined { if (!value || typeof value !== "object" || Array.isArray(value)) { @@ -29,11 +41,18 @@ interface ParsedRuntimeSceneCommand { } interface ServiceSceneLaunchRequest { - skill: ServiceSkillHomeItem; + skill: ServiceSkillItem; sceneEntry: SkillCatalogSceneEntry; requestContext: Record; } +export class RuntimeSceneLaunchValidationError extends Error { + constructor(message: string) { + super(message); + this.name = "RuntimeSceneLaunchValidationError"; + } +} + function normalizeCommandToken(value?: string | null): string { if (typeof value !== "string") { return ""; @@ -45,7 +64,7 @@ function normalizeCommandToken(value?: string | null): string { export function parseRuntimeSceneCommand( rawText: string, ): ParsedRuntimeSceneCommand | null { - const sceneMatch = rawText.trim().match(/^\/([a-zA-Z0-9_-]+)\s*([\s\S]*)$/); + const sceneMatch = rawText.trim().match(/^\/([^\s]+)\s*([\s\S]*)$/); if (!sceneMatch) { return null; } @@ -80,9 +99,9 @@ export function matchesRuntimeSceneEntry( } function resolveRuntimeSceneSkill( - serviceSkills: ServiceSkillHomeItem[], + serviceSkills: ServiceSkillItem[], entry: SkillCatalogSceneEntry, -): ServiceSkillHomeItem | null { +): ServiceSkillItem | null { const normalizedSceneKey = normalizeCommandToken(entry.sceneKey); if (!normalizedSceneKey) { return null; @@ -100,11 +119,115 @@ function resolveRuntimeSceneSkill( ); } +async function resolveRuntimeSceneSkillWithCatalogFallback( + serviceSkills: ServiceSkillItem[], + entry: SkillCatalogSceneEntry, +): Promise { + const matchedSkill = resolveRuntimeSceneSkill(serviceSkills, entry); + if (matchedSkill) { + return matchedSkill; + } + + try { + return resolveRuntimeSceneSkill(await listServiceSkills(), entry); + } catch { + return null; + } +} + +function extractFirstUrl(value: string): string | undefined { + const match = value.match(/https?:\/\/[^\s<>"'))]+/i); + return normalizeOptionalText(match?.[0]); +} + +function resolveSiteSceneSlotValues(params: { + sceneEntry: SkillCatalogSceneEntry; + skill: ServiceSkillItem; + userInput: string; +}): ServiceSkillSlotValues { + const { sceneEntry, skill, userInput } = params; + const normalizedUserInput = userInput.trim(); + + const resolvedSlotValues: ServiceSkillSlotValues = {}; + const singleUrlSlot = + skill.slotSchema.filter((slot) => slot.type === "url").length === 1 + ? skill.slotSchema.find((slot) => slot.type === "url") + : undefined; + if (singleUrlSlot) { + const matchedUrl = extractFirstUrl(normalizedUserInput); + if (matchedUrl) { + resolvedSlotValues[singleUrlSlot.key] = matchedUrl; + } + } + + const unresolvedRequiredSlots = skill.slotSchema.filter( + (slot) => slot.required && !resolvedSlotValues[slot.key], + ); + if (unresolvedRequiredSlots.length === 1 && normalizedUserInput) { + const [slot] = unresolvedRequiredSlots; + if (slot && slot.type !== "url") { + resolvedSlotValues[slot.key] = normalizedUserInput; + } + } + + const missingRequiredSlots = skill.slotSchema.filter( + (slot) => slot.required && !resolvedSlotValues[slot.key], + ); + if (missingRequiredSlots.length > 0) { + const slotLabels = missingRequiredSlots + .map((slot) => slot.label.trim()) + .filter(Boolean) + .join("、"); + if (slotLabels) { + throw new RuntimeSceneLaunchValidationError( + `请在 ${sceneEntry.commandPrefix} 后补${slotLabels}。`, + ); + } + throw new RuntimeSceneLaunchValidationError( + `请在 ${sceneEntry.commandPrefix} 后补完整参数。`, + ); + } + + return resolvedSlotValues; +} + +async function resolveSiteSceneProjectId( + skill: ServiceSkillItem, + projectId?: string | null, +): Promise { + const normalizedProjectId = normalizeOptionalText(projectId); + if (normalizedProjectId) { + return normalizedProjectId; + } + + const requiresProject = + skill.readinessRequirements?.requiresProject || + (skill.siteCapabilityBinding?.saveMode ?? "project_resource") === + "project_resource"; + if (!requiresProject) { + return undefined; + } + + try { + const defaultProject = await getOrCreateDefaultProject(); + const defaultProjectId = normalizeOptionalText(defaultProject?.id); + if (defaultProjectId) { + return defaultProjectId; + } + } catch { + // 统一在下方抛出稳定提示。 + } + + throw new RuntimeSceneLaunchValidationError( + "当前场景需要项目工作区,但默认项目准备失败,请先选择项目后再重试。", + ); +} + function buildServiceSceneLaunchRequestContext(params: { rawText: string; parsedCommand: ParsedRuntimeSceneCommand; sceneEntry: SkillCatalogSceneEntry; - skill: ServiceSkillHomeItem; + skill: ServiceSkillItem; projectId?: string | null; contentId?: string | null; }): Record { @@ -147,10 +270,82 @@ function buildServiceSceneLaunchRequestContext(params: { }; } +function buildSiteSceneLaunchRequestContext(params: { + parsedCommand: ParsedRuntimeSceneCommand; + sceneEntry: SkillCatalogSceneEntry; + skill: ServiceSkillItem; + projectId?: string; + contentId?: string | null; + launchReadiness?: Awaited< + ReturnType + > | null; +}): ServiceSkillClawLaunchContext { + const { + parsedCommand, + sceneEntry, + skill, + projectId, + contentId, + launchReadiness, + } = params; + + if (!isServiceSkillSiteCapabilityBound(skill)) { + throw new RuntimeSceneLaunchValidationError( + "当前场景没有绑定站点执行能力。", + ); + } + + const slotValues = resolveSiteSceneSlotValues({ + sceneEntry, + skill, + userInput: parsedCommand.userInput, + }); + const saveMode = skill.siteCapabilityBinding.saveMode ?? "project_resource"; + + return buildServiceSkillClawLaunchContext(skill, slotValues, { + projectId, + contentId: saveMode === "current_content" ? contentId : undefined, + launchReadiness, + }); +} + +async function resolveSiteSceneLaunchReadiness( + skill: ServiceSkillItem, +): Promise> | null> { + if (!isServiceSkillSiteCapabilityBound(skill)) { + return null; + } + + try { + return await siteGetAdapterLaunchReadiness({ + adapter_name: skill.siteCapabilityBinding.adapterName, + }); + } catch { + return null; + } +} + export function buildServiceSceneLaunchRequestMetadata( existingMetadata: Record | undefined, requestContext: Record, ): Record { + if (requestContext.kind === "site_adapter") { + const existingHarness = asRecord(existingMetadata?.harness); + const siteMetadata = buildServiceSkillClawLaunchRequestMetadata( + requestContext as ServiceSkillClawLaunchContext, + ); + const siteHarness = asRecord(siteMetadata.harness); + + return { + ...(existingMetadata || {}), + ...siteMetadata, + harness: { + ...(existingHarness || {}), + ...(siteHarness || {}), + }, + }; + } + const serviceSceneRun = asRecord(requestContext.service_scene_run); const existingHarness = asRecord(existingMetadata?.harness); @@ -177,7 +372,7 @@ export function buildServiceSceneLaunchRequestMetadata( export async function resolveRuntimeSceneLaunchRequest(params: { rawText: string; - serviceSkills: ServiceSkillHomeItem[]; + serviceSkills: ServiceSkillItem[]; projectId?: string | null; contentId?: string | null; }): Promise { @@ -194,21 +389,39 @@ export async function resolveRuntimeSceneLaunchRequest(params: { return null; } - const matchedSkill = resolveRuntimeSceneSkill(params.serviceSkills, sceneEntry); + const matchedSkill = await resolveRuntimeSceneSkillWithCatalogFallback( + params.serviceSkills, + sceneEntry, + ); if (!matchedSkill) { return null; } + const requestContext = + matchedSkill.defaultExecutorBinding === "browser_assist" + ? buildSiteSceneLaunchRequestContext({ + parsedCommand: parsedSceneCommand, + sceneEntry, + skill: matchedSkill, + projectId: await resolveSiteSceneProjectId( + matchedSkill, + params.projectId, + ), + contentId: params.contentId, + launchReadiness: await resolveSiteSceneLaunchReadiness(matchedSkill), + }) + : buildServiceSceneLaunchRequestContext({ + rawText: params.rawText, + parsedCommand: parsedSceneCommand, + sceneEntry, + skill: matchedSkill, + projectId: params.projectId, + contentId: params.contentId, + }); + return { skill: matchedSkill, sceneEntry, - requestContext: buildServiceSceneLaunchRequestContext({ - rawText: params.rawText, - parsedCommand: parsedSceneCommand, - sceneEntry, - skill: matchedSkill, - projectId: params.projectId, - contentId: params.contentId, - }), + requestContext, }; } diff --git a/src/components/agent/chat/workspace/useWorkspaceArtifactPreviewActions.ts b/src/components/agent/chat/workspace/useWorkspaceArtifactPreviewActions.ts index 6ccd4959f..4be295b7f 100644 --- a/src/components/agent/chat/workspace/useWorkspaceArtifactPreviewActions.ts +++ b/src/components/agent/chat/workspace/useWorkspaceArtifactPreviewActions.ts @@ -11,7 +11,10 @@ import type { LayoutMode, ThemeType } from "@/lib/workspace/workbenchContract"; import { readFilePreview } from "@/lib/api/fileBrowser"; import type { SessionFile } from "@/lib/api/session-files"; import type { Artifact } from "@/lib/artifact/types"; -import { resolveArtifactProtocolFilePath } from "@/lib/artifact-protocol"; +import { + areArtifactProtocolPathsEquivalent, + resolveArtifactProtocolFilePath, +} from "@/lib/artifact-protocol"; import type { TaskFile } from "../components/TaskFiles"; import type { HarnessFilePreviewResult } from "../components/HarnessStatusPanel"; import { useArtifactAutoPreviewSync } from "../hooks/useArtifactAutoPreviewSync"; @@ -280,7 +283,7 @@ export function useWorkspaceArtifactPreviewActions({ const matchingArtifact = artifacts.find((artifact) => { const artifactPath = resolveArtifactProtocolFilePath(artifact); return ( - artifactPath === fileName || + areArtifactProtocolPathsEquivalent(artifactPath, fileName) || artifact.title === extractFileNameFromPath(fileName) || (content.trim().length > 0 && artifact.content === content) ); diff --git a/src/components/agent/chat/workspace/useWorkspaceBrowserAssistRuntime.ts b/src/components/agent/chat/workspace/useWorkspaceBrowserAssistRuntime.ts index af9bf8ebb..ebdb1d43c 100644 --- a/src/components/agent/chat/workspace/useWorkspaceBrowserAssistRuntime.ts +++ b/src/components/agent/chat/workspace/useWorkspaceBrowserAssistRuntime.ts @@ -570,11 +570,18 @@ export function useWorkspaceBrowserAssistRuntime({ return; } + const hasMarkdownBundleOutput = Boolean( + result.saved_content?.markdown_relative_path?.trim(), + ); const successMessage = result.saved_content ? result.saved_by === "explicit_content" || result.saved_by === "context_content" - ? `站点技能已完成,结果已写回当前主稿` - : `站点技能已完成,结果已保存到项目资源` + ? hasMarkdownBundleOutput + ? "站点技能已完成,Markdown 已写回当前主稿并同步保存图片资源" + : "站点技能已完成,结果已写回当前主稿" + : hasMarkdownBundleOutput + ? "站点技能已完成,Markdown 与图片已保存到项目资源" + : "站点技能已完成,结果已保存到项目资源" : `站点技能已完成`; setSiteSkillExecutionState({ diff --git a/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.test.tsx b/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.test.tsx index e40bef65d..905aa0dfe 100644 --- a/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.test.tsx @@ -41,11 +41,13 @@ function renderHook(props?: Partial) { showTeamWorkspaceBoard: false, hasCurrentCanvasArtifact: false, currentCanvasArtifactType: null, + hasBrowserAssistArtifact: false, currentImageWorkbenchActive: false, onHasMessagesChange: vi.fn(), dismissActiveTeamWorkbenchAutoOpen: vi.fn(), suppressGeneralCanvasArtifactAutoOpen: vi.fn(), suppressBrowserAssistCanvasAutoOpen: vi.fn(), + clearBrowserAssistCanvasArtifact: vi.fn(), setShowSidebar: vi.fn(), setLayoutMode: vi.fn(), setGeneralCanvasState: vi.fn(), @@ -253,4 +255,53 @@ describe("useWorkspaceCanvasLayoutRuntime", () => { expect(setGeneralCanvasState).not.toHaveBeenCalled(); expect(setCanvasState).not.toHaveBeenCalled(); }); + + it("关闭通用画布时应一并移除残留的浏览器协助 artifact", async () => { + const dismissActiveTeamWorkbenchAutoOpen = vi.fn(); + const suppressGeneralCanvasArtifactAutoOpen = vi.fn(); + const suppressBrowserAssistCanvasAutoOpen = vi.fn(); + const clearBrowserAssistCanvasArtifact = vi.fn(); + const setLayoutMode = vi.fn(); + const setGeneralCanvasState = vi.fn(); + const { render, getValue } = renderHook({ + activeTheme: "general", + hasBrowserAssistArtifact: true, + dismissActiveTeamWorkbenchAutoOpen, + suppressGeneralCanvasArtifactAutoOpen, + suppressBrowserAssistCanvasAutoOpen, + clearBrowserAssistCanvasArtifact, + setLayoutMode, + setGeneralCanvasState, + }); + + await render(); + + act(() => { + getValue().handleCloseCanvas(); + }); + + expect(dismissActiveTeamWorkbenchAutoOpen).toHaveBeenCalledTimes(1); + expect(suppressGeneralCanvasArtifactAutoOpen).toHaveBeenCalledTimes(1); + expect(suppressBrowserAssistCanvasAutoOpen).toHaveBeenCalledTimes(1); + expect(clearBrowserAssistCanvasArtifact).toHaveBeenCalledTimes(1); + expect(setLayoutMode).toHaveBeenCalledWith("chat"); + + const updater = setGeneralCanvasState.mock.calls.at(-1)?.[0] as + | ((previous: GeneralCanvasState) => GeneralCanvasState) + | undefined; + expect(typeof updater).toBe("function"); + expect( + updater?.({ + isOpen: true, + contentType: "markdown", + content: "浏览器残留", + isEditing: false, + }), + ).toEqual({ + isOpen: false, + contentType: "markdown", + content: "浏览器残留", + isEditing: false, + }); + }); }); diff --git a/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.ts b/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.ts index 54d4b5057..fe35fb1c0 100644 --- a/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.ts +++ b/src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.ts @@ -40,11 +40,13 @@ interface UseWorkspaceCanvasLayoutRuntimeParams { showTeamWorkspaceBoard: boolean; hasCurrentCanvasArtifact: boolean; currentCanvasArtifactType?: string | null; + hasBrowserAssistArtifact: boolean; currentImageWorkbenchActive: boolean; onHasMessagesChange?: (hasMessages: boolean) => void; dismissActiveTeamWorkbenchAutoOpen: () => void; suppressGeneralCanvasArtifactAutoOpen: () => void; suppressBrowserAssistCanvasAutoOpen: () => void; + clearBrowserAssistCanvasArtifact: () => void; setShowSidebar: Dispatch>; setLayoutMode: Dispatch>; setGeneralCanvasState: Dispatch>; @@ -74,11 +76,13 @@ export function useWorkspaceCanvasLayoutRuntime({ showTeamWorkspaceBoard, hasCurrentCanvasArtifact, currentCanvasArtifactType, + hasBrowserAssistArtifact, currentImageWorkbenchActive, onHasMessagesChange, dismissActiveTeamWorkbenchAutoOpen, suppressGeneralCanvasArtifactAutoOpen, suppressBrowserAssistCanvasAutoOpen, + clearBrowserAssistCanvasArtifact, setShowSidebar, setLayoutMode, setGeneralCanvasState, @@ -404,8 +408,12 @@ export function useWorkspaceCanvasLayoutRuntime({ if (activeTheme === "general") { dismissActiveTeamWorkbenchAutoOpen(); suppressGeneralCanvasArtifactAutoOpen(); - if (currentCanvasArtifactType === "browser_assist") { + if ( + hasBrowserAssistArtifact || + currentCanvasArtifactType === "browser_assist" + ) { suppressBrowserAssistCanvasAutoOpen(); + clearBrowserAssistCanvasArtifact(); } } setLayoutMode("chat"); @@ -414,8 +422,10 @@ export function useWorkspaceCanvasLayoutRuntime({ } }, [ activeTheme, + clearBrowserAssistCanvasArtifact, currentCanvasArtifactType, dismissActiveTeamWorkbenchAutoOpen, + hasBrowserAssistArtifact, setGeneralCanvasState, setLayoutMode, suppressBrowserAssistCanvasAutoOpen, diff --git a/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts b/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts index bdbc99f35..3d7eff241 100644 --- a/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts +++ b/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts @@ -192,4 +192,15 @@ describe("useWorkspaceConversationSceneRuntime", () => { presentationParams?.canvasWorkbenchLayout?.onLayoutModeChange, ).toBeUndefined(); }); + + it("任务中心场景应继续向页面层透传顶栏上下文变体", () => { + const params = createBaseParams({ + navbarContextVariant: "task-center", + }); + + useWorkspaceConversationSceneRuntime(params); + + const presentationParams = mockPresentation.mock.calls.at(-1)?.[0]; + expect(presentationParams?.scene.navbarContextVariant).toBe("task-center"); + }); }); diff --git a/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx b/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx index 8d5fa99d7..ba5467a12 100644 --- a/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx @@ -28,6 +28,8 @@ type ConversationScenePresentationParams = Parameters< >[0]; interface UseWorkspaceConversationSceneRuntimeParams { + messageListEmptyStateVariant?: "default" | "task-center"; + navbarContextVariant?: "default" | "task-center"; navigationActions: NavigationActions; inputbarScene: InputbarScene; canvasScene: CanvasScene; @@ -154,6 +156,8 @@ interface UseWorkspaceConversationSceneRuntimeParams { } export function useWorkspaceConversationSceneRuntime({ + messageListEmptyStateVariant = "default", + navbarContextVariant = "default", navigationActions, inputbarScene, canvasScene, @@ -360,6 +364,7 @@ export function useWorkspaceConversationSceneRuntime({ navbarVisible: shellChromeRuntime.shouldRenderTopBar, isRunning: Boolean(isSending), navbarChrome: topBarChrome, + navbarContextVariant, onToggleHistory: handleToggleSidebar, showHistoryToggle: !hideHistoryToggle && showChatPanel, onBackToProjectManagement, @@ -408,6 +413,7 @@ export function useWorkspaceConversationSceneRuntime({ }, messageList: { messages: displayMessages, + emptyStateVariant: messageListEmptyStateVariant, turns, threadItems: effectiveThreadItems, currentTurnId, diff --git a/src/components/agent/chat/workspace/useWorkspaceConversationShellSceneRuntime.tsx b/src/components/agent/chat/workspace/useWorkspaceConversationShellSceneRuntime.tsx index 8edc7e3b9..bf25ac647 100644 --- a/src/components/agent/chat/workspace/useWorkspaceConversationShellSceneRuntime.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceConversationShellSceneRuntime.tsx @@ -54,6 +54,7 @@ interface UseWorkspaceConversationShellSceneRuntimeParams currentImageWorkbenchState: { active: boolean }; project: { rootPath?: string | null } | null; projectId: string | null | undefined; + sidebarContextVariant?: "default" | "task-center"; generalCanvasState: { content: string }; projectMemory: { characters?: ConversationSceneRuntimeParams["projectCharacters"]; @@ -81,6 +82,7 @@ export function useWorkspaceConversationShellSceneRuntime({ currentImageWorkbenchState, project, projectId, + sidebarContextVariant = "default", projectMemory, handleSend, showSidebar, @@ -131,6 +133,7 @@ export function useWorkspaceConversationShellSceneRuntime({ isThemeWorkbench: conversationScene.isThemeWorkbench, showChatPanel: conversationScene.showChatPanel, showSidebar, + sidebarContextVariant, generalWorkbenchShellRuntime, conversationSceneRuntime, sessionId: conversationScene.sessionId, diff --git a/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.test.tsx b/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.test.tsx index 733eb28be..453f79aad 100644 --- a/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.test.tsx @@ -118,7 +118,10 @@ function createArtifactOutput( function renderHook( props?: Partial, - options?: { initialMessages?: Message[] }, + options?: { + initialMessages?: Message[]; + initialImageWorkbenchState?: SessionImageWorkbenchState; + }, ) { const container = document.createElement("div"); document.body.appendChild(container); @@ -134,25 +137,25 @@ function renderHook( projectId: DEFAULT_PROJECT_ID, contentId: DEFAULT_CONTENT_ID, projectRootPath: DEFAULT_PROJECT_ROOT_PATH, + currentImageWorkbenchState: createInitialSessionImageWorkbenchState(), canvasState: null, }; function Probe(currentProps: RuntimeHarnessProps) { - const [messages, setMessages] = useState([]); + const [messages, setMessages] = useState( + () => options?.initialMessages || [], + ); const [canvasState, setCanvasState] = useState(currentProps.canvasState); const [imageWorkbenchState, setImageWorkbenchState] = useState( - createInitialSessionImageWorkbenchState(), + options?.initialImageWorkbenchState || + createInitialSessionImageWorkbenchState(), ); useEffect(() => { setCanvasState(currentProps.canvasState); }, [currentProps.canvasState]); - useEffect(() => { - setMessages(options?.initialMessages || []); - }, []); - latestValue = { messages, canvasState, @@ -161,6 +164,8 @@ function renderHook( useWorkspaceImageTaskPreviewRuntime({ ...currentProps, + messages, + currentImageWorkbenchState: imageWorkbenchState, canvasState, setCanvasState, setChatMessages: setMessages, @@ -330,6 +335,7 @@ describe("useWorkspaceImageTaskPreviewRuntime", () => { status: "running", projectId: "project-image-1", contentId: "content-image-1", + statusMessage: "任务已提交,正在排队处理。", }), }), ]); @@ -403,7 +409,7 @@ describe("useWorkspaceImageTaskPreviewRuntime", () => { ]); await act(async () => { - await vi.advanceTimersByTimeAsync(3000); + await vi.advanceTimersByTimeAsync(1500); await Promise.resolve(); }); @@ -539,6 +545,107 @@ describe("useWorkspaceImageTaskPreviewRuntime", () => { ]); }); + it("task file 仍是等待队列时,应立即优先采用媒体任务接口返回的完整结果", async () => { + let listener: CreationTaskListener | null = null; + vi.mocked(safeListen).mockImplementationOnce(async (_event, handler) => { + listener = handler; + return vi.fn(); + }); + + const taskId = "task-image-prefer-artifact-api-1"; + const taskPath = `/workspace/project-image-1/.lime/tasks/image_generate/${taskId}.json`; + vi.mocked(readFilePreview).mockResolvedValueOnce( + createFilePreviewResult( + taskPath, + withDefaultTaskContext({ + task_id: taskId, + task_type: "image_generate", + task_family: "image", + status: "queued", + normalized_status: "queued", + created_at: "2026-04-04T10:30:00Z", + payload: { + prompt: "[img:珠江夜景主视觉]", + count: 1, + size: "1024x1024", + }, + progress: { + phase: "queued", + message: "任务已进入队列", + }, + }), + ), + ); + vi.mocked(getMediaTaskArtifact).mockResolvedValueOnce( + createArtifactOutput({ + task_id: taskId, + task_type: "image_generate", + current_attempt_id: "attempt-prefer-artifact-api-1", + record: withDefaultTaskContext({ + task_id: taskId, + task_type: "image_generate", + task_family: "image", + status: "completed", + normalized_status: "succeeded", + created_at: "2026-04-04T10:30:01Z", + current_attempt_id: "attempt-prefer-artifact-api-1", + payload: { + prompt: "[img:珠江夜景主视觉]", + count: 1, + size: "1024x1024", + }, + result: { + images: [{ url: "https://example.com/prefer-artifact-api.png" }], + }, + attempts: [ + { + attempt_id: "attempt-prefer-artifact-api-1", + provider: "fal", + model: "flux-pro", + result_snapshot: { + images: [{ url: "https://example.com/prefer-artifact-api.png" }], + }, + }, + ], + }), + }), + ); + + const { render, getValue } = renderHook(); + await render(); + + await act(async () => { + listener?.({ + payload: withDefaultTaskContext({ + task_id: taskId, + task_type: "image_generate", + task_family: "image", + status: "queued", + path: `.lime/tasks/image_generate/${taskId}.json`, + }), + }); + await Promise.resolve(); + await Promise.resolve(); + }); + + expect(readFilePreview).toHaveBeenCalledWith(taskPath, 256 * 1024); + expect(getMediaTaskArtifact).toHaveBeenCalledWith({ + projectRootPath: DEFAULT_PROJECT_ROOT_PATH, + taskRef: taskId, + }); + expect(getValue().messages).toEqual([ + expect.objectContaining({ + id: `image-workbench:${taskId}:assistant`, + imageWorkbenchPreview: expect.objectContaining({ + taskId, + status: "complete", + imageUrl: "https://example.com/prefer-artifact-api.png", + prompt: "珠江夜景主视觉", + }), + }), + ]); + }); + it("已存在同 taskId 的 skill 消息时,应把 task 预览合并回原消息而不是再插一条伪造消息", async () => { let listener: CreationTaskListener | null = null; vi.mocked(safeListen).mockImplementationOnce(async (event, handler) => { @@ -893,6 +1000,155 @@ describe("useWorkspaceImageTaskPreviewRuntime", () => { expect(readFilePreview).not.toHaveBeenCalled(); }); + it("历史消息已带 taskId 时,应直接按 taskId 走媒体任务接口恢复图片结果", async () => { + const taskId = "task-image-history-direct-1"; + vi.mocked(getMediaTaskArtifact).mockResolvedValueOnce( + createArtifactOutput({ + task_id: taskId, + task_type: "image_generate", + record: withDefaultTaskContext({ + task_id: taskId, + task_type: "image_generate", + task_family: "image", + status: "completed", + normalized_status: "succeeded", + created_at: "2026-04-04T12:00:00Z", + payload: { + prompt: "[img:历史直恢广州春日主视觉]", + count: 1, + size: "1024x1024", + }, + result: { + images: [{ url: "https://example.com/history-direct-restore.png" }], + }, + }), + }), + ); + + const { render, getValue } = renderHook( + {}, + { + initialMessages: [ + { + id: `image-workbench:${taskId}:assistant`, + role: "assistant", + content: "图片任务已提交,正在同步任务状态。", + timestamp: new Date("2026-04-04T12:00:00Z"), + imageWorkbenchPreview: { + taskId, + prompt: "历史直恢广州春日主视觉", + status: "running", + phase: "queued", + }, + }, + ], + }, + ); + await render(); + + await act(async () => { + await Promise.resolve(); + await Promise.resolve(); + }); + + expect(getMediaTaskArtifact).toHaveBeenCalledWith({ + projectRootPath: DEFAULT_PROJECT_ROOT_PATH, + taskRef: taskId, + }); + expect(listMediaTaskArtifacts).not.toHaveBeenCalled(); + expect(getValue().messages).toEqual([ + expect.objectContaining({ + id: `image-workbench:${taskId}:assistant`, + imageWorkbenchPreview: expect.objectContaining({ + taskId, + status: "complete", + imageUrl: "https://example.com/history-direct-restore.png", + prompt: "历史直恢广州春日主视觉", + }), + }), + ]); + }); + + it("同一历史会话已缓存图片工作台结果时,应直接回填聊天卡而不是继续显示等待队列", async () => { + const taskId = "task-image-history-cached-1"; + const cachedState = { + ...createInitialSessionImageWorkbenchState(), + tasks: [ + { + sessionId: taskId, + id: taskId, + mode: "generate" as const, + status: "complete" as const, + prompt: "已缓存的广州主视觉", + rawText: "已缓存的广州主视觉", + expectedCount: 1, + outputIds: [`${taskId}:output:1`], + createdAt: Date.now(), + hookImageIds: [`${taskId}:hook:1`], + applyTarget: null, + }, + ], + outputs: [ + { + id: `${taskId}:output:1`, + taskId, + hookImageId: `${taskId}:hook:1`, + refId: `img-${taskId}`, + url: "https://example.com/history-cached.png", + prompt: "已缓存的广州主视觉", + createdAt: Date.now(), + size: "1024x1024", + parentOutputId: null, + resourceSaved: false, + applyTarget: null, + }, + ], + selectedOutputId: `${taskId}:output:1`, + }; + + const { render, getValue } = renderHook( + {}, + { + initialMessages: [ + { + id: `image-workbench:${taskId}:assistant`, + role: "assistant", + content: "图片任务已提交,正在同步任务状态。", + timestamp: new Date("2026-04-04T12:10:00Z"), + isThinking: true, + imageWorkbenchPreview: { + taskId, + prompt: "已缓存的广州主视觉", + status: "running", + phase: "queued", + }, + }, + ], + initialImageWorkbenchState: cachedState, + }, + ); + await render(); + + await act(async () => { + await Promise.resolve(); + await Promise.resolve(); + }); + + expect(getMediaTaskArtifact).not.toHaveBeenCalled(); + expect(getValue().messages).toEqual([ + expect.objectContaining({ + id: `image-workbench:${taskId}:assistant`, + isThinking: false, + imageWorkbenchPreview: expect.objectContaining({ + taskId, + status: "complete", + imageUrl: "https://example.com/history-cached.png", + size: "1024x1024", + }), + }), + ]); + }); + it("应在进入会话时从 task file 恢复最近的图片任务", async () => { vi.mocked(listDirectory) .mockResolvedValueOnce( diff --git a/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.ts b/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.ts index ccae6eac4..c1afefa5a 100644 --- a/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.ts +++ b/src/components/agent/chat/workspace/useWorkspaceImageTaskPreviewRuntime.ts @@ -24,7 +24,7 @@ import { const IMAGE_TASK_EVENT_NAME = "lime://creation_task_submitted"; const IMAGE_TASK_FILE_PREVIEW_MAX_SIZE = 256 * 1024; -const IMAGE_TASK_POLL_INTERVAL_MS = 3000; +const IMAGE_TASK_POLL_INTERVAL_MS = 1500; const IMAGE_TASK_RESTORE_LOOKBACK_MS = 24 * 60 * 60 * 1000; const IMAGE_TASK_RESTORE_LIMIT = 8; const IMAGE_TASKS_ROOT_RELATIVE_PATH = ".lime/tasks"; @@ -80,6 +80,8 @@ interface UseWorkspaceImageTaskPreviewRuntimeParams { contentId?: string | null; projectRootPath?: string | null; restoreFromWorkspace?: boolean; + messages?: Message[]; + currentImageWorkbenchState?: SessionImageWorkbenchState; canvasState: CanvasStateUnion | null; setCanvasState: Dispatch>; setChatMessages: Dispatch>; @@ -107,6 +109,84 @@ interface RestoredImageTaskSnapshot extends LoadedImageTaskSnapshot { taskFamily: string; } +function shouldPreferLoadedImageTaskSnapshot( + current: LoadedImageTaskSnapshot | null, + candidate: LoadedImageTaskSnapshot | null, +): boolean { + if (!candidate) { + return false; + } + if (!current) { + return true; + } + + const currentIsTerminal = current.snapshot.terminal; + const candidateIsTerminal = candidate.snapshot.terminal; + if (currentIsTerminal !== candidateIsTerminal) { + return candidateIsTerminal; + } + + const currentOutputCount = current.snapshot.outputs.length; + const candidateOutputCount = candidate.snapshot.outputs.length; + if (currentOutputCount !== candidateOutputCount) { + return candidateOutputCount > currentOutputCount; + } + + return candidate.snapshot.updatedAt > current.snapshot.updatedAt; +} + +function collectSeedImageTaskIds(messages?: Message[]): string[] { + if (!messages || messages.length === 0) { + return []; + } + + const taskIds: string[] = []; + const seen = new Set(); + messages.forEach((message) => { + if (message.role !== "assistant") { + return; + } + + const taskId = message.imageWorkbenchPreview?.taskId?.trim(); + if (!taskId || seen.has(taskId)) { + return; + } + + seen.add(taskId); + taskIds.push(taskId); + }); + return taskIds; +} + +function isImageWorkbenchTaskSatisfiedByCache(params: { + imageWorkbenchState?: SessionImageWorkbenchState; + taskId: string; +}): boolean { + const imageWorkbenchState = params.imageWorkbenchState; + if (!imageWorkbenchState) { + return false; + } + + const task = imageWorkbenchState.tasks.find((item) => item.id === params.taskId); + if (!task) { + return false; + } + + const outputs = imageWorkbenchState.outputs.filter( + (output) => output.taskId === params.taskId, + ); + if (outputs.length > 0) { + return true; + } + + return ( + task.status === "cancelled" || + task.status === "error" || + task.status === "partial" || + task.status === "complete" + ); +} + function asRecord(value: unknown): Record | null { if (!value || typeof value !== "object" || Array.isArray(value)) { return null; @@ -1083,7 +1163,7 @@ function buildParsedImageTaskSnapshot(params: { readString([progressRecord], ["message"]) || (prompt ? `正在处理:${prompt}` - : "任务已提交到异步队列,结果会自动回填。"), + : "任务已提交,生成完成后会自动展示结果。"), checkpoints: ["创建任务文件", "轮询任务状态", "回填图片结果"], } : previewStatus === "cancelled" @@ -1202,7 +1282,7 @@ function buildPendingImageTaskSnapshot(params: { phase: resolvePendingProgressPhase(params.status), message: params.progressMessage || - "任务已提交到异步队列,正在同步任务状态。", + "任务已提交,正在排队处理。", }, created_at: new Date().toISOString(), }, @@ -1237,7 +1317,7 @@ function buildPendingImageTaskSnapshot(params: { phase: resolvePendingProgressPhase(params.status), statusMessage: params.progressMessage || - "任务已提交到异步队列,正在同步任务状态。", + "任务已提交,正在排队处理。", }, }, task: { @@ -1394,23 +1474,131 @@ function mergeImageTaskSnapshot( }; } +function resolvePreviewStatusFromWorkbenchTask( + status: ImageWorkbenchTask["status"], +): MessageImageWorkbenchPreview["status"] { + switch (status) { + case "complete": + return "complete"; + case "partial": + return "partial"; + case "cancelled": + return "cancelled"; + case "error": + return "failed"; + case "queued": + case "routing": + case "running": + default: + return "running"; + } +} + +function patchMessagesWithImageWorkbenchState(params: { + messages: Message[]; + imageWorkbenchState?: SessionImageWorkbenchState; +}): Message[] { + const imageWorkbenchState = params.imageWorkbenchState; + if (!imageWorkbenchState || params.messages.length === 0) { + return params.messages; + } + + const outputsByTaskId = new Map(); + imageWorkbenchState.outputs.forEach((output) => { + const current = outputsByTaskId.get(output.taskId) || []; + current.push(output); + outputsByTaskId.set(output.taskId, current); + }); + + let changed = false; + const nextMessages = params.messages.map((message) => { + const preview = message.imageWorkbenchPreview; + if (!preview?.taskId) { + return message; + } + + const task = imageWorkbenchState.tasks.find((item) => item.id === preview.taskId); + if (!task) { + return message; + } + + const outputs = outputsByTaskId.get(task.id) || []; + const preferredOutput = + task.outputIds + .map((outputId) => outputs.find((output) => output.id === outputId)) + .find((output): output is ImageWorkbenchOutput => Boolean(output)) || + outputs[0]; + const nextPreview: MessageImageWorkbenchPreview = { + ...preview, + prompt: preview.prompt || task.prompt, + mode: task.mode, + status: resolvePreviewStatusFromWorkbenchTask(task.status), + imageUrl: preferredOutput?.url || preview.imageUrl || null, + imageCount: outputs.length > 0 ? outputs.length : preview.imageCount, + sourceImageUrl: task.sourceImageUrl ?? preview.sourceImageUrl ?? null, + sourceImagePrompt: + task.sourceImagePrompt ?? preview.sourceImagePrompt ?? null, + sourceImageRef: task.sourceImageRef ?? preview.sourceImageRef ?? null, + sourceImageCount: task.sourceImageCount ?? preview.sourceImageCount, + size: preferredOutput?.size || preview.size, + retryable: + typeof preview.retryable === "boolean" + ? preview.retryable + : task.status === "error" + ? false + : preview.retryable, + }; + + const hasChanged = + nextPreview.status !== preview.status || + nextPreview.imageUrl !== preview.imageUrl || + nextPreview.imageCount !== preview.imageCount || + nextPreview.size !== preview.size || + nextPreview.sourceImageUrl !== preview.sourceImageUrl || + nextPreview.sourceImagePrompt !== preview.sourceImagePrompt || + nextPreview.sourceImageRef !== preview.sourceImageRef || + nextPreview.sourceImageCount !== preview.sourceImageCount || + nextPreview.mode !== preview.mode; + + if (!hasChanged) { + return message; + } + + changed = true; + return { + ...message, + isThinking: + nextPreview.status === "running" ? message.isThinking : false, + imageWorkbenchPreview: nextPreview, + }; + }); + + return changed ? nextMessages : params.messages; +} + export function useWorkspaceImageTaskPreviewRuntime({ sessionId, projectId, contentId, projectRootPath, restoreFromWorkspace = true, + messages, + currentImageWorkbenchState, canvasState, setCanvasState, setChatMessages, updateCurrentImageWorkbenchState, }: UseWorkspaceImageTaskPreviewRuntimeParams) { const trackedTasksRef = useRef>(new Map()); + const restoreSeedMessagesRef = useRef< + ((seedMessages?: Message[]) => void) | null + >(null); const runtimeContextRef = useRef({ sessionId, projectId, contentId, projectRootPath, + messages, canvasState, }); @@ -1419,9 +1607,24 @@ export function useWorkspaceImageTaskPreviewRuntime({ projectId, contentId, projectRootPath, + messages, + currentImageWorkbenchState, canvasState, }; + useEffect(() => { + setChatMessages((previous) => + patchMessagesWithImageWorkbenchState({ + messages: previous, + imageWorkbenchState: currentImageWorkbenchState, + }), + ); + }, [currentImageWorkbenchState, setChatMessages]); + + useEffect(() => { + restoreSeedMessagesRef.current?.(messages); + }, [messages, projectRootPath, sessionId]); + useEffect(() => { const trackedTasks = trackedTasksRef.current; trackedTasks.forEach((trackedTask) => { @@ -1433,6 +1636,7 @@ export function useWorkspaceImageTaskPreviewRuntime({ let cancelled = false; let unlisten: (() => void) | null = null; + const restoredSeedTaskIds = new Set(); const loadTaskSnapshotFromArtifactApi = async ( taskId: string, @@ -1491,6 +1695,27 @@ export function useWorkspaceImageTaskPreviewRuntime({ }); }; + const trackTaskForPolling = (params: { + taskId: string; + taskType?: string; + absolutePath?: string; + artifactPath?: string; + }) => { + const existing = trackedTasks.get(params.taskId); + if (existing?.timerId !== null) { + window.clearTimeout(existing.timerId); + } + trackedTasks.set(params.taskId, { + taskId: params.taskId, + taskType: params.taskType || existing?.taskType || "image_generate", + taskFamily: "image", + artifactPath: params.artifactPath || existing?.artifactPath || "", + absolutePath: params.absolutePath || existing?.absolutePath || "", + timerId: null, + polling: false, + }); + }; + const scheduleNextPoll = (taskId: string) => { const trackedTask = trackedTasks.get(taskId); if (!trackedTask || cancelled) { @@ -1549,8 +1774,21 @@ export function useWorkspaceImageTaskPreviewRuntime({ loadedSnapshot = null; } - if (!loadedSnapshot) { - loadedSnapshot = await loadTaskSnapshotFromArtifactApi(taskId); + const shouldProbeArtifactApi = + !loadedSnapshot || + !loadedSnapshot.snapshot.terminal || + loadedSnapshot.snapshot.outputs.length === 0; + + if (shouldProbeArtifactApi) { + const artifactSnapshot = await loadTaskSnapshotFromArtifactApi(taskId); + if ( + shouldPreferLoadedImageTaskSnapshot( + loadedSnapshot, + artifactSnapshot, + ) + ) { + loadedSnapshot = artifactSnapshot; + } } if (!loadedSnapshot) { scheduleNextPoll(taskId); @@ -1770,6 +2008,73 @@ export function useWorkspaceImageTaskPreviewRuntime({ } }; + const restoreTrackedTasksFromMessages = async ( + seedMessages?: Message[], + ): Promise => { + const taskIds = collectSeedImageTaskIds( + seedMessages || runtimeContextRef.current.messages, + ).filter((taskId) => !restoredSeedTaskIds.has(taskId)); + if (taskIds.length === 0 || cancelled) { + return false; + } + + taskIds.forEach((taskId) => { + restoredSeedTaskIds.add(taskId); + }); + + const unresolvedTaskIds = taskIds.filter( + (taskId) => + !isImageWorkbenchTaskSatisfiedByCache({ + imageWorkbenchState: runtimeContextRef.current.currentImageWorkbenchState, + taskId, + }), + ); + if (unresolvedTaskIds.length === 0) { + return true; + } + + const loadedSnapshots = await Promise.all( + unresolvedTaskIds.map(async (taskId) => ({ + taskId, + loaded: await loadTaskSnapshotFromArtifactApi(taskId), + })), + ); + if (cancelled) { + return false; + } + + const resolvedSnapshots = loadedSnapshots.filter( + ( + item, + ): item is { + taskId: string; + loaded: LoadedImageTaskSnapshot; + } => Boolean(item.loaded), + ); + if (resolvedSnapshots.length === 0) { + return false; + } + + resolvedSnapshots.forEach((item) => { + applyLoadedTaskSnapshot(item.loaded); + if (!item.loaded.snapshot.terminal) { + trackTaskForPolling({ + taskId: item.taskId, + }); + scheduleNextPoll(item.taskId); + } + }); + + return resolvedSnapshots.length === taskIds.length; + }; + + restoreSeedMessagesRef.current = (seedMessages) => { + if (!restoreFromWorkspace || cancelled) { + return; + } + void restoreTrackedTasksFromMessages(seedMessages); + }; + safeListen(IMAGE_TASK_EVENT_NAME, (event) => { if (cancelled) { return; @@ -1793,6 +2098,18 @@ export function useWorkspaceImageTaskPreviewRuntime({ } const artifactPath = payload.path?.trim() || payload.absolute_path?.trim() || ""; + const normalizedEventStatus = normalizeTaskStatus(payload.status); + const progressMessage = payload.reused_existing + ? "已复用现有图片任务,正在同步最新状态。" + : normalizedEventStatus === "succeeded" + ? "图片已生成完成,可在右侧查看结果。" + : normalizedEventStatus === "partial" + ? "图片已返回部分结果,可在右侧继续查看。" + : normalizedEventStatus === "failed" + ? "图片任务执行失败,可查看详情后重试。" + : normalizedEventStatus === "cancelled" + ? "图片任务已取消。" + : "任务已提交,正在排队处理。"; const pendingSnapshot = taskId && taskType && taskFamily === "image" ? buildPendingImageTaskSnapshot({ @@ -1816,9 +2133,7 @@ export function useWorkspaceImageTaskPreviewRuntime({ anchor_section_title: payload.anchor_section_title, anchor_text: payload.anchor_text, }, - progressMessage: payload.reused_existing - ? "已复用现有图片任务,正在同步最新状态。" - : "任务已提交到异步队列,正在同步任务状态。", + progressMessage, projectId: payload.project_id || runtimeContextRef.current.projectId, contentId: @@ -1905,11 +2220,16 @@ export function useWorkspaceImageTaskPreviewRuntime({ }); if (restoreFromWorkspace) { - void restoreTrackedTasksFromWorkspace(); + void restoreTrackedTasksFromMessages().then((restoredFromMessages) => { + if (!restoredFromMessages) { + void restoreTrackedTasksFromWorkspace(); + } + }); } return () => { cancelled = true; + restoreSeedMessagesRef.current = null; trackedTasks.forEach((trackedTask) => { if (trackedTask.timerId !== null) { window.clearTimeout(trackedTask.timerId); diff --git a/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.test.tsx b/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.test.tsx index 72932c3d6..99c17e7ec 100644 --- a/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.test.tsx @@ -52,7 +52,6 @@ function renderHook(props?: Partial) { status: "cancelled", }), contentId: null, - createFreshSession: vi.fn().mockResolvedValue("session-1"), createImageGenerationTask: vi.fn().mockResolvedValue({ task_id: "task-image-1", task_type: "image_generate", @@ -116,7 +115,6 @@ function renderHook(props?: Partial) { setCanvasState: vi.fn(), setInput: vi.fn(), setLayoutMode: vi.fn(), - updateImageWorkbenchStateForSession: vi.fn(), updateCurrentImageWorkbenchState: vi.fn(), }; @@ -215,17 +213,13 @@ describe("useWorkspaceImageWorkbenchActionRuntime", () => { expect(toast.error).not.toHaveBeenCalled(); }); - it("本地图片工作台 key 首次提交时应先创建真实会话,并把 Agent 请求绑定到该会话", async () => { - const createFreshSession = vi.fn().mockResolvedValue("session-image-1"); + it("本地图片工作台 key 首次提交时应保留统一发送主线,延后由发送边界绑定真实会话", async () => { const submitImageWorkbenchAgentCommand = vi.fn().mockResolvedValue(true); - const updateImageWorkbenchStateForSession = vi.fn(); const localImageWorkbenchSessionKey = "__local_image_workbench__:draft:image"; const { render, getValue } = renderHook({ - createFreshSession, submitImageWorkbenchAgentCommand, imageWorkbenchSessionKey: localImageWorkbenchSessionKey, - updateImageWorkbenchStateForSession, }); await render(); @@ -238,27 +232,15 @@ describe("useWorkspaceImageWorkbenchActionRuntime", () => { }); }); - expect(createFreshSession).toHaveBeenCalledWith("配图:城市夜景主视觉"); expect(submitImageWorkbenchAgentCommand).toHaveBeenCalledWith( expect.objectContaining({ requestContext: expect.objectContaining({ image_task: expect.objectContaining({ - session_id: "session-image-1", + session_id: localImageWorkbenchSessionKey, }), }), }), ); - expect(updateImageWorkbenchStateForSession).toHaveBeenCalledWith( - "session-image-1", - expect.any(Function), - expect.objectContaining({ - fallbackState: expect.objectContaining({ - tasks: [], - outputs: [], - }), - removeSessionKeys: [localImageWorkbenchSessionKey], - }), - ); }); it("应把编辑命令解析为统一的 skillRequest 上下文", async () => { diff --git a/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.ts b/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.ts index f32650dab..4273ca290 100644 --- a/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.ts +++ b/src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.ts @@ -18,8 +18,6 @@ import { onImageWorkbenchTaskAction } from "@/lib/imageWorkbenchEvents"; import type { MessageImage } from "../types"; import { parseImageWorkbenchCommand } from "../utils/imageWorkbenchCommand"; import { - buildImageWorkbenchSessionTitle, - isLocalImageWorkbenchSessionKey, resolveImageWorkbenchSkillRequest, } from "./imageSkillLaunch"; import { @@ -44,7 +42,6 @@ export interface SubmitImageWorkbenchAgentCommandParams { interface UseWorkspaceImageWorkbenchActionRuntimeParams { contentId?: string | null; - createFreshSession: (sessionName?: string) => Promise; createImageGenerationTask: ( request: CreateImageGenerationTaskArtifactRequest, ) => Promise; @@ -69,16 +66,6 @@ interface UseWorkspaceImageWorkbenchActionRuntimeParams { setCanvasState: Dispatch>; setInput: Dispatch>; setLayoutMode: Dispatch>; - updateImageWorkbenchStateForSession: ( - sessionKey: string, - updater: ( - current: SessionImageWorkbenchState, - ) => SessionImageWorkbenchState, - options?: { - fallbackState?: SessionImageWorkbenchState; - removeSessionKeys?: string[]; - }, - ) => void; updateCurrentImageWorkbenchState: ( updater: ( current: SessionImageWorkbenchState, @@ -271,7 +258,6 @@ function matchesTaskActionContext(params: { export function useWorkspaceImageWorkbenchActionRuntime({ cancelImageTask, contentId, - createFreshSession, createImageGenerationTask, getImageTask, currentImageWorkbenchState, @@ -286,43 +272,19 @@ export function useWorkspaceImageWorkbenchActionRuntime({ setCanvasState, setInput, setLayoutMode, - updateImageWorkbenchStateForSession, updateCurrentImageWorkbenchState, }: UseWorkspaceImageWorkbenchActionRuntimeParams) { const resolveImageWorkbenchSessionKey = useCallback( - async (params: { - preferredSessionKey?: string | null; - mode: NonNullable>["mode"]; - prompt: string; - }) => { + async (params: { preferredSessionKey?: string | null }) => { const normalizedPreferredSessionKey = params.preferredSessionKey?.trim() || null; - if ( - normalizedPreferredSessionKey && - !isLocalImageWorkbenchSessionKey(normalizedPreferredSessionKey) - ) { + if (normalizedPreferredSessionKey) { return normalizedPreferredSessionKey; } - const normalizedCurrentSessionKey = imageWorkbenchSessionKey.trim(); - if ( - normalizedCurrentSessionKey && - !isLocalImageWorkbenchSessionKey(normalizedCurrentSessionKey) - ) { - return normalizedCurrentSessionKey; - } - - const createdSessionId = await createFreshSession( - buildImageWorkbenchSessionTitle(params.mode, params.prompt), - ); - const normalizedCreatedSessionId = createdSessionId?.trim(); - if (!normalizedCreatedSessionId) { - throw new Error("图片会话创建失败,请稍后重试"); - } - - return normalizedCreatedSessionId; + return imageWorkbenchSessionKey.trim() || null; }, - [createFreshSession, imageWorkbenchSessionKey], + [imageWorkbenchSessionKey], ); const handleImageWorkbenchViewportChange = useCallback( @@ -724,10 +686,7 @@ export function useWorkspaceImageWorkbenchActionRuntime({ return false; } - const resolvedSessionKey = await resolveImageWorkbenchSessionKey({ - mode: params.parsedCommand.mode, - prompt: effectivePrompt, - }); + const resolvedSessionKey = await resolveImageWorkbenchSessionKey({}); const skillRequest = resolveImageWorkbenchSkillRequest({ rawText: params.rawText, @@ -751,17 +710,6 @@ export function useWorkspaceImageWorkbenchActionRuntime({ return false; } - if (resolvedSessionKey !== imageWorkbenchSessionKey) { - updateImageWorkbenchStateForSession( - resolvedSessionKey, - (current) => current, - { - fallbackState: currentImageWorkbenchState, - removeSessionKeys: [imageWorkbenchSessionKey], - }, - ); - } - return submitImageWorkbenchAgentCommand({ rawText: params.rawText, displayContent: params.rawText, @@ -780,7 +728,6 @@ export function useWorkspaceImageWorkbenchActionRuntime({ projectRootPath, resolveImageWorkbenchSessionKey, submitImageWorkbenchAgentCommand, - updateImageWorkbenchStateForSession, ], ); diff --git a/src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx b/src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx index 31a16a39a..73defd433 100644 --- a/src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx @@ -3,28 +3,50 @@ import { createRoot } from "react-dom/client"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { TeamMemorySnapshot } from "@/lib/teamMemorySync"; import type { ServiceSkillHomeItem } from "../service-skills/types"; +import { listMentionEntryUsage } from "../skill-selection/mentionEntryUsage"; +import { listServiceSkillUsage } from "../service-skills/storage"; import { useWorkspaceSendActions } from "./useWorkspaceSendActions"; import type { TeamWorkspaceRuntimeFormationState } from "../teamWorkspaceRuntime"; +import { listSlashEntryUsage } from "../skill-selection/slashEntryUsage"; const mockPreheatBrowserAssistInBackground = vi.hoisted(() => vi.fn()); const mockGetSkillCatalog = vi.hoisted(() => vi.fn()); const mockListSkillCatalogSceneEntries = vi.hoisted(() => vi.fn()); +const mockGetOrCreateDefaultProject = vi.hoisted(() => vi.fn()); const mockResolveOemCloudRuntimeContext = vi.hoisted(() => vi.fn()); vi.mock("../utils/browserAssistPreheat", () => ({ preheatBrowserAssistInBackground: mockPreheatBrowserAssistInBackground, })); -vi.mock("@/lib/api/skillCatalog", () => ({ - getSkillCatalog: () => mockGetSkillCatalog(), - listSkillCatalogSceneEntries: (catalog: unknown) => - mockListSkillCatalogSceneEntries(catalog), -})); +vi.mock("@/lib/api/skillCatalog", async () => { + const actual = await vi.importActual( + "@/lib/api/skillCatalog", + ); + + return { + ...actual, + getSkillCatalog: () => mockGetSkillCatalog(), + listSkillCatalogSceneEntries: (catalog: unknown) => + mockListSkillCatalogSceneEntries(catalog), + }; +}); vi.mock("@/lib/api/oemCloudRuntime", () => ({ resolveOemCloudRuntimeContext: () => mockResolveOemCloudRuntimeContext(), })); +vi.mock("@/lib/api/project", async () => { + const actual = await vi.importActual( + "@/lib/api/project", + ); + + return { + ...actual, + getOrCreateDefaultProject: () => mockGetOrCreateDefaultProject(), + }; +}); + type HookProps = Parameters[0]; interface HookHarness { @@ -138,6 +160,86 @@ function createCloudSceneSkill(): ServiceSkillHomeItem { }; } +function createXArticleExportSkill(): ServiceSkillHomeItem { + return { + id: "x-article-export", + skillKey: "x-article-export", + title: "X 文章转存", + summary: "复用 X 登录态把长文导出成 Markdown 和图片目录。", + category: "站点采集", + outputHint: "Markdown 正文 + 图片目录", + source: "local_custom", + runnerType: "instant", + defaultExecutorBinding: "browser_assist", + executionLocation: "client_default", + version: "seed-v1", + badge: "本地技能", + recentUsedAt: null, + isRecent: false, + runnerLabel: "浏览器站点执行", + runnerTone: "emerald", + runnerDescription: "直接复用浏览器登录态执行。", + actionLabel: "启动采集", + automationStatus: null, + slotSchema: [ + { + key: "article_url", + label: "X 文章链接", + type: "url", + required: true, + placeholder: "https://x.com/<账号>/article/<文章ID>", + }, + ], + readinessRequirements: { + requiresBrowser: true, + requiresProject: true, + }, + siteCapabilityBinding: { + adapterName: "x/article-export", + autoRun: true, + requireAttachedSession: true, + saveMode: "project_resource", + slotArgMap: { + article_url: "url", + }, + }, + sceneBinding: { + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + aliases: ["x文章转存", "x转存"], + }, + }; +} + +function createGeneralServiceSkill( + overrides: Partial = {}, +): ServiceSkillHomeItem { + return { + id: "research", + title: "搜索", + summary: "针对当前主题执行联网检索与轻量调研。", + category: "通用技能", + outputHint: "结论 + 来源", + source: "cloud_catalog", + runnerType: "instant", + defaultExecutorBinding: "agent_turn", + executionLocation: "client_default", + version: "seed-v1", + badge: "云目录", + recentUsedAt: null, + isRecent: false, + runnerLabel: "Agent 调度", + runnerTone: "slate", + runnerDescription: "通过统一 Agent 发送链执行。", + actionLabel: "立即启动", + automationStatus: null, + slotSchema: [], + ...overrides, + }; +} + function createPreparedRuntimeTeamState(): TeamWorkspaceRuntimeFormationState { return { requestId: "runtime-team-preview-1", @@ -288,10 +390,14 @@ describe("useWorkspaceSendActions", () => { ).IS_REACT_ACT_ENVIRONMENT = true; vi.clearAllMocks(); + window.localStorage.clear(); mockResolveImageWorkbenchSkillRequest.mockReturnValue(null); mockEnsureSessionForCommandMetadata.mockResolvedValue(null); mockGetSkillCatalog.mockResolvedValue({ entries: [] }); mockListSkillCatalogSceneEntries.mockReturnValue([]); + mockGetOrCreateDefaultProject.mockResolvedValue({ + id: "project-default", + }); mockResolveOemCloudRuntimeContext.mockReturnValue(null); }); @@ -981,7 +1087,8 @@ describe("useWorkspaceSendActions", () => { } }); - it("预绑定 image_skill_launch metadata 时不应重新解析图片命令", async () => { + it("预绑定 image_skill_launch metadata 时不应重新解析图片命令,并且仍会绑定真实 session_id", async () => { + mockEnsureSessionForCommandMetadata.mockResolvedValue("session-image-bound"); const harness = mountHook({ input: "@配图 生成 一张春日咖啡馆插画", }); @@ -1004,6 +1111,7 @@ describe("useWorkspaceSendActions", () => { kind: "image_task", image_task: { prompt: "一张春日咖啡馆插画", + session_id: "__local_image_workbench__:draft", }, }, }, @@ -1015,11 +1123,15 @@ describe("useWorkspaceSendActions", () => { expect(mockResolveImageWorkbenchSkillRequest).not.toHaveBeenCalled(); expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockEnsureSessionForCommandMetadata).toHaveBeenCalledTimes(1); expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ requestMetadata: { harness: { image_skill_launch: { skill_name: "image_generate", + image_task: { + session_id: "session-image-bound", + }, }, }, }, @@ -1282,6 +1394,79 @@ describe("useWorkspaceSendActions", () => { } }); + it("@搜索 直接输入成功后应回写对应 service skill 最近使用", async () => { + const harness = mountHook({ + input: + "@搜索 关键词:AI Agent 融资 站点:36Kr 时间:近30天 深度:深度 重点:融资额与产品发布 输出:要点", + serviceSkills: [ + createGeneralServiceSkill({ + id: "research", + title: "搜索", + }), + ], + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(listServiceSkillUsage()).toEqual([ + expect.objectContaining({ + skillId: "research", + runnerType: "instant", + }), + ]); + expect(listMentionEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "builtin_command", + entryId: "research", + replayText: + "关键词:AI Agent 融资 站点:36Kr 时间:近30天 深度:深度 重点:融资额与产品发布 输出:要点", + }), + ]); + } finally { + harness.unmount(); + } + }); + + it("通过 active builtin command 发送时,也应回写最近一次正文草稿", async () => { + const harness = mountHook({ + input: "GitHub 最近一周 openai agents sdk issue 讨论", + serviceSkills: [ + createGeneralServiceSkill({ + id: "research", + title: "搜索", + }), + ], + }); + + try { + await act(async () => { + const started = await harness + .getValue() + .handleSend( + undefined, + undefined, + undefined, + "@搜索 GitHub 最近一周 openai agents sdk issue 讨论", + ); + expect(started).toBe(true); + }); + + expect(listMentionEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "builtin_command", + entryId: "research", + replayText: "GitHub 最近一周 openai agents sdk issue 讨论", + }), + ]); + } finally { + harness.unmount(); + } + }); + it("@深搜 应保留原始消息,并通过 deep_search_skill_launch metadata 交给 Agent 调度 research 技能", async () => { const harness = mountHook({ input: @@ -1649,6 +1834,79 @@ describe("useWorkspaceSendActions", () => { } }); + it("@修图 直接输入成功后应归并回写 image_generate 的最近使用", async () => { + mockResolveImageWorkbenchSkillRequest.mockReturnValueOnce({ + images: [], + requestContext: { + kind: "image_task", + image_task: { + mode: "edit", + prompt: "去掉角标,保留主体", + target_output_ref_id: "img-2", + }, + }, + }); + const harness = mountHook({ + input: "@修图 #img-2 去掉角标,保留主体", + serviceSkills: [ + createGeneralServiceSkill({ + id: "image_generate", + title: "配图", + defaultExecutorBinding: "native_skill", + }), + ], + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(listServiceSkillUsage()).toEqual([ + expect.objectContaining({ + skillId: "image_generate", + runnerType: "instant", + }), + ]); + expect(listMentionEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "builtin_command", + entryId: "image_edit", + replayText: "#img-2 去掉角标,保留主体", + }), + ]); + } finally { + harness.unmount(); + } + }); + + it("@搜索 发送失败时不应误记最近使用", async () => { + mockSendMessage.mockRejectedValueOnce(new Error("network down")); + const harness = mountHook({ + input: + "@搜索 关键词:AI Agent 融资 站点:36Kr 时间:近30天 深度:深度 重点:融资额与产品发布 输出:要点", + serviceSkills: [ + createGeneralServiceSkill({ + id: "research", + title: "搜索", + }), + ], + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(false); + }); + + expect(listServiceSkillUsage()).toEqual([]); + expect(listMentionEntryUsage()).toEqual([]); + } finally { + harness.unmount(); + } + }); + it("@链接解析 应保留原始消息,并通过 url_parse_skill_launch metadata 交给 Agent 调度技能", async () => { const harness = mountHook({ input: @@ -1784,6 +2042,223 @@ describe("useWorkspaceSendActions", () => { } }); + it("@网页 应保留原始消息,并通过 webpage_skill_launch metadata 交给 Agent 调度技能", async () => { + const harness = mountHook({ + input: + "@网页 类型:落地页 风格:未来感 技术:原生 HTML 帮我做一个 AI 代码助手官网", + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockResolveImageWorkbenchSkillRequest).not.toHaveBeenCalled(); + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[0]).toBe( + "@网页 类型:落地页 风格:未来感 技术:原生 HTML 帮我做一个 AI 代码助手官网", + ); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + requestMetadata: { + harness: { + allow_model_skills: true, + webpage_skill_launch: { + skill_name: "webpage_generate", + kind: "webpage_request", + webpage_request: { + prompt: "帮我做一个 AI 代码助手官网", + content: + "类型:落地页 风格:未来感 技术:原生 HTML 帮我做一个 AI 代码助手官网", + page_type: "landing_page", + style: "未来感", + tech_stack: "原生 HTML", + entry_source: "at_webpage_command", + }, + }, + }, + }, + }); + } finally { + harness.unmount(); + } + }); + + it("@PPT 应保留原始消息,并通过 presentation_skill_launch metadata 交给 Agent 调度技能", async () => { + const harness = mountHook({ + input: + "@PPT 类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿", + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[0]).toBe( + "@PPT 类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿", + ); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + requestMetadata: { + harness: { + allow_model_skills: true, + presentation_skill_launch: { + skill_name: "presentation_generate", + kind: "presentation_request", + presentation_request: { + prompt: "帮我做一个 AI 助手创业项目融资演示稿", + content: + "类型:路演PPT 风格:极简科技 受众:投资人 页数:10 帮我做一个 AI 助手创业项目融资演示稿", + deck_type: "pitch_deck", + style: "极简科技", + audience: "投资人", + slide_count: 10, + entry_source: "at_presentation_command", + }, + }, + }, + }, + }); + } finally { + harness.unmount(); + } + }); + + it("@表单 应保留原始消息,并通过 form_skill_launch metadata 交给 Agent 调度技能", async () => { + const harness = mountHook({ + input: + "@表单 类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表", + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[0]).toBe( + "@表单 类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表", + ); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + requestMetadata: { + harness: { + allow_model_skills: true, + form_skill_launch: { + skill_name: "form_generate", + kind: "form_request", + form_request: { + prompt: "帮我做一个 AI Workshop 报名表", + content: + "类型:报名表单 风格:简洁专业 受众:活动嘉宾 字段数:8 帮我做一个 AI Workshop 报名表", + form_type: "registration_form", + style: "简洁专业", + audience: "活动嘉宾", + field_count: 8, + entry_source: "at_form_command", + }, + }, + }, + }, + }); + } finally { + harness.unmount(); + } + }); + + it("@代码 应保留原始消息,并切到 code_orchestrated + 代码团队主链", async () => { + const harness = mountHook({ + input: "@代码 修复消息历史切换后图片卡片丢失的问题,并补一个回归测试", + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[0]).toBe( + "@代码 修复消息历史切换后图片卡片丢失的问题,并补一个回归测试", + ); + expect(mockSendMessage.mock.calls[0]?.[5]).toBe("code_orchestrated"); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + requestMetadata: { + harness: { + preferred_team_preset_id: "code-triage-team", + preferences: { + task: true, + subagent: true, + }, + code_command: { + kind: "bug_fix", + prompt: "修复消息历史切换后图片卡片丢失的问题,并补一个回归测试", + content: + "修复消息历史切换后图片卡片丢失的问题,并补一个回归测试", + entry_source: "at_code_command", + }, + }, + }, + }); + expect(listMentionEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "builtin_command", + entryId: "code_runtime", + replayText: "修复消息历史切换后图片卡片丢失的问题,并补一个回归测试", + }), + ]); + expect(listServiceSkillUsage()).toEqual([]); + } finally { + harness.unmount(); + } + }); + + it("@发布 应保留原始消息,并将 dispatch 接到现有发布工作流", async () => { + const harness = mountHook({ + input: "@发布 平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本", + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[0]).toBe( + "/content_post_with_cover 平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本", + ); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + displayContent: + "@发布 平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本", + requestMetadata: { + harness: { + browser_requirement: "required_with_user_step", + browser_launch_url: "https://mp.weixin.qq.com/", + publish_command: { + prompt: "帮我把这篇文章整理成可直接发布的版本", + content: "平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本", + platform_type: "wechat_official_account", + platform_label: "微信公众号后台", + entry_source: "at_publish_command", + }, + }, + }, + }); + expect(listMentionEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "builtin_command", + entryId: "publish_runtime", + replayText: "平台:微信公众号后台 帮我把这篇文章整理成可直接发布的版本", + }), + ]); + } finally { + harness.unmount(); + } + }); + it("/scene-key 命中运行时场景时应注入统一 scene launch metadata 后继续走 Agent 发送主线", async () => { mockGetSkillCatalog.mockResolvedValueOnce({ entries: [ @@ -1852,12 +2327,133 @@ describe("useWorkspaceSendActions", () => { }, }, }); + expect(listSlashEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "scene", + entryId: "campaign-launch", + }), + ]); expect(mockHandleAutoLaunchMatchedSiteSkill).not.toHaveBeenCalled(); } finally { harness.unmount(); } }); + it("site scene 应从 skill 声明推导 service_skill_launch metadata 并继续发送", async () => { + mockGetSkillCatalog.mockResolvedValueOnce({ + entries: [ + { + id: "scene:x-article-export", + }, + ], + }); + mockListSkillCatalogSceneEntries.mockReturnValueOnce([ + { + id: "scene:x-article-export", + kind: "scene", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + aliases: ["x文章转存", "x转存"], + linkedSkillId: "x-article-export", + executionKind: "site_adapter", + }, + ]); + const harness = mountHook({ + input: + "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + serviceSkills: [createXArticleExportSkill()], + contentId: "content-1", + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + requestMetadata: { + harness: { + browser_requirement: "required", + service_skill_launch: { + kind: "site_adapter", + skill_id: "x-article-export", + adapter_name: "x/article-export", + save_mode: "project_resource", + project_id: "project-1", + args: { + url: "https://x.com/GoogleCloudTech/article/2033953579824758855", + }, + }, + }, + }, + }); + expect(listSlashEntryUsage()).toEqual([ + expect.objectContaining({ + kind: "scene", + entryId: "x-article-export", + }), + ]); + } finally { + harness.unmount(); + } + }); + + it("site scene 缺少当前项目时应回退默认项目继续发送", async () => { + mockGetSkillCatalog.mockResolvedValueOnce({ + entries: [ + { + id: "scene:x-article-export", + }, + ], + }); + mockListSkillCatalogSceneEntries.mockReturnValueOnce([ + { + id: "scene:x-article-export", + kind: "scene", + title: "X文章转存", + summary: "把 X 长文导出成 Markdown。", + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + aliases: ["x文章转存", "x转存"], + linkedSkillId: "x-article-export", + executionKind: "site_adapter", + }, + ]); + const harness = mountHook({ + input: + "/x文章转存 https://x.com/GoogleCloudTech/article/2033953579824758855", + serviceSkills: [createXArticleExportSkill()], + projectId: null, + contentId: null, + }); + + try { + await act(async () => { + const started = await harness.getValue().handleSend(); + expect(started).toBe(true); + }); + + expect(mockGetOrCreateDefaultProject).toHaveBeenCalledTimes(1); + expect(mockSendMessage).toHaveBeenCalledTimes(1); + expect(mockSendMessage.mock.calls[0]?.[8]).toMatchObject({ + requestMetadata: { + harness: { + service_skill_launch: { + project_id: "project-default", + adapter_name: "x/article-export", + }, + }, + }, + }); + } finally { + harness.unmount(); + } + }); + it("已携带 service_skill_launch metadata 时不应再被前端二次命中站点技能或浏览器预热", async () => { const harness = mountHook({ input: "请帮我使用 GitHub 查一下 AI Agent 项目", diff --git a/src/components/agent/chat/workspace/useWorkspaceSendActions.ts b/src/components/agent/chat/workspace/useWorkspaceSendActions.ts index db8d5fb14..ed65a1c16 100644 --- a/src/components/agent/chat/workspace/useWorkspaceSendActions.ts +++ b/src/components/agent/chat/workspace/useWorkspaceSendActions.ts @@ -2,12 +2,20 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import type { Dispatch, SetStateAction } from "react"; import type { AutoContinueRequestPayload } from "@/lib/api/agentRuntime"; +import { + getSeededSkillCatalog, + listSkillCatalogCommandEntries, +} from "@/lib/api/skillCatalog"; import { parseAnalysisWorkbenchCommand } from "../utils/analysisWorkbenchCommand"; import { parseBroadcastWorkbenchCommand } from "../utils/broadcastWorkbenchCommand"; +import { parseCodeWorkbenchCommand } from "../utils/codeWorkbenchCommand"; import { parseCoverWorkbenchCommand } from "../utils/coverWorkbenchCommand"; import { parseDeepSearchWorkbenchCommand } from "../utils/deepSearchWorkbenchCommand"; +import { parseFormWorkbenchCommand } from "../utils/formWorkbenchCommand"; import { parseImageWorkbenchCommand } from "../utils/imageWorkbenchCommand"; import { parsePdfWorkbenchCommand } from "../utils/pdfWorkbenchCommand"; +import { parsePresentationWorkbenchCommand } from "../utils/presentationWorkbenchCommand"; +import { parsePublishWorkbenchCommand } from "../utils/publishWorkbenchCommand"; import { parseReportWorkbenchCommand } from "../utils/reportWorkbenchCommand"; import { parseResourceSearchWorkbenchCommand } from "../utils/resourceSearchWorkbenchCommand"; import { parseSearchWorkbenchCommand } from "../utils/searchWorkbenchCommand"; @@ -18,6 +26,8 @@ import { parseTranscriptionWorkbenchCommand } from "../utils/transcriptionWorkbe import { parseTypesettingWorkbenchCommand } from "../utils/typesettingWorkbenchCommand"; import { parseUrlParseWorkbenchCommand } from "../utils/urlParseWorkbenchCommand"; import { parseVideoWorkbenchCommand } from "../utils/videoWorkbenchCommand"; +import { parseWebpageWorkbenchCommand } from "../utils/webpageWorkbenchCommand"; +import { detectBrowserTaskRequirement } from "../utils/browserTaskRequirement"; import { isTeamRuntimeRecommendation } from "../utils/contextualRecommendations"; import { matchAutoLaunchSiteSkillFromText, @@ -59,8 +69,13 @@ import { } from "./imageSkillLaunch"; import { buildServiceSceneLaunchRequestMetadata, + RuntimeSceneLaunchValidationError, resolveRuntimeSceneLaunchRequest, } from "./serviceSkillSceneLaunch"; +import { recordMentionEntryUsage } from "../skill-selection/mentionEntryUsage"; +import { recordServiceSkillUsage } from "../service-skills/storage"; +import { recordSlashEntryUsage } from "../skill-selection/slashEntryUsage"; +import { CONTENT_POST_SKILL_KEY } from "../utils/contentPostSkill"; type ExecutionStrategy = "react" | "code_orchestrated" | "auto"; type SetStringState = (value: string) => void; @@ -85,6 +100,12 @@ type ParsedReportWorkbenchCommand = NonNullable< type ParsedPdfWorkbenchCommand = NonNullable< ReturnType >; +type ParsedPresentationWorkbenchCommand = NonNullable< + ReturnType +>; +type ParsedFormWorkbenchCommand = NonNullable< + ReturnType +>; type ParsedSearchWorkbenchCommand = NonNullable< ReturnType >; @@ -112,6 +133,28 @@ type ParsedUrlParseWorkbenchCommand = NonNullable< type ParsedTypesettingWorkbenchCommand = NonNullable< ReturnType >; +type ParsedWebpageWorkbenchCommand = NonNullable< + ReturnType +>; +type CompletedMentionUsage = { + skillId: string; + runnerType: ServiceSkillHomeItem["runnerType"]; +}; +type CompletedMentionCommandUsage = { + entryId: string; + replayText?: string; +}; + +const MENTION_COMMAND_SKILL_ID_MAP = new Map( + listSkillCatalogCommandEntries(getSeededSkillCatalog()) + .filter((entry) => entry.triggers.some((trigger) => trigger.mode === "mention")) + .flatMap((entry) => { + const commandKey = entry.commandKey.trim(); + const skillId = entry.binding?.skillId?.trim(); + + return commandKey && skillId ? [[commandKey, skillId] as const] : []; + }), +); function asRecord(value: unknown): Record | undefined { if (!value || typeof value !== "object" || Array.isArray(value)) { @@ -120,6 +163,73 @@ function asRecord(value: unknown): Record | undefined { return value as Record; } +function resolveImageMentionCommandKey( + trigger: ParsedImageWorkbenchCommand["trigger"], +): string | null { + if (trigger === "@修图") { + return "image_edit"; + } + if (trigger === "@重绘") { + return "image_variation"; + } + if (trigger === "@配图" || trigger === "@image") { + return "image_generate"; + } + return null; +} + +const MAX_MENTION_COMMAND_REPLAY_TEXT_LENGTH = 400; + +function normalizeMentionCommandReplayText( + value: string | null | undefined, +): string | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + + return trimmed.slice(0, MAX_MENTION_COMMAND_REPLAY_TEXT_LENGTH).trim(); +} + +function resolveMentionCommandReplayText(parsedCommand: { + body: string; +}): string | undefined { + return normalizeMentionCommandReplayText(parsedCommand.body); +} + +function resolveMentionCommandUsage(params: { + commandKey: string; + serviceSkills: ServiceSkillHomeItem[]; +}): CompletedMentionUsage | null { + const normalizedCommandKey = params.commandKey.trim(); + if (!normalizedCommandKey) { + return null; + } + + const boundSkillId = MENTION_COMMAND_SKILL_ID_MAP.get(normalizedCommandKey); + if (!boundSkillId) { + return null; + } + + const matchedSkill = params.serviceSkills.find((skill) => { + const normalizedSkillId = skill.id.trim(); + const normalizedSkillKey = skill.skillKey?.trim(); + return ( + normalizedSkillId === boundSkillId || + normalizedSkillKey === boundSkillId + ); + }); + + if (!matchedSkill) { + return null; + } + + return { + skillId: matchedSkill.id, + runnerType: matchedSkill.runnerType, + }; +} + type SessionBoundRequestContextKey = | "image_task" | "cover_task" @@ -130,6 +240,17 @@ type SessionBoundRequestContextKey = | "url_parse_task" | "typesetting_task"; +type PendingCommandSessionBinding = + | { + kind: "request_context"; + requestContext: Record; + requestContextKey: SessionBoundRequestContextKey; + } + | { + kind: "scoped_request_context"; + scopedRequestContext: Record; + }; + function attachSessionIdToRequestContext( requestContext: Record, requestContextKey: SessionBoundRequestContextKey, @@ -149,6 +270,95 @@ function attachSessionIdToRequestContext( delete scopedRequestContext.session_id; } +function attachSessionIdToScopedRequestContext( + scopedRequestContext: Record, + sessionId: string | null | undefined, +): void { + const normalizedSessionId = sessionId?.trim(); + if (normalizedSessionId) { + scopedRequestContext.session_id = normalizedSessionId; + return; + } + + delete scopedRequestContext.session_id; +} + +const SESSION_BOUND_MODEL_SKILL_LAUNCHES: ReadonlyArray<{ + launchKey: + | "image_skill_launch" + | "cover_skill_launch" + | "video_skill_launch" + | "broadcast_skill_launch" + | "resource_search_skill_launch" + | "transcription_skill_launch" + | "url_parse_skill_launch" + | "typesetting_skill_launch"; + requestContextKey: SessionBoundRequestContextKey; +}> = [ + { + launchKey: "image_skill_launch", + requestContextKey: "image_task", + }, + { + launchKey: "cover_skill_launch", + requestContextKey: "cover_task", + }, + { + launchKey: "video_skill_launch", + requestContextKey: "video_task", + }, + { + launchKey: "broadcast_skill_launch", + requestContextKey: "broadcast_task", + }, + { + launchKey: "resource_search_skill_launch", + requestContextKey: "resource_search_task", + }, + { + launchKey: "transcription_skill_launch", + requestContextKey: "transcription_task", + }, + { + launchKey: "url_parse_skill_launch", + requestContextKey: "url_parse_task", + }, + { + launchKey: "typesetting_skill_launch", + requestContextKey: "typesetting_task", + }, +]; + +function extractBoundSessionRequestContext( + requestMetadata: Record | undefined, +): PendingCommandSessionBinding | null { + const harness = asRecord(requestMetadata?.harness); + if (!harness) { + return null; + } + + for (const launch of SESSION_BOUND_MODEL_SKILL_LAUNCHES) { + const launchMetadata = asRecord(harness[launch.launchKey]); + if (!launchMetadata) { + continue; + } + + const scopedRequestContext = + asRecord(launchMetadata[launch.requestContextKey]) || + asRecord(asRecord(launchMetadata.request_context)?.[launch.requestContextKey]); + if (!scopedRequestContext) { + continue; + } + + return { + kind: "scoped_request_context", + scopedRequestContext, + }; + } + + return null; +} + function buildModelSkillLaunchRequestMetadata(params: { existingMetadata: Record | undefined; requestContext: Record; @@ -168,7 +378,10 @@ function buildModelSkillLaunchRequestMetadata(params: { | "analysis_skill_launch" | "transcription_skill_launch" | "url_parse_skill_launch" - | "typesetting_skill_launch"; + | "typesetting_skill_launch" + | "presentation_skill_launch" + | "form_skill_launch" + | "webpage_skill_launch"; requestContextKey: | "image_task" | "cover_task" @@ -185,7 +398,10 @@ function buildModelSkillLaunchRequestMetadata(params: { | "analysis_request" | "transcription_task" | "url_parse_task" - | "typesetting_task"; + | "typesetting_task" + | "presentation_request" + | "form_request" + | "webpage_request"; defaultKind: | "image_task" | "cover_task" @@ -202,7 +418,10 @@ function buildModelSkillLaunchRequestMetadata(params: { | "analysis_request" | "transcription_task" | "url_parse_task" - | "typesetting_task"; + | "typesetting_task" + | "presentation_request" + | "form_request" + | "webpage_request"; skillName: | "image_generate" | "cover_generate" @@ -218,7 +437,10 @@ function buildModelSkillLaunchRequestMetadata(params: { | "analysis" | "transcription_generate" | "url_parse" - | "typesetting"; + | "typesetting" + | "presentation_generate" + | "form_generate" + | "webpage_generate"; }): Record { const scopedRequestContext = asRecord( params.requestContext[params.requestContextKey], @@ -456,6 +678,48 @@ function buildTypesettingSkillLaunchRequestMetadata( }); } +function buildPresentationSkillLaunchRequestMetadata( + existingMetadata: Record | undefined, + requestContext: Record, +): Record { + return buildModelSkillLaunchRequestMetadata({ + existingMetadata, + requestContext, + launchKey: "presentation_skill_launch", + requestContextKey: "presentation_request", + defaultKind: "presentation_request", + skillName: "presentation_generate", + }); +} + +function buildWebpageSkillLaunchRequestMetadata( + existingMetadata: Record | undefined, + requestContext: Record, +): Record { + return buildModelSkillLaunchRequestMetadata({ + existingMetadata, + requestContext, + launchKey: "webpage_skill_launch", + requestContextKey: "webpage_request", + defaultKind: "webpage_request", + skillName: "webpage_generate", + }); +} + +function buildFormSkillLaunchRequestMetadata( + existingMetadata: Record | undefined, + requestContext: Record, +): Record { + return buildModelSkillLaunchRequestMetadata({ + existingMetadata, + requestContext, + launchKey: "form_skill_launch", + requestContextKey: "form_request", + defaultKind: "form_request", + skillName: "form_generate", + }); +} + function buildVideoSkillLaunchRequestContext(params: { rawText: string; parsedCommand: ParsedVideoWorkbenchCommand; @@ -880,6 +1144,83 @@ function buildTypesettingSkillLaunchRequestContext(params: { }; } +function buildWebpageSkillLaunchRequestContext(params: { + rawText: string; + parsedCommand: ParsedWebpageWorkbenchCommand; + projectId?: string | null; + contentId?: string | null; +}): Record { + const prompt = + params.parsedCommand.prompt.trim() || "请生成一个可直接预览的网页"; + + return { + kind: "webpage_request", + webpage_request: { + raw_text: params.rawText, + prompt, + content: params.parsedCommand.body || undefined, + page_type: params.parsedCommand.pageType, + style: params.parsedCommand.style, + tech_stack: params.parsedCommand.techStack, + project_id: params.projectId || undefined, + content_id: params.contentId || undefined, + entry_source: "at_webpage_command", + }, + }; +} + +function buildPresentationSkillLaunchRequestContext(params: { + rawText: string; + parsedCommand: ParsedPresentationWorkbenchCommand; + projectId?: string | null; + contentId?: string | null; +}): Record { + const prompt = + params.parsedCommand.prompt.trim() || "请生成一份可直接讲述的演示文稿草稿"; + + return { + kind: "presentation_request", + presentation_request: { + raw_text: params.rawText, + prompt, + content: params.parsedCommand.body || undefined, + deck_type: params.parsedCommand.deckType, + style: params.parsedCommand.style, + audience: params.parsedCommand.audience, + slide_count: params.parsedCommand.slideCount, + project_id: params.projectId || undefined, + content_id: params.contentId || undefined, + entry_source: "at_presentation_command", + }, + }; +} + +function buildFormSkillLaunchRequestContext(params: { + rawText: string; + parsedCommand: ParsedFormWorkbenchCommand; + projectId?: string | null; + contentId?: string | null; +}): Record { + const prompt = + params.parsedCommand.prompt.trim() || "请生成一个可直接在聊天区渲染的 A2UI 表单"; + + return { + kind: "form_request", + form_request: { + raw_text: params.rawText, + prompt, + content: params.parsedCommand.body || undefined, + form_type: params.parsedCommand.formType, + style: params.parsedCommand.style, + audience: params.parsedCommand.audience, + field_count: params.parsedCommand.fieldCount, + project_id: params.projectId || undefined, + content_id: params.contentId || undefined, + entry_source: "at_form_command", + }, + }; +} + interface UseWorkspaceSendActionsParams { input: string; setInput: SetStringState; @@ -955,6 +1296,12 @@ interface WorkspaceSendPlan extends WorkspaceResolvedSendState { sendExecutionStrategy?: ExecutionStrategy; autoContinuePayload?: AutoContinueRequestPayload; sendOptions?: HandleSendOptions; + completedMentionCommandUsage: CompletedMentionCommandUsage | null; + completedMentionUsage: CompletedMentionUsage | null; + completedSlashUsage?: { + kind: "scene"; + entryId: string; + } | null; } type WorkspaceSendResolution = @@ -1043,7 +1390,7 @@ export function useWorkspaceSendActions({ sourceText = sendBoundary.sourceText; let dispatchText = sourceText; - const effectiveToolPreferences = + let effectiveToolPreferences = sendOptions?.toolPreferencesOverride ?? chatToolPreferences; const { browserRequirementMatch } = sendBoundary; const mergedLaunchRequestMetadata = { @@ -1062,12 +1409,6 @@ export function useWorkspaceSendActions({ : requestedWebSearch; const effectiveThinking = thinking ?? effectiveToolPreferences.thinking; - if (!projectId) { - sendOptions?.observer?.onError?.("请先选择项目后再开始对话"); - toast.error("请先选择项目后再开始对话"); - return { kind: "done", result: false }; - } - const preparedActiveContextPrompt = contextWorkspace.enabled && !contextWorkspace.activeContextPrompt.trim() @@ -1085,12 +1426,14 @@ export function useWorkspaceSendActions({ let commandSessionId: string | null | undefined; let commandSessionPromise: Promise | null = null; - let pendingCommandSessionBinding: - | { - requestContext: Record; - requestContextKey: SessionBoundRequestContextKey; - } + let pendingCommandSessionBinding: PendingCommandSessionBinding | null = + extractBoundSessionRequestContext(mergedLaunchRequestMetadata); + let completedMentionCommandUsage: + | WorkspaceSendPlan["completedMentionCommandUsage"] | null = null; + let completedMentionUsage: WorkspaceSendPlan["completedMentionUsage"] = + null; + let completedSlashUsage: WorkspaceSendPlan["completedSlashUsage"] = null; let submissionPreviewKey: string | null = null; const ensureSubmissionPreview = (previewImages = effectiveImages) => { if (submissionPreviewKey) { @@ -1135,6 +1478,19 @@ export function useWorkspaceSendActions({ const ensureCommandSessionId = async () => { return primeCommandSessionId(); }; + const markCompletedMentionCommand = ( + commandKey: string, + replayText?: string, + ) => { + completedMentionCommandUsage = { + entryId: commandKey, + replayText: normalizeMentionCommandReplayText(replayText), + }; + completedMentionUsage = resolveMentionCommandUsage({ + commandKey, + serviceSkills, + }); + }; const parsedImageWorkbenchCommand = !sendOptions?.purpose && !hasBoundSkillLaunch && sourceText.trim() @@ -1156,6 +1512,7 @@ export function useWorkspaceSendActions({ ? skillRequest.images : effectiveImages; pendingCommandSessionBinding = { + kind: "request_context", requestContext: skillRequest.requestContext, requestContextKey: "image_task", }; @@ -1168,6 +1525,15 @@ export function useWorkspaceSendActions({ skillRequest.requestContext, ), }; + const mentionCommandKey = resolveImageMentionCommandKey( + parsedImageWorkbenchCommand.trigger, + ); + if (mentionCommandKey) { + markCompletedMentionCommand( + mentionCommandKey, + resolveMentionCommandReplayText(parsedImageWorkbenchCommand), + ); + } hasBoundSkillLaunch = true; } @@ -1189,6 +1555,7 @@ export function useWorkspaceSendActions({ return { kind: "done", result: false }; } pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "cover_task", }; @@ -1201,6 +1568,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "cover_generate", + resolveMentionCommandReplayText(parsedCoverWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1223,6 +1594,7 @@ export function useWorkspaceSendActions({ return { kind: "done", result: false }; } pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "video_task", }; @@ -1235,6 +1607,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "video_generate", + resolveMentionCommandReplayText(parsedVideoWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1254,6 +1630,7 @@ export function useWorkspaceSendActions({ contentId, }); pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "broadcast_task", }; @@ -1266,6 +1643,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "broadcast_generate", + resolveMentionCommandReplayText(parsedBroadcastWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1286,6 +1667,7 @@ export function useWorkspaceSendActions({ contentId, }); pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "resource_search_task", }; @@ -1298,6 +1680,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "modal_resource_search", + resolveMentionCommandReplayText(parsedResourceSearchWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1319,6 +1705,7 @@ export function useWorkspaceSendActions({ contentId, }); pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "transcription_task", }; @@ -1331,6 +1718,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "transcription_generate", + resolveMentionCommandReplayText(parsedTranscriptionWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1362,6 +1753,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "research", + resolveMentionCommandReplayText(parsedSearchWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1394,6 +1789,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "research_report", + resolveMentionCommandReplayText(parsedReportWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1427,6 +1826,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "deep_search", + resolveMentionCommandReplayText(parsedDeepSearchWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1461,6 +1864,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "site_search", + resolveMentionCommandReplayText(parsedSiteSearchWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1496,6 +1903,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "read_pdf", + resolveMentionCommandReplayText(parsedPdfWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1529,6 +1940,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "summary", + resolveMentionCommandReplayText(parsedSummaryWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1563,6 +1978,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "translation", + resolveMentionCommandReplayText(parsedTranslationWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1598,6 +2017,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "analysis", + resolveMentionCommandReplayText(parsedAnalysisWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1627,6 +2050,7 @@ export function useWorkspaceSendActions({ contentId, }); pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "url_parse_task", }; @@ -1639,6 +2063,10 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "url_parse", + resolveMentionCommandReplayText(parsedUrlParseWorkbenchCommand), + ); hasBoundSkillLaunch = true; } @@ -1669,6 +2097,7 @@ export function useWorkspaceSendActions({ contentId, }); pendingCommandSessionBinding = { + kind: "request_context", requestContext, requestContextKey: "typesetting_task", }; @@ -1681,17 +2110,292 @@ export function useWorkspaceSendActions({ requestContext, ), }; + markCompletedMentionCommand( + "typesetting", + resolveMentionCommandReplayText(parsedTypesettingWorkbenchCommand), + ); hasBoundSkillLaunch = true; } + const parsedPresentationWorkbenchCommand = + !sendOptions?.purpose && + sourceText.trim() && + !parsedImageWorkbenchCommand && + !parsedCoverWorkbenchCommand && + !parsedVideoWorkbenchCommand && + !parsedBroadcastWorkbenchCommand && + !parsedResourceSearchWorkbenchCommand && + !parsedTranscriptionWorkbenchCommand && + !parsedSearchWorkbenchCommand && + !parsedReportWorkbenchCommand && + !parsedDeepSearchWorkbenchCommand && + !parsedSiteSearchWorkbenchCommand && + !parsedPdfWorkbenchCommand && + !parsedSummaryWorkbenchCommand && + !parsedTranslationWorkbenchCommand && + !parsedUrlParseWorkbenchCommand && + !parsedTypesettingWorkbenchCommand + ? parsePresentationWorkbenchCommand(sourceText) + : null; + if (parsedPresentationWorkbenchCommand) { + const requestContext = buildPresentationSkillLaunchRequestContext({ + rawText: sourceText, + parsedCommand: parsedPresentationWorkbenchCommand, + projectId, + contentId, + }); + ensureSubmissionPreview(); + sendOptions = { + ...(sendOptions || {}), + requestMetadata: buildPresentationSkillLaunchRequestMetadata( + sendOptions?.requestMetadata, + requestContext, + ), + }; + markCompletedMentionCommand( + "presentation_generate", + resolveMentionCommandReplayText(parsedPresentationWorkbenchCommand), + ); + hasBoundSkillLaunch = true; + } + + const parsedFormWorkbenchCommand = + !sendOptions?.purpose && + sourceText.trim() && + !parsedImageWorkbenchCommand && + !parsedCoverWorkbenchCommand && + !parsedVideoWorkbenchCommand && + !parsedBroadcastWorkbenchCommand && + !parsedResourceSearchWorkbenchCommand && + !parsedTranscriptionWorkbenchCommand && + !parsedSearchWorkbenchCommand && + !parsedReportWorkbenchCommand && + !parsedDeepSearchWorkbenchCommand && + !parsedSiteSearchWorkbenchCommand && + !parsedPdfWorkbenchCommand && + !parsedSummaryWorkbenchCommand && + !parsedTranslationWorkbenchCommand && + !parsedUrlParseWorkbenchCommand && + !parsedTypesettingWorkbenchCommand && + !parsedPresentationWorkbenchCommand + ? parseFormWorkbenchCommand(sourceText) + : null; + if (parsedFormWorkbenchCommand) { + const requestContext = buildFormSkillLaunchRequestContext({ + rawText: sourceText, + parsedCommand: parsedFormWorkbenchCommand, + projectId, + contentId, + }); + ensureSubmissionPreview(); + sendOptions = { + ...(sendOptions || {}), + requestMetadata: buildFormSkillLaunchRequestMetadata( + sendOptions?.requestMetadata, + requestContext, + ), + }; + markCompletedMentionCommand( + "form_generate", + resolveMentionCommandReplayText(parsedFormWorkbenchCommand), + ); + hasBoundSkillLaunch = true; + } + + const parsedWebpageWorkbenchCommand = + !sendOptions?.purpose && + sourceText.trim() && + !parsedImageWorkbenchCommand && + !parsedCoverWorkbenchCommand && + !parsedVideoWorkbenchCommand && + !parsedBroadcastWorkbenchCommand && + !parsedResourceSearchWorkbenchCommand && + !parsedTranscriptionWorkbenchCommand && + !parsedSearchWorkbenchCommand && + !parsedReportWorkbenchCommand && + !parsedDeepSearchWorkbenchCommand && + !parsedSiteSearchWorkbenchCommand && + !parsedPdfWorkbenchCommand && + !parsedSummaryWorkbenchCommand && + !parsedTranslationWorkbenchCommand && + !parsedUrlParseWorkbenchCommand && + !parsedTypesettingWorkbenchCommand && + !parsedPresentationWorkbenchCommand && + !parsedFormWorkbenchCommand + ? parseWebpageWorkbenchCommand(sourceText) + : null; + if (parsedWebpageWorkbenchCommand) { + const requestContext = buildWebpageSkillLaunchRequestContext({ + rawText: sourceText, + parsedCommand: parsedWebpageWorkbenchCommand, + projectId, + contentId, + }); + ensureSubmissionPreview(); + sendOptions = { + ...(sendOptions || {}), + requestMetadata: buildWebpageSkillLaunchRequestMetadata( + sendOptions?.requestMetadata, + requestContext, + ), + }; + markCompletedMentionCommand( + "webpage_generate", + resolveMentionCommandReplayText(parsedWebpageWorkbenchCommand), + ); + hasBoundSkillLaunch = true; + } + + const parsedCodeWorkbenchCommand = + !sendOptions?.purpose && + sourceText.trim() && + !parsedImageWorkbenchCommand && + !parsedCoverWorkbenchCommand && + !parsedVideoWorkbenchCommand && + !parsedBroadcastWorkbenchCommand && + !parsedResourceSearchWorkbenchCommand && + !parsedTranscriptionWorkbenchCommand && + !parsedSearchWorkbenchCommand && + !parsedReportWorkbenchCommand && + !parsedDeepSearchWorkbenchCommand && + !parsedSiteSearchWorkbenchCommand && + !parsedPdfWorkbenchCommand && + !parsedSummaryWorkbenchCommand && + !parsedTranslationWorkbenchCommand && + !parsedUrlParseWorkbenchCommand && + !parsedTypesettingWorkbenchCommand && + !parsedPresentationWorkbenchCommand && + !parsedFormWorkbenchCommand && + !parsedWebpageWorkbenchCommand + ? parseCodeWorkbenchCommand(sourceText) + : null; + if (parsedCodeWorkbenchCommand) { + const existingHarnessMetadata = + asRecord(sendOptions?.requestMetadata?.harness) || {}; + effectiveToolPreferences = { + ...effectiveToolPreferences, + task: true, + subagent: true, + }; + sendExecutionStrategy = "code_orchestrated"; + ensureSubmissionPreview(); + sendOptions = { + ...(sendOptions || {}), + toolPreferencesOverride: effectiveToolPreferences, + requestMetadata: { + ...(sendOptions?.requestMetadata || {}), + harness: { + ...existingHarnessMetadata, + preferred_team_preset_id: "code-triage-team", + code_command: { + kind: + parsedCodeWorkbenchCommand.taskType || "implementation", + prompt: + parsedCodeWorkbenchCommand.prompt || + parsedCodeWorkbenchCommand.body, + content: parsedCodeWorkbenchCommand.body, + entry_source: "at_code_command", + }, + }, + }, + }; + markCompletedMentionCommand( + "code_runtime", + resolveMentionCommandReplayText(parsedCodeWorkbenchCommand), + ); + } + + const parsedPublishWorkbenchCommand = + !sendOptions?.purpose && + sourceText.trim() && + !parsedImageWorkbenchCommand && + !parsedCoverWorkbenchCommand && + !parsedVideoWorkbenchCommand && + !parsedBroadcastWorkbenchCommand && + !parsedResourceSearchWorkbenchCommand && + !parsedTranscriptionWorkbenchCommand && + !parsedSearchWorkbenchCommand && + !parsedReportWorkbenchCommand && + !parsedDeepSearchWorkbenchCommand && + !parsedSiteSearchWorkbenchCommand && + !parsedPdfWorkbenchCommand && + !parsedSummaryWorkbenchCommand && + !parsedTranslationWorkbenchCommand && + !parsedUrlParseWorkbenchCommand && + !parsedTypesettingWorkbenchCommand && + !parsedPresentationWorkbenchCommand && + !parsedFormWorkbenchCommand && + !parsedWebpageWorkbenchCommand && + !parsedCodeWorkbenchCommand + ? parsePublishWorkbenchCommand(sourceText) + : null; + if (parsedPublishWorkbenchCommand) { + const existingHarnessMetadata = + asRecord(sendOptions?.requestMetadata?.harness) || {}; + const publishBrowserRequirementMatch = detectBrowserTaskRequirement( + parsedPublishWorkbenchCommand.body || + parsedPublishWorkbenchCommand.prompt || + sourceText, + ); + const nextBody = + parsedPublishWorkbenchCommand.body || + parsedPublishWorkbenchCommand.prompt; + dispatchText = `/${CONTENT_POST_SKILL_KEY}${nextBody ? ` ${nextBody}` : ""}`; + ensureSubmissionPreview(); + sendOptions = { + ...(sendOptions || {}), + requestMetadata: { + ...(sendOptions?.requestMetadata || {}), + harness: { + ...existingHarnessMetadata, + ...(publishBrowserRequirementMatch + ? { + browser_requirement: + publishBrowserRequirementMatch.requirement, + browser_requirement_reason: + publishBrowserRequirementMatch.reason, + browser_launch_url: + publishBrowserRequirementMatch.launchUrl, + } + : {}), + publish_command: { + prompt: + parsedPublishWorkbenchCommand.prompt || + parsedPublishWorkbenchCommand.body, + content: parsedPublishWorkbenchCommand.body, + platform_type: + parsedPublishWorkbenchCommand.platformType || undefined, + platform_label: + parsedPublishWorkbenchCommand.platformLabel || undefined, + entry_source: "at_publish_command", + }, + }, + }, + }; + markCompletedMentionCommand( + "publish_runtime", + resolveMentionCommandReplayText(parsedPublishWorkbenchCommand), + ); + } + if (!sendOptions?.purpose && sourceText.trim().startsWith("/")) { ensureSubmissionPreview(); - const sceneLaunchRequest = await resolveRuntimeSceneLaunchRequest({ - rawText: sourceText, - serviceSkills, - projectId, - contentId, - }); + let sceneLaunchRequest = null; + try { + sceneLaunchRequest = await resolveRuntimeSceneLaunchRequest({ + rawText: sourceText, + serviceSkills, + projectId, + contentId, + }); + } catch (error) { + if (error instanceof RuntimeSceneLaunchValidationError) { + toast.error(error.message); + clearSubmissionPreview(); + return { kind: "done", result: false }; + } + throw error; + } if (sceneLaunchRequest) { sendOptions = { ...(sendOptions || {}), @@ -1701,6 +2405,10 @@ export function useWorkspaceSendActions({ ), }; hasBoundSkillLaunch = true; + completedSlashUsage = { + kind: "scene", + entryId: sceneLaunchRequest.sceneEntry.sceneKey, + }; } } @@ -1725,6 +2433,20 @@ export function useWorkspaceSendActions({ } } + const mergedRequestMetadataAfterLaunch = { + ...(workspaceRequestMetadataBase || {}), + ...(sendOptions?.requestMetadata || {}), + }; + if ( + !projectId && + !hasServiceSkillLaunchRequestMetadata(mergedRequestMetadataAfterLaunch) + ) { + sendOptions?.observer?.onError?.("请先选择项目后再开始对话"); + toast.error("请先选择项目后再开始对话"); + clearSubmissionPreview(); + return { kind: "done", result: false }; + } + const shouldPrimeSessionForInitialConversationSend = !sendOptions?.purpose && !hasBoundSkillLaunch && @@ -1754,11 +2476,19 @@ export function useWorkspaceSendActions({ preparedActiveContextPrompt, }); if (pendingCommandSessionBinding) { - attachSessionIdToRequestContext( - pendingCommandSessionBinding.requestContext, - pendingCommandSessionBinding.requestContextKey, - await ensureCommandSessionId(), - ); + const resolvedSessionId = await ensureCommandSessionId(); + if (pendingCommandSessionBinding.kind === "request_context") { + attachSessionIdToRequestContext( + pendingCommandSessionBinding.requestContext, + pendingCommandSessionBinding.requestContextKey, + resolvedSessionId, + ); + } else { + attachSessionIdToScopedRequestContext( + pendingCommandSessionBinding.scopedRequestContext, + resolvedSessionId, + ); + } } submissionPreviewKey = resolvedSubmissionPreviewKey; } catch (error) { @@ -1781,6 +2511,9 @@ export function useWorkspaceSendActions({ sendExecutionStrategy, autoContinuePayload, sendOptions, + completedMentionCommandUsage, + completedMentionUsage, + completedSlashUsage, }, }; }, @@ -1819,6 +2552,8 @@ export function useWorkspaceSendActions({ sendExecutionStrategy, autoContinuePayload, sendOptions, + completedMentionCommandUsage, + completedMentionUsage, } = plan; setRuntimeTeamDispatchPreview(null); @@ -1886,6 +2621,22 @@ export function useWorkspaceSendActions({ nextSendOptions, ); + if (completedMentionCommandUsage) { + recordMentionEntryUsage({ + kind: "builtin_command", + entryId: completedMentionCommandUsage.entryId, + replayText: completedMentionCommandUsage.replayText, + }); + } + + if (completedMentionUsage) { + recordServiceSkillUsage(completedMentionUsage); + } + + if (plan.completedSlashUsage) { + recordSlashEntryUsage(plan.completedSlashUsage); + } + finalizeAfterSendSuccess(sendBoundary); return true; } catch (error) { diff --git a/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.test.tsx b/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.test.tsx index 35cc15659..09d2f9adf 100644 --- a/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.test.tsx @@ -13,6 +13,7 @@ const mockGetServiceSkillRun = vi.fn(); const mockIsTerminalServiceSkillRunStatus = vi.fn(); const mockCreateContent = vi.fn(); const mockListProjects = vi.fn(); +const mockGetOrCreateDefaultProject = vi.fn(); const mockRecordServiceSkillAutomationLink = vi.fn(); const mockSiteGetAdapterLaunchReadiness = vi.fn(); const mockToastSuccess = vi.fn(); @@ -42,6 +43,7 @@ vi.mock("@/lib/api/serviceSkillRuns", () => ({ vi.mock("@/lib/api/project", () => ({ createContent: (request: unknown) => mockCreateContent(request), + getOrCreateDefaultProject: () => mockGetOrCreateDefaultProject(), listProjects: () => mockListProjects(), getDefaultContentTypeForProject: (projectType: string) => { switch (projectType) { @@ -322,6 +324,7 @@ beforeEach(() => { id: "content-created-by-service-skill", }); mockListProjects.mockResolvedValue([createProject()]); + mockGetOrCreateDefaultProject.mockResolvedValue(createProject("project-default")); mockRecordServiceSkillAutomationLink.mockReset(); mockToastSuccess.mockReset(); mockToastError.mockReset(); @@ -473,6 +476,45 @@ describe("useWorkspaceServiceSkillEntryActions", () => { ); }); + it("站点型技能缺少当前项目时应回退默认项目后再进入工作区", async () => { + const onNavigate = vi.fn(); + const { render, getValue } = renderHook({ + onNavigate, + projectId: null, + contentId: null, + recordServiceSkillUsage: vi.fn(), + }); + await render(); + + await act(async () => { + await getValue().handleServiceSkillLaunch(createBrowserServiceSkill(), { + repository_query: "browser assist mcp", + }); + }); + + expect(mockGetOrCreateDefaultProject).toHaveBeenCalledTimes(1); + expect(mockCreateContent).toHaveBeenCalledWith( + expect.objectContaining({ + project_id: "project-default", + }), + ); + expect(onNavigate).toHaveBeenCalledWith( + "agent", + expect.objectContaining({ + projectId: "project-default", + contentId: "content-created-by-service-skill", + initialAutoSendRequestMetadata: { + harness: expect.objectContaining({ + service_skill_launch: expect.objectContaining({ + project_id: "project-default", + content_id: "content-created-by-service-skill", + }), + }), + }, + }), + ); + }); + it("站点型技能次级动作才应跳到浏览器工作台", async () => { const onNavigate = vi.fn(); const recordServiceSkillUsage = vi.fn(); diff --git a/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.ts b/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.ts index 78fc83dba..5f5ad7e9f 100644 --- a/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.ts +++ b/src/components/agent/chat/workspace/useWorkspaceServiceSkillEntryActions.ts @@ -10,6 +10,7 @@ import { } from "@/lib/api/serviceSkillRuns"; import { createContent, + getOrCreateDefaultProject, listProjects, type Project, } from "@/lib/api/project"; @@ -89,6 +90,18 @@ function normalizeOptionalText(value?: string | null): string | undefined { return normalized ? normalized : undefined; } +function siteSkillRequiresProject(skill: ServiceSkillHomeItem): boolean { + if (!isServiceSkillExecutableAsSiteAdapter(skill)) { + return false; + } + + return ( + skill.readinessRequirements?.requiresProject || + (skill.siteCapabilityBinding.saveMode ?? "project_resource") === + "project_resource" + ); +} + interface ServiceSkillLaunchOptions { launchUserInput?: string | null; fallbackToWorkspaceOnCloudSubmitFailure?: boolean; @@ -277,7 +290,7 @@ export function useWorkspaceServiceSkillEntryActions({ ), }; const resolved = resolveWorkspaceEntry({ - projectId: currentProjectId, + projectId: payload.projectId ?? currentProjectId, activeTheme, creationMode, defaultToolPreferences: chatToolPreferences, @@ -352,6 +365,27 @@ export function useWorkspaceServiceSkillEntryActions({ [activeTheme, currentProjectId], ); + const resolveSiteSkillProjectId = useCallback( + async (skill: ServiceSkillHomeItem): Promise => { + if (!siteSkillRequiresProject(skill)) { + return undefined; + } + + if (currentProjectId) { + return currentProjectId; + } + + const defaultProject = await getOrCreateDefaultProject(); + const defaultProjectId = normalizeProjectId(defaultProject?.id); + if (!defaultProjectId) { + throw new Error("当前技能需要项目工作区,但默认项目准备失败。"); + } + + return defaultProjectId; + }, + [currentProjectId], + ); + const prepareServiceSkillWorkspacePayload = useCallback( async ( skill: ServiceSkillHomeItem, @@ -432,13 +466,7 @@ export function useWorkspaceServiceSkillEntryActions({ throw new Error(buildSiteLaunchBlockedMessage(launchReadiness)); } - if ( - skill.readinessRequirements?.requiresProject && - !currentProjectId - ) { - throw new Error("缺少项目工作区,请先选择项目后再启动站点技能。"); - } - + const resolvedProjectId = await resolveSiteSkillProjectId(skill); const binding = skill.siteCapabilityBinding; const saveMode = binding.saveMode ?? "project_resource"; const initialSaveTitle = buildServiceSkillSiteCapabilitySaveTitle( @@ -450,11 +478,11 @@ export function useWorkspaceServiceSkillEntryActions({ if ( saveMode === "current_content" && !nextContentId && - currentProjectId + resolvedProjectId ) { const created = await createServiceSkillSeededContent( skill, - currentProjectId, + resolvedProjectId, ); nextContentId = created?.id ?? undefined; } @@ -462,7 +490,7 @@ export function useWorkspaceServiceSkillEntryActions({ const clawLaunchContext = { ...buildServiceSkillClawLaunchContext(skill, slotValues, { contentId: nextContentId, - projectId: currentProjectId, + projectId: resolvedProjectId, launchReadiness, }), saveTitle: nextContentId ? undefined : initialSaveTitle, @@ -476,6 +504,7 @@ export function useWorkspaceServiceSkillEntryActions({ return { prompt, + projectId: resolvedProjectId, contentId: nextContentId, themeOverride: "general", initialAutoSendRequestMetadata: @@ -483,7 +512,12 @@ export function useWorkspaceServiceSkillEntryActions({ autoRunInitialPromptOnMount: true, }; }, - [createServiceSkillSeededContent, currentContentId, currentProjectId, input], + [ + createServiceSkillSeededContent, + currentContentId, + input, + resolveSiteSkillProjectId, + ], ); const prepareServiceSkillCloudResultWorkspacePayload = useCallback( @@ -548,11 +582,11 @@ export function useWorkspaceServiceSkillEntryActions({ return; } - if ( - skill.readinessRequirements?.requiresProject && - !currentProjectId - ) { - toast.error("缺少项目工作区,请先选择项目后再启动浏览器采集。"); + let resolvedProjectId: string | undefined; + try { + resolvedProjectId = await resolveSiteSkillProjectId(skill); + } catch (error) { + toast.error(getErrorMessage(error)); return; } @@ -581,12 +615,12 @@ export function useWorkspaceServiceSkillEntryActions({ if ( saveMode === "current_content" && !nextContentId && - currentProjectId + resolvedProjectId ) { try { const created = await createServiceSkillSeededContent( skill, - currentProjectId, + resolvedProjectId, ); nextContentId = created?.id ?? undefined; } catch (error) { @@ -596,7 +630,7 @@ export function useWorkspaceServiceSkillEntryActions({ } const navigationParams: BrowserRuntimePageParams = { - projectId: currentProjectId ?? undefined, + projectId: resolvedProjectId, contentId: nextContentId, initialProfileKey: launchReadiness?.status === "ready" @@ -624,9 +658,9 @@ export function useWorkspaceServiceSkillEntryActions({ [ createServiceSkillSeededContent, currentContentId, - currentProjectId, onNavigate, recordServiceSkillUsage, + resolveSiteSkillProjectId, ], ); diff --git a/src/components/agent/chat/workspace/useWorkspaceShellSceneRuntime.tsx b/src/components/agent/chat/workspace/useWorkspaceShellSceneRuntime.tsx index 30fb3518b..f91dba7ac 100644 --- a/src/components/agent/chat/workspace/useWorkspaceShellSceneRuntime.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceShellSceneRuntime.tsx @@ -16,6 +16,7 @@ interface UseWorkspaceShellSceneRuntimeParams { isThemeWorkbench: boolean; showChatPanel: boolean; showSidebar: boolean; + sidebarContextVariant?: WorkspaceShellSceneProps["sidebarContextVariant"]; generalWorkbenchShellRuntime: GeneralWorkbenchShellRuntime; conversationSceneRuntime: ConversationSceneRuntime; sessionId?: WorkspaceShellSceneProps["currentTopicId"]; @@ -40,6 +41,7 @@ export function useWorkspaceShellSceneRuntime({ isThemeWorkbench, showChatPanel, showSidebar, + sidebarContextVariant = "default", generalWorkbenchShellRuntime, conversationSceneRuntime, sessionId, @@ -68,6 +70,7 @@ export function useWorkspaceShellSceneRuntime({ } showChatPanel={showChatPanel} showSidebar={showSidebar} + sidebarContextVariant={sidebarContextVariant} showGeneralWorkbenchLeftExpandButton={ generalWorkbenchShellRuntime.showGeneralWorkbenchLeftExpandButton } diff --git a/src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.test.tsx b/src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.test.tsx new file mode 100644 index 000000000..5d4f7d89a --- /dev/null +++ b/src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.test.tsx @@ -0,0 +1,250 @@ +import React from "react"; +import { act } from "react"; +import { createRoot, type Root } from "react-dom/client"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { emitVideoWorkbenchTaskAction } from "@/lib/videoWorkbenchEvents"; +import type { Message } from "../types"; +import { useWorkspaceVideoTaskActionRuntime } from "./useWorkspaceVideoTaskActionRuntime"; + +const { mockCancelTask, mockCreateTask, mockGetTask, toast } = vi.hoisted( + () => ({ + mockCancelTask: vi.fn(), + mockCreateTask: vi.fn(), + mockGetTask: vi.fn(), + toast: { + error: vi.fn(), + success: vi.fn(), + }, + }), +); + +vi.mock("sonner", () => ({ + toast, +})); + +vi.mock("@/lib/api/videoGeneration", () => ({ + videoGenerationApi: { + getTask: mockGetTask, + createTask: mockCreateTask, + cancelTask: mockCancelTask, + }, +})); + +type HookProps = Parameters[0]; + +const mountedRoots: Array<{ container: HTMLDivElement; root: Root }> = []; + +function buildFailedVideoMessage(): Message { + return { + id: "msg-video-failed-1", + role: "assistant", + content: "视频任务失败。", + timestamp: new Date(), + taskPreview: { + kind: "video_generate", + taskId: "task-video-old", + taskType: "video_generate", + prompt: "新品发布会短视频", + status: "failed", + durationSeconds: 15, + aspectRatio: "16:9", + resolution: "720p", + projectId: "project-video-1", + contentId: "content-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + }, + }; +} + +function buildRunningVideoMessage(): Message { + return { + ...buildFailedVideoMessage(), + id: "msg-video-running-1", + content: "视频任务进行中。", + taskPreview: { + ...buildFailedVideoMessage().taskPreview!, + taskId: "task-video-running", + status: "running", + progress: 32, + statusMessage: "视频任务正在生成中,工作区会继续同步最新状态。", + }, + }; +} + +function renderHook(props: HookProps) { + const container = document.createElement("div"); + document.body.appendChild(container); + const root = createRoot(container); + + function Probe(currentProps: HookProps) { + useWorkspaceVideoTaskActionRuntime(currentProps); + return null; + } + + const render = async () => { + await act(async () => { + root.render(); + await Promise.resolve(); + }); + }; + + mountedRoots.push({ container, root }); + return { render }; +} + +beforeEach(() => { + ( + globalThis as typeof globalThis & { + IS_REACT_ACT_ENVIRONMENT?: boolean; + } + ).IS_REACT_ACT_ENVIRONMENT = true; + mockCancelTask.mockReset(); + mockCreateTask.mockReset(); + mockGetTask.mockReset(); + toast.error.mockReset(); + toast.success.mockReset(); +}); + +afterEach(() => { + while (mountedRoots.length > 0) { + const mounted = mountedRoots.pop(); + if (!mounted) { + break; + } + act(() => { + mounted.root.unmount(); + }); + mounted.container.remove(); + } +}); + +describe("useWorkspaceVideoTaskActionRuntime", () => { + it("应响应聊天区视频任务卡的重试动作,并把消息卡切回新的运行任务", async () => { + let messages: Message[] = [buildFailedVideoMessage()]; + const setChatMessages: HookProps["setChatMessages"] = (value) => { + messages = typeof value === "function" ? value(messages) : value; + }; + + mockGetTask.mockResolvedValue({ + id: "task-video-old", + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "新品发布会短视频", + requestPayload: JSON.stringify({ + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "新品发布会短视频", + aspectRatio: "16:9", + resolution: "720p", + duration: 15, + imageUrl: "material://start", + endImageUrl: "material://end", + }), + status: "error", + createdAt: Date.now(), + updatedAt: Date.now(), + }); + mockCreateTask.mockResolvedValue({ + id: "task-video-new", + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "新品发布会短视频", + status: "pending", + progress: 0, + createdAt: Date.now(), + updatedAt: Date.now(), + }); + + const harness = renderHook({ + projectId: "project-video-1", + contentId: "content-video-1", + setChatMessages, + }); + + await harness.render(); + await act(async () => { + emitVideoWorkbenchTaskAction({ + action: "retry", + taskId: "task-video-old", + projectId: "project-video-1", + contentId: "content-video-1", + }); + await Promise.resolve(); + await Promise.resolve(); + }); + + expect(mockGetTask).toHaveBeenCalledWith("task-video-old", { + refreshStatus: false, + }); + expect(mockCreateTask).toHaveBeenCalledWith({ + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "新品发布会短视频", + aspectRatio: "16:9", + resolution: "720p", + duration: 15, + imageUrl: "material://start", + endImageUrl: "material://end", + }); + expect(messages[0]?.taskPreview).toMatchObject({ + kind: "video_generate", + taskId: "task-video-new", + status: "running", + phase: "queued", + videoUrl: null, + statusMessage: "视频任务已重新提交,工作区会继续同步最新状态。", + }); + expect(toast.success).toHaveBeenCalledWith("已重新提交视频任务"); + }); + + it("应响应聊天区视频任务卡的取消动作,并立即回写已取消状态", async () => { + let messages: Message[] = [buildRunningVideoMessage()]; + const setChatMessages: HookProps["setChatMessages"] = (value) => { + messages = typeof value === "function" ? value(messages) : value; + }; + + mockCancelTask.mockResolvedValue({ + id: "task-video-running", + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "新品发布会短视频", + status: "cancelled", + createdAt: Date.now(), + updatedAt: Date.now(), + }); + + const harness = renderHook({ + projectId: "project-video-1", + contentId: "content-video-1", + setChatMessages, + }); + + await harness.render(); + await act(async () => { + emitVideoWorkbenchTaskAction({ + action: "cancel", + taskId: "task-video-running", + projectId: "project-video-1", + contentId: "content-video-1", + }); + await Promise.resolve(); + await Promise.resolve(); + }); + + expect(mockCancelTask).toHaveBeenCalledWith("task-video-running"); + expect(messages[0]?.taskPreview).toMatchObject({ + kind: "video_generate", + taskId: "task-video-running", + status: "cancelled", + phase: null, + statusMessage: "视频任务已取消,当前不会继续生成新的结果。", + }); + expect(toast.success).toHaveBeenCalledWith("已提交取消请求"); + }); +}); diff --git a/src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.ts b/src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.ts new file mode 100644 index 000000000..6f1aa1eba --- /dev/null +++ b/src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.ts @@ -0,0 +1,254 @@ +import { + useCallback, + useEffect, + type Dispatch, + type SetStateAction, +} from "react"; +import { toast } from "sonner"; +import { + type CreateVideoGenerationRequest, + videoGenerationApi, +} from "@/lib/api/videoGeneration"; +import { onVideoWorkbenchTaskAction } from "@/lib/videoWorkbenchEvents"; +import type { Message, MessageVideoTaskPreview } from "../types"; +import { + buildVideoPreviewFromTask, + clampVideoTaskProgress, + resolveVideoPreviewPhase, + resolveVideoPreviewStatus, +} from "./videoTaskPreviewState"; + +interface UseWorkspaceVideoTaskActionRuntimeParams { + projectId?: string | null; + contentId?: string | null; + setChatMessages: Dispatch>; +} + +function parseTaskRequestPayload( + requestPayload?: string | null, +): Partial | null { + const normalizedPayload = requestPayload?.trim(); + if (!normalizedPayload) { + return null; + } + + try { + const parsed = JSON.parse(normalizedPayload) as unknown; + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + return null; + } + return parsed as Partial; + } catch { + return null; + } +} + +function buildRetryRequest( + task: Awaited>, + preview?: MessageVideoTaskPreview, +): CreateVideoGenerationRequest | null { + if (!task) { + return null; + } + + const payload = parseTaskRequestPayload(task.requestPayload); + const projectId = payload?.projectId || task.projectId; + const providerId = payload?.providerId || task.providerId; + const model = payload?.model || task.model; + const prompt = payload?.prompt || task.prompt; + + if (!projectId || !providerId || !model || !prompt?.trim()) { + return null; + } + + return { + projectId, + providerId, + model, + prompt: prompt.trim(), + aspectRatio: payload?.aspectRatio || preview?.aspectRatio, + resolution: payload?.resolution || preview?.resolution, + duration: payload?.duration || preview?.durationSeconds, + imageUrl: payload?.imageUrl, + endImageUrl: payload?.endImageUrl, + seed: payload?.seed, + generateAudio: payload?.generateAudio, + cameraFixed: payload?.cameraFixed, + }; +} + +function matchesTaskActionContext(params: { + detailProjectId?: string | null; + detailContentId?: string | null; + projectId?: string | null; + contentId?: string | null; +}): boolean { + if ( + params.detailProjectId && + params.projectId && + params.detailProjectId !== params.projectId + ) { + return false; + } + + if ( + params.detailContentId && + params.contentId && + params.detailContentId !== params.contentId + ) { + return false; + } + + return true; +} + +function updateVideoPreviewByTaskId( + previous: Message[], + taskId: string, + updater: (preview: MessageVideoTaskPreview) => MessageVideoTaskPreview, +): Message[] { + let changed = false; + const nextMessages = previous.map((message) => { + const preview = message.taskPreview; + if (preview?.kind !== "video_generate" || preview.taskId !== taskId) { + return message; + } + + changed = true; + return { + ...message, + taskPreview: updater(preview), + }; + }); + + return changed ? nextMessages : previous; +} + +export function useWorkspaceVideoTaskActionRuntime({ + projectId, + contentId, + setChatMessages, +}: UseWorkspaceVideoTaskActionRuntimeParams) { + const handleRetryVideoTask = useCallback( + async (taskId: string) => { + const normalizedTaskId = taskId.trim(); + if (!normalizedTaskId) { + toast.error("缺少视频任务 ID,暂时无法重新生成"); + return false; + } + + const originalTask = await videoGenerationApi.getTask(normalizedTaskId, { + refreshStatus: false, + }); + if (!originalTask) { + toast.error("未找到原视频任务,暂时无法重新生成"); + return false; + } + + let sourcePreview: MessageVideoTaskPreview | null = null; + setChatMessages((previous) => { + previous.some((message) => { + if ( + message.taskPreview?.kind === "video_generate" && + message.taskPreview.taskId === normalizedTaskId + ) { + sourcePreview = message.taskPreview; + return true; + } + return false; + }); + return previous; + }); + + const retryRequest = buildRetryRequest( + originalTask, + sourcePreview || undefined, + ); + if (!retryRequest) { + toast.error("原视频任务缺少必要参数,暂时无法重新生成"); + return false; + } + + try { + const created = await videoGenerationApi.createTask(retryRequest); + setChatMessages((previous) => + updateVideoPreviewByTaskId(previous, normalizedTaskId, (preview) => ({ + ...preview, + taskId: created.id, + prompt: created.prompt?.trim() || preview.prompt, + status: resolveVideoPreviewStatus(created.status), + projectId: created.projectId || preview.projectId || null, + videoUrl: null, + thumbnailUrl: null, + providerId: created.providerId || preview.providerId || null, + model: created.model || preview.model || null, + progress: clampVideoTaskProgress(created.progress), + phase: resolveVideoPreviewPhase(created.status), + statusMessage: "视频任务已重新提交,工作区会继续同步最新状态。", + })), + ); + toast.success("已重新提交视频任务"); + return true; + } catch (error) { + toast.error( + error instanceof Error ? error.message : "重新提交视频任务失败", + ); + return false; + } + }, + [setChatMessages], + ); + + const handleCancelVideoTask = useCallback( + async (taskId: string) => { + const normalizedTaskId = taskId.trim(); + if (!normalizedTaskId) { + toast.error("缺少视频任务 ID,暂时无法取消"); + return false; + } + + try { + const cancelledTask = await videoGenerationApi.cancelTask( + normalizedTaskId, + ); + if (cancelledTask) { + setChatMessages((previous) => + updateVideoPreviewByTaskId(previous, normalizedTaskId, (preview) => + buildVideoPreviewFromTask(cancelledTask, preview), + ), + ); + } + toast.success("已提交取消请求"); + return true; + } catch (error) { + toast.error( + error instanceof Error ? error.message : "取消视频任务失败", + ); + return false; + } + }, + [setChatMessages], + ); + + useEffect(() => { + return onVideoWorkbenchTaskAction((detail) => { + if ( + !matchesTaskActionContext({ + detailProjectId: detail.projectId, + detailContentId: detail.contentId, + projectId, + contentId, + }) + ) { + return; + } + + if (detail.action === "retry") { + void handleRetryVideoTask(detail.taskId); + return; + } + + void handleCancelVideoTask(detail.taskId); + }); + }, [contentId, handleCancelVideoTask, handleRetryVideoTask, projectId]); +} diff --git a/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.test.tsx b/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.test.tsx index 5cbdc7be3..d2efb2fcd 100644 --- a/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.test.tsx @@ -140,6 +140,7 @@ describe("useWorkspaceVideoTaskPreviewRuntime", () => { taskPreview: { ...buildVideoMessage().taskPreview!, status: "complete", + videoUrl: "https://example.com/already-synced.mp4", }, }, ], @@ -155,4 +156,54 @@ describe("useWorkspaceVideoTaskPreviewRuntime", () => { expect(mockGetTask).not.toHaveBeenCalled(); }); + + it("历史里的视频任务已完成但尚未带回 videoUrl 时,也应继续回填最终结果", async () => { + let messages: Message[] = [ + { + ...buildVideoMessage(), + taskPreview: { + ...buildVideoMessage().taskPreview!, + status: "complete", + statusMessage: "视频已经生成完成,正在同步最终结果。", + }, + }, + ]; + const setChatMessages: HookProps["setChatMessages"] = (value) => { + messages = typeof value === "function" ? value(messages) : value; + }; + + mockGetTask.mockResolvedValue({ + id: "task-video-1", + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "新品发布会短视频", + status: "success", + progress: 100, + resultUrl: "https://example.com/history-video.mp4", + createdAt: Date.now(), + updatedAt: Date.now(), + }); + + const harness = renderHook({ + messages, + setChatMessages, + }); + + await harness.render(); + await act(async () => { + await Promise.resolve(); + }); + + expect(mockGetTask).toHaveBeenCalledWith("task-video-1", { + refreshStatus: true, + }); + expect(messages[0]?.taskPreview).toMatchObject({ + kind: "video_generate", + taskId: "task-video-1", + status: "complete", + videoUrl: "https://example.com/history-video.mp4", + statusMessage: "视频结果已同步,打开查看即可继续预览。", + }); + }); }); diff --git a/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.ts b/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.ts index 8c3b32ea7..db172cd7b 100644 --- a/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.ts +++ b/src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.ts @@ -1,9 +1,10 @@ import { useEffect, useRef, type Dispatch, type SetStateAction } from "react"; -import { - videoGenerationApi, - type VideoGenerationTask, -} from "@/lib/api/videoGeneration"; +import { videoGenerationApi } from "@/lib/api/videoGeneration"; import type { Message, MessageVideoTaskPreview } from "../types"; +import { + areVideoPreviewsEqual, + buildVideoPreviewFromTask, +} from "./videoTaskPreviewState"; const VIDEO_TASK_POLL_INTERVAL_MS = 3000; @@ -12,115 +13,28 @@ interface UseWorkspaceVideoTaskPreviewRuntimeParams { setChatMessages: Dispatch>; } -function clampProgress(value?: number | null): number | null { - if (typeof value !== "number" || Number.isNaN(value)) { - return null; +function shouldTrackVideoPreview(preview?: MessageVideoTaskPreview): boolean { + if (!preview) { + return false; } - return Math.max(0, Math.min(100, Math.round(value))); -} -function resolvePreviewStatus( - status: VideoGenerationTask["status"], -): MessageVideoTaskPreview["status"] { - switch (status) { - case "success": - return "complete"; - case "error": - return "failed"; - case "cancelled": - return "cancelled"; - case "pending": - case "processing": - default: - return "running"; + if (preview.status === "running") { + return true; } -} -function resolvePreviewPhase( - status: VideoGenerationTask["status"], -): MessageVideoTaskPreview["phase"] { - if (status === "pending") { - return "queued"; - } - if (status === "processing") { - return "running"; - } - return null; -} - -function resolveStatusMessage( - task: VideoGenerationTask, - previewStatus: MessageVideoTaskPreview["status"], - progress: number | null, -): string { - if (previewStatus === "complete") { - return task.resultUrl - ? "视频结果已同步,打开查看即可继续预览。" - : "视频已经生成完成,工作区正在同步最终结果。"; - } - if (previewStatus === "failed") { - return task.errorMessage?.trim() || "视频生成失败,请稍后重试。"; - } - if (previewStatus === "cancelled") { - return "视频任务已取消,当前不会继续生成新的结果。"; - } - if (typeof progress === "number" && progress > 0) { - return `视频正在生成中,当前进度约 ${progress}%。`; - } - if (task.status === "pending") { - return "视频任务已进入排队队列,稍后会自动开始生成。"; - } - return "视频任务正在生成中,工作区会继续同步最新状态。"; -} - -function buildPreviewFromTask( - task: VideoGenerationTask, - currentPreview: MessageVideoTaskPreview, -): MessageVideoTaskPreview { - const nextStatus = resolvePreviewStatus(task.status); - const progress = clampProgress(task.progress); - - return { - ...currentPreview, - kind: "video_generate", - taskId: task.id, - taskType: "video_generate", - prompt: task.prompt?.trim() || currentPreview.prompt, - status: nextStatus, - projectId: task.projectId || currentPreview.projectId || null, - videoUrl: task.resultUrl || currentPreview.videoUrl || null, - providerId: task.providerId || currentPreview.providerId || null, - model: task.model || currentPreview.model || null, - progress, - phase: resolvePreviewPhase(task.status), - statusMessage: resolveStatusMessage(task, nextStatus, progress), - }; -} - -function areVideoPreviewsEqual( - previous: MessageVideoTaskPreview, - next: MessageVideoTaskPreview, -): boolean { return ( - previous.prompt === next.prompt && - previous.status === next.status && - previous.projectId === next.projectId && - previous.videoUrl === next.videoUrl && - previous.providerId === next.providerId && - previous.model === next.model && - previous.progress === next.progress && - previous.phase === next.phase && - previous.statusMessage === next.statusMessage + (preview.status === "complete" || preview.status === "partial") && + !preview.videoUrl?.trim() ); } function collectTrackedTaskIds(messages: Message[]): string[] { const taskIds = new Set(); messages.forEach((message) => { - if ( - message.taskPreview?.kind !== "video_generate" || - message.taskPreview.status !== "running" - ) { + if (message.taskPreview?.kind !== "video_generate") { + return; + } + if (!shouldTrackVideoPreview(message.taskPreview)) { return; } const taskId = message.taskPreview.taskId.trim(); @@ -182,7 +96,7 @@ export function useWorkspaceVideoTaskPreviewRuntime({ return message; } - const nextPreview = buildPreviewFromTask(task, currentPreview); + const nextPreview = buildVideoPreviewFromTask(task, currentPreview); if (areVideoPreviewsEqual(currentPreview, nextPreview)) { return message; } diff --git a/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.test.tsx b/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.test.tsx index 2a287d585..90b654cdb 100644 --- a/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.test.tsx +++ b/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.test.tsx @@ -151,6 +151,58 @@ describe("useWorkspaceWriteFileAction", () => { expect(setLayoutMode).not.toHaveBeenCalled(); }); + it("tool_result 来源的通用产物不应自动选中或展开工作台", async () => { + const setSelectedArtifactId = vi.fn(); + const setArtifactViewMode = vi.fn(); + const setLayoutMode = vi.fn(); + const { render, getValue } = renderHook({ + setSelectedArtifactId, + setArtifactViewMode, + setLayoutMode, + suppressCanvasAutoOpen: false, + }); + + await render(); + + act(() => { + getValue()("## 结果摘要", "summary.md", { + source: "tool_result", + status: "complete", + metadata: { + writePhase: "completed", + }, + }); + }); + + expect(setSelectedArtifactId).not.toHaveBeenCalled(); + expect(setArtifactViewMode).not.toHaveBeenCalled(); + expect(setLayoutMode).not.toHaveBeenCalled(); + }); + + it("空内容的图片 tool_result 不应进入通用 artifact 工作台", async () => { + const upsertGeneralArtifact = vi.fn(); + const setSelectedArtifactId = vi.fn(); + const { render, getValue } = renderHook({ + upsertGeneralArtifact, + setSelectedArtifactId, + }); + + await render(); + + act(() => { + getValue()("", "output_image.jpg", { + source: "tool_result", + status: "complete", + metadata: { + writePhase: "completed", + }, + }); + }); + + expect(upsertGeneralArtifact).not.toHaveBeenCalled(); + expect(setSelectedArtifactId).not.toHaveBeenCalled(); + }); + it("进行中的流式写入仍应自动展开画布,便于实时查看输出", async () => { const setArtifactViewMode = vi.fn(); const setLayoutMode = vi.fn(); diff --git a/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.ts b/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.ts index cbc2f652e..fd6b64ade 100644 --- a/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.ts +++ b/src/components/agent/chat/workspace/useWorkspaceWriteFileAction.ts @@ -8,7 +8,11 @@ import { createInitialDocumentState } from "@/lib/workspace/workbenchCanvas"; import type { CanvasStateUnion } from "@/lib/workspace/workbenchCanvas"; import { activityLogger } from "@/lib/workspace/workbenchRuntime"; import type { ThemeType, LayoutMode } from "@/lib/workspace/workbenchContract"; -import { resolveArtifactProtocolFilePath } from "@/lib/artifact-protocol"; +import { + areArtifactProtocolPathsEquivalent, + isArtifactProtocolImagePath, + resolveArtifactProtocolFilePath, +} from "@/lib/artifact-protocol"; import type { TaskFile } from "../components/TaskFiles"; import type { TopicBranchStatus } from "../hooks/useTopicBranchBoard"; import type { WriteArtifactContext } from "../types"; @@ -40,6 +44,25 @@ function shouldAutoOpenCanvasForActiveWrite( ); } +function shouldBackgroundGeneralArtifactWrite( + context?: WriteArtifactContext, +): boolean { + return context?.source === "tool_result"; +} + +function shouldSkipGeneralArtifactWrite(params: { + fileName: string; + content: string; + context?: WriteArtifactContext; +}): boolean { + return ( + params.content.length === 0 && + isArtifactProtocolImagePath(params.fileName) && + (params.context?.source === "tool_result" || + params.context?.source === "artifact_snapshot") + ); +} + function isContentPostDocumentFile(fileName: string, fileType: string): boolean { return fileType === "document" && /^content-posts\/.+\.md$/i.test(fileName); } @@ -178,7 +201,10 @@ export function useWorkspaceWriteFileAction({ return true; } - return resolveArtifactProtocolFilePath(artifact) === fileName; + return areArtifactProtocolPathsEquivalent( + resolveArtifactProtocolFilePath(artifact), + fileName, + ); }); const nextContent = content.length > 0 @@ -212,6 +238,17 @@ export function useWorkspaceWriteFileAction({ (nextContent.length > 0 ? "complete" : "pending"), }, }); + const shouldKeepInBackground = shouldBackgroundGeneralArtifactWrite(context); + + if ( + shouldSkipGeneralArtifactWrite({ + fileName, + content: nextContent, + context, + }) + ) { + return; + } const syncResource = () => { if (nextArtifact.status !== "complete") { @@ -238,21 +275,23 @@ export function useWorkspaceWriteFileAction({ } upsertGeneralArtifact(nextArtifact); - setSelectedArtifactId(nextArtifact.id); - setArtifactViewMode( - resolveDefaultArtifactViewMode(nextArtifact, { - preferSourceWhenStreaming: true, - }), - { artifactId: nextArtifact.id }, - ); - if ( - !suppressCanvasAutoOpen && - shouldAutoOpenCanvasForActiveWrite( - nextArtifact.status, - nextArtifact.meta.writePhase, - ) - ) { - setLayoutMode("chat-canvas"); + if (!shouldKeepInBackground) { + setSelectedArtifactId(nextArtifact.id); + setArtifactViewMode( + resolveDefaultArtifactViewMode(nextArtifact, { + preferSourceWhenStreaming: true, + }), + { artifactId: nextArtifact.id }, + ); + if ( + !suppressCanvasAutoOpen && + shouldAutoOpenCanvasForActiveWrite( + nextArtifact.status, + nextArtifact.meta.writePhase, + ) + ) { + setLayoutMode("chat-canvas"); + } } return; } diff --git a/src/components/agent/chat/workspace/videoTaskPreviewState.ts b/src/components/agent/chat/workspace/videoTaskPreviewState.ts new file mode 100644 index 000000000..1dc0fa7a8 --- /dev/null +++ b/src/components/agent/chat/workspace/videoTaskPreviewState.ts @@ -0,0 +1,105 @@ +import type { VideoGenerationTask } from "@/lib/api/videoGeneration"; +import type { MessageVideoTaskPreview } from "../types"; + +export function clampVideoTaskProgress(value?: number | null): number | null { + if (typeof value !== "number" || Number.isNaN(value)) { + return null; + } + return Math.max(0, Math.min(100, Math.round(value))); +} + +export function resolveVideoPreviewStatus( + status: VideoGenerationTask["status"], +): MessageVideoTaskPreview["status"] { + switch (status) { + case "success": + return "complete"; + case "error": + return "failed"; + case "cancelled": + return "cancelled"; + case "pending": + case "processing": + default: + return "running"; + } +} + +export function resolveVideoPreviewPhase( + status: VideoGenerationTask["status"], +): MessageVideoTaskPreview["phase"] { + if (status === "pending") { + return "queued"; + } + if (status === "processing") { + return "running"; + } + return null; +} + +export function resolveVideoStatusMessage( + task: VideoGenerationTask, + previewStatus: MessageVideoTaskPreview["status"], + progress: number | null, +): string { + if (previewStatus === "complete") { + return task.resultUrl + ? "视频结果已同步,打开查看即可继续预览。" + : "视频已经生成完成,工作区正在同步最终结果。"; + } + if (previewStatus === "failed") { + return task.errorMessage?.trim() || "视频生成失败,请稍后重试。"; + } + if (previewStatus === "cancelled") { + return "视频任务已取消,当前不会继续生成新的结果。"; + } + if (typeof progress === "number" && progress > 0) { + return `视频正在生成中,当前进度约 ${progress}%。`; + } + if (task.status === "pending") { + return "视频任务已进入排队队列,稍后会自动开始生成。"; + } + return "视频任务正在生成中,工作区会继续同步最新状态。"; +} + +export function buildVideoPreviewFromTask( + task: VideoGenerationTask, + currentPreview: MessageVideoTaskPreview, +): MessageVideoTaskPreview { + const nextStatus = resolveVideoPreviewStatus(task.status); + const progress = clampVideoTaskProgress(task.progress); + + return { + ...currentPreview, + kind: "video_generate", + taskId: task.id, + taskType: "video_generate", + prompt: task.prompt?.trim() || currentPreview.prompt, + status: nextStatus, + projectId: task.projectId || currentPreview.projectId || null, + videoUrl: task.resultUrl || currentPreview.videoUrl || null, + providerId: task.providerId || currentPreview.providerId || null, + model: task.model || currentPreview.model || null, + progress, + phase: resolveVideoPreviewPhase(task.status), + statusMessage: resolveVideoStatusMessage(task, nextStatus, progress), + }; +} + +export function areVideoPreviewsEqual( + previous: MessageVideoTaskPreview, + next: MessageVideoTaskPreview, +): boolean { + return ( + previous.prompt === next.prompt && + previous.status === next.status && + previous.projectId === next.projectId && + previous.videoUrl === next.videoUrl && + previous.thumbnailUrl === next.thumbnailUrl && + previous.providerId === next.providerId && + previous.model === next.model && + previous.progress === next.progress && + previous.phase === next.phase && + previous.statusMessage === next.statusMessage + ); +} diff --git a/src/components/agent/chat/workspace/workspaceSendHelpers.ts b/src/components/agent/chat/workspace/workspaceSendHelpers.ts index 7e43ce459..36ce90e6a 100644 --- a/src/components/agent/chat/workspace/workspaceSendHelpers.ts +++ b/src/components/agent/chat/workspace/workspaceSendHelpers.ts @@ -5,7 +5,7 @@ import { } from "../utils/harnessRequestMetadata"; import type { HandleSendOptions } from "../hooks/handleSendTypes"; import type { ChatToolPreferences } from "../utils/chatToolPreferences"; -import type { MessageImage } from "../types"; +import type { BrowserTaskRequirement, MessageImage } from "../types"; import type { Character } from "@/lib/api/memory"; import { buildTeamMemoryShadowRequestMetadata, @@ -64,6 +64,20 @@ function readMetadataText( : undefined; } +function readExistingBrowserRequirement( + metadata: Record | undefined, +): BrowserTaskRequirement | undefined { + const requirement = readMetadataText(metadata, "browser_requirement"); + if ( + requirement === "optional" || + requirement === "required" || + requirement === "required_with_user_step" + ) { + return requirement; + } + return undefined; +} + function readExistingTeamSource( metadata: Record | undefined, ): TeamDefinitionSource | undefined { @@ -231,7 +245,7 @@ function applyActiveContextPrompt( return text; } - const slashCommandMatch = text.match(/^\/([a-zA-Z0-9_-]+)\s*([\s\S]*)$/); + const slashCommandMatch = text.match(/^\/([a-zA-Z0-9_-]+)(?:\s+([\s\S]*))?$/); if (slashCommandMatch) { const [, skillName, skillArgs] = slashCommandMatch; const mergedArgs = [activeContextPrompt, skillArgs.trim()] @@ -362,6 +376,12 @@ export function hasModelSkillLaunchRequestMetadata( "urlParseSkillLaunch", "typesetting_skill_launch", "typesettingSkillLaunch", + "presentation_skill_launch", + "presentationSkillLaunch", + "form_skill_launch", + "formSkillLaunch", + "webpage_skill_launch", + "webpageSkillLaunch", "service_scene_launch", "serviceSceneLaunch", ] as const; @@ -467,6 +487,15 @@ export function buildWorkspaceRequestMetadata( const resolvedTeamMemoryShadow = buildTeamMemoryShadowRequestMetadata(teamMemoryShadowSnapshot) || readExistingTeamMemoryShadow(existingHarnessMetadata); + const resolvedBrowserRequirement = + browserRequirementMatch?.requirement || + readExistingBrowserRequirement(existingHarnessMetadata); + const resolvedBrowserRequirementReason = + browserRequirementMatch?.reason || + readMetadataText(existingHarnessMetadata, "browser_requirement_reason"); + const resolvedBrowserLaunchUrl = + browserRequirementMatch?.launchUrl || + readMetadataText(existingHarnessMetadata, "browser_launch_url"); return { ...(workspaceRequestMetadataBase || {}), @@ -486,9 +515,9 @@ export function buildWorkspaceRequestMetadata( gateKey: isThemeWorkbench ? currentGateKey : undefined, runTitle: themeWorkbenchActiveQueueTitle?.trim() || undefined, contentId: contentId || undefined, - browserRequirement: browserRequirementMatch?.requirement, - browserRequirementReason: browserRequirementMatch?.reason, - browserLaunchUrl: browserRequirementMatch?.launchUrl, + browserRequirement: resolvedBrowserRequirement, + browserRequirementReason: resolvedBrowserRequirementReason, + browserLaunchUrl: resolvedBrowserLaunchUrl, browserAssistProfileKey: mappedTheme === "general" ? browserAssistProfileKey || GENERAL_BROWSER_ASSIST_PROFILE_KEY diff --git a/src/components/agent/chat/workspaceEntry.ts b/src/components/agent/chat/workspaceEntry.ts index 35847db76..921105cf2 100644 --- a/src/components/agent/chat/workspaceEntry.ts +++ b/src/components/agent/chat/workspaceEntry.ts @@ -26,6 +26,7 @@ export interface AgentChatWorkspaceBootstrap { export interface WorkspaceEntryPayload { prompt?: string; images?: MessageImage[]; + projectId?: string; contentId?: string; initialRequestMetadata?: Record; initialAutoSendRequestMetadata?: Record; @@ -107,6 +108,7 @@ export function resolveWorkspaceEntry( const hasPrompt = Boolean(payload.prompt?.trim()); const hasImages = Boolean(payload.images?.length); + const resolvedProjectId = payload.projectId?.trim() || projectId || undefined; const hasContentId = Boolean(payload.contentId?.trim()); const hasSiteSkillLaunch = Boolean( payload.initialSiteSkillLaunch?.adapterName?.trim(), @@ -122,7 +124,7 @@ export function resolveWorkspaceEntry( const openBrowserAssistOnMount = payload.openBrowserAssistOnMount; const autoRunInitialPromptOnMount = payload.autoRunInitialPromptOnMount; - if (!openBrowserAssistOnMount && !hasSiteSkillLaunch && !projectId) { + if (!openBrowserAssistOnMount && !hasSiteSkillLaunch && !resolvedProjectId) { return { ok: false, reason: "missing_project", @@ -144,7 +146,7 @@ export function resolveWorkspaceEntry( const nextNewChatAt = now(); const shared = { - projectId: projectId ?? undefined, + projectId: resolvedProjectId, contentId: payload.contentId, theme: targetTheme, lockTheme, @@ -175,7 +177,7 @@ export function resolveWorkspaceEntry( nextNewChatAt, navigationParams: buildClawAgentParams(shared), workspaceBootstrap: { - projectId: projectId ?? undefined, + projectId: resolvedProjectId, contentId: payload.contentId, initialUserPrompt: payload.prompt, initialUserImages: payload.images, diff --git a/src/components/channels/ImConfigPage.test.tsx b/src/components/channels/ImConfigPage.test.tsx index 91b282f13..98615a457 100644 --- a/src/components/channels/ImConfigPage.test.tsx +++ b/src/components/channels/ImConfigPage.test.tsx @@ -272,7 +272,7 @@ describe("ImConfigPage", () => { await flushEffects(); const text = document.body.textContent ?? ""; - expect(text).toContain("IM 配置"); + expect(text).toContain("消息渠道"); expect(text).toContain("Telegram"); expect(text).toContain("飞书"); expect(text).toContain("微信"); @@ -292,7 +292,7 @@ describe("ImConfigPage", () => { ); expect(getBodyText()).not.toContain("网关、日志和运行状态都收在这里。"); - const introTip = await hoverTip("IM 配置说明"); + const introTip = await hoverTip("消息渠道说明"); expect(getBodyText()).toContain( "首页只放重点入口。Telegram、飞书、微信在这里直达;联调检查放进各自配置弹窗,网关和日志统一收到下方高级区。", ); diff --git a/src/components/channels/ImConfigPage.tsx b/src/components/channels/ImConfigPage.tsx index 928f01b66..c54fb58a0 100644 --- a/src/components/channels/ImConfigPage.tsx +++ b/src/components/channels/ImConfigPage.tsx @@ -2370,7 +2370,7 @@ export function ImConfigPage() {

    - 能力 / IM 配置 + 能力 / 消息渠道
    @@ -2378,11 +2378,14 @@ export function ImConfigPage() { 把常用 IM 接到 Lime
    +

    + 让 Telegram、飞书、微信等外部客户端也能连到 Lime。 +

    diff --git a/src/components/image-gen/useImageGen.ts b/src/components/image-gen/useImageGen.ts index 76596ef38..021f7a803 100644 --- a/src/components/image-gen/useImageGen.ts +++ b/src/components/image-gen/useImageGen.ts @@ -14,6 +14,7 @@ import { import { getImageModelsForProvider } from "@/lib/imageGeneration"; import { isDebugFlagEnabled } from "@/lib/perfDebug"; import { setStoredResourceProjectId } from "@/lib/resourceProjectSelection"; +import { scheduleMinimumDelayIdleTask } from "@/lib/utils/scheduleMinimumDelayIdleTask"; import type { GeneratedImage, ImageGenRequest, @@ -60,6 +61,8 @@ interface UseImageGenOptions { preferredProviderId?: string; preferredModelId?: string; allowFallback?: boolean; + providerLoadMode?: "immediate" | "deferred"; + providerDeferredDelayMs?: number; } const IMAGE_REQUEST_TIMEOUT_MS = 180_000; @@ -70,6 +73,7 @@ const FAL_QUEUE_TIMEOUT_MS = 180_000; const IMAGE_GEN_MATERIAL_TAG = "image-gen"; const IMAGE_MATERIAL_NAME_MAX_LENGTH = 48; export const IMAGE_GENERATION_CANCELED_MESSAGE = "已停止当前图片任务"; +const IMAGE_GEN_PROVIDER_IDLE_TIMEOUT_MS = 1_500; function imageGenDebugLog(...args: unknown[]): void { if (!isDebugFlagEnabled(PROVIDER_DEBUG_KEY)) { @@ -2030,7 +2034,15 @@ function isFalProviderLike(provider: { } export function useImageGen(options: UseImageGenOptions = {}) { - const { providers, loading: providersLoading } = useApiKeyProvider(); + const providerLoadMode = options.providerLoadMode ?? "immediate"; + const providerDeferredDelayMs = + options.providerDeferredDelayMs ?? IMAGE_GEN_PROVIDER_IDLE_TIMEOUT_MS; + const [providerLoadReady, setProviderLoadReady] = useState( + providerLoadMode !== "deferred", + ); + const { providers, loading: providersLoading } = useApiKeyProvider({ + autoLoad: providerLoadReady, + }); const preferredProviderId = options.preferredProviderId?.trim() || ""; const preferredModelId = options.preferredModelId?.trim() || ""; const allowFallback = options.allowFallback ?? true; @@ -2049,6 +2061,27 @@ export function useImageGen(options: UseImageGenOptions = {}) { const syncedPreferredModelIdRef = useRef(""); const hasManualProviderSelectionRef = useRef(false); + useEffect(() => { + if (providerLoadMode !== "deferred") { + setProviderLoadReady(true); + return; + } + + if (providerLoadReady) { + return; + } + + return scheduleMinimumDelayIdleTask( + () => { + setProviderLoadReady(true); + }, + { + minimumDelayMs: providerDeferredDelayMs, + idleTimeoutMs: IMAGE_GEN_PROVIDER_IDLE_TIMEOUT_MS, + }, + ); + }, [providerDeferredDelayMs, providerLoadMode, providerLoadReady]); + // 过滤出支持图片生成、启用且有 API Key 的 Provider const availableProviders = useMemo(() => { imageGenDebugLog( diff --git a/src/components/memory/MemoryPage.test.tsx b/src/components/memory/MemoryPage.test.tsx index 63b97946c..8f7e6d8cf 100644 --- a/src/components/memory/MemoryPage.test.tsx +++ b/src/components/memory/MemoryPage.test.tsx @@ -168,19 +168,19 @@ describe("MemoryPage", () => { cleanupMountedRoots(mountedRoots); }); - it("应把导航说明和首页说明收进 tips", async () => { + it("应把灵感库导航说明和总览说明收进 tips", async () => { renderPage(); await flushPageEffects(); expect(getBodyText()).not.toContain("按 / 搜索,按 1-6 切换视图。"); - expect(getBodyText()).not.toContain("查看全部记忆并触发分析任务"); + expect(getBodyText()).not.toContain("查看已沉淀的风格、参考、成果与偏好"); - const navTip = await hoverTip("记忆导航说明"); + const navTip = await hoverTip("灵感库导航说明"); expect(getBodyText()).toContain("按 / 搜索,按 1-6 切换视图。"); await leaveTip(navTip); - const heroTip = await hoverTip("记忆首页说明"); - expect(getBodyText()).toContain("查看全部记忆并触发分析任务"); + const heroTip = await hoverTip("灵感总览说明"); + expect(getBodyText()).toContain("查看已沉淀的风格、参考、成果与偏好"); await leaveTip(heroTip); }); }); diff --git a/src/components/memory/MemoryPage.tsx b/src/components/memory/MemoryPage.tsx index 0e132723a..0c3c59f05 100644 --- a/src/components/memory/MemoryPage.tsx +++ b/src/components/memory/MemoryPage.tsx @@ -120,28 +120,28 @@ const CATEGORY_META: Record< { label: string; description: string; icon: LucideIcon } > = { identity: { - label: "身份", - description: "关于你是谁的稳定信息", + label: "风格", + description: "常用语气、风格方向与稳定审美", icon: Signature, }, context: { - label: "情境", - description: "对话背景与当前约束", + label: "参考", + description: "值得反复参考的背景、约束与素材线索", icon: MessagesSquare, }, preference: { label: "偏好", - description: "你的习惯、口味与偏爱", + description: "常用习惯、口味与输出偏好", icon: HeartPulse, }, experience: { - label: "经验", - description: "过往经历与可复用知识", + label: "成果", + description: "已验证可复用的结果与经验", icon: Lightbulb, }, activity: { - label: "活动", - description: "近期计划与进行中的事项", + label: "收藏", + description: "先留住准备回头再用的内容", icon: CalendarClock, }, }; @@ -162,19 +162,19 @@ const MEMORY_NAV_ITEMS: Array<{ }> = [ { key: "home", - label: "首页", + label: "总览", icon: Home, - description: "全部记忆", + description: "全部灵感", }, { key: "identity", - label: "身份", + label: CATEGORY_META.identity.label, icon: CATEGORY_META.identity.icon, description: CATEGORY_META.identity.description, }, { key: "context", - label: "情境", + label: CATEGORY_META.context.label, icon: CATEGORY_META.context.icon, description: CATEGORY_META.context.description, }, @@ -186,13 +186,13 @@ const MEMORY_NAV_ITEMS: Array<{ }, { key: "experience", - label: "经验", + label: CATEGORY_META.experience.label, icon: CATEGORY_META.experience.icon, description: CATEGORY_META.experience.description, }, { key: "activity", - label: "活动", + label: CATEGORY_META.activity.label, icon: CATEGORY_META.activity.icon, description: CATEGORY_META.activity.description, }, @@ -481,9 +481,9 @@ function EmptyMemoryState({
    -

    暂无记忆

    +

    暂无灵感沉淀

    - 记忆提取是渐进式能力。积累更多真实对话后,系统会抽取并沉淀更稳定的可用信息。 + 沉淀是渐进式能力。积累更多真实对话、参考和成果后,系统会逐步整理出更稳定、可复用的内容。

    @@ -521,7 +521,7 @@ function MemoryEntryCollection({ if (entries.length === 0) { return (
    - 当前筛选条件下暂无记忆条目 + 当前筛选条件下暂无沉淀条目
    ); } @@ -661,7 +661,7 @@ function MemoryDetailPanel({ if (!entry) { return (
    - 请选择一条记忆查看详情 + 请选择一条沉淀查看详情
    ); } @@ -684,7 +684,7 @@ function MemoryDetailPanel({
    -
    记忆标题
    +
    条目标题
    {entry.title}
    @@ -760,7 +760,7 @@ function MemoryDetailPanel({ ) : ( <> - 删除记忆(不可恢复) + 删除条目(不可恢复) )} @@ -974,7 +974,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { await Promise.all([loadConfig(), loadOverview()]); } catch (error) { console.error("加载记忆数据失败:", error); - showMessage("error", "加载记忆失败,请稍后重试"); + showMessage("error", "加载灵感库失败,请稍后重试"); } finally { setLoading(false); } @@ -1062,7 +1062,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { const hasOutline = (projectMemory?.outline.length ?? 0) > 0; if (hasCharacters && hasWorldBuilding && hasOutline) { - showMessage("success", "第三层项目记忆已完善"); + showMessage("success", "第三层项目沉淀已完善"); return; } @@ -1104,10 +1104,10 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { } await loadOverview(); - showMessage("success", "已初始化第三层项目记忆,请按需继续完善"); + showMessage("success", "已初始化第三层项目沉淀,请按需继续完善"); } catch (error) { console.error("初始化项目记忆失败:", error); - showMessage("error", "初始化项目记忆失败,请稍后重试"); + showMessage("error", "初始化项目沉淀失败,请稍后重试"); } finally { setInitializingProjectMemory(false); } @@ -1132,7 +1132,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { } if (!memoryConfig.enabled) { - showMessage("error", "记忆功能已关闭,请先开启"); + showMessage("error", "沉淀功能已关闭,请先开启"); return; } @@ -1148,14 +1148,14 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { if (result.generated_entries > 0) { showMessage( "success", - `分析完成:新增 ${result.generated_entries} 条记忆(去重 ${result.deduplicated_entries} 条)`, + `整理完成:新增 ${result.generated_entries} 条沉淀(去重 ${result.deduplicated_entries} 条)`, ); } else { - showMessage("success", "分析完成:暂无新的可提取记忆"); + showMessage("success", "整理完成:暂无新的可提取沉淀"); } } catch (error) { console.error("记忆分析失败:", error); - showMessage("error", "记忆分析失败,请稍后重试"); + showMessage("error", "灵感整理失败,请稍后重试"); } finally { setAnalyzing(false); } @@ -1170,7 +1170,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { const handleDeleteEntry = useCallback( async (entry: MemoryEntryPreview) => { const confirmed = window.confirm( - `确定永久删除这条记忆吗?\n\n标题:${entry.title}\n\n该操作不可恢复。`, + `确定永久删除这条沉淀吗?\n\n标题:${entry.title}\n\n该操作不可恢复。`, ); if (!confirmed) { return; @@ -1180,12 +1180,12 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { try { const deleted = await deleteUnifiedMemory(entry.id); if (!deleted) { - showMessage("error", "删除失败,记忆可能不存在"); + showMessage("error", "删除失败,条目可能不存在"); return; } await loadOverview(); - showMessage("success", "记忆已删除"); + showMessage("success", "条目已删除"); } catch (error) { console.error("删除记忆失败:", error); showMessage("error", "删除失败,请稍后重试"); @@ -1218,10 +1218,10 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { await saveConfig(nextConfig); setConfig(nextConfig); setMemoryConfig(nextMemoryConfig); - showMessage("success", "记忆设置已保存"); + showMessage("success", "灵感设置已保存"); } catch (error) { console.error("保存记忆设置失败:", error); - showMessage("error", "记忆设置保存失败"); + showMessage("error", "灵感设置保存失败"); } finally { setSaving(false); } @@ -1231,12 +1231,12 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { const sectionTitle = activeSection === "home" - ? "记忆首页" - : `${CATEGORY_META[activeSection].label}记忆`; + ? "灵感总览" + : CATEGORY_META[activeSection].label; const sectionDescription = activeSection === "home" - ? "查看全部记忆并触发分析任务" + ? "查看已沉淀的风格、参考、成果与偏好" : CATEGORY_META[activeSection].description; const activeSectionCount = @@ -1253,7 +1253,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { return (
    - +
    @@ -1261,9 +1261,9 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {
    - 记忆 + 灵感库 @@ -1317,10 +1317,10 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {
    - 统一记忆数据库 + 当前沉淀数据库
    - MEMORY HUB + 灵感沉淀
    @@ -1373,8 +1373,8 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { ariaLabel={`${sectionTitle}说明`} content={`${sectionDescription}${ activeSection === "home" - ? " 统一记忆、上下文记忆和项目记忆会在这里汇总展示。" - : " 这里会聚焦当前分类下的真实记忆条目与分析结果。" + ? " 风格、收藏、参考、成果与偏好会在这里汇总展示。" + : " 这里会聚焦当前分类下可反复参考的沉淀条目与整理结果。" }`} tone="mint" /> @@ -1385,7 +1385,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { - {memoryConfig.enabled ? "记忆已启用" : "记忆已关闭"} + {memoryConfig.enabled ? "沉淀已启用" : "沉淀已暂停"} 当前范围 {analysisScopeLabel} @@ -1401,24 +1401,24 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {
    @@ -1440,8 +1440,8 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {
    - 记忆设置 + 灵感设置 @@ -1498,8 +1498,8 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {
    @@ -1648,8 +1648,8 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { tone={memoryConfig.enabled ? "success" : "warning"} > {memoryConfig.enabled - ? "当前允许分析" - : "请先开启记忆"} + ? "当前允许整理" + : "请先开启沉淀"} 分析范围 {analysisScopeLabel} @@ -1671,7 +1671,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { ) : ( <> - 立即分析 + 立即整理 )} @@ -1693,7 +1693,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { {analysisResult ? (
    - 最近一次分析结果 + 最近一次整理结果
    @@ -1709,7 +1709,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {

    -

    新增记忆

    +

    新增沉淀

    {analysisResult.generated_entries}

    @@ -1724,7 +1724,7 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) {
    ) : (
    - 还没有最近一次分析结果。未选择日期时,会分析全部可用历史对话。 + 还没有最近一次整理结果。未选择日期时,会整理全部可用历史对话。
    )}
    @@ -1776,8 +1776,8 @@ export function MemoryPage({ onNavigate, pageParams }: MemoryPageProps) { ))}
    @@ -471,13 +474,16 @@ export function ImageGenSettings() { )} >
    {size.label}
    -
    - -
    +

    + {size.desc} +

    ))}
    @@ -512,15 +518,16 @@ export function ImageGenSettings() { )} >
    {quality.label}
    -
    - -
    +

    + {quality.desc} +

    ))}
    @@ -555,13 +562,16 @@ export function ImageGenSettings() { )} >
    {style.label}
    -
    - -
    +

    + {style.desc} +

    ))}
    diff --git a/src/components/settings-v2/agent/providers/index.test.tsx b/src/components/settings-v2/agent/providers/index.test.tsx index 09e0b082a..a2e805c5d 100644 --- a/src/components/settings-v2/agent/providers/index.test.tsx +++ b/src/components/settings-v2/agent/providers/index.test.tsx @@ -684,10 +684,16 @@ describe("CloudProviderSettings", () => { container.querySelector('[data-testid="companion-provider-card"]'), ).not.toBeNull(); expect(text).toContain("Lime Pet Companion"); - expect(text).toContain( + + const introTip = await hoverTip("桌宠 Companion 说明"); + expect(getBodyText()).toContain( "桌宠通过本地 Companion 通道复用 Lime 的 AI 服务商状态", ); - expect(text).toContain("不会直接读取 API Key、OAuth 凭证或本地凭证文件"); + expect(getBodyText()).toContain( + "不会直接读取 API Key、OAuth 凭证或本地凭证文件", + ); + await leaveTip(introTip); + expect(text).toContain("桌宠已连接"); expect(text).toContain("Provider 概览"); expect(text).toContain("桌宠视角预览"); @@ -878,6 +884,9 @@ describe("CloudProviderSettings", () => { expect(syncButton?.disabled).toBe(true); expect(text).toContain("能力未声明"); expect(text).toContain("当前桌宠已连接,但尚未声明 Provider 概览能力"); - expect(text).toContain("平台:Windows"); + + const identityTip = await hoverTip("桌宠身份说明"); + expect(getBodyText()).toContain("平台:Windows"); + await leaveTip(identityTip); }); }); diff --git a/src/components/settings-v2/agent/providers/index.tsx b/src/components/settings-v2/agent/providers/index.tsx index cbd068b66..d04f7ca37 100644 --- a/src/components/settings-v2/agent/providers/index.tsx +++ b/src/components/settings-v2/agent/providers/index.tsx @@ -563,7 +563,7 @@ function CompanionProviderBridgeCard() { detail: supportsProviderOverview ? "桌宠已声明可接收 provider-overview 摘要。" : connected - ? "当前桌宠已连接,但尚未声明 provider-overview 能力。" + ? "当前桌宠已连接,但尚未声明 Provider 概览能力。" : "桌宠连接建立后,Lime 会等待能力声明。", }, { @@ -590,7 +590,7 @@ function CompanionProviderBridgeCard() { return "点击“开启桌宠”,或检查桌宠是否已连接到本地 Companion 地址。"; } if (!supportsProviderOverview) { - return "先让桌宠在 ready 事件里声明 provider-overview 能力,再尝试同步摘要。"; + return "先让桌宠在 ready 事件里声明 Provider 概览能力,再尝试同步摘要。"; } if (previewLoading) { return "等待 Lime 整理完当前 Provider 脱敏摘要。"; diff --git a/src/components/settings-v2/general/appearance/index.test.tsx b/src/components/settings-v2/general/appearance/index.test.tsx index 08b380bf3..fed02026e 100644 --- a/src/components/settings-v2/general/appearance/index.test.tsx +++ b/src/components/settings-v2/general/appearance/index.test.tsx @@ -168,11 +168,11 @@ describe("AppearanceSettings", () => { expect(text).toContain("左侧边栏导航"); expect(text).toContain("主导航入口"); expect(text).toContain("系统入口"); - expect(text).toContain("核心入口固定显示:新建任务、任务中心、技能、自动化、IM 配置"); + expect(text).toContain("核心入口固定显示:新建任务、任务中心、技能、消息渠道、资料库、灵感库"); expect(text).toContain("推荐行为"); expect(text).toContain("OpenClaw"); expect(text).toContain("资料库"); - expect(text).toContain("记忆"); + expect(text).toContain("灵感库"); expect(text).toContain("推荐自动附带选中内容"); expect(text).toContain("重新运行引导"); expect(text).not.toContain("已合并旧入口"); @@ -182,7 +182,7 @@ describe("AppearanceSettings", () => { it("切换底部入口时应保留 workspace_preferences 的其他配置", async () => { const { container } = await renderPage(); const button = Array.from(container.querySelectorAll("button")).find( - (item) => item.textContent?.includes("资料库"), + (item) => item.textContent?.includes("工具箱"), ); await act(async () => { @@ -192,11 +192,7 @@ describe("AppearanceSettings", () => { const savedConfig = mockSaveConfig.mock.calls.at(-1)?.[0] as any; - expect(savedConfig.navigation.enabled_items).toEqual([ - "video", - "image-gen", - "terminal", - ]); + expect(savedConfig.navigation.enabled_items).toEqual(["terminal", "tools"]); expect( savedConfig.workspace_preferences.media_defaults.voice.preferredProviderId, ).toBe("openai"); @@ -205,7 +201,7 @@ describe("AppearanceSettings", () => { it("切换底部入口时应保存完整的侧栏导航配置", async () => { const { container } = await renderPage(); const button = Array.from(container.querySelectorAll("button")).find( - (item) => item.textContent?.includes("资料库"), + (item) => item.textContent?.includes("工具箱"), ); await act(async () => { @@ -215,11 +211,7 @@ describe("AppearanceSettings", () => { const savedConfig = mockSaveConfig.mock.calls.at(-1)?.[0] as any; - expect(savedConfig.navigation.enabled_items).toEqual([ - "video", - "image-gen", - "terminal", - ]); + expect(savedConfig.navigation.enabled_items).toEqual(["terminal", "tools"]); }); it("缺少导航配置时应回退到底部默认入口", async () => { @@ -242,13 +234,7 @@ describe("AppearanceSettings", () => { const savedConfig = mockSaveConfig.mock.calls.at(-1)?.[0] as any; - expect(savedConfig.navigation.enabled_items).toEqual([ - "video", - "image-gen", - "resources", - "terminal", - "tools", - ]); + expect(savedConfig.navigation.enabled_items).toEqual(["terminal", "tools"]); }); it("应把首屏和基础外观说明收进 tips", async () => { diff --git a/src/components/skills/SkillsWorkspacePage.test.tsx b/src/components/skills/SkillsWorkspacePage.test.tsx index a08d3327a..4cb452719 100644 --- a/src/components/skills/SkillsWorkspacePage.test.tsx +++ b/src/components/skills/SkillsWorkspacePage.test.tsx @@ -264,7 +264,7 @@ describe("SkillsWorkspacePage", () => { "技能中心现在先展示技能组,再进入具体技能项。", ); expect(getBodyText()).not.toContain( - "先定位技能组,再进入具体技能;本地和项目级补充能力仍收纳在高级管理中。", + "先从能直接开工的技能组找起;本地导入、仓库维护和远程安装统一收进导入与维护。", ); const entryTip = await hoverTip("技能主入口说明"); @@ -275,7 +275,7 @@ describe("SkillsWorkspacePage", () => { const searchTip = await hoverTip("技能搜索说明"); expect(getBodyText()).toContain( - "先定位技能组,再进入具体技能;本地和项目级补充能力仍收纳在高级管理中。", + "先从能直接开工的技能组找起;本地导入、仓库维护和远程安装统一收进导入与维护。", ); await leaveTip(searchTip); }); @@ -326,7 +326,7 @@ describe("SkillsWorkspacePage", () => { expect(mockRefreshLocalSkills).toHaveBeenCalledTimes(1); }); - it("切到我的技能后应展示本地已安装技能,并可打开高级管理", () => { + it("切到我的技能后应展示本地已安装技能,并可打开导入与维护", () => { const { container } = renderPage(); const installedTab = Array.from(container.querySelectorAll("button")).find( @@ -341,7 +341,7 @@ describe("SkillsWorkspacePage", () => { expect(container.textContent).toContain("写作助手"); const manageButton = Array.from(container.querySelectorAll("button")).find( - (button) => button.textContent?.includes("高级技能管理"), + (button) => button.textContent?.includes("导入与维护"), ); expect(manageButton).toBeTruthy(); diff --git a/src/components/skills/SkillsWorkspacePage.tsx b/src/components/skills/SkillsWorkspacePage.tsx index 783565ecb..63dc6e6e4 100644 --- a/src/components/skills/SkillsWorkspacePage.tsx +++ b/src/components/skills/SkillsWorkspacePage.tsx @@ -499,7 +499,7 @@ export function SkillsWorkspacePage({
    - CLAW SKILLS · 主入口 + 技能 · 直接开工
    @@ -512,24 +512,21 @@ export function SkillsWorkspacePage({ tone="mint" />
    +

    + 先找能直接开工的做法,再进入具体技能。 +

    {catalogMeta ? ( <> - {catalogMeta.sourceLabel} + 技能 {serviceSkills.length} {catalogMeta.groupCount ? ( 分组 {catalogMeta.groupCount} ) : null} - - Tenant · {catalogMeta.tenantId} - - - Version · {catalogMeta.version} - {syncedAtLabel ? ( 同步于 {syncedAtLabel} @@ -549,7 +546,7 @@ export function SkillsWorkspacePage({ 查找技能组 / 技能项
    @@ -581,7 +578,7 @@ export function SkillsWorkspacePage({ onClick={() => setAdvancedManagerOpen(true)} > - 高级技能管理 + 导入与维护
    @@ -592,12 +589,12 @@ export function SkillsWorkspacePage({
    - Claw 下的技能主入口 + 从现成做法开始

    - 先选技能组,再进入真正可执行的技能 + 先找能直接开工的做法

    onNavigate("agent", { agentEntry: "claw" })} > - 打开 Claw 对话 + 回到任务中心
    @@ -650,7 +647,7 @@ export function SkillsWorkspacePage({ 本地已安装
    @@ -683,7 +680,7 @@ export function SkillsWorkspacePage({ }, { icon: Boxes, - title: "本地补充", + title: "我的补充", description: "本地和项目级技能仍然可用,但不再作为默认主入口承载。", }, @@ -747,7 +744,7 @@ export function SkillsWorkspacePage({ ? "正在同步当前目录..." : selectedGroup ? `当前正在浏览 ${selectedGroup.title} 技能组。` - : "技能广场面向最终用户,本地仓库与导入能力收纳在高级管理中。"} + : "首页先展示能直接启动的技能;本地仓库与导入能力收纳在导入与维护。"}
    @@ -1004,7 +1001,7 @@ export function SkillsWorkspacePage({
    ) : (
    - 当前没有本地已安装技能。你仍然可以在高级管理里导入本地技能或查看远程仓库目录。 + 当前没有本地已安装技能。你仍然可以在导入与维护里导入本地技能或查看远程仓库目录。
    )}
    @@ -1030,10 +1027,10 @@ export function SkillsWorkspacePage({
    - 高级技能管理 + 导入与维护
    diff --git a/src/components/workspace/video/VideoWorkspace.tsx b/src/components/workspace/video/VideoWorkspace.tsx index 3f35d1257..f00f0f551 100644 --- a/src/components/workspace/video/VideoWorkspace.tsx +++ b/src/components/workspace/video/VideoWorkspace.tsx @@ -453,6 +453,102 @@ const StageFooterTips = styled.div` flex-wrap: wrap; `; +const FocusedTaskPanel = styled.div` + position: relative; + z-index: 1; + margin-top: 14px; + border-radius: 24px; + border: 1px solid hsl(var(--border) / 0.84); + background: hsl(var(--background) / 0.94); + padding: 16px; + display: flex; + flex-direction: column; + gap: 14px; +`; + +const FocusedTaskHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; +`; + +const FocusedTaskCopy = styled.div` + display: flex; + flex-direction: column; + gap: 4px; +`; + +const FocusedTaskTitle = styled.h4` + margin: 0; + font-size: 15px; + line-height: 1.4; + font-weight: 700; + color: hsl(var(--foreground)); +`; + +const FocusedTaskDescription = styled.p` + margin: 0; + font-size: 12px; + line-height: 1.6; + color: hsl(var(--muted-foreground)); +`; + +const FocusedTaskPrompt = styled.div` + border-radius: 18px; + border: 1px solid hsl(var(--border) / 0.82); + background: hsl(var(--muted) / 0.12); + padding: 14px 16px; + font-size: 14px; + line-height: 1.7; + color: hsl(var(--foreground)); + white-space: pre-wrap; + word-break: break-word; +`; + +const FocusedTaskMetaGrid = styled.div` + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + + @media (max-width: 720px) { + grid-template-columns: 1fr; + } +`; + +const FocusedTaskMetaCard = styled.div` + border-radius: 18px; + border: 1px solid hsl(var(--border) / 0.84); + background: hsl(var(--background)); + padding: 12px 14px; + display: flex; + flex-direction: column; + gap: 6px; +`; + +const FocusedTaskMetaLabel = styled.span` + font-size: 11px; + font-weight: 700; + letter-spacing: 0.08em; + color: hsl(var(--muted-foreground)); +`; + +const FocusedTaskMetaValue = styled.span` + font-size: 14px; + line-height: 1.6; + font-weight: 700; + color: hsl(var(--foreground)); + word-break: break-word; +`; + +const FocusedTaskMetaHint = styled.span` + font-size: 12px; + line-height: 1.6; + color: hsl(var(--muted-foreground)); + word-break: break-word; +`; + const TaskCounter = styled.span` display: inline-flex; align-items: center; @@ -659,6 +755,22 @@ function mergeTaskList( return merged; } +function resolveFocusedTask( + taskList: WorkspaceTask[], + selectedTaskId?: string, +): WorkspaceTask | null { + const normalizedSelectedTaskId = selectedTaskId?.trim(); + if (normalizedSelectedTaskId) { + const matchedTask = taskList.find( + (task) => task.id === normalizedSelectedTaskId, + ); + if (matchedTask) { + return matchedTask; + } + } + return taskList[0] ?? null; +} + function getStatusTone( status: string, ): "neutral" | "processing" | "success" | "error" | "cancelled" { @@ -704,6 +816,126 @@ function clampProgress(value?: number | null): number | null { return Math.max(0, Math.min(100, Math.round(value))); } +function parseTaskRequestPayload( + task: WorkspaceTask, +): Record | null { + const normalizedPayload = task.requestPayload?.trim(); + if (!normalizedPayload) { + return null; + } + + try { + const parsed = JSON.parse(normalizedPayload) as unknown; + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + return null; + } + return parsed as Record; + } catch { + return null; + } +} + +function readTaskPayloadString( + payload: Record | null, + keys: string[], +): string | null { + if (!payload) { + return null; + } + + for (const key of keys) { + const value = payload[key]; + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + } + + return null; +} + +function readTaskPayloadPositiveNumber( + payload: Record | null, + keys: string[], +): number | null { + if (!payload) { + return null; + } + + for (const key of keys) { + const value = payload[key]; + if (typeof value === "number" && Number.isFinite(value) && value > 0) { + return value; + } + if (typeof value === "string" && value.trim()) { + const parsed = Number(value); + if (Number.isFinite(parsed) && parsed > 0) { + return parsed; + } + } + } + + return null; +} + +function resolveTaskSyncCopy(task: WorkspaceTask): { + label: string; + hint: string; +} { + const progress = clampProgress(task.progress); + + if (task.status === "success") { + if (task.resourceMaterialId) { + return { + label: "已同步到项目素材", + hint: "当前结果已经沉淀到项目素材库,可继续复用或组合后续命令。", + }; + } + if (task.resourceSaveError) { + return { + label: "素材同步失败", + hint: task.resourceSaveError, + }; + } + return { + label: "结果已生成", + hint: "视频已经可预览,素材入库会继续在后台自动完成。", + }; + } + + if (task.status === "error") { + return { + label: "生成失败", + hint: task.errorMessage?.trim() || "请检查提示词、模型配置或参考图。", + }; + } + + if (task.status === "cancelled") { + return { + label: "任务已取消", + hint: "当前任务不会继续生成新的结果,可直接重新发起下一轮。", + }; + } + + if (typeof progress === "number") { + return { + label: `当前进度 ${progress}%`, + hint: "工作台会继续刷新状态,完成后自动切换为可预览结果。", + }; + } + + if (task.status === "pending") { + return { + label: "排队中", + hint: "任务已提交到生成队列,等待服务端返回正式进度。", + }; + } + + return { + label: "生成中", + hint: "视频任务正在执行,当前会优先展示你选中的任务状态。", + }; +} + export const VideoWorkspace: React.FC = memo( ({ state, projectId, onStateChange }) => { const [tasks, setTasks] = useState([]); @@ -711,6 +943,19 @@ export const VideoWorkspace: React.FC = memo( const pollingGuard = useRef(false); const savingTaskIdsRef = useRef>(new Set()); const materialRefCache = useRef>(new Map()); + const stateRef = useRef(state); + + useEffect(() => { + stateRef.current = state; + }, [state]); + + const pushState = useCallback( + (nextState: VideoCanvasState) => { + stateRef.current = nextState; + onStateChange(nextState); + }, + [onStateChange], + ); useEffect(() => { skillsApi @@ -725,49 +970,81 @@ export const VideoWorkspace: React.FC = memo( const syncPrimaryState = useCallback( (taskList: WorkspaceTask[]) => { - if (taskList.length === 0) { + const currentState = stateRef.current; + const focusedTask = resolveFocusedTask( + taskList, + currentState.selectedTaskId, + ); + if (!focusedTask) { return; } - const latestTask = taskList[0]; - if (latestTask.status === "success" && latestTask.resultUrl) { + const baseState = + currentState.selectedTaskId === focusedTask.id + ? currentState + : { + ...currentState, + selectedTaskId: focusedTask.id, + }; + + if (focusedTask.status === "success" && focusedTask.resultUrl) { if ( - state.status !== "success" || - state.videoUrl !== latestTask.resultUrl + baseState.status !== "success" || + baseState.videoUrl !== focusedTask.resultUrl || + baseState.errorMessage !== undefined ) { - onStateChange({ - ...state, + pushState({ + ...baseState, status: "success", - videoUrl: latestTask.resultUrl, + videoUrl: focusedTask.resultUrl, errorMessage: undefined, }); - } - return; - } - if (latestTask.status === "error") { - const message = latestTask.errorMessage ?? "视频生成失败"; - if (state.status !== "error" || state.errorMessage !== message) { - onStateChange({ - ...state, - status: "error", - errorMessage: message, - }); + } else if (baseState !== currentState) { + pushState(baseState); } return; } if ( - latestTask.status === "pending" || - latestTask.status === "processing" + focusedTask.status === "error" || + focusedTask.status === "cancelled" ) { - if (state.status !== "generating") { - onStateChange({ - ...state, + const message = + focusedTask.errorMessage ?? + (focusedTask.status === "cancelled" + ? "视频任务已取消" + : "视频生成失败"); + if ( + baseState.status !== "error" || + baseState.errorMessage !== message + ) { + pushState({ + ...baseState, + status: "error", + errorMessage: message, + }); + } else if (baseState !== currentState) { + pushState(baseState); + } + return; + } + if ( + focusedTask.status === "pending" || + focusedTask.status === "processing" + ) { + if ( + baseState.status !== "generating" || + baseState.errorMessage !== undefined + ) { + pushState({ + ...baseState, status: "generating", errorMessage: undefined, }); + } else if (baseState !== currentState) { + pushState(baseState); } } }, - [onStateChange, state], + [pushState], ); const saveVideoToResource = useCallback( @@ -835,7 +1112,10 @@ export const VideoWorkspace: React.FC = memo( if (!active) { return; } - const mapped = list.map((task) => ({ ...task })); + const mapped = mergeTaskList( + [], + list.map((task) => ({ ...task })), + ); setTasks(mapped); syncPrimaryState(mapped); } catch (error) { @@ -994,8 +1274,8 @@ export const VideoWorkspace: React.FC = memo( return; } - onStateChange({ - ...state, + pushState({ + ...stateRef.current, status: "generating", errorMessage: undefined, }); @@ -1021,23 +1301,30 @@ export const VideoWorkspace: React.FC = memo( cameraFixed: state.cameraFixed, }); + pushState({ + ...stateRef.current, + status: "generating", + selectedTaskId: created.id, + errorMessage: undefined, + }); setTasks((previous) => { const merged = mergeTaskList(previous, [created]); + syncPrimaryState(merged); return merged; }); toast.success("视频任务已提交,正在生成"); } catch (error) { const message = error instanceof Error ? error.message : String(error); - onStateChange({ - ...state, + pushState({ + ...stateRef.current, status: "error", errorMessage: message, }); toast.error(message); } }, - [ensureReferenceImageUrl, onStateChange, projectId, state], + [ensureReferenceImageUrl, projectId, pushState, state, syncPrimaryState], ); const handlePreviewTask = useCallback( @@ -1045,18 +1332,24 @@ export const VideoWorkspace: React.FC = memo( if (!task.resultUrl) { return; } - onStateChange({ - ...state, + pushState({ + ...stateRef.current, + selectedTaskId: task.id, status: "success", videoUrl: task.resultUrl, errorMessage: undefined, }); }, - [onStateChange, state], + [pushState], ); const isGenerated = tasks.length > 0 || state.status !== "idle"; const latestTask = tasks[0] ?? null; + const focusedTask = useMemo( + () => resolveFocusedTask(tasks, state.selectedTaskId), + [state.selectedTaskId, tasks], + ); + const activeTaskId = focusedTask?.id ?? state.selectedTaskId ?? null; const referenceCount = [state.startImage, state.endImage].filter( Boolean, ).length; @@ -1105,16 +1398,19 @@ export const VideoWorkspace: React.FC = memo( label: "生成中", tone: "processing" as const, detail: - latestTask?.progress != null - ? `当前进度 ${Math.round(latestTask.progress)}%` - : "已提交任务,正在持续轮询状态。", + focusedTask?.progress != null + ? `当前进度 ${Math.round(focusedTask.progress)}%` + : "任务已提交,正在持续刷新当前进度。", }; } if (state.status === "success" && state.videoUrl) { return { label: "已生成", tone: "success" as const, - detail: "可在右侧切换历史结果,最新成功结果会自动成为主预览。", + detail: + focusedTask && latestTask && focusedTask.id !== latestTask.id + ? "当前正在查看一条历史结果,可在右侧继续切换不同任务做比较。" + : "当前结果已就绪,可继续调整提示词并发起下一轮生成。", }; } if (state.status === "error") { @@ -1130,12 +1426,61 @@ export const VideoWorkspace: React.FC = memo( detail: "先在提示框描述画面,再提交一次生成任务。", }; }, [ - latestTask?.progress, + focusedTask, + latestTask, state.errorMessage, state.status, state.videoUrl, ]); + const focusedTaskSummary = useMemo(() => { + if (!focusedTask) { + return null; + } + + const payload = parseTaskRequestPayload(focusedTask); + const providerLabel = + focusedTask.providerId?.trim() || + readTaskPayloadString(payload, ["providerId", "provider_id"]) || + state.providerId || + "待选择服务"; + const modelLabel = + focusedTask.model?.trim() || + readTaskPayloadString(payload, ["model"]) || + state.model || + "待选择模型"; + const aspectRatioLabel = + readTaskPayloadString(payload, ["aspectRatio", "aspect_ratio"]) || + state.aspectRatio; + const resolutionLabel = + readTaskPayloadString(payload, ["resolution"]) || state.resolution; + const durationLabel = + readTaskPayloadPositiveNumber(payload, ["duration"]) || state.duration; + const promptLabel = focusedTask.prompt?.trim() || state.prompt.trim(); + const syncCopy = resolveTaskSyncCopy(focusedTask); + const isLatestFocused = latestTask?.id === focusedTask.id; + + return { + prompt: promptLabel || "当前任务没有返回明确提示词。", + sourceValue: `${providerLabel} · ${modelLabel}`, + sourceHint: isLatestFocused + ? "当前查看的是最近一次任务。" + : "当前查看的是一条历史任务结果。", + specValue: `${aspectRatioLabel} · ${resolutionLabel} · ${durationLabel} 秒`, + specHint: "规格优先从任务请求恢复,缺失时回退到当前工作台状态。", + syncValue: syncCopy.label, + syncHint: syncCopy.hint, + timelineValue: `创建 ${formatTaskTime(focusedTask.createdAt)}`, + timelineHint: `最近更新 ${formatTaskTime( + focusedTask.updatedAt ?? focusedTask.createdAt, + )} · 任务 ID ${focusedTask.id}`, + badgeLabel: isLatestFocused ? "最新结果" : "历史结果", + description: isLatestFocused + ? "这里固定展示当前聚焦任务的上下文,切换任务后会一起更新。" + : "你正在查看一条历史任务,下面的信息与主预览都跟随该任务同步。", + }; + }, [focusedTask, latestTask?.id, state.aspectRatio, state.duration, state.model, state.prompt, state.providerId, state.resolution]); + return ( @@ -1282,7 +1627,7 @@ export const VideoWorkspace: React.FC = memo( {state.status === "generating" ? "任务已提交,右侧卡片会持续刷新进度。你可以继续优化提示词,准备下一轮迭代。" - : "提交任务后,最新成功结果会自动显示在这里。"} + : "任务完成后,结果会自动显示在这里。"} )} @@ -1299,12 +1644,75 @@ export const VideoWorkspace: React.FC = memo( content="成功结果会自动同步到项目素材;切换历史任务预览不会覆盖你当前输入的提示词。" /> - {latestTask ? ( + {focusedTask ? ( - 最近更新于 {formatTaskTime(latestTask.createdAt)} + 当前任务更新于{" "} + {formatTaskTime( + focusedTask.updatedAt ?? focusedTask.createdAt, + )} ) : null} + + {focusedTaskSummary ? ( + + + + 当前查看任务 + + {focusedTaskSummary.description} + + + {focusedTaskSummary.badgeLabel} + + + + {focusedTaskSummary.prompt} + + + + + 模型链路 + + {focusedTaskSummary.sourceValue} + + + {focusedTaskSummary.sourceHint} + + + + + 生成规格 + + {focusedTaskSummary.specValue} + + + {focusedTaskSummary.specHint} + + + + + 结果同步 + + {focusedTaskSummary.syncValue} + + + {focusedTaskSummary.syncHint} + + + + + 任务时间 + + {focusedTaskSummary.timelineValue} + + + {focusedTaskSummary.timelineHint} + + + + + ) : null} @@ -1349,10 +1757,8 @@ export const VideoWorkspace: React.FC = memo( return ( @@ -1395,10 +1801,11 @@ export const VideoWorkspace: React.FC = memo( {task.resultUrl ? ( handlePreviewTask(task)} > - {task.resultUrl === state.videoUrl + {task.id === activeTaskId ? "当前预览" : "切换预览"} diff --git a/src/components/workspace/video/VideoWorkspaceSelection.test.tsx b/src/components/workspace/video/VideoWorkspaceSelection.test.tsx new file mode 100644 index 000000000..ae2b9129d --- /dev/null +++ b/src/components/workspace/video/VideoWorkspaceSelection.test.tsx @@ -0,0 +1,190 @@ +import { useState } from "react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { VideoWorkspace } from "./VideoWorkspace"; +import { + cleanupMountedRoots, + clickElement, + flushEffects, + mountHarness, + setupReactActEnvironment, + type MountedRoot, +} from "@/components/workspace/hooks/testUtils"; +import { + createInitialVideoState, + type VideoCanvasState, +} from "@/components/workspace/video/types"; + +const { mockGetAll, mockListTasks } = vi.hoisted(() => ({ + mockGetAll: vi.fn(), + mockListTasks: vi.fn(), +})); + +vi.mock("@/lib/api/skills", async () => { + const actual = + await vi.importActual( + "@/lib/api/skills", + ); + + return { + ...actual, + skillsApi: { + ...actual.skillsApi, + getAll: (...args: unknown[]) => mockGetAll(...args), + }, + }; +}); + +vi.mock("@/lib/api/videoGeneration", async () => { + const actual = + await vi.importActual( + "@/lib/api/videoGeneration", + ); + + return { + ...actual, + videoGenerationApi: { + ...actual.videoGenerationApi, + listTasks: (...args: unknown[]) => mockListTasks(...args), + }, + }; +}); + +const mountedRoots: MountedRoot[] = []; + +function buildInitialState(): VideoCanvasState { + return { + ...createInitialVideoState("旧任务视频"), + providerId: "doubao", + model: "seedance-1-5-pro-251215", + status: "success", + selectedTaskId: "task-old", + videoUrl: "https://example.com/old.mp4", + }; +} + +function ControlledVideoWorkspace({ + onObservedStateChange, +}: { + onObservedStateChange?: (state: VideoCanvasState) => void; +}) { + const [state, setState] = useState(() => buildInitialState()); + + return ( + { + onObservedStateChange?.(nextState); + setState(nextState); + }} + /> + ); +} + +describe("VideoWorkspace 任务聚焦", () => { + beforeEach(() => { + setupReactActEnvironment(); + vi.clearAllMocks(); + mockGetAll.mockResolvedValue([]); + mockListTasks.mockResolvedValue([ + { + id: "task-latest", + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "最新任务视频", + status: "success", + progress: 100, + resultUrl: "https://example.com/latest.mp4", + requestPayload: JSON.stringify({ + aspectRatio: "16:9", + resolution: "720p", + duration: 6, + }), + createdAt: 2_000, + updatedAt: 2_100, + }, + { + id: "task-old", + projectId: "project-video-1", + providerId: "doubao", + model: "seedance-1-5-pro-251215", + prompt: "旧任务视频", + status: "success", + progress: 100, + resultUrl: "https://example.com/old.mp4", + requestPayload: JSON.stringify({ + aspectRatio: "9:16", + resolution: "1080p", + duration: 12, + }), + createdAt: 1_000, + updatedAt: 1_100, + }, + ]); + }); + + afterEach(() => { + cleanupMountedRoots(mountedRoots); + }); + + it("应优先保持聊天区传入的 selectedTaskId,不被最新任务自动抢焦点", async () => { + const observedStateChanges: VideoCanvasState[] = []; + + const mounted = mountHarness( + ControlledVideoWorkspace, + { + onObservedStateChange: (nextState: VideoCanvasState) => { + observedStateChanges.push(nextState); + }, + }, + mountedRoots, + ); + + await flushEffects(8); + + expect(mockGetAll).toHaveBeenCalledWith("lime"); + expect(mockListTasks).toHaveBeenCalledWith("project-video-1", { + limit: 50, + }); + + const oldPreviewButton = mounted.container.querySelector( + "[data-testid='video-task-preview-task-old']", + ); + const latestPreviewButton = mounted.container.querySelector( + "[data-testid='video-task-preview-task-latest']", + ); + + expect(oldPreviewButton?.textContent).toContain("当前预览"); + expect(latestPreviewButton?.textContent).toContain("切换预览"); + expect(observedStateChanges).toEqual([]); + expect( + mounted.container.querySelector("[data-testid='video-focused-task-prompt']") + ?.textContent, + ).toContain("旧任务视频"); + expect( + mounted.container.querySelector("[data-testid='video-focused-task-spec']") + ?.textContent, + ).toContain("9:16 · 1080p · 12 秒"); + + clickElement(latestPreviewButton); + await flushEffects(2); + + expect( + observedStateChanges[observedStateChanges.length - 1], + ).toMatchObject({ + selectedTaskId: "task-latest", + status: "success", + videoUrl: "https://example.com/latest.mp4", + }); + expect(latestPreviewButton?.textContent).toContain("当前预览"); + expect( + mounted.container.querySelector("[data-testid='video-focused-task-prompt']") + ?.textContent, + ).toContain("最新任务视频"); + expect( + mounted.container.querySelector("[data-testid='video-focused-task-spec']") + ?.textContent, + ).toContain("16:9 · 720p · 6 秒"); + }); +}); diff --git a/src/components/workspace/video/types.ts b/src/components/workspace/video/types.ts index 68a264617..5d836091e 100644 --- a/src/components/workspace/video/types.ts +++ b/src/components/workspace/video/types.ts @@ -23,6 +23,7 @@ export interface VideoCanvasState { aspectRatio: VideoAspectRatio; resolution: VideoResolution; status: VideoStatus; + selectedTaskId?: string; videoUrl?: string; errorMessage?: string; } @@ -50,4 +51,5 @@ export const createInitialVideoState = ( aspectRatio: "adaptive", resolution: "720p", status: "idle", + selectedTaskId: undefined, }); diff --git a/src/hooks/useAppStartupEffects.ts b/src/hooks/useAppStartupEffects.ts index 5e473f5ec..66b2c383f 100644 --- a/src/hooks/useAppStartupEffects.ts +++ b/src/hooks/useAppStartupEffects.ts @@ -69,6 +69,10 @@ export function useAppStartupEffects({ }, []); useEffect(() => { + if (!isTauriDesktopEnvironment()) { + return; + } + void ensureDefaultWorkspaceReady() .then((result) => { if (result?.repaired) { diff --git a/src/hooks/useGlobalTrayModelSync.ts b/src/hooks/useGlobalTrayModelSync.ts index 6c06df2f3..287730c07 100644 --- a/src/hooks/useGlobalTrayModelSync.ts +++ b/src/hooks/useGlobalTrayModelSync.ts @@ -23,6 +23,7 @@ import { type Page, type PageParams, } from "@/types/page"; +import { hasTauriInvokeCapability } from "@/lib/tauri-runtime"; const LAST_PROJECT_ID_KEY = "agent_last_project_id"; @@ -119,6 +120,7 @@ export function useGlobalTrayModelSync({ currentPage, pageParams, }: UseGlobalTrayModelSyncOptions) { + const traySyncEnabled = hasTauriInvokeCapability(); const currentPageRef = useRef(currentPage); const pageParamsRef = useRef(pageParams); @@ -126,6 +128,10 @@ export function useGlobalTrayModelSync({ pageParamsRef.current = pageParams; useEffect(() => { + if (!traySyncEnabled) { + return; + } + let cancelled = false; const retryTimerIds: number[] = []; const idleCallbackIds: number[] = []; @@ -269,5 +275,5 @@ export function useGlobalTrayModelSync({ dispose(); } }; - }, [currentPage]); + }, [currentPage, traySyncEnabled]); } diff --git a/src/hooks/useOemLimeHubProviderSync.test.tsx b/src/hooks/useOemLimeHubProviderSync.test.tsx index 2bdaf588b..6abe8232a 100644 --- a/src/hooks/useOemLimeHubProviderSync.test.tsx +++ b/src/hooks/useOemLimeHubProviderSync.test.tsx @@ -28,6 +28,10 @@ vi.mock("@/lib/api/oemCloudControlPlane", () => ({ listClientProviderOfferModels: controlPlaneMocks.listClientProviderOfferModels, })); +vi.mock("@/lib/tauri-runtime", () => ({ + hasTauriInvokeCapability: () => true, +})); + import { useOemLimeHubProviderSync } from "./useOemLimeHubProviderSync"; interface MountedHarness { diff --git a/src/hooks/useOemLimeHubProviderSync.ts b/src/hooks/useOemLimeHubProviderSync.ts index f7048629d..a1825c2ae 100644 --- a/src/hooks/useOemLimeHubProviderSync.ts +++ b/src/hooks/useOemLimeHubProviderSync.ts @@ -15,6 +15,7 @@ import { OEM_LIME_HUB_PROVIDER_ID, resolveOemLimeHubProviderName, } from "@/lib/oemLimeHubProvider"; +import { hasTauriInvokeCapability } from "@/lib/tauri-runtime"; function buildSyncSignature( runtime: ReturnType, @@ -69,14 +70,24 @@ async function resolveSyncedCustomModels( } export function useOemLimeHubProviderSync() { - const runtime = resolveOemCloudRuntimeContext(); + const syncEnabled = hasTauriInvokeCapability(); const lastAppliedSignatureRef = useRef(""); useEffect(() => { + if (!syncEnabled) { + return; + } + let disposed = false; async function syncProviders() { try { + const runtime = resolveOemCloudRuntimeContext(); + if (!runtime) { + lastAppliedSignatureRef.current = buildSyncSignature(null, []); + return; + } + const providers = await apiKeyProviderApi.getProviders({ forceRefresh: true, }); @@ -84,11 +95,6 @@ export function useOemLimeHubProviderSync() { return; } - if (!runtime) { - lastAppliedSignatureRef.current = buildSyncSignature(null, []); - return; - } - const limeHubProvider = providers.find( (provider) => provider.id === OEM_LIME_HUB_PROVIDER_ID, ); @@ -170,5 +176,5 @@ export function useOemLimeHubProviderSync() { unsubscribeSession(); unsubscribeBootstrap(); }; - }, [runtime]); + }, [syncEnabled]); } diff --git a/src/hooks/useProjects.test.tsx b/src/hooks/useProjects.test.tsx new file mode 100644 index 000000000..cb3531ba6 --- /dev/null +++ b/src/hooks/useProjects.test.tsx @@ -0,0 +1,219 @@ +import { act } from "react"; +import { createRoot } from "react-dom/client"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const projectApiMocks = vi.hoisted(() => ({ + createProject: vi.fn(), + deleteProject: vi.fn(), + ensureWorkspaceReady: vi.fn(), + getDefaultProject: vi.fn(), + getOrCreateDefaultProject: vi.fn(), + listProjects: vi.fn(), + resolveProjectRootPath: vi.fn(), + updateProject: vi.fn(), +})); + +const telemetryMocks = vi.hoisted(() => ({ + recordWorkspaceRepair: vi.fn(), +})); + +vi.mock("@/lib/api/project", () => ({ + createProject: projectApiMocks.createProject, + deleteProject: projectApiMocks.deleteProject, + ensureWorkspaceReady: projectApiMocks.ensureWorkspaceReady, + getDefaultProject: projectApiMocks.getDefaultProject, + getOrCreateDefaultProject: projectApiMocks.getOrCreateDefaultProject, + listProjects: projectApiMocks.listProjects, + resolveProjectRootPath: projectApiMocks.resolveProjectRootPath, + updateProject: projectApiMocks.updateProject, +})); + +vi.mock("@/lib/workspaceHealthTelemetry", () => ({ + recordWorkspaceRepair: telemetryMocks.recordWorkspaceRepair, +})); + +import { useProjects } from "./useProjects"; + +interface HookHarness { + getValue: () => ReturnType; + unmount: () => void; +} + +function createProject(overrides: Partial> = {}) { + return buildProject(overrides); +} + +function buildProject(overrides: Partial<{ + id: string; + name: string; + workspaceType: "general"; + rootPath: string; + isDefault: boolean; + settings: Record; + createdAt: number; + updatedAt: number; + icon: string; + color: string; + isFavorite: boolean; + isArchived: boolean; + tags: string[]; + defaultPersonaId?: string; +}> = {}) { + return { + id: "project-default", + name: "默认项目", + workspaceType: "general" as const, + rootPath: "/tmp/default-project", + isDefault: true, + settings: {}, + createdAt: 1, + updatedAt: 1, + icon: "📁", + color: "#00aa88", + isFavorite: false, + isArchived: false, + tags: [], + ...overrides, + }; +} + +async function flushMicrotasks() { + await act(async () => { + await Promise.resolve(); + await Promise.resolve(); + }); +} + +function mountHook(): HookHarness { + const container = document.createElement("div"); + document.body.appendChild(container); + const root = createRoot(container); + + let hookValue: ReturnType | null = null; + + function TestComponent() { + hookValue = useProjects(); + return null; + } + + act(() => { + root.render(); + }); + + return { + getValue: () => { + if (!hookValue) { + throw new Error("hook 尚未初始化"); + } + return hookValue; + }, + unmount: () => { + act(() => { + root.unmount(); + }); + container.remove(); + }, + }; +} + +describe("useProjects", () => { + beforeEach(() => { + ( + globalThis as typeof globalThis & { + IS_REACT_ACT_ENVIRONMENT?: boolean; + } + ).IS_REACT_ACT_ENVIRONMENT = true; + vi.useFakeTimers(); + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("不应等待默认项目目录健康检查完成才暴露项目列表", async () => { + const defaultProject = createProject(); + let resolveEnsure: ((value: { + workspaceId: string; + rootPath: string; + existed: boolean; + created: boolean; + repaired: boolean; + }) => void) | null = null; + + projectApiMocks.listProjects.mockResolvedValueOnce([defaultProject]); + projectApiMocks.getDefaultProject.mockResolvedValueOnce(defaultProject); + projectApiMocks.ensureWorkspaceReady.mockImplementationOnce( + () => + new Promise((resolve) => { + resolveEnsure = resolve; + }), + ); + + const harness = mountHook(); + + try { + await flushMicrotasks(); + + expect(projectApiMocks.ensureWorkspaceReady).toHaveBeenCalledWith( + defaultProject.id, + ); + expect(harness.getValue().loading).toBe(false); + expect(harness.getValue().projects).toHaveLength(1); + expect(harness.getValue().defaultProject?.id).toBe(defaultProject.id); + + resolveEnsure?.({ + workspaceId: defaultProject.id, + rootPath: defaultProject.rootPath, + existed: true, + created: false, + repaired: false, + }); + await flushMicrotasks(); + } finally { + harness.unmount(); + } + }); + + it("DevBridge 瞬时不可用时应自动重试并恢复项目列表", async () => { + const defaultProject = createProject(); + const bridgeError = new Error( + "[DevBridge] 浏览器模式无法连接后端桥接,命令 \"workspace_list\" 执行失败。", + ); + + projectApiMocks.listProjects + .mockRejectedValueOnce(bridgeError) + .mockResolvedValueOnce([defaultProject]); + projectApiMocks.getDefaultProject + .mockRejectedValueOnce(bridgeError) + .mockResolvedValueOnce(defaultProject); + projectApiMocks.ensureWorkspaceReady.mockResolvedValue({ + workspaceId: defaultProject.id, + rootPath: defaultProject.rootPath, + existed: true, + created: false, + repaired: false, + }); + + const harness = mountHook(); + + try { + await flushMicrotasks(); + + expect(harness.getValue().error).toContain("DevBridge"); + expect(harness.getValue().loading).toBe(false); + + await act(async () => { + await vi.advanceTimersByTimeAsync(1200); + }); + await flushMicrotasks(); + + expect(harness.getValue().error).toBeNull(); + expect(harness.getValue().projects).toHaveLength(1); + expect(harness.getValue().defaultProject?.id).toBe(defaultProject.id); + expect(projectApiMocks.listProjects).toHaveBeenCalledTimes(2); + } finally { + harness.unmount(); + } + }); +}); diff --git a/src/hooks/useProjects.ts b/src/hooks/useProjects.ts index 5ec7701aa..caebcd2d1 100644 --- a/src/hooks/useProjects.ts +++ b/src/hooks/useProjects.ts @@ -5,7 +5,7 @@ * @requirements 12.1, 12.2, 12.3, 12.4 */ -import { useState, useEffect, useCallback, useMemo } from "react"; +import { useState, useEffect, useCallback, useMemo, useRef } from "react"; import type { Project, CreateProjectRequest, @@ -67,6 +67,18 @@ interface UseProjectsOptions { autoLoad?: boolean; } +const DEV_BRIDGE_RETRY_BASE_DELAY_MS = 1200; +const DEV_BRIDGE_RETRY_MAX_DELAY_MS = 5000; +const DEV_BRIDGE_RETRY_MAX_ATTEMPTS = 4; + +function isDevBridgeUnavailableErrorMessage(message: string): boolean { + return ( + message.includes("[DevBridge] 浏览器模式无法连接后端桥接") || + message.includes("Failed to fetch") || + message.includes("ERR_CONNECTION_REFUSED") + ); +} + /** * 项目管理 Hook */ @@ -79,6 +91,17 @@ export function useProjects( const [loading, setLoading] = useState(autoLoad); const [error, setError] = useState(null); const [filter, setFilter] = useState({}); + const retryTimerRef = useRef | null>(null); + const retryAttemptRef = useRef(0); + + const clearRetryTimer = useCallback(() => { + if (!retryTimerRef.current) { + return; + } + + clearTimeout(retryTimerRef.current); + retryTimerRef.current = null; + }, []); /** 刷新项目列表 */ const refresh = useCallback(async () => { @@ -91,29 +114,41 @@ export function useProjects( getDefaultApiProject(), ]); - if (!skipDefaultWorkspaceReadyCheck && defaultProj?.id) { - const ensureResult = await ensureWorkspaceReady(defaultProj.id); - if (ensureResult.repaired) { - recordWorkspaceRepair({ - workspaceId: ensureResult.workspaceId, - rootPath: ensureResult.rootPath, - source: "projects_refresh", - }); - console.info( - "[Projects] 默认项目目录缺失,已自动修复:", - ensureResult.rootPath, - ); - } - } - setProjects(list.map(toProjectView)); setDefaultProject(defaultProj ? toProjectView(defaultProj) : null); + clearRetryTimer(); + retryAttemptRef.current = 0; + + if (!skipDefaultWorkspaceReadyCheck && defaultProj?.id) { + void ensureWorkspaceReady(defaultProj.id) + .then((ensureResult) => { + if (!ensureResult.repaired) { + return; + } + + recordWorkspaceRepair({ + workspaceId: ensureResult.workspaceId, + rootPath: ensureResult.rootPath, + source: "projects_refresh", + }); + console.info( + "[Projects] 默认项目目录缺失,已自动修复:", + ensureResult.rootPath, + ); + }) + .catch((ensureError) => { + console.warn( + "[Projects] 默认项目目录健康检查失败:", + ensureError, + ); + }); + } } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setLoading(false); } - }, [skipDefaultWorkspaceReadyCheck]); + }, [clearRetryTimer, skipDefaultWorkspaceReadyCheck]); /** 筛选后的项目列表 */ const filteredProjects = useMemo(() => { @@ -218,6 +253,38 @@ export function useProjects( refresh(); }, [autoLoad, refresh]); + useEffect(() => { + if ( + !autoLoad || + !error || + !isDevBridgeUnavailableErrorMessage(error) || + retryAttemptRef.current >= DEV_BRIDGE_RETRY_MAX_ATTEMPTS || + retryTimerRef.current + ) { + return; + } + + const delay = Math.min( + DEV_BRIDGE_RETRY_MAX_DELAY_MS, + DEV_BRIDGE_RETRY_BASE_DELAY_MS * 2 ** retryAttemptRef.current, + ); + retryAttemptRef.current += 1; + retryTimerRef.current = setTimeout(() => { + retryTimerRef.current = null; + void refresh(); + }, delay); + + return () => { + clearRetryTimer(); + }; + }, [autoLoad, clearRetryTimer, error, refresh]); + + useEffect(() => { + return () => { + clearRetryTimer(); + }; + }, [clearRetryTimer]); + return { projects, generalProjects, diff --git a/src/hooks/useRelayRegistry.ts b/src/hooks/useRelayRegistry.ts index 8ab51f45f..13e9ecf03 100644 --- a/src/hooks/useRelayRegistry.ts +++ b/src/hooks/useRelayRegistry.ts @@ -14,6 +14,10 @@ import { showRegistryNoCacheError, } from "@/lib/utils/connectError"; +interface UseRelayRegistryOptions { + autoLoad?: boolean; +} + /** * Registry 错误 */ @@ -66,7 +70,10 @@ export interface UseRelayRegistryReturn { * * @returns Hook 返回值 */ -export function useRelayRegistry(): UseRelayRegistryReturn { +export function useRelayRegistry( + options: UseRelayRegistryOptions = {}, +): UseRelayRegistryReturn { + const { autoLoad = true } = options; const [providers, setProviders] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); @@ -138,13 +145,18 @@ export function useRelayRegistry(): UseRelayRegistryReturn { // 初始加载 // _Requirements: 2.1_ useEffect(() => { + if (!autoLoad) { + setIsLoading(false); + return; + } + // 延迟加载,等待 Connect 模块初始化 const timer = setTimeout(() => { loadProviders(); }, 1000); return () => clearTimeout(timer); - }, [loadProviders]); + }, [autoLoad, loadProviders]); return { providers, diff --git a/src/lib/api/agentProtocol.ts b/src/lib/api/agentProtocol.ts index 4169f64e1..0be8897ba 100644 --- a/src/lib/api/agentProtocol.ts +++ b/src/lib/api/agentProtocol.ts @@ -91,6 +91,7 @@ export interface AgentMessage { role: string; content: AgentMessageContent[]; timestamp: number; + usage?: AgentTokenUsage; } export interface AgentArtifactSignal { diff --git a/src/lib/api/frontendDebug.test.ts b/src/lib/api/frontendDebug.test.ts index e9227dcf5..c34d8ae41 100644 --- a/src/lib/api/frontendDebug.test.ts +++ b/src/lib/api/frontendDebug.test.ts @@ -1,8 +1,9 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { safeInvoke } from "@/lib/dev-bridge"; +import { isDevBridgeAvailable, safeInvoke } from "@/lib/dev-bridge"; import { reportFrontendDebugLog } from "./frontendDebug"; vi.mock("@/lib/dev-bridge", () => ({ + isDevBridgeAvailable: vi.fn(() => false), safeInvoke: vi.fn(), })); @@ -12,6 +13,7 @@ describe("frontendDebug API", () => { }); it("应代理前端调试日志上报命令", async () => { + vi.mocked(isDevBridgeAvailable).mockReturnValue(false); vi.mocked(safeInvoke).mockResolvedValueOnce(undefined); await expect( @@ -21,4 +23,17 @@ describe("frontendDebug API", () => { }), ).resolves.toBeUndefined(); }); + + it("浏览器 dev shell 下应跳过远端调试日志上报", async () => { + vi.mocked(isDevBridgeAvailable).mockReturnValue(true); + + await expect( + reportFrontendDebugLog({ + message: "AgentChatPage.loadData.start", + category: "agent", + }), + ).resolves.toBeUndefined(); + + expect(safeInvoke).not.toHaveBeenCalled(); + }); }); diff --git a/src/lib/api/frontendDebug.ts b/src/lib/api/frontendDebug.ts index 507474245..a4a943989 100644 --- a/src/lib/api/frontendDebug.ts +++ b/src/lib/api/frontendDebug.ts @@ -1,4 +1,4 @@ -import { safeInvoke } from "@/lib/dev-bridge"; +import { isDevBridgeAvailable, safeInvoke } from "@/lib/dev-bridge"; export interface FrontendDebugLogReport { message: string; @@ -10,5 +10,9 @@ export interface FrontendDebugLogReport { export async function reportFrontendDebugLog( report: FrontendDebugLogReport, ): Promise { + // 浏览器 dev shell 仅保留本地 console 调试,不再占用 DevBridge 主链。 + if (isDevBridgeAvailable()) { + return; + } await safeInvoke("report_frontend_debug_log", { report }); } diff --git a/src/lib/api/serviceSkills.test.ts b/src/lib/api/serviceSkills.test.ts index 41f604fac..571bdc707 100644 --- a/src/lib/api/serviceSkills.test.ts +++ b/src/lib/api/serviceSkills.test.ts @@ -64,13 +64,6 @@ describe("serviceSkills API", () => { expect(catalog.tenantId).toBe("local-seeded"); expect(catalog.items.length).toBeGreaterThan(0); - expect( - catalog.items.some( - (item) => - item.defaultExecutorBinding === "browser_assist" || - Boolean(item.siteCapabilityBinding), - ), - ).toBe(false); expect( catalog.items.find((item) => item.id === "carousel-post-replication"), ).toEqual( @@ -95,6 +88,22 @@ describe("serviceSkills API", () => { }), }), ); + expect( + catalog.items.find((item) => item.id === "x-article-export"), + ).toEqual( + expect.objectContaining({ + source: "local_custom", + defaultExecutorBinding: "browser_assist", + sceneBinding: expect.objectContaining({ + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + }), + siteCapabilityBinding: expect.objectContaining({ + adapterName: "x/article-export", + saveMode: "project_resource", + }), + }), + ); const cached = window.localStorage.getItem("lime:service-skill-catalog:v1"); expect(cached).toContain('"tenantId":"local-seeded"'); @@ -110,8 +119,9 @@ describe("serviceSkills API", () => { expect(catalog.tenantId).toBe("tenant-demo"); expect(catalog.version).toBe("tenant-2026-03-24"); - expect(skills).toHaveLength(1); - expect(skills[0]?.id).toBe("tenant-remote-skill"); + expect(skills.map((item) => item.id)).toEqual( + expect.arrayContaining(["tenant-remote-skill", "x-article-export"]), + ); }); it("旧格式远端目录缺少 skillBundle 时应自动补齐标准摘要", async () => { @@ -146,7 +156,7 @@ describe("serviceSkills API", () => { const catalog = await getServiceSkillCatalog(); expect(catalog.tenantId).toBe("local-seeded"); - expect(catalog.version).toBe("client-seed-2026-04-04"); + expect(catalog.version).toBe("client-seed-2026-04-07"); }); it("当前 OEM 租户不匹配时不应读取其他租户的缓存目录", async () => { @@ -159,7 +169,7 @@ describe("serviceSkills API", () => { const catalog = await getServiceSkillCatalog(); expect(catalog.tenantId).toBe("local-seeded"); - expect(catalog.version).toBe("client-seed-2026-04-04"); + expect(catalog.version).toBe("client-seed-2026-04-07"); }); it("旧的 seeded 本地缓存应自动升级到当前 seeded 目录", async () => { diff --git a/src/lib/api/serviceSkills.ts b/src/lib/api/serviceSkills.ts index 5b6eb1a0f..682887b33 100644 --- a/src/lib/api/serviceSkills.ts +++ b/src/lib/api/serviceSkills.ts @@ -82,6 +82,14 @@ export interface ServiceSkillSiteCapabilityBinding { suggestedTitleTemplate?: string; } +export interface ServiceSkillSceneBinding { + sceneKey: string; + commandPrefix: string; + title?: string; + summary?: string; + aliases?: string[]; +} + export interface ServiceSkillBundleResourceSummary { hasScripts: boolean; hasReferences: boolean; @@ -127,6 +135,7 @@ export interface ServiceSkillItem { examples?: string[]; outputDestination?: string; siteCapabilityBinding?: ServiceSkillSiteCapabilityBinding; + sceneBinding?: ServiceSkillSceneBinding; slotSchema: ServiceSkillSlotDefinition[]; surfaceScopes?: ServiceSkillSurfaceScope[]; promptTemplateKey?: ServiceSkillPromptTemplateKey; @@ -157,7 +166,7 @@ interface ServiceSkillCatalogResponseEnvelope { const SERVICE_SKILL_CATALOG_STORAGE_KEY = "lime:service-skill-catalog:v1"; const SERVICE_SKILL_CATALOG_CHANGED_EVENT = "lime:service-skill-catalog-changed"; -const SEEDED_SERVICE_SKILL_CATALOG_VERSION = "client-seed-2026-04-04"; +const SEEDED_SERVICE_SKILL_CATALOG_VERSION = "client-seed-2026-04-07"; const PLATFORM_OPTIONS: ServiceSkillSlotOption[] = [ { value: "xiaohongshu", label: "小红书" }, @@ -826,6 +835,85 @@ const SEEDED_SERVICE_SKILL_CATALOG: ServiceSkillCatalog = { }, ], }, + { + id: "x-article-export", + skillKey: "x-article-export", + skillType: "site", + title: "X 文章转存", + summary: + "复用已连接的 X / Twitter 浏览器登录态,导出长文为 Markdown,并把文内图片一并落到项目目录。", + entryHint: + "给我 X 文章链接,我会复用现有浏览器上下文抓正文、代码块和图片,并沉淀到项目导出目录。", + aliases: [ + "x文章转存", + "x 长文转存", + "twitter article export", + "twitter-article-export", + ], + category: "站点采集", + outputHint: "Markdown 正文 + 图片目录 + 元信息", + triggerHints: [ + "需要把 X 长文沉淀到本地项目目录,方便继续改写或引用时使用。", + "需要保留文内图片、代码块和标题结构,转换成 Markdown 时使用。", + ], + source: "local_custom", + runnerType: "instant", + defaultExecutorBinding: "browser_assist", + executionLocation: "client_default", + readinessRequirements: { + requiresBrowser: true, + requiresProject: true, + }, + usageGuidelines: [ + "优先在已连接浏览器上下文中执行,避免丢失 X 的登录态和长文阅读权限。", + "结果会落到当前项目目录,适合后续继续整理、引用和版本管理。", + ], + setupRequirements: [ + "需要先在浏览器工作台连接目标浏览器。", + "需要当前会话已经选择项目,方便把 Markdown 和图片写入项目目录。", + ], + examples: [ + "把这篇 X 长文导出成 Markdown,并把图片一起保存到项目里。", + "请转存这条 Twitter Article,我后面还要继续改写和引用里面的代码示例。", + ], + outputDestination: + "结果会写入当前项目目录下的导出文件夹,并在工作区生成一个结果入口文档。", + siteCapabilityBinding: { + adapterName: "x/article-export", + autoRun: true, + requireAttachedSession: true, + saveMode: "project_resource", + slotArgMap: { + article_url: "url", + }, + }, + sceneBinding: { + sceneKey: "x-article-export", + commandPrefix: "/x文章转存", + title: "X文章转存", + summary: + "复用 X / Twitter 登录态,把长文导出成 Markdown,并把文内图片一起写入项目目录。", + aliases: [ + "x文章转存", + "x转存", + "twitter-article-export", + "twitter文章转存", + ], + }, + surfaceScopes: ["workspace"], + themeTarget: "general", + version: SEEDED_SERVICE_SKILL_CATALOG_VERSION, + slotSchema: [ + { + key: "article_url", + label: "X 文章链接", + type: "url", + required: true, + placeholder: "https://x.com/<账号>/article/<文章ID>", + helpText: "支持 x.com 和 twitter.com 的 Article 链接。", + }, + ], + }, ], }; @@ -971,6 +1059,25 @@ function isServiceSkillSiteCapabilityBinding( ); } +function isServiceSkillSceneBinding( + value: unknown, +): value is ServiceSkillSceneBinding { + if (!value || typeof value !== "object") { + return false; + } + + const binding = value as Partial; + return ( + typeof binding.sceneKey === "string" && + binding.sceneKey.trim().length > 0 && + typeof binding.commandPrefix === "string" && + binding.commandPrefix.trim().length > 0 && + (binding.title === undefined || typeof binding.title === "string") && + (binding.summary === undefined || typeof binding.summary === "string") && + (binding.aliases === undefined || isStringArray(binding.aliases)) + ); +} + function isServiceSkillItem(value: unknown): value is ServiceSkillItem { if (!value || typeof value !== "object") { return false; @@ -1020,6 +1127,8 @@ function isServiceSkillItem(value: unknown): value is ServiceSkillItem { typeof item.outputDestination === "string") && (item.siteCapabilityBinding === undefined || isServiceSkillSiteCapabilityBinding(item.siteCapabilityBinding)) && + (item.sceneBinding === undefined || + isServiceSkillSceneBinding(item.sceneBinding)) && Array.isArray(item.slotSchema) && item.slotSchema.every(isServiceSkillSlotDefinition) && (item.surfaceScopes === undefined || @@ -1080,6 +1189,14 @@ function cloneServiceSkillCatalog( : undefined, } : undefined, + sceneBinding: item.sceneBinding + ? { + ...item.sceneBinding, + aliases: item.sceneBinding.aliases + ? [...item.sceneBinding.aliases] + : undefined, + } + : undefined, skillBundle: item.skillBundle ? { ...item.skillBundle, @@ -1218,6 +1335,28 @@ function shouldIgnoreServerSyncedCatalog( return compareCatalogVersion(incoming.version, current.version) < 0; } +function mergeSeededLocalCustomServiceSkillItems( + catalog: ServiceSkillCatalog, +): ServiceSkillCatalog { + const localCustomItems = SEEDED_SERVICE_SKILL_CATALOG.items.filter( + (item) => item.source === "local_custom", + ); + if (localCustomItems.length === 0) { + return catalog; + } + + const localCustomIds = new Set(localCustomItems.map((item) => item.id)); + return { + ...catalog, + items: [ + ...catalog.items.filter((item) => !localCustomIds.has(item.id)), + ...localCustomItems.map( + (item) => JSON.parse(JSON.stringify(item)) as ServiceSkillItem, + ), + ], + }; +} + export function parseServiceSkillCatalog( value: unknown, ): ServiceSkillCatalog | null { @@ -1225,7 +1364,7 @@ export function parseServiceSkillCatalog( return null; } - return cloneServiceSkillCatalog(value); + return cloneServiceSkillCatalog(mergeSeededLocalCustomServiceSkillItems(value)); } function persistServiceSkillCatalog(catalog: ServiceSkillCatalog): void { @@ -1421,5 +1560,5 @@ export async function refreshServiceSkillCatalogFromRemote(): Promise { const catalog = await getServiceSkillCatalog(); - return catalog.items.filter((item) => item.source === "cloud_catalog"); + return catalog.items; } diff --git a/src/lib/api/skillCatalog.test.ts b/src/lib/api/skillCatalog.test.ts index 1e6522c90..4627a879d 100644 --- a/src/lib/api/skillCatalog.test.ts +++ b/src/lib/api/skillCatalog.test.ts @@ -120,6 +120,15 @@ describe("skillCatalog", () => { it("应从统一目录中暴露 command 与 scene 扩展入口", async () => { const seeded = await getSkillCatalog(); + const formEntry = listSkillCatalogCommandEntries(seeded).find( + (entry) => entry.commandKey === "form_generate", + ); + const codeEntry = listSkillCatalogCommandEntries(seeded).find( + (entry) => entry.commandKey === "code_runtime", + ); + const publishEntry = listSkillCatalogCommandEntries(seeded).find( + (entry) => entry.commandKey === "publish_runtime", + ); expect( listSkillCatalogCommandEntries(seeded).map((entry) => entry.commandKey), @@ -141,8 +150,29 @@ describe("skillCatalog", () => { "transcription_generate", "url_parse", "typesetting", + "form_generate", + "code_runtime", + "publish_runtime", ]), ); + expect(formEntry?.renderContract).toMatchObject({ + resultKind: "form", + detailKind: "json", + supportsStreaming: true, + supportsTimeline: true, + }); + expect(codeEntry?.renderContract).toMatchObject({ + resultKind: "tool_timeline", + detailKind: "json", + supportsStreaming: true, + supportsTimeline: true, + }); + expect(publishEntry?.renderContract).toMatchObject({ + resultKind: "artifact", + detailKind: "artifact_detail", + supportsStreaming: true, + supportsTimeline: true, + }); const remoteCatalog: SkillCatalog = { ...buildLegacyCatalogWithSiteEntries(), @@ -163,6 +193,22 @@ describe("skillCatalog", () => { supportsTimeline: true, }, }, + { + id: "scene:legacy-site-export", + kind: "scene", + title: "旧版站点导出", + summary: "把站点技能包装成 slash scene。", + sceneKey: "legacy-site-export", + commandPrefix: "/legacy-site-export", + linkedSkillId: "legacy-site-skill", + executionKind: "site_adapter", + renderContract: { + resultKind: "tool_timeline", + detailKind: "scene_detail", + supportsStreaming: true, + supportsTimeline: true, + }, + }, ], }; @@ -171,6 +217,12 @@ describe("skillCatalog", () => { expect( listSkillCatalogSceneEntries(catalog).map((entry) => entry.sceneKey), - ).toContain("campaign-launch"); + ).toEqual( + expect.arrayContaining([ + "campaign-launch", + "legacy-site-export", + "x-article-export", + ]), + ); }); }); diff --git a/src/lib/api/skillCatalog.ts b/src/lib/api/skillCatalog.ts index 4762cface..99c9c6e36 100644 --- a/src/lib/api/skillCatalog.ts +++ b/src/lib/api/skillCatalog.ts @@ -207,7 +207,7 @@ const SEEDED_SKILL_GROUP_PRESETS = [ }, ] as const; const SEEDED_SKILL_CATALOG_VERSION = - "client-seed-skill-catalog-2026-04-06-report"; + "client-seed-skill-catalog-2026-04-07-z-code-runtime"; const SEEDED_COMMAND_ENTRY_DEFINITIONS = [ { id: "command:image_generate", @@ -299,6 +299,140 @@ const SEEDED_COMMAND_ENTRY_DEFINITIONS = [ supportsTimeline: true, }, }, + { + id: "command:presentation_generate", + title: "PPT", + summary: "根据目标说明生成一份可直接讲述和继续导出的演示稿草稿。", + commandKey: "presentation_generate", + aliases: [ + "ppt", + "presentation", + "slides", + "deck", + "yanjiang", + "演示", + "演示稿", + "路演", + ], + triggers: [{ mode: "mention", prefix: "@PPT" }], + binding: { + skillId: "presentation_generate", + executionKind: "agent_turn" as const, + }, + renderContract: { + resultKind: "artifact" as const, + detailKind: "artifact_detail" as const, + supportsStreaming: true, + supportsTimeline: true, + }, + }, + { + id: "command:form_generate", + title: "表单", + summary: "根据目标说明生成可直接在聊天区渲染的 A2UI 表单。", + commandKey: "form_generate", + aliases: [ + "form", + "survey", + "biaodan", + "wenjuan", + "表单", + "问卷", + "报名表", + ], + triggers: [{ mode: "mention", prefix: "@表单" }], + binding: { + skillId: "form_generate", + executionKind: "agent_turn" as const, + }, + renderContract: { + resultKind: "form" as const, + detailKind: "json" as const, + supportsStreaming: true, + supportsTimeline: true, + }, + }, + { + id: "command:webpage_generate", + title: "网页", + summary: "根据目标说明生成可直接预览的单文件网页。", + commandKey: "webpage_generate", + aliases: [ + "webpage", + "web", + "wangye", + "网页", + "落地页", + "landing", + "官网", + "活动页", + ], + triggers: [{ mode: "mention", prefix: "@网页" }], + binding: { + skillId: "webpage_generate", + executionKind: "agent_turn" as const, + }, + renderContract: { + resultKind: "artifact" as const, + detailKind: "artifact_detail" as const, + supportsStreaming: true, + supportsTimeline: true, + }, + }, + { + id: "command:code_runtime", + title: "代码", + summary: "把本次输入切到代码编排主链,优先调度工具、子代理与代码团队协作。", + commandKey: "code_runtime", + aliases: [ + "code", + "coding", + "kaifa", + "daima", + "代码", + "开发", + "代码评审", + "修复", + "重构", + ], + triggers: [{ mode: "mention", prefix: "@代码" }], + binding: { + executionKind: "agent_turn" as const, + }, + renderContract: { + resultKind: "tool_timeline" as const, + detailKind: "json" as const, + supportsStreaming: true, + supportsTimeline: true, + }, + }, + { + id: "command:publish_runtime", + title: "发布", + summary: "把当前内容导入发布工作流,继续整理发布稿、发布包与平台检查。", + commandKey: "publish_runtime", + aliases: [ + "publish", + "fabu", + "fawen", + "投稿", + "发文", + "发布", + "发布稿", + "发布前检查", + ], + triggers: [{ mode: "mention", prefix: "@发布" }], + binding: { + skillId: "content_post_with_cover", + executionKind: "native_skill" as const, + }, + renderContract: { + resultKind: "artifact" as const, + detailKind: "artifact_detail" as const, + supportsStreaming: true, + supportsTimeline: true, + }, + }, { id: "command:broadcast_generate", title: "播报", @@ -813,11 +947,15 @@ function buildSkillEntryFromCatalogItem(item: SkillCatalogItem): SkillCatalogSki function buildSceneEntryFromCatalogItem( item: SkillCatalogItem, ): SkillCatalogSceneEntry | null { - if (item.execution.kind !== "cloud_scene") { + const explicitSceneBinding = item.sceneBinding; + if (!explicitSceneBinding && item.execution.kind !== "cloud_scene") { return null; } - const sceneKey = normalizeText(item.skillKey) ?? normalizeText(item.id); + const sceneKey = + normalizeText(explicitSceneBinding?.sceneKey) ?? + normalizeText(item.skillKey) ?? + normalizeText(item.id); if (!sceneKey) { return null; } @@ -825,11 +963,15 @@ function buildSceneEntryFromCatalogItem( return { id: `scene:${sceneKey}`, kind: "scene", - title: item.title, - summary: item.summary, + title: normalizeText(explicitSceneBinding?.title) ?? item.title, + summary: normalizeText(explicitSceneBinding?.summary) ?? item.summary, sceneKey, - commandPrefix: `/${sceneKey}`, - aliases: item.aliases, + commandPrefix: + normalizeText(explicitSceneBinding?.commandPrefix) ?? `/${sceneKey}`, + aliases: + explicitSceneBinding?.aliases && explicitSceneBinding.aliases.length > 0 + ? explicitSceneBinding.aliases + : item.aliases, surfaceScopes: item.surfaceScopes, linkedSkillId: item.id, executionKind: item.execution.kind, @@ -859,7 +1001,40 @@ function buildSeededCommandEntries(): SkillCatalogCommandEntry[] { })); } -function buildLegacyCatalogEntries(items: SkillCatalogItem[]): SkillCatalogEntry[] { +function buildSceneEntriesFromCatalogItems( + items: SkillCatalogItem[], +): SkillCatalogSceneEntry[] { + return items + .map((item) => buildSceneEntryFromCatalogItem(item)) + .filter((entry): entry is SkillCatalogSceneEntry => Boolean(entry)); +} + +function mergeSeededCatalogEntries( + entries: SkillCatalogEntry[], + sceneSourceItems: SkillCatalogItem[], +): SkillCatalogEntry[] { + const merged: SkillCatalogEntry[] = []; + const seenIds = new Set(); + + [ + ...buildSeededCommandEntries(), + ...buildSceneEntriesFromCatalogItems(sceneSourceItems), + ...entries, + ].forEach((entry) => { + if (seenIds.has(entry.id)) { + return; + } + seenIds.add(entry.id); + merged.push(entry); + }); + + return merged; +} + +function buildLegacyCatalogEntries( + items: SkillCatalogItem[], + sceneSourceItems: SkillCatalogItem[] = items, +): SkillCatalogEntry[] { const entries: SkillCatalogEntry[] = []; const seenIds = new Set(); @@ -877,12 +1052,14 @@ function buildLegacyCatalogEntries(items: SkillCatalogItem[]): SkillCatalogEntry seenIds.add(skillEntry.id); entries.push(skillEntry); } + }); - const sceneEntry = buildSceneEntryFromCatalogItem(item); - if (sceneEntry && !seenIds.has(sceneEntry.id)) { - seenIds.add(sceneEntry.id); - entries.push(sceneEntry); + buildSceneEntriesFromCatalogItems(sceneSourceItems).forEach((entry) => { + if (seenIds.has(entry.id)) { + return; } + seenIds.add(entry.id); + entries.push(entry); }); return entries; @@ -892,7 +1069,7 @@ function resolveSeededSkillGroupKey(item: ServiceSkillItem): string { return resolveAdapterGroupKey(item.siteCapabilityBinding?.adapterName); } -function buildSeededSkillCatalog(): SkillCatalog { +function buildRawSeededSkillCatalog(): SkillCatalog { const seeded = getSeededServiceSkillCatalog(); const items: SkillCatalogItem[] = seeded.items.map((item) => { const clonedItem = cloneJsonValue(item); @@ -936,7 +1113,8 @@ function buildSeededSkillCatalog(): SkillCatalog { }; } -const SEEDED_SKILL_CATALOG = buildSeededSkillCatalog(); +const RAW_SEEDED_SKILL_CATALOG = buildRawSeededSkillCatalog(); +const SEEDED_SKILL_CATALOG = normalizeSkillCatalog(RAW_SEEDED_SKILL_CATALOG); function resolveAdapterGroupKey(adapterName?: string | null): string { const normalized = normalizeText(adapterName)?.toLowerCase(); @@ -1035,21 +1213,30 @@ function shouldExposeSkillCatalogItem(item: SkillCatalogItem): boolean { function normalizeSkillCatalog(catalog: SkillCatalog): SkillCatalog { const filteredItems = catalog.items.filter(shouldExposeSkillCatalogItem); const normalizedGroups = mergeCatalogGroups(catalog.groups, filteredItems); - const normalizedEntries = + const normalizedEntries = mergeSeededCatalogEntries( catalog.entries.length > 0 ? catalog.entries.filter((entry) => { if (entry.kind === "skill") { return filteredItems.some((item) => entry.skillId === item.id); } if (entry.kind === "scene") { + const linkedSkillId = entry.linkedSkillId?.trim(); + if (!linkedSkillId) { + return true; + } + if (catalog.items.some((item) => item.id === linkedSkillId)) { + return true; + } return ( - !entry.linkedSkillId || - filteredItems.some((item) => item.id === entry.linkedSkillId) + entry.executionKind === "site_adapter" || + entry.executionKind === "scene" ); } return true; }) - : buildLegacyCatalogEntries(filteredItems); + : buildLegacyCatalogEntries(filteredItems, catalog.items), + catalog.items, + ); return cloneSkillCatalog({ ...catalog, @@ -1286,6 +1473,26 @@ function parseSkillCatalogEntry(value: unknown): SkillCatalogEntry | null { return null; } +function mergeSeededLocalCustomSkillCatalogItems( + catalog: SkillCatalog, +): SkillCatalog { + const localCustomItems = RAW_SEEDED_SKILL_CATALOG.items.filter( + (item) => item.source === "local_custom", + ); + if (localCustomItems.length === 0) { + return catalog; + } + + const localCustomIds = new Set(localCustomItems.map((item) => item.id)); + return { + ...catalog, + items: [ + ...catalog.items.filter((item) => !localCustomIds.has(item.id)), + ...localCustomItems.map((item) => cloneJsonValue(item)), + ], + }; +} + export function parseSkillCatalog(value: unknown): SkillCatalog | null { if (!isPlainRecord(value)) { return null; @@ -1329,14 +1536,16 @@ export function parseSkillCatalog(value: unknown): SkillCatalog | null { entries.push(parsed); } - return normalizeSkillCatalog({ - version, - tenantId, - syncedAt, - groups, - items, - entries, - }); + return normalizeSkillCatalog( + mergeSeededLocalCustomSkillCatalogItems({ + version, + tenantId, + syncedAt, + groups, + items, + entries, + }), + ); } function persistSkillCatalog(catalog: SkillCatalog): void { diff --git a/src/lib/artifact-protocol/index.test.ts b/src/lib/artifact-protocol/index.test.ts index 1e75fa3e8..f5d968017 100644 --- a/src/lib/artifact-protocol/index.test.ts +++ b/src/lib/artifact-protocol/index.test.ts @@ -2,11 +2,14 @@ import { describe, expect, it } from "vitest"; import { ARTIFACT_DOCUMENT_SCHEMA_VERSION } from "@/lib/artifact-document"; import { + areArtifactProtocolPathsEquivalent, extractArtifactProtocolPaths, extractArtifactProtocolPathsFromRecord, extractArtifactProtocolPathsFromValue, hasArtifactProtocolDocumentMetadata, hasArtifactProtocolMetadata, + isArtifactProtocolImagePath, + normalizeArtifactProtocolPath, resolveArtifactProtocolDocumentPayload, resolveArtifactProtocolFilePath, resolveArtifactProtocolPreviewText, @@ -105,6 +108,35 @@ describe("artifact-protocol", () => { expect(hasArtifactProtocolMetadata(undefined)).toBe(false); }); + it("应把文件名、相对路径与绝对路径识别为同一路径", () => { + expect( + areArtifactProtocolPathsEquivalent( + "output_image.jpg", + "/Users/coso/.lime/tasks/image/output_image.jpg", + ), + ).toBe(true); + expect( + areArtifactProtocolPathsEquivalent( + "./.lime/tasks/image/output_image.jpg", + ".lime/tasks/image/output_image.jpg", + ), + ).toBe(true); + expect( + areArtifactProtocolPathsEquivalent( + "content-posts/cover.png", + "assets/cover.png", + ), + ).toBe(false); + }); + + it("应规范化协议路径并识别二进制图片文件", () => { + expect(normalizeArtifactProtocolPath(" .\\.lime\\tasks\\image\\cover.jpg ")).toBe( + "./.lime/tasks/image/cover.jpg", + ); + expect(isArtifactProtocolImagePath("output_image.jpg")).toBe(true); + expect(isArtifactProtocolImagePath("diagram.svg")).toBe(false); + }); + it("应统一处理 artifact 的文件路径回退顺序", () => { expect( resolveArtifactProtocolFilePath({ diff --git a/src/lib/artifact-protocol/index.ts b/src/lib/artifact-protocol/index.ts index 6357c014f..b41e89316 100644 --- a/src/lib/artifact-protocol/index.ts +++ b/src/lib/artifact-protocol/index.ts @@ -38,6 +38,39 @@ function normalizePath(value: string): string { return value.replace(/\\/g, "/").trim(); } +function splitArtifactProtocolPath(value: string): { + normalized: string; + isAbsolute: boolean; + segments: string[]; +} { + const normalized = normalizePath(value); + const isAbsolute = + normalized.startsWith("/") || + normalized.startsWith("~/") || + /^[A-Za-z]:\//.test(normalized) || + normalized.startsWith("//"); + const segments = normalized + .split("/") + .map((segment) => segment.trim()) + .filter((segment) => segment.length > 0 && segment !== "."); + + return { + normalized, + isAbsolute, + segments, + }; +} + +function hasSameTrailingSegments(left: string[], right: string[]): boolean { + const minLength = Math.min(left.length, right.length); + for (let index = 1; index <= minLength; index += 1) { + if (left[left.length - index] !== right[right.length - index]) { + return false; + } + } + return minLength > 0; +} + function appendArtifactProtocolPath( paths: Set, value: unknown, @@ -161,20 +194,82 @@ export function extractArtifactProtocolPathsFromValue( return Array.from(paths); } +export function normalizeArtifactProtocolPath( + value?: string | null, +): string { + return typeof value === "string" ? splitArtifactProtocolPath(value).normalized : ""; +} + +export function areArtifactProtocolPathsEquivalent( + left?: string | null, + right?: string | null, +): boolean { + const leftPath = typeof left === "string" ? splitArtifactProtocolPath(left) : null; + const rightPath = + typeof right === "string" ? splitArtifactProtocolPath(right) : null; + + if ( + !leftPath || + !rightPath || + leftPath.segments.length === 0 || + rightPath.segments.length === 0 + ) { + return false; + } + + if (leftPath.normalized === rightPath.normalized) { + return true; + } + + if ( + leftPath.segments.length === rightPath.segments.length && + leftPath.segments.every((segment, index) => segment === rightPath.segments[index]) + ) { + return true; + } + + const leftFileName = leftPath.segments[leftPath.segments.length - 1]; + const rightFileName = rightPath.segments[rightPath.segments.length - 1]; + if (leftFileName !== rightFileName) { + return false; + } + + if (leftPath.segments.length === 1 || rightPath.segments.length === 1) { + return true; + } + + if (leftPath.isAbsolute !== rightPath.isAbsolute) { + return hasSameTrailingSegments(leftPath.segments, rightPath.segments); + } + + return false; +} + +export function isArtifactProtocolImagePath( + value?: string | null, +): boolean { + const normalized = normalizeArtifactProtocolPath(value); + if (!normalized) { + return false; + } + + return /\.(avif|bmp|gif|heic|heif|jpe?g|png|tiff?|webp)$/i.test(normalized); +} + export function resolveArtifactProtocolFilePath( artifact: ArtifactProtocolFileTarget, ): string { const filePath = normalizeText(artifact.meta.filePath); if (filePath) { - return filePath; + return normalizeArtifactProtocolPath(filePath); } const filename = normalizeText(artifact.meta.filename); if (filename) { - return filename; + return normalizeArtifactProtocolPath(filename); } - return artifact.title; + return normalizeArtifactProtocolPath(artifact.title); } export function hasArtifactProtocolMetadata( diff --git a/src/lib/dev-bridge/http-client.test.ts b/src/lib/dev-bridge/http-client.test.ts index 0e9c8090e..36285b7c5 100644 --- a/src/lib/dev-bridge/http-client.test.ts +++ b/src/lib/dev-bridge/http-client.test.ts @@ -1,92 +1,111 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -type MockMessageEvent = { - data: string; -}; +vi.mock("@/lib/tauri-runtime", () => ({ + hasTauriInvokeCapability: vi.fn(() => false), + hasTauriRuntimeMarkers: vi.fn(() => false), +})); -class MockEventSource { - static instances: MockEventSource[] = []; +import { + __resetDevBridgeHttpStateForTests, + healthCheck, + invokeViaHttp, + listenViaHttpEvent, +} from "./http-client"; - readonly url: string; - readonly withCredentials = false; - readyState = 0; - onopen: ((event: Event) => void) | null = null; - onmessage: ((event: MockMessageEvent) => void) | null = null; - onerror: ((event: Event | unknown) => void) | null = null; - closed = false; +type FetchInput = Parameters[0]; +type FetchOptions = Parameters[1]; - constructor(url: string) { - this.url = url; - MockEventSource.instances.push(this); - } - - close() { - this.closed = true; - this.readyState = 2; - } - - emitOpen() { - this.readyState = 1; - this.onopen?.(new Event("open")); - } - - emitMessage(data: string) { - this.onmessage?.({ data }); - } +function createAbortablePendingFetch() { + return vi.fn((_input: FetchInput, init?: FetchOptions) => { + return new Promise((_resolve, reject) => { + const signal = init?.signal; + signal?.addEventListener("abort", () => { + reject(new DOMException("The operation was aborted.", "AbortError")); + }); + }); + }); } -describe("http-client listenViaHttpEvent", () => { +describe("http-client", () => { beforeEach(() => { vi.useFakeTimers(); - vi.resetModules(); - MockEventSource.instances = []; - vi.stubEnv("MODE", "development"); - vi.stubEnv("DEV", true); - vi.stubEnv("VITEST", ""); - vi.stubGlobal("EventSource", MockEventSource as unknown as typeof EventSource); + __resetDevBridgeHttpStateForTests(); + vi.spyOn(console, "log").mockImplementation(() => undefined); + vi.spyOn(console, "error").mockImplementation(() => undefined); + vi.stubGlobal("fetch", vi.fn()); }); afterEach(() => { - vi.unstubAllGlobals(); - vi.unstubAllEnvs(); vi.useRealTimers(); + vi.unstubAllGlobals(); + vi.restoreAllMocks(); + __resetDevBridgeHttpStateForTests(); }); - it("会等待事件流真正连上后再返回订阅", async () => { - const { listenViaHttpEvent } = await import("./http-client"); - const handler = vi.fn(); - let resolved = false; + it("桥健康探测失败后,后续检查会在短退避窗口内快速失败", async () => { + const fetchMock = createAbortablePendingFetch(); + vi.stubGlobal("fetch", fetchMock); - const promise = listenViaHttpEvent("agent_stream", handler).then((unlisten) => { - resolved = true; - return unlisten; - }); + const firstCheck = healthCheck(); + await vi.advanceTimersByTimeAsync(1000); + await expect(firstCheck).resolves.toBe(false); + expect(fetchMock).toHaveBeenCalledTimes(1); - await Promise.resolve(); - expect(resolved).toBe(false); - expect(MockEventSource.instances).toHaveLength(1); - - const source = MockEventSource.instances[0]; - source.emitOpen(); - - const unlisten = await promise; - expect(resolved).toBe(true); - - source.emitMessage(JSON.stringify({ payload: { delta: "hello" } })); - expect(handler).toHaveBeenCalledWith({ payload: { delta: "hello" } }); - - unlisten(); - expect(source.closed).toBe(true); + await expect(invokeViaHttp("workspace_list")).rejects.toThrow( + "Failed to fetch", + ); + expect(fetchMock).toHaveBeenCalledTimes(1); }); - it("连接超时会拒绝订阅并关闭事件流", async () => { - const { listenViaHttpEvent } = await import("./http-client"); + it("桥健康时会复用短期健康缓存,避免每次调用都重复探测", async () => { + const fetchMock = vi.fn() + .mockResolvedValueOnce(new Response(null, { status: 200 })) + .mockResolvedValueOnce( + new Response(JSON.stringify({ result: ["project-a"] }), { + status: 200, + headers: { + "Content-Type": "application/json", + }, + }), + ) + .mockResolvedValueOnce( + new Response(JSON.stringify({ result: { id: "default-project" } }), { + status: 200, + headers: { + "Content-Type": "application/json", + }, + }), + ); + vi.stubGlobal("fetch", fetchMock); - const promise = listenViaHttpEvent("agent_stream", vi.fn()); - const rejection = expect(promise).rejects.toThrow("事件流连接超时"); - await vi.advanceTimersByTimeAsync(1500); + await expect(invokeViaHttp("workspace_list")).resolves.toEqual([ + "project-a", + ]); + await expect( + invokeViaHttp<{ id: string }>("workspace_get_default"), + ).resolves.toEqual({ id: "default-project" }); - await rejection; - expect(MockEventSource.instances[0]?.closed).toBe(true); + expect(fetchMock).toHaveBeenCalledTimes(3); + expect(fetchMock.mock.calls[0]?.[0]).toBe("http://127.0.0.1:3030/health"); + expect(fetchMock.mock.calls[1]?.[0]).toBe("http://127.0.0.1:3030/invoke"); + expect(fetchMock.mock.calls[2]?.[0]).toBe("http://127.0.0.1:3030/invoke"); + }); + + it("桥失败短退避期间,事件监听不应继续创建 EventSource 连接", async () => { + const fetchMock = createAbortablePendingFetch(); + const eventSourceMock = vi.fn(); + vi.stubGlobal("fetch", fetchMock); + vi.stubGlobal("EventSource", eventSourceMock as unknown as typeof EventSource); + + const firstCheck = healthCheck(); + await vi.advanceTimersByTimeAsync(1000); + await expect(firstCheck).resolves.toBe(false); + + await expect( + listenViaHttpEvent("config-changed", vi.fn()), + ).rejects.toThrow("Failed to fetch"); + + expect(eventSourceMock).not.toHaveBeenCalled(); + expect(fetchMock).toHaveBeenCalledTimes(1); }); }); diff --git a/src/lib/dev-bridge/http-client.ts b/src/lib/dev-bridge/http-client.ts index a9a600482..2b1e24b58 100644 --- a/src/lib/dev-bridge/http-client.ts +++ b/src/lib/dev-bridge/http-client.ts @@ -14,6 +14,10 @@ const BRIDGE_URL = "http://127.0.0.1:3030/invoke"; const BRIDGE_HEALTH_URL = "http://127.0.0.1:3030/health"; const BRIDGE_EVENTS_URL = "http://127.0.0.1:3030/events"; const DEV_BRIDGE_EVENT_CONNECT_TIMEOUT_MS = 1500; +const DEV_BRIDGE_REQUEST_TIMEOUT_MS = 1800; +const DEV_BRIDGE_HEALTH_TIMEOUT_MS = 800; +const DEV_BRIDGE_HEALTH_CACHE_MS = 2500; +const DEV_BRIDGE_FAILURE_COOLDOWN_MS = 3000; export interface InvokeRequest { cmd: string; @@ -33,7 +37,13 @@ interface DevBridgeEventHub { openPromise: Promise; } +type FetchInput = Parameters[0]; +type FetchOptions = NonNullable[1]>; + const bridgeEventHubs = new Map(); +let bridgeLastHealthyAt = 0; +let bridgeConnectionBackoffUntil = 0; +let bridgeHealthProbePromise: Promise | null = null; function resolveEventSourceConstructor(): typeof EventSource | null { if (typeof window !== "undefined" && typeof window.EventSource === "function") { @@ -63,16 +73,109 @@ function isBridgeCommandError(message: string): boolean { } function isBridgeConnectionError(message: string): boolean { + const normalizedMessage = message.toLowerCase(); return ( message.includes("Failed to fetch") || message.includes("fetch failed") || message.includes("NetworkError") || message.includes("ERR_CONNECTION_REFUSED") || message.includes("Load failed") || - message.includes("ECONNREFUSED") + message.includes("ECONNREFUSED") || + normalizedMessage.includes("timeout") || + normalizedMessage.includes("aborterror") ); } +function markBridgeHealthy(now = Date.now()): void { + bridgeLastHealthyAt = now; + bridgeConnectionBackoffUntil = 0; +} + +function markBridgeUnavailable(now = Date.now()): void { + bridgeLastHealthyAt = 0; + bridgeConnectionBackoffUntil = Math.max( + bridgeConnectionBackoffUntil, + now + DEV_BRIDGE_FAILURE_COOLDOWN_MS, + ); +} + +function isBridgeCooldownActive(now = Date.now()): boolean { + return bridgeConnectionBackoffUntil > now; +} + +function createBridgeConnectionFailureError(reason: string): Error { + return new Error(`Failed to fetch (${reason})`); +} + +async function fetchWithTimeout( + input: FetchInput, + init: FetchOptions, + timeoutMs: number, +): Promise { + const controller = new AbortController(); + const timeoutId = globalThis.setTimeout(() => { + controller.abort(); + }, timeoutMs); + + try { + return await fetch(input, { + ...init, + signal: controller.signal, + }); + } catch (error) { + if (controller.signal.aborted) { + throw createBridgeConnectionFailureError(`timeout after ${timeoutMs}ms`); + } + throw error; + } finally { + globalThis.clearTimeout(timeoutId); + } +} + +async function ensureBridgeReachable(): Promise { + const now = Date.now(); + if (bridgeLastHealthyAt > 0 && now - bridgeLastHealthyAt < DEV_BRIDGE_HEALTH_CACHE_MS) { + return; + } + + if (isBridgeCooldownActive(now)) { + throw createBridgeConnectionFailureError("bridge cooldown active"); + } + + if (!bridgeHealthProbePromise) { + bridgeHealthProbePromise = (async () => { + try { + const response = await fetchWithTimeout( + BRIDGE_HEALTH_URL, + { + method: "GET", + }, + DEV_BRIDGE_HEALTH_TIMEOUT_MS, + ); + if (!response.ok) { + markBridgeUnavailable(); + return false; + } + markBridgeHealthy(); + return true; + } catch (error) { + if (isBridgeConnectionError(toErrorMessage(error))) { + markBridgeUnavailable(); + return false; + } + throw error; + } finally { + bridgeHealthProbePromise = null; + } + })(); + } + + const reachable = await bridgeHealthProbePromise; + if (!reachable) { + throw createBridgeConnectionFailureError("bridge health check failed"); + } +} + function isTestEnvironment(): boolean { return Boolean(import.meta.env?.MODE === "test" || import.meta.env?.VITEST); } @@ -177,6 +280,8 @@ export async function listenViaHttpEvent( let hub = bridgeEventHubs.get(normalizedEvent); if (!hub) { + await ensureBridgeReachable(); + const EventSourceConstructor = resolveEventSourceConstructor(); if (!EventSourceConstructor) { throw new Error(`[DevBridge] 浏览器模式事件桥不可用: ${event}`); @@ -199,6 +304,7 @@ export async function listenViaHttpEvent( if (hasOpened) { return; } + markBridgeUnavailable(); bridgeEventHubs.delete(normalizedEvent); source.close(); settleOpenError?.( @@ -237,6 +343,7 @@ export async function listenViaHttpEvent( return; } window.clearTimeout(connectTimeout); + markBridgeUnavailable(); bridgeEventHubs.delete(normalizedEvent); source.close(); settleOpenError?.( @@ -287,13 +394,19 @@ export async function invokeViaHttp( console.log(`[DevBridge] HTTP 调用: ${cmd}`, args); try { - const response = await fetch(BRIDGE_URL, { - method: "POST", - headers: { - "Content-Type": "application/json", + await ensureBridgeReachable(); + + const response = await fetchWithTimeout( + BRIDGE_URL, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ cmd, args } satisfies InvokeRequest), }, - body: JSON.stringify({ cmd, args } satisfies InvokeRequest), - }); + DEV_BRIDGE_REQUEST_TIMEOUT_MS, + ); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); @@ -305,8 +418,12 @@ export async function invokeViaHttp( throw new Error(data.error); } + markBridgeHealthy(); return data.result as T; } catch (e) { + if (isBridgeConnectionError(toErrorMessage(e))) { + markBridgeUnavailable(); + } console.error(`[DevBridge] HTTP 调用失败: ${cmd}`, e); throw e; } @@ -319,15 +436,20 @@ export async function invokeViaHttp( */ export async function healthCheck(): Promise { try { - const response = await fetch(BRIDGE_HEALTH_URL, { - method: "GET", - }); - return response.ok; + await ensureBridgeReachable(); + return true; } catch { return false; } } +/** @internal 仅供测试重置 DevBridge HTTP 状态 */ +export function __resetDevBridgeHttpStateForTests(): void { + bridgeLastHealthyAt = 0; + bridgeConnectionBackoffUntil = 0; + bridgeHealthProbePromise = null; +} + /** * 获取桥接状态信息 */ diff --git a/src/lib/governance/legacySurfaceCatalog.json b/src/lib/governance/legacySurfaceCatalog.json index 45284b31c..41bfda324 100644 --- a/src/lib/governance/legacySurfaceCatalog.json +++ b/src/lib/governance/legacySurfaceCatalog.json @@ -1687,6 +1687,31 @@ "stopAsterSession(" ] }, + { + "id": "frontend-browser-preflight-legacy-tokens", + "classification": "dead-candidate", + "description": "前端不允许恢复旧浏览器 preflight 状态机、状态原因与顶栏兼容 props,当前统一收口到 browser requirement metadata + browser-runtime handoff", + "allowedPaths": [], + "patterns": [ + "BrowserTaskPreflight", + "browserTaskPreflight", + "useWorkspaceBrowserPreflightRuntime", + "browser_preflight", + "browserPrepState", + "allowCapabilityFallback", + "browser_launching", + "browser_awaiting_user", + "browser_failed", + "showBrowserAssistEntry", + "onOpenBrowserAssist", + "browserAssistAttentionLevel", + "browserAssistEntryLabel", + "isBrowserAssistCanvasVisible", + "onPrepareBrowserTaskPreflight", + "maybeStartBrowserTaskPreflight", + "handlePermissionResponseWithBrowserPreflight" + ] + }, { "id": "aster-session-helper-direct-usage", "classification": "dead-candidate", diff --git a/src/lib/navigation/sidebarNav.ts b/src/lib/navigation/sidebarNav.ts index 118c83385..090942d8d 100644 --- a/src/lib/navigation/sidebarNav.ts +++ b/src/lib/navigation/sidebarNav.ts @@ -91,11 +91,10 @@ const CAPABILITY_SIDEBAR_NAV_ITEMS: SidebarNavItemDefinition[] = [ icon: CalendarRange, page: "automation", isActive: (currentPage) => currentPage === "automation", - configurable: false, }, { id: "channels", - label: "IM 配置", + label: "消息渠道", icon: Send, page: "channels", isActive: (currentPage) => currentPage === "channels", @@ -110,6 +109,15 @@ const LIBRARY_SIDEBAR_NAV_ITEMS: SidebarNavItemDefinition[] = [ icon: Library, page: "resources", isActive: (currentPage) => currentPage === "resources", + configurable: false, + }, + { + id: "memory", + label: "灵感库", + icon: BrainCircuit, + page: "memory", + isActive: (currentPage) => currentPage === "memory", + configurable: false, }, ]; @@ -117,13 +125,6 @@ const SYSTEM_SIDEBAR_NAV_ITEMS: SidebarNavItemDefinition[] = [ { id: "terminal", label: "终端", icon: Terminal, page: "terminal" }, { id: "tools", label: "工具箱", icon: Wrench, page: "tools" }, { id: "plugins", label: "插件中心", icon: Compass, page: "plugins" }, - { - id: "memory", - label: "记忆", - icon: BrainCircuit, - page: "memory", - isActive: (currentPage) => currentPage === "memory", - }, { id: "openclaw", label: "OpenClaw", @@ -167,7 +168,7 @@ export const MAIN_SIDEBAR_NAV_SECTIONS: SidebarNavSectionDefinition[] = [ { id: "tasks", title: "任务", items: TASK_SIDEBAR_NAV_ITEMS }, { id: "workspace", title: "工作台", items: WORKSPACE_SIDEBAR_NAV_ITEMS }, { id: "capability", title: "能力", items: CAPABILITY_SIDEBAR_NAV_ITEMS }, - { id: "library", title: "资料库", items: LIBRARY_SIDEBAR_NAV_ITEMS }, + { id: "library", title: "资料", items: LIBRARY_SIDEBAR_NAV_ITEMS }, ]; export const FOOTER_SIDEBAR_NAV_SECTIONS: SidebarNavSectionDefinition[] = [ @@ -198,9 +199,6 @@ const CONFIGURABLE_SIDEBAR_NAV_ITEMS: SidebarNavItemDefinition[] = [ ]; export const DEFAULT_ENABLED_SIDEBAR_NAV_ITEM_IDS = [ - "video", - "image-gen", - "resources", "terminal", ]; diff --git a/src/lib/tauri-mock/core.ts b/src/lib/tauri-mock/core.ts index 068dbd476..ac346ea19 100644 --- a/src/lib/tauri-mock/core.ts +++ b/src/lib/tauri-mock/core.ts @@ -2537,6 +2537,10 @@ const defaultMocks: Record = { : targetContentId ? "当前主稿" : `站点采集 ${adapterName || "github/search"} 2026-03-25 12:00:00`; + const bundleRootDir = + adapterName === "x/article-export" + ? "exports/x-article-export/mock-article" + : undefined; return { ok: true, adapter: adapterName || "github/search", @@ -2565,6 +2569,18 @@ const defaultMocks: Record = { content_id: targetContentId || "mock-site-content-1", project_id: targetProjectId || "mock-current-project", title, + project_root_path: "/mock/projects/current", + bundle_relative_dir: bundleRootDir, + markdown_relative_path: bundleRootDir + ? `${bundleRootDir}/index.md` + : undefined, + images_relative_dir: bundleRootDir + ? `${bundleRootDir}/images` + : undefined, + meta_relative_path: bundleRootDir + ? `${bundleRootDir}/meta.json` + : undefined, + image_count: bundleRootDir ? 3 : undefined, } : undefined, saved_project_id: diff --git a/src/lib/utils/scheduleMinimumDelayIdleTask.test.ts b/src/lib/utils/scheduleMinimumDelayIdleTask.test.ts new file mode 100644 index 000000000..b53339f73 --- /dev/null +++ b/src/lib/utils/scheduleMinimumDelayIdleTask.test.ts @@ -0,0 +1,52 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { scheduleMinimumDelayIdleTask } from "./scheduleMinimumDelayIdleTask"; + +describe("scheduleMinimumDelayIdleTask", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); + }); + + it("应先等待最小延迟,再进入 idle 阶段执行任务", () => { + const task = vi.fn(); + const requestIdleCallback = vi.fn((callback: (deadline: IdleDeadline) => void) => { + callback({ + didTimeout: false, + timeRemaining: () => 50, + } as IdleDeadline); + return 1; + }); + + vi.stubGlobal("requestIdleCallback", requestIdleCallback); + vi.stubGlobal("cancelIdleCallback", vi.fn()); + + scheduleMinimumDelayIdleTask(task, { + minimumDelayMs: 6_000, + idleTimeoutMs: 1_500, + }); + + vi.advanceTimersByTime(5_999); + expect(requestIdleCallback).not.toHaveBeenCalled(); + expect(task).not.toHaveBeenCalled(); + + vi.advanceTimersByTime(1); + expect(requestIdleCallback).toHaveBeenCalledTimes(1); + expect(task).toHaveBeenCalledTimes(1); + }); + + it("在最小延迟前取消时不应执行任务", () => { + const task = vi.fn(); + const cancel = scheduleMinimumDelayIdleTask(task, { + minimumDelayMs: 1_500, + }); + + cancel(); + vi.advanceTimersByTime(1_500); + + expect(task).not.toHaveBeenCalled(); + }); +}); diff --git a/src/lib/utils/scheduleMinimumDelayIdleTask.ts b/src/lib/utils/scheduleMinimumDelayIdleTask.ts new file mode 100644 index 000000000..4e32e7ea2 --- /dev/null +++ b/src/lib/utils/scheduleMinimumDelayIdleTask.ts @@ -0,0 +1,52 @@ +interface ScheduleMinimumDelayIdleTaskOptions { + minimumDelayMs?: number; + idleTimeoutMs?: number; +} + +const DEFAULT_IDLE_TIMEOUT_MS = 1_500; + +export function scheduleMinimumDelayIdleTask( + task: () => void, + options: ScheduleMinimumDelayIdleTaskOptions = {}, +): () => void { + if (typeof window === "undefined") { + task(); + return () => undefined; + } + + const minimumDelayMs = Math.max(0, options.minimumDelayMs ?? 0); + const idleTimeoutMs = Math.max( + 0, + options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS, + ); + + let cancelled = false; + let idleId: number | null = null; + const delayId = window.setTimeout(() => { + if (cancelled) { + return; + } + + if (typeof window.requestIdleCallback === "function") { + idleId = window.requestIdleCallback( + () => { + if (!cancelled) { + task(); + } + }, + { timeout: idleTimeoutMs }, + ); + return; + } + + task(); + }, minimumDelayMs); + + return () => { + cancelled = true; + window.clearTimeout(delayId); + if (idleId !== null && typeof window.cancelIdleCallback === "function") { + window.cancelIdleCallback(idleId); + } + }; +} diff --git a/src/lib/videoWorkbenchEvents.ts b/src/lib/videoWorkbenchEvents.ts new file mode 100644 index 000000000..9928d5099 --- /dev/null +++ b/src/lib/videoWorkbenchEvents.ts @@ -0,0 +1,62 @@ +const VIDEO_WORKBENCH_TASK_ACTION_EVENT = + "lime:video-workbench-task-action"; + +export type VideoWorkbenchTaskAction = "retry" | "cancel"; + +export interface VideoWorkbenchTaskActionDetail { + action: VideoWorkbenchTaskAction; + taskId: string; + projectId?: string | null; + contentId?: string | null; +} + +function hasWindow(): boolean { + return typeof window !== "undefined"; +} + +export function emitVideoWorkbenchTaskAction( + detail: VideoWorkbenchTaskActionDetail, +): void { + if (!hasWindow()) { + return; + } + + window.dispatchEvent( + new CustomEvent( + VIDEO_WORKBENCH_TASK_ACTION_EVENT, + { + detail, + }, + ), + ); +} + +export function onVideoWorkbenchTaskAction( + listener: (detail: VideoWorkbenchTaskActionDetail) => void, +): () => void { + if (!hasWindow()) { + return () => undefined; + } + + const handler = (event: Event) => { + if (!(event instanceof CustomEvent)) { + return; + } + + const detail = (event as CustomEvent) + .detail; + if ( + !detail || + (detail.action !== "retry" && detail.action !== "cancel") || + typeof detail.taskId !== "string" + ) { + return; + } + listener(detail); + }; + + window.addEventListener(VIDEO_WORKBENCH_TASK_ACTION_EVENT, handler); + return () => { + window.removeEventListener(VIDEO_WORKBENCH_TASK_ACTION_EVENT, handler); + }; +} diff --git a/src/lib/webview-api.ts b/src/lib/webview-api.ts index 6f24e68c1..940182d15 100644 --- a/src/lib/webview-api.ts +++ b/src/lib/webview-api.ts @@ -521,6 +521,12 @@ export interface SavedSiteAdapterContent { content_id: string; project_id: string; title: string; + project_root_path?: string; + bundle_relative_dir?: string; + markdown_relative_path?: string; + images_relative_dir?: string; + meta_relative_path?: string; + image_count?: number; } export type BrowserRuntimeAuditKind = "action" | "launch";

    bhAeL0ph^l?>Ff+Jvxmf;T|Z;D0@sE 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 z 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