kuaifan
0a97039d75
refactor(ai): 重构 AI 建议功能并完善向量搜索
...
1. 重构 task__ai_apply 接口:移除业务逻辑,仅负责状态更新和日志记录,
返回建议数据由前端调用现有接口处理(taskUpdate/taskAddSub)
2. 实现 searchSimilarByEmbedding 向量搜索:
- 使用 ManticoreBase::taskVectorSearch 进行向量搜索
- 按 project_id 过滤同项目任务
- 排除当前任务及其子任务
- 设置 0.7 相似度阈值,最多返回 5 个结果
3. 更新 AI 助手头像:将文字 "AI" 替换为 SVG 图标
Generated with [Claude Code](https://claude.ai/code )
via [Happy](https://happy.engineering )
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-01-21 15:30:06 +00:00
kuaifan
cb56a01622
fix(ai): fix URL parsing for ai-apply/ai-dismiss links
...
The regex pattern (\w+) didn't match 'ai-apply' or 'ai-dismiss' because
\w doesn't include hyphens, causing all AI suggestion buttons to fail.
Fix by handling AI links before the regex match using startsWith().
Remove dead switch cases that were never reached.
Generated with [Claude Code](https://claude.ai/code )
via [Happy](https://happy.engineering )
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-01-21 15:30:06 +00:00
kuaifan
452af4bd2f
fix(ai): address issues from second code review
...
- Add STATUS_APPLIED and STATUS_DISMISSED constants to model
- Add markApplied() and markDismissed() methods
- Update event status after apply/dismiss actions (prevent duplicate ops)
- Validate related_task_id exists and user has permission
- Filter empty or overly long subtask names before creation
Generated with [Claude Code](https://claude.ai/code )
via [Happy](https://happy.engineering )
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-01-21 15:30:06 +00:00
kuaifan
75073d4320
fix(ai): address security and robustness issues from code review
...
Security fixes:
- Add escapeUserInput() to prevent Prompt injection via user input
- Validate msgId belongs to dialogId in updateMessageStatus()
- Add type parameter whitelist validation in ai-apply/ai-dismiss
- Add event record validation in task__ai_dismiss
Robustness fixes:
- Use atomic update for markProcessing to prevent concurrent processing
- Add subtask count limit check before creation (max 50)
- Disable similar task feature until vector search is implemented
- Fix Promise anti-pattern in frontend actions
Generated with [Claude Code](https://claude.ai/code )
via [Happy](https://happy.engineering )
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-01-21 15:30:06 +00:00
kuaifan
d4d7a0d69f
feat(ai): add AI::invoke() method for task suggestions
...
- Add generic invoke() static method to AI module for custom chat completion
- Fix AiTaskSuggestion::callAi() to properly handle AI::invoke() response
- Fix findSimilarTasks() to properly handle AI::getEmbedding() response
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 15:30:06 +00:00
kuaifan
165ad03024
feat(ai): add ai-apply/ai-dismiss protocol handlers
2026-01-21 15:30:06 +00:00
kuaifan
3603cf9889
feat(ai): display AI assistant avatar for userid=-1
...
When a message has userid=-1 (AI assistant), display a special AI avatar
with gradient styling instead of the regular UserAvatar component.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 15:30:06 +00:00
kuaifan
027662ebab
feat(ai): add ai-apply and ai-dismiss API endpoints
2026-01-21 15:30:06 +00:00
kuaifan
106465b932
feat(ai): add AiTaskLoopTask timer and register to crontab
2026-01-21 15:30:06 +00:00
kuaifan
eef4c6fbe5
feat(ai): add AiTaskAnalyzeTask async task
2026-01-21 15:30:06 +00:00
kuaifan
916ae97ca7
feat(ai): add AiTaskSuggestion module with prompt templates
...
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 15:30:06 +00:00
kuaifan
841405505d
feat(ai): add ProjectTaskAiEvent model
2026-01-21 15:30:06 +00:00
kuaifan
22a653bb0f
feat(ai): add project_task_ai_events migration
2026-01-21 15:30:06 +00:00
kuaifan
3482e4b1a8
fix(file): 修复日期格式文件名被误转换导致创建失败的问题
...
newDateString 函数在处理请求参数时会将所有符合日期格式的字符串
(如 "2026-01-15")转换为完整日期时间格式("2026-01-15 00:00:00"),
导致文件名中出现冒号,触发后端文件名校验错误。
修复方案:
- 直接调用时(key=null),保持原有行为用于显示格式化
- 递归处理对象属性时,仅对白名单字段(times、*_at)进行转换
- 其他字段(如 name)保持原值不转换
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 22:33:45 +00:00
kuaifan
9097369b0c
fix(ai-assistant): 修复图片预览调用不存在方法的错误
...
将 $A.previewFile 替换为 this.$store.dispatch("previewImage"),
解决 TypeError: $A.previewFile is not a function 错误。
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 14:58:37 +00:00
kuaifan
95c6b53f10
fix(ai-assistant): 优化图片压缩逻辑避免重复质量压缩
...
- 新增 forceCompress 参数控制是否强制质量压缩
- compressImageForAI: 始终进行质量压缩(发送给 AI)
- saveImageToCache: 仅在需要缩小尺寸时才压缩(避免已压缩图片被重复压缩)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 14:52:57 +00:00
kuaifan
f7d5040b02
feat(ai-assistant): 支持拖放和粘贴上传图片
...
- 新增拖放上传:可将图片拖放到对话窗口任意位置
- 新增粘贴上传:在输入框中可直接粘贴剪贴板图片
- 提取 handleImageFiles 通用方法供多种上传方式复用
- 添加拖放时的视觉反馈(虚线边框 + 提示遮罩)
- 使用计数器方式正确处理嵌套元素和拖出窗口的情况
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 14:45:38 +00:00
kuaifan
26b7f83d35
no message
2026-01-20 14:45:02 +00:00
kuaifan
07b99c6e75
fix(ai-assistant): 修复 SSE 连接失败时状态未正确更新的问题
...
当 SSE 连接一开始就失败时,响应状态保持 'waiting' 而非 'streaming',
导致 onFailed 回调不会更新状态,UI 一直显示 loading。
现在同时处理 'streaming' 和 'waiting' 状态,并标记为错误状态显示失败提示。
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 14:20:50 +00:00
kuaifan
cb5e7e2cc7
refactor(ai): 优化 AI 提示词构建逻辑
...
- withLanguagePreferencePrompt: 修复无语言标签时占位符未添加的问题
- handleBeforeSend: 简化操作会话提示词,移除冗余的工具名称说明
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 13:47:25 +00:00
kuaifan
2180998e81
feat(ai-assistant): 添加图片发送功能支持多模态对话
...
- 支持上传图片并压缩(当前消息 1024px,历史 512px)
- 图片独立缓存存储,使用占位符 [IMG:xxx] 替代 base64
- 新增 prompt-image.vue 组件展示历史图片缩略图
- 后端 AI.php 支持多模态消息格式处理
- 添加图片缓存清理机制(删除会话时同步清理)
- 优化 parsePromptContent 避免重复调用
- 会话标题自动过滤图片占位符
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:31:34 +00:00
kuaifan
478876ddc1
feat(workflow): 在工作流配置中添加规则摘要展示
...
在工作流展开后的配置表格上方添加规则摘要区块,根据实际配置动态展示:
- 状态负责人规则:区分添加模式、流转模式、剔除模式的不同描述
- 限制负责人规则:显示仅限任务负责人和项目管理员修改状态
- 关联列表规则:显示流转时自动移动至指定列表
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 01:55:00 +00:00
kuaifan
ae021fd148
fix(push): 修复友盟延迟推送已读检查失效的问题
...
消息ID取值路径错误,导致延迟推送时无法正确判断消息已读状态,
用户在PC端阅读消息后APP仍会收到重复推送。
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 00:44:45 +00:00
kuaifan
f36317b081
fix(operation-client): 修正 WebSocket 路径格式并优化连接 URL 生成
v1.6.51
2026-01-19 10:52:22 +08:00
kuaifan
066a5a619c
build
2026-01-19 09:43:37 +08:00
kuaifan
654793156d
feat(micro-app): 添加额外的事件发射器方法以支持动态事件处理
2026-01-19 09:19:27 +08:00
kuaifan
ba65378c6b
fix(package): 更新 view-design-hi 依赖版本至 4.7.0-80
2026-01-19 01:14:05 +00:00
kuaifan
cb6c50b071
fix(ai-assistant): 修复弹窗和下拉菜单被其他弹窗遮挡的问题
...
- 使用 window.modalTransferIndex + 1000 作为动态 z-index
- 添加定时刷新机制:弹窗可见时 5 秒刷新,不可见时 20 秒刷新
- modal.vue 通过 zIndex prop 接收并应用 z-index
- float-button.vue 通过 $parent.topZIndex 获取 z-index
- Dropdown 和 Select 使用 ViewUI 新增的 z-index prop
2026-01-19 01:13:18 +00:00
kuaifan
2cb67fafe7
feat(ai-assistant): 支持任务弹窗和对话弹窗的场景检测
...
- 在 page-context.js 的 getPageContext 和 getSceneKey 函数中优先检测弹窗状态
- 当 taskId > 0 时使用 single-task 上下文
- 当 dialogModalShow && dialogId > 0 时使用 single-dialog 上下文
- 在 welcome-prompts.js 中添加弹窗场景检测逻辑
- 提取 formatPrompts 辅助函数减少代码重复
- 在 index.vue 的 welcomePromptsKey 中监听 taskId 和 dialogModalShow 变化
2026-01-18 23:52:26 +00:00
kuaifan
8eaba6f364
fix(ai-assistant): 优化流式响应期间的 loading 状态显示
...
- 修改 loading 显示条件,streaming 状态时继续显示 loading icon
- SSEClient 添加可选的 onFailed 回调,处理连接失败情况
- 修复 done 事件处理,确保状态正确转为 completed
- 解决工具调用期间 loading 动画过早消失的问题
2026-01-18 14:44:03 +00:00
kuaifan
c4f0fb5a3d
feat(ai-assistant): 合并连续工具使用的显示
...
在 Markdown 渲染前预处理文本,将连续的 tool-use 标签合并为一行显示:
- 连续相同工具显示计数(如 get_page_context x 2)
- 不同工具用逗号分隔
- 工具间的空行不会打断合并
2026-01-18 13:36:53 +00:00
kuaifan
59ad79fa58
feat(ai-assistant): 支持上下键切换历史输入
...
- 按 ↑ 键切换到上一条历史输入(光标在第一行时生效)
- 按 ↓ 键切换到下一条历史输入(光标在最后一行时生效)
- 历史记录使用 IndexedDB 持久化存储,最多保存 50 条
- 重复输入会移动到末尾而非重复添加
- 弹窗关闭时自动重置导航状态
2026-01-18 13:20:13 +00:00
kuaifan
c65f0276bd
feat(ai-assistant): 支持编辑历史问题并重新发送
...
- 鼠标悬停历史问题时显示编辑图标
- 点击编辑后在原位置显示内联编辑器
- 支持 Enter 发送、Shift+Enter 换行、Esc 取消
- 发送后删除该问题及之后的对话历史,重新发送编辑后的问题
- 正确处理中文输入法组合状态,避免误触发提交
2026-01-18 12:56:16 +00:00
kuaifan
f8b335a003
feat(ai-assistant): 增加元素向量匹配与关键词搜索能力
...
- 新增后端 match_elements API,使用向量相似度匹配页面元素
- 页面上下文采集支持关键词过滤,按 name/aria-label/placeholder/title 匹配
- 关键词匹配失败时自动降级为向量搜索
- 改进 findElementByRef 函数,使用 selector + name 双重匹配提高准确性
2026-01-18 11:50:27 +00:00
kuaifan
0ac4b546ba
feat(ai-assistant): 实现 AI 前端操作能力
...
新增三个 MCP 工具的前端支持:
- get_page_context: 基于 ARIA 角色收集页面元素,支持分页和区域筛选
- execute_action: 执行导航操作(打开任务/对话、切换项目/页面)
- execute_element_action: 元素级操作(click/type/select/focus/scroll/hover)
新增文件:
- operation-client.js: WebSocket 客户端,处理与 MCP Server 的通信
- page-context-collector.js: 页面上下文收集器,ref 系统和 cursor:pointer 扫描
- action-executor.js: 操作执行器,支持智能解析如 open_task_123
- operation-module.js: 模块编排,整合上述模块
修改文件:
- float-button.vue: 集成 operation-module,AI 助手打开时启用
- index.vue: 发射关闭事件供 float-button 监听
2026-01-18 01:35:13 +00:00
kuaifan
07a41ca0ac
feat(ai-assistant): 扩充提示词库并优化随机选择策略
...
- 为提示词增加 type(query/action/sync/review)和 pin 属性
- 新增 selectPrompts 函数:优先展示 pin 提示,按类型多样化抽样
- 各场景提示词数量扩充 2-3 倍,覆盖更多常见操作
- 部分场景使用动态数据(如 taskName、userName、groupName)个性化提示
2026-01-17 02:24:42 +00:00
kuaifan
347465fc4d
feat(ai-assistant): 按场景隔离会话存储
...
- 将 sessionStore 从对象改为数组,每个场景独立存储
- sessionCacheKey 改为 sessionCacheKeyPrefix,拼接场景 key 动态生成
- initSession 改为异步方法,切换场景时按需加载对应数据
- 使用防抖更新 displayWelcomePrompts,避免场景切换时闪屏
- 修复输入框文字颜色样式
2026-01-17 02:24:31 +00:00
kuaifan
acb9cd317c
feat(ai-assistant): 增加 SVG 图标和随机选择提示功能
2026-01-16 14:42:04 +00:00
kuaifan
b7213f8c47
feat(ai-assistant): 添加全屏切换功能
...
- 添加全屏按钮,支持点击或双击标题栏切换全屏
- 全屏时禁用拖动和调整大小
- 全屏状态下占满视口(保留 12px 边距)
- 关闭窗口时自动退出全屏状态
2026-01-16 10:26:57 +00:00
kuaifan
a3caf5ebdf
feat(ai-assistant): 支持拖动边缘调整聊天窗口大小
...
- 添加 8 个方向的调整大小控制点(四边 + 四角)
- 支持从任意边缘或角落拖动调整窗口尺寸
- 尺寸自动保存到 IndexedDB,下次打开时恢复
- 窗口大小限制:最小 380×400,最大 800×900
- 视口尺寸变化时自动调整窗口大小和位置
2026-01-16 10:24:41 +00:00
kuaifan
87dd07ef23
feat(ai-assistant): 基于场景标识管理会话恢复
...
- 新增 getSceneKey 函数,根据路由和实体生成唯一场景标识
- 会话初始化改为按 sceneKey 匹配历史记录,相同场景恢复会话
- 统一全局 AI 助手打开方式,manage.vue 通过事件触发 float-button
- resumeSession 超时时间统一为 86400 秒(1天)
2026-01-16 08:49:25 +00:00
kuaifan
0cefb7eaff
feat(task): 兼容 start_at/end_at 参数,统一转换为 times
...
- 新增 ProjectTask::normalizeTimes() 方法统一处理时间参数
- 支持只传 end_at 时自动补充 start_at
- 支持只传 start_at 时保留已有 end_at
2026-01-16 08:37:32 +00:00
kuaifan
ff87de9f44
feat(manage): 优化快捷键事件处理
2026-01-16 08:28:39 +00:00
kuaifan
22de7de87c
feat(manage): 优化新建菜单并添加 AI 助手快捷键
...
- 主按钮从「新建项目」改为「新建任务」
- 下拉菜单首位添加「AI 助手」选项(需安装 AI 插件)
- 添加 Ctrl/Cmd+I 快捷键打开 AI 助手
- 键盘设置页面同步显示 AI 助手快捷键
2026-01-16 07:46:50 +00:00
kuaifan
53dd9dca0f
feat(ai-assistant): 浮动按钮支持拖拽到边缘自动收起
...
- 拖拽按钮到屏幕边缘(≤12px)松开后自动收起为窄条
- 鼠标悬停窄条时自动展开,离开 1 秒后收起
- 点击收起状态的窄条直接打开 AI 助手
- 收起/展开过渡动画平滑,按钮中心位置保持不变
- 仅在 AI 插件安装后显示浮动按钮
2026-01-16 07:46:41 +00:00
kuaifan
12d6bbea19
feat(mcp): 增强文件工具支持文本内容读取
...
- get_file_detail: 添加 with_content 参数提取文本
- 新增 fetch_file_content 工具通过路径获取内容
2026-01-16 01:41:36 +00:00
kuaifan
23b06327d6
feat(file): 添加文件内容提取 API 支持分页读取
...
- FileController: 新增 fetch API 通过路径获取文本内容
- FileController: one API 支持 with_text 参数提取文本
- ManticoreFile: 实现分页提取 extractFileContentPaginated
- TextExtractor: 添加 truncate 参数支持内容截取
2026-01-16 01:41:28 +00:00
kuaifan
6c22e373f7
build
v1.6.27
2026-01-16 03:11:32 +08:00
kuaifan
4ebbb387ee
no message
2026-01-16 03:08:25 +08:00
kuaifan
9234fe3ed1
feat(ai-assistant): 添加欢迎界面快捷提示功能和交互优化
...
主要变更:
- 新增场景化快捷提示,根据页面类型显示相关操作建议
- 重新设计欢迎界面 UI,支持图标和可点击的提示卡片
- 修复浮动按钮点击判断逻辑(移动距离<5px 且 按下时间<200ms)
- 优化加载状态显示,移除冗余文案
- 支持 base64 编码格式的文件链接
2026-01-16 02:31:13 +08:00