feat(agent): redesign trigger system#965
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (3)
Walkthrough本次变更新增统一聊天调用运行时、投递与持久化控制,并将会话错误、消息观察和中止流程改为新的契约;同时以 Trigger V2 重构触发器任务模型、调度执行链路、服务 API 与控制台界面。 Changes聊天调用与会话运行时
Trigger V2 任务系统
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces a major refactoring of the trigger system (Trigger V2), replacing the old task and provider registries with a new structured Trigger Store, Planner, Runner, Scheduler, and Observer, alongside a redesigned wizard-based WebUI editor. It also adds a new programmatic invoke API to ChatLunaService for flexible chat execution. The review feedback highlights several critical issues: a missing options assignment in ChatChain.runCommand that will cause runtime errors, a data loss risk in ChatLunaService.invoke where existing conversations could be deleted when persistence is disabled, a potential TypeError in agent wakeup due to unsafe property access, and robustness issues in message observation when session fields are missing.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
Actionable comments posted: 18
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/core/src/llm-core/chat/app.ts (1)
151-158: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
persist: false仍会写入 Agent 历史。当前保护只覆盖用户消息和最终回复;Line 192-199 的
addAgentToolBatch()、addMessages()以及 Line 220 的附加状态更新仍会修改历史。失败调用又可能在清理前返回,违反非持久化契约。请让所有历史和会话状态写入统一受arg.persist控制。Also applies to: 228-238
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/llm-core/chat/app.ts` around lines 151 - 158, Ensure every chat-history and session-state write in the surrounding flow, including saveUser, addAgentToolBatch, addMessages, and the additional state update near the later cleanup path, is skipped when arg.persist === false. Centralize or consistently apply the persistence guard so failure and early-return paths cannot write before cleanup, while preserving existing behavior when persistence is enabled.packages/extension-agent/src/config/defaults.ts (1)
18-24: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win不要默认向普通用户开放持久触发器。
trigger同时被默认启用且注册授权恒为真;移出高权限集合后,普通用户可持续创建模型调用任务,而服务层没有任务数量配额。请保留 authority 3,或先增加配额与频率限制。建议修复
- 'grep' + 'grep', + 'trigger'🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/src/config/defaults.ts` around lines 18 - 24, HIGH_AUTHORITY_TOOLS currently omits the persistent trigger tool, allowing ordinary users to invoke it without limits. Add 'trigger' to the set in defaults.ts, preserving authority level 3; do not reduce its authorization unless task quotas and rate limiting are implemented.
🧹 Nitpick comments (3)
packages/extension-agent/client/components/trigger/trigger-editor.vue (2)
918-961: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
statusType、formatDate与trigger-catalog.vue重复。这两个函数在两个组件中完全一致。建议提取到
types.ts共享,避免维护时遗漏同步修改。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/client/components/trigger/trigger-editor.vue` around lines 918 - 961, 将 trigger-editor.vue 中与 trigger-catalog.vue 重复的 statusType 和 formatDate 提取到共享的 types.ts,并从两个组件导入使用;删除各组件内的重复实现,确保类型签名与现有行为保持一致。
237-248: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value
fireSelected在getTrigger期间未设置 loading 状态。
fire()完成后pending已被置为false,随后fireSelected调用getTrigger刷新编辑器数据时未重新设置pending,用户在此期间看不到加载指示。💡 建议在 getTrigger 前后管理 pending 状态
async function fireSelected() { if (!editing.value) return await fire(editing.value.id) + pending.value = true try { editing.value = await send( 'chatluna-agent/getTrigger', editing.value.id ) } catch (err) { backendError.value = err instanceof Error ? err.message : String(err) + } finally { + pending.value = false } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/client/components/trigger/trigger-editor.vue` around lines 237 - 248, 在 fireSelected 调用 getTrigger 刷新编辑器数据的过程中补充 pending 状态管理:调用 getTrigger 前设置 pending 为 true,并使用 finally 确保请求完成或失败后恢复为 false;定位并修改 fireSelected 及其调用的 getTrigger 逻辑,避免刷新期间缺少加载指示。packages/extension-agent/client/components/trigger/trigger-catalog.vue (1)
292-302: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
statusType和formatDate与trigger-editor.vue重复。这两个函数在
trigger-catalog.vue和trigger-editor.vue中完全一致,决策标签映射也高度相似。建议提取到types.ts作为共享工具函数,减少维护成本。♻️ 提取共享工具函数到 types.ts
+export function statusType(status: TriggerTaskStatus) { + if (status === 'waiting') return 'success' + if (status === 'running') return 'warning' + if (status === 'error') return 'danger' + return 'info' +} + +export function formatDate(value?: Date | string | null) { + if (!value) return '未安排' + return new Date(value).toLocaleString() +} + +export const decisionLabels: Record<TriggerRunDecision['type'], string> = { + continue: '继续', + stop_period: '停止本周期', + complete: '完成任务', + pause_until: '暂停', + reschedule: '重新安排' +}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/client/components/trigger/trigger-catalog.vue` around lines 292 - 302, Extract the duplicated statusType and formatDate functions from trigger-catalog.vue and trigger-editor.vue into shared utilities in types.ts, preserving their existing behavior and type signatures. Update both components to import and use the shared functions, and remove their local definitions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/core/src/llm-core/chat/app.ts`:
- Around line 238-251: Move the `this.ctx.parallel('chatluna/after-chat', ...)`
call in the chat completion flow outside the `arg.persist !== false` condition
so it always fires, including non-persistent requests. Keep only
persistence-specific work, such as automatic title generation, guarded by
`arg.persist`; update the surrounding error handling consistently.
In `@packages/core/src/middlewares/conversation/request_conversation.ts`:
- Around line 116-122: Remove the unnecessary parentheses in the nested ternary
expression assigning inputMessage.name, preserving its existing fallback logic
and ensuring the formatting in the request conversation middleware passes
Prettier.
In `@packages/core/src/services/chat.ts`:
- Around line 719-720: Remove the unnecessary parentheses surrounding the
nullish-coalescing expression in the ternary branch near the chat invocation
handling, while preserving the existing error?.message fallback behavior. Use
the surrounding ternary expression in the chat service to ensure formatting
matches Prettier.
In `@packages/extension-agent/client/components/trigger/duration-input.vue`:
- Around line 3-9: 调整 duration 输入组件中 el-input-number 的最大值绑定:将模板里的 :max="max"
改为使用动态计算的 inputMax,并在相关脚本逻辑中根据 unit 换算 max,确保 large 单位下输入范围与 setter
的换算一致,避免值被静默截断。
In `@packages/extension-agent/client/components/trigger/trigger-catalog.vue`:
- Around line 268-281: 统一决策标签文案:在 trigger-catalog.vue 的 decisionLabel 函数中,将
complete 映射从“完成”修改为与 trigger-editor.vue 的 formatDecision 一致的“完成任务”,保持列表和编辑器显示统一。
In `@packages/extension-agent/client/components/trigger/trigger-editor.vue`:
- Around line 945-956: 统一 formatDecision 中 complete 决策的显示文案:将其从“完成任务”调整为与
trigger-catalog.vue 的 decisionLabel 一致的“完成”,保持两处标签一致。
In `@packages/extension-agent/client/components/trigger/types.ts`:
- Around line 166-186: createInput() initializes channel destinations without
the guildId field, unlike trigger-editor.vue’s setDestination. Add guildId: ''
to the channel destination returned by createInput() so new triggers use the
same shape as edited destinations.
In `@packages/extension-agent/src/service/index.ts`:
- Line 81: 配置重载不应重启 Trigger V2;在服务的 reload() 方法中移除对 ChatLunaAgentTriggerService
实例 trigger 的 stop() 和 start() 调用,保留其初始化与其他必要的配置重载逻辑,确保保存无关配置不会中断活跃运行。
In `@packages/extension-agent/src/service/trigger.ts`:
- Around line 550-554: 在 _afterChange 中保留 _scheduler.refresh() 和
_refreshStatus() 的等待逻辑,但将 ctx.chatluna_agent?.refreshConsoleData() 单独放入
try/catch;刷新控制台失败时记录错误而不要继续向调用方抛出异常,确保已提交的 CRUD 操作不会被误判为失败。
- Around line 540-545: 在触发目标校验逻辑中,确保目标的 guildId 必须与当前 session.guildId 严格一致:修改包含
target.destination.guildId 的条件,避免目标省略 guildId 时放行;使用直接相等比较,并保留现有的频道类型与 channelId
校验。
In `@packages/extension-agent/src/trigger/planner.ts`:
- Line 289: 重新运行仓库配置的 Prettier 格式化工具,重点检查 planner.ts 中与 task.state.periodKey ??
undefined 相关的两处三元表达式(包括另一处对应位置),并提交格式化后的结果以清除 lint 告警。
In `@packages/extension-agent/src/trigger/runner.ts`:
- Line 64: packages/extension-agent/src/trigger/runner.ts 中的相关表达式仍未符合仓库的
Prettier 格式。对 TriggerRunControl 条件表达式及指定的其他位置运行 lint-fix/Prettier,并提交格式化后的输出。
In `@packages/extension-agent/src/trigger/scheduler.ts`:
- Around line 133-166: 当前在调度循环中逐个 await 任务,导致长任务阻塞其他到期任务;请重构 scheduler 中处理 tasks
的逻辑,使用受限并发并行执行独立任务,同时保留每个任务 finally 中对 _controllers.delete(controller)
的清理,并确保错误仍按任务单独记录。
In `@packages/extension-agent/src/trigger/schema.ts`:
- Around line 15-22: Update the `iso` schema refinement in `schema.ts` to
require an explicit UTC designator or numeric offset at the end of the string
before accepting it. Keep validating the resulting value with
`DateTime.fromISO(..., { setZone: true }).isValid`, and reject timestamps such
as `2026-07-01T10:00` that omit timezone information.
In `@packages/extension-agent/src/trigger/store.ts`:
- Around line 122-155: 部分更新分别解析 condition 和 target,绕过了作用域一致性校验。修改 update 方法,将现有
TriggerTask 与 patch 在同一事务中合并,使用 triggerUpdateInputSchema 进行完整校验后再写入,确保
keyword、observeScope 与 destination 等字段组合一致。
- Around line 88-120: 将 TriggerStore 的 list() 和 listRuns()
从全量读取后内存过滤、排序和截断改为使用数据库查询条件、排序及 limit;保留必要的结果映射,并确保查询语义与现有过滤逻辑一致。为
chatluna_trigger 及运行记录表中 enabled、ownerKey、state.status、condition.type、taskId
等常用查询字段补充索引,优先复用数据库现有查询和索引定义机制。
In `@packages/extension-agent/src/trigger/tool.ts`:
- Around line 28-53: 工具描述中的示例使用了固定的近未来日期,过期后会导致模型创建任务失败。修改 description 中 once 和
interval 示例的时间,使用足够遥远且明确的未来日期,或改为动态生成的未来时间,确保示例始终表示有效的未来时刻。
In `@packages/extension-agent/src/types/trigger.ts`:
- Around line 6-25: 调整 trigger.ts 中
TriggerTaskStatus、TriggerRunOrigin、TriggerRunStatus、TriggerMisfirePolicy、TriggerModelPolicy、TriggerConversationPolicy
和 TriggerToolPolicy 的联合类型格式,按 Prettier 要求将联合成员拆分为多行并保持统一缩进,确保通过
prettier/prettier lint 校验。
---
Outside diff comments:
In `@packages/core/src/llm-core/chat/app.ts`:
- Around line 151-158: Ensure every chat-history and session-state write in the
surrounding flow, including saveUser, addAgentToolBatch, addMessages, and the
additional state update near the later cleanup path, is skipped when arg.persist
=== false. Centralize or consistently apply the persistence guard so failure and
early-return paths cannot write before cleanup, while preserving existing
behavior when persistence is enabled.
In `@packages/extension-agent/src/config/defaults.ts`:
- Around line 18-24: HIGH_AUTHORITY_TOOLS currently omits the persistent trigger
tool, allowing ordinary users to invoke it without limits. Add 'trigger' to the
set in defaults.ts, preserving authority level 3; do not reduce its
authorization unless task quotas and rate limiting are implemented.
---
Nitpick comments:
In `@packages/extension-agent/client/components/trigger/trigger-catalog.vue`:
- Around line 292-302: Extract the duplicated statusType and formatDate
functions from trigger-catalog.vue and trigger-editor.vue into shared utilities
in types.ts, preserving their existing behavior and type signatures. Update both
components to import and use the shared functions, and remove their local
definitions.
In `@packages/extension-agent/client/components/trigger/trigger-editor.vue`:
- Around line 918-961: 将 trigger-editor.vue 中与 trigger-catalog.vue 重复的
statusType 和 formatDate 提取到共享的 types.ts,并从两个组件导入使用;删除各组件内的重复实现,确保类型签名与现有行为保持一致。
- Around line 237-248: 在 fireSelected 调用 getTrigger 刷新编辑器数据的过程中补充 pending
状态管理:调用 getTrigger 前设置 pending 为 true,并使用 finally 确保请求完成或失败后恢复为 false;定位并修改
fireSelected 及其调用的 getTrigger 逻辑,避免刷新期间缺少加载指示。
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: cf596395-56e2-44e2-bbb6-d6b4798e4f29
⛔ Files ignored due to path filters (1)
packages/extension-agent/package.jsonis excluded by!**/*.json
📒 Files selected for processing (58)
packages/core/src/chains/chain.tspackages/core/src/llm-core/agent/wakeup.tspackages/core/src/llm-core/chain/base.tspackages/core/src/llm-core/chat/app.tspackages/core/src/middlewares/chat/allow_reply.tspackages/core/src/middlewares/conversation/request_conversation.tspackages/core/src/render/stream.tspackages/core/src/services/chat.tspackages/core/src/services/conversation.tspackages/core/src/services/conversation_runtime.tspackages/core/src/services/types.tspackages/core/src/types.tspackages/core/src/utils/queue.tspackages/extension-agent/client/components/trigger/duration-input.vuepackages/extension-agent/client/components/trigger/editors/calendar-editor.vuepackages/extension-agent/client/components/trigger/editors/cron-editor.vuepackages/extension-agent/client/components/trigger/editors/editor.csspackages/extension-agent/client/components/trigger/editors/inactivity-editor.vuepackages/extension-agent/client/components/trigger/editors/interval-editor.vuepackages/extension-agent/client/components/trigger/editors/keyword-editor.vuepackages/extension-agent/client/components/trigger/editors/once-editor.vuepackages/extension-agent/client/components/trigger/editors/participation-editor.vuepackages/extension-agent/client/components/trigger/editors/semantic-editor.vuepackages/extension-agent/client/components/trigger/editors/window-editor.vuepackages/extension-agent/client/components/trigger/gate-editor.vuepackages/extension-agent/client/components/trigger/trigger-catalog.vuepackages/extension-agent/client/components/trigger/trigger-detail.vuepackages/extension-agent/client/components/trigger/trigger-editor.vuepackages/extension-agent/client/components/trigger/trigger-page.vuepackages/extension-agent/client/components/trigger/trigger-schedule-preview.vuepackages/extension-agent/client/components/trigger/types.tspackages/extension-agent/src/config/defaults.tspackages/extension-agent/src/config/read.tspackages/extension-agent/src/config/write.tspackages/extension-agent/src/service/index.tspackages/extension-agent/src/service/trigger.tspackages/extension-agent/src/trigger/control.tspackages/extension-agent/src/trigger/dsl.tspackages/extension-agent/src/trigger/executor.tspackages/extension-agent/src/trigger/listener.tspackages/extension-agent/src/trigger/observer.tspackages/extension-agent/src/trigger/planner.tspackages/extension-agent/src/trigger/provider_registry.tspackages/extension-agent/src/trigger/providers/activity.tspackages/extension-agent/src/trigger/providers/cron.tspackages/extension-agent/src/trigger/providers/keyword.tspackages/extension-agent/src/trigger/providers/once.tspackages/extension-agent/src/trigger/render.tspackages/extension-agent/src/trigger/runner.tspackages/extension-agent/src/trigger/scheduler.tspackages/extension-agent/src/trigger/schema.tspackages/extension-agent/src/trigger/session.tspackages/extension-agent/src/trigger/store.tspackages/extension-agent/src/trigger/task_registry.tspackages/extension-agent/src/trigger/tool.tspackages/extension-agent/src/types.tspackages/extension-agent/src/types/trigger.tspackages/extension-agent/src/webui/index.ts
💤 Files with no reviewable changes (12)
- packages/extension-agent/src/trigger/providers/cron.ts
- packages/extension-agent/src/trigger/session.ts
- packages/extension-agent/src/trigger/providers/keyword.ts
- packages/extension-agent/src/trigger/provider_registry.ts
- packages/extension-agent/src/trigger/providers/once.ts
- packages/extension-agent/src/trigger/listener.ts
- packages/extension-agent/src/trigger/task_registry.ts
- packages/extension-agent/client/components/trigger/trigger-detail.vue
- packages/extension-agent/src/trigger/executor.ts
- packages/extension-agent/src/trigger/dsl.ts
- packages/extension-agent/src/trigger/providers/activity.ts
- packages/extension-agent/src/trigger/render.ts
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (3)
packages/extension-agent/src/service/trigger.ts (1)
319-331: 🚀 Performance & Scalability | 🔵 Trivial可将 owner 过滤下推到存储查询以减少加载量。
非管理员场景下当前会加载全部任务再在内存中按
ownerKey过滤。TriggerStore.list已支持ownerKey过滤,可在非管理员时下推该条件,避免随任务量增长的全表读取。建议
- async list(actor: TriggerActor, filter?: TriggerListFilter) { - return (await this._store.list()).filter( - (task) => - (actor.authority >= 3 || task.ownerKey === actor.key) && + async list(actor: TriggerActor, filter?: TriggerListFilter) { + const ownerKey = actor.authority >= 3 ? undefined : actor.key + return (await this._store.list({ ownerKey })).filter( + (task) => (filter?.enabled == null || task.enabled === filter.enabled) &&🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/src/service/trigger.ts` around lines 319 - 331, 更新 TriggerService.list 中的存储查询:管理员继续调用 _store.list() 获取全部任务,非管理员则将 actor.key 作为 ownerKey 传入 TriggerStore.list,以便下推所有者过滤并减少加载量;保留现有 enabled、status 和 conditionType 过滤逻辑及权限行为。packages/extension-agent/client/components/trigger/trigger-editor.vue (2)
804-813: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win扩展 provider schema 的必填字段在 UI 上标注了星号,但整个保存链路都没有真正校验。
根因:
schema-editor.vue只负责展示required标记,trigger-editor.vue的validateStep1又没有读取 schema 的required列表去校验draft.condition.config,导致必填字段可以留空直接保存扩展触发器。
packages/extension-agent/client/components/trigger/trigger-editor.vue#L804-L813:在扩展条件分支中,读取selectedProvider.value.schema.required,逐一检查draft.condition.config中对应字段是否为空并给出ElMessage.warning。packages/extension-agent/client/components/trigger/editors/schema-editor.vue#L9-L12:保持现状展示星号即可,无需改动,仅作为必填字段来源的佐证。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/client/components/trigger/trigger-editor.vue` around lines 804 - 813, 在 packages/extension-agent/client/components/trigger/trigger-editor.vue:804-813 的 validateStep1 扩展条件分支中读取 selectedProvider.value.schema.required,并逐项校验 draft.condition.config 对应字段是否为空;为空时通过 ElMessage.warning 提示并返回 false。packages/extension-agent/client/components/trigger/editors/schema-editor.vue:9-12 无需修改,继续仅展示 required 标记。
602-613: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
extensionConfig的 getter 中存在副作用(直接修改draft.condition.config)。Vue 的 computed getter 应保持纯函数,这里在 get() 内直接赋值
draft.condition.config = {}(第 610 行)会触发依赖重新收集,虽然本例中赋值后条件不再满足从而自愈,不会无限循环,但仍是脆弱的反模式,建议把归一化逻辑移到watch(() => props.task, ...)或selectScenario中,在赋值draft.condition时一次性处理。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/client/components/trigger/trigger-editor.vue` around lines 602 - 613, 移除 extensionConfig computed getter 中对 draft.condition.config 的直接赋值,确保 getter 仅返回值且无副作用;将无效或缺失配置归一化为对象的逻辑移至 watch(() => props.task, ...) 或 selectScenario,在设置 draft.condition 时完成,并保持 extensionConfig 对非 extension 条件返回 null 的行为。
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@packages/extension-agent/client/components/trigger/editors/schema-editor.vue`:
- Around line 272-283: Update commitJson so JSON.parse failures no longer
silently write the raw string to model.value[key]. Surface a clear validation
error to the user and preserve the schema-compatible model value instead of
committing invalid JSON text.
In `@packages/extension-agent/src/trigger/providers/registry.ts`:
- Around line 80-82: 调整 registry.ts 中获取 defs 的类型断言格式,使联合类型与 Prettier
预期的换行和缩进一致;保持 defs 的类型、可选访问以及 return defs?.[name] ?? json 逻辑不变。
---
Nitpick comments:
In `@packages/extension-agent/client/components/trigger/trigger-editor.vue`:
- Around line 804-813: 在
packages/extension-agent/client/components/trigger/trigger-editor.vue:804-813 的
validateStep1 扩展条件分支中读取 selectedProvider.value.schema.required,并逐项校验
draft.condition.config 对应字段是否为空;为空时通过 ElMessage.warning 提示并返回
false。packages/extension-agent/client/components/trigger/editors/schema-editor.vue:9-12
无需修改,继续仅展示 required 标记。
- Around line 602-613: 移除 extensionConfig computed getter 中对
draft.condition.config 的直接赋值,确保 getter 仅返回值且无副作用;将无效或缺失配置归一化为对象的逻辑移至 watch(() =>
props.task, ...) 或 selectScenario,在设置 draft.condition 时完成,并保持 extensionConfig 对非
extension 条件返回 null 的行为。
In `@packages/extension-agent/src/service/trigger.ts`:
- Around line 319-331: 更新 TriggerService.list 中的存储查询:管理员继续调用 _store.list()
获取全部任务,非管理员则将 actor.key 作为 ownerKey 传入 TriggerStore.list,以便下推所有者过滤并减少加载量;保留现有
enabled、status 和 conditionType 过滤逻辑及权限行为。
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: dcbba331-5e90-4eb7-a6c1-b2d0cc62b69f
⛔ Files ignored due to path filters (1)
packages/extension-agent/package.jsonis excluded by!**/*.json
📒 Files selected for processing (25)
packages/core/src/llm-core/chat/app.tspackages/core/src/middlewares/chat/allow_reply.tspackages/core/src/services/chat.tspackages/extension-agent/client/components/trigger/duration-input.vuepackages/extension-agent/client/components/trigger/editors/schema-editor.vuepackages/extension-agent/client/components/trigger/trigger-catalog.vuepackages/extension-agent/client/components/trigger/trigger-editor.vuepackages/extension-agent/client/components/trigger/trigger-page.vuepackages/extension-agent/client/components/trigger/trigger-schedule-preview.vuepackages/extension-agent/client/components/trigger/types.tspackages/extension-agent/src/config/defaults.tspackages/extension-agent/src/service/index.tspackages/extension-agent/src/service/trigger.tspackages/extension-agent/src/trigger/observer.tspackages/extension-agent/src/trigger/planner.tspackages/extension-agent/src/trigger/providers/builtin.tspackages/extension-agent/src/trigger/providers/registry.tspackages/extension-agent/src/trigger/runner.tspackages/extension-agent/src/trigger/scheduler.tspackages/extension-agent/src/trigger/schema.tspackages/extension-agent/src/trigger/store.tspackages/extension-agent/src/trigger/tool.tspackages/extension-agent/src/types.tspackages/extension-agent/src/types/trigger.tspackages/extension-agent/src/webui/index.ts
💤 Files with no reviewable changes (1)
- packages/extension-agent/src/service/index.ts
🚧 Files skipped from review as they are similar to previous changes (11)
- packages/extension-agent/src/webui/index.ts
- packages/extension-agent/client/components/trigger/duration-input.vue
- packages/extension-agent/client/components/trigger/trigger-schedule-preview.vue
- packages/extension-agent/src/trigger/store.ts
- packages/core/src/services/chat.ts
- packages/extension-agent/src/trigger/scheduler.ts
- packages/extension-agent/src/trigger/runner.ts
- packages/extension-agent/src/trigger/tool.ts
- packages/extension-agent/src/types.ts
- packages/extension-agent/client/components/trigger/trigger-page.vue
- packages/core/src/middlewares/chat/allow_reply.ts
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/extension-agent/client/components/trigger/editors/schema-editor.vue (1)
166-209: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win模型替换时要重置 JSON 草稿
watch(fields)只在字段结构变化时初始化jsonDraft;同一 schema 复用到新的model时,textarea 会保留旧内容,失焦后还能把旧 JSON 回写到新配置。这里应监听model变化并清空/重建草稿,或按触发器 ID 重新挂载组件。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/client/components/trigger/editors/schema-editor.vue` around lines 166 - 209, 在 schema-editor 的 watch(fields) 相关逻辑中补充对 model 变化的处理:当同一 schema 替换为新的 model 时,清空并按新 model 重建所有 JSON 字段的 jsonDraft,避免 textarea 保留旧配置内容并回写。保留现有字段默认值初始化逻辑,并确保仅在 model 实际替换时刷新草稿。
🧹 Nitpick comments (1)
packages/extension-agent/src/trigger/runner.ts (1)
670-712: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value提取这两个公共小函数到共享模块。
keepGateCursor和toInvokeConversation在packages/extension-agent/src/trigger/observer.ts、packages/extension-agent/src/service/trigger.ts、packages/extension-agent/src/trigger/runner.ts中重复定义,抽到单一位置可避免后续逻辑漂移。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/src/trigger/runner.ts` around lines 670 - 712, 将 keepGateCursor 和 toInvokeConversation 提取到共享模块,并删除 observer.ts、service/trigger.ts、trigger/runner.ts 中的重复实现;各调用点改为复用共享导出的函数,保持现有行为和类型签名不变。
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@packages/extension-agent/client/components/trigger/editors/schema-editor.vue`:
- Around line 248-274: Update the allOf merge logic around the visible
result-building loop so result is initialized with the root schema’s sibling
constraints instead of an empty object. Preserve and merge root-level properties
and required values together with each unwrapped allOf part, while retaining the
existing deduplication and later-part override behavior.
- Around line 172-198: Update the missing-value initialization logic around the
schema field handling to stop assigning inferred defaults for enum, number,
integer, and other fields when field.defaultValue is undefined; only clone and
assign explicitly declared schema defaults, leaving absent values untouched so
editor initialization cannot create schema-invalid configuration.
---
Outside diff comments:
In
`@packages/extension-agent/client/components/trigger/editors/schema-editor.vue`:
- Around line 166-209: 在 schema-editor 的 watch(fields) 相关逻辑中补充对 model 变化的处理:当同一
schema 替换为新的 model 时,清空并按新 model 重建所有 JSON 字段的 jsonDraft,避免 textarea
保留旧配置内容并回写。保留现有字段默认值初始化逻辑,并确保仅在 model 实际替换时刷新草稿。
---
Nitpick comments:
In `@packages/extension-agent/src/trigger/runner.ts`:
- Around line 670-712: 将 keepGateCursor 和 toInvokeConversation 提取到共享模块,并删除
observer.ts、service/trigger.ts、trigger/runner.ts
中的重复实现;各调用点改为复用共享导出的函数,保持现有行为和类型签名不变。
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 0f48a58f-67a8-472f-a47e-a86d891cf1cf
📒 Files selected for processing (14)
packages/extension-agent/client/components/trigger/duration-input.vuepackages/extension-agent/client/components/trigger/editors/schema-editor.vuepackages/extension-agent/client/components/trigger/trigger-editor.vuepackages/extension-agent/client/components/trigger/types.tspackages/extension-agent/src/service/trigger.tspackages/extension-agent/src/trigger/observer.tspackages/extension-agent/src/trigger/planner.tspackages/extension-agent/src/trigger/providers/builtin.tspackages/extension-agent/src/trigger/providers/registry.tspackages/extension-agent/src/trigger/runner.tspackages/extension-agent/src/trigger/scheduler.tspackages/extension-agent/src/trigger/schema.tspackages/extension-agent/src/trigger/store.tspackages/extension-agent/src/types/trigger.ts
🚧 Files skipped from review as they are similar to previous changes (10)
- packages/extension-agent/src/trigger/providers/builtin.ts
- packages/extension-agent/client/components/trigger/duration-input.vue
- packages/extension-agent/src/trigger/scheduler.ts
- packages/extension-agent/client/components/trigger/trigger-editor.vue
- packages/extension-agent/src/trigger/observer.ts
- packages/extension-agent/src/trigger/store.ts
- packages/extension-agent/src/service/trigger.ts
- packages/extension-agent/src/trigger/planner.ts
- packages/extension-agent/src/trigger/schema.ts
- packages/extension-agent/src/types/trigger.ts
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/extension-agent/src/service/trigger.ts (1)
123-199: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win把所有资源注册纳入启动回滚范围。
Line 127-197 位于
try之外;任一工具或 pipeline 注册失败都会留下_started = true及部分已注册资源,后续启动也会被 Line 124 跳过。请从第一次注册开始进入try,确保所有失败都调用stop()回滚。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/src/service/trigger.ts` around lines 123 - 199, 将 start() 中从首次 registerTool 调用开始的全部资源注册逻辑移入现有 try 范围,并保留失败时调用 stop() 的回滚路径;确保任一工具或 pipeline 注册失败都会清理已注册资源、重置 _started,并允许后续重新启动。
🧹 Nitpick comments (4)
packages/extension-agent/src/trigger/utils.ts (1)
3-22: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win内联这两个短转换,避免新增工具层。
这两个函数仅包装数行简单分支,应直接放回调用点并删除该文件。
As per coding guidelines, “Do NOT wrap values in helper functions” 以及 “Do NOT create extra functions for short logic”。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/extension-agent/src/trigger/utils.ts` around lines 3 - 22, 内联 keepGateCursor 和 toInvokeConversation 的逻辑到各自调用点,删除这两个工具函数及其文件;保持现有的 gate 游标校验、policy 分支行为和返回结构不变,并移除相关导入与调用引用。Source: Coding guidelines
packages/core/src/services/conversation.ts (3)
1118-1118: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win使用局部类型推断。
messages已由数据库表类型推导,显式声明MessageRecord[]是冗余的。- const records: MessageRecord[] = messages + const records = messagesAs per coding guidelines, “Use TypeScript's type inference for local variables; avoid redundant type annotations”。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/services/conversation.ts` at line 1118, Update the local declaration in the conversation flow by removing the redundant MessageRecord[] annotation from records and rely on TypeScript to infer its type from messages.Source: Coding guidelines
755-763: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win将无实例依赖的模型校验移到模块级。
requireInvocationModel未使用this,不应作为私有实例方法。请保持逻辑不变并移动到模块级。As per coding guidelines, “Extract class-independent methods as standalone module-level functions if they do not depend on the class instance (
this)”。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/services/conversation.ts` around lines 755 - 763, 将 Conversation 中的 requireInvocationModel 从私有实例方法提取为模块级函数,保留现有参数、返回类型、校验逻辑及 ConversationInvocationError 行为不变,并更新所有调用方以使用该模块级函数。Source: Coding guidelines
553-560: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win重命名新建的
resolve*方法。
resolveInvocation和resolveEphemeralInvocation均属于仓库明确禁止的命名模式。可分别改为prepareInvocation和createEphemeral,并同步调用方。As per coding guidelines, “Do NOT create
resolveXXX,normalizeXXX,ensureXXXfunctions—these are banned patterns”。Also applies to: 611-614
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/services/conversation.ts` around lines 553 - 560, 将 ConversationService 中新建的 resolveInvocation 重命名为 prepareInvocation,并将 resolveEphemeralInvocation 重命名为 createEphemeral;同步更新所有方法声明、调用方及引用,确保现有分支行为不变且不再使用被禁止的 resolve* 命名模式。Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/core/src/llm-core/chat/runtime.ts`:
- Around line 114-116: 调整 runtime 中基于 invocation.persist 设置 cleanup
的逻辑:不要用消息持久化开关判断会话是否可删除,改为使用 resolveInvocation
返回的“本次新建临时记录”标记,仅清理本次创建的临时会话。保留既有会话,即使 persist 为 false
也不得删除其消息或会话记录,并让清理删除失败向上传播或明确记录,不要静默吞掉错误。
- Around line 139-168: Update the result-handling logic before the success
return in the chat invocation flow to check controller.signal.aborted
unconditionally, regardless of whether reply is present. Preserve the existing
timeout handling via state.timedOut and abortErr, ensuring aborted or timed-out
executions never return ok: true; keep non-aborted error handling and successful
responses unchanged.
In `@packages/core/src/middlewares/conversation/request_conversation.ts`:
- Around line 147-152: Update the replyStream completion logic in the
conversation request handler so capture and silent modes also call
ReplyStream.end(). Use a no-frame end for capture mode, while preserving the
existing done frame for normal replies; keep send:false from emitting an actual
reply while ensuring thinking-message withdrawal and queue cleanup still occur.
In `@packages/core/src/services/conversation.ts`:
- Around line 727-750: 更新 applyInvocationOverlay 中的模型和 preset 合并逻辑,优先保留
resolved.effectiveModel 与 resolved.effectivePreset,避免路由默认值覆盖已解析的会话配置或
fixedPreset。同步确保返回的 conversation、effectiveModel、effectivePreset 及
constraint.fixedModel/fixedPreset 使用一致的解析结果,并保留显式 input.model/input.preset
的覆盖优先级。
In `@packages/core/tests/helpers.ts`:
- Around line 378-379: 在测试上下文的 chatluna mock 中补充 preset 服务,并实现 getPreset 方法,使其返回
invocation 流程所需的预设数据;确保现有对 ctx.chatluna.preset 的传递保持可用。
---
Outside diff comments:
In `@packages/extension-agent/src/service/trigger.ts`:
- Around line 123-199: 将 start() 中从首次 registerTool 调用开始的全部资源注册逻辑移入现有 try
范围,并保留失败时调用 stop() 的回滚路径;确保任一工具或 pipeline 注册失败都会清理已注册资源、重置 _started,并允许后续重新启动。
---
Nitpick comments:
In `@packages/core/src/services/conversation.ts`:
- Line 1118: Update the local declaration in the conversation flow by removing
the redundant MessageRecord[] annotation from records and rely on TypeScript to
infer its type from messages.
- Around line 755-763: 将 Conversation 中的 requireInvocationModel
从私有实例方法提取为模块级函数,保留现有参数、返回类型、校验逻辑及 ConversationInvocationError
行为不变,并更新所有调用方以使用该模块级函数。
- Around line 553-560: 将 ConversationService 中新建的 resolveInvocation 重命名为
prepareInvocation,并将 resolveEphemeralInvocation 重命名为
createEphemeral;同步更新所有方法声明、调用方及引用,确保现有分支行为不变且不再使用被禁止的 resolve* 命名模式。
In `@packages/extension-agent/src/trigger/utils.ts`:
- Around line 3-22: 内联 keepGateCursor 和 toInvokeConversation
的逻辑到各自调用点,删除这两个工具函数及其文件;保持现有的 gate 游标校验、policy 分支行为和返回结构不变,并移除相关导入与调用引用。
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a6db5800-79f3-45d2-be6a-f7e0bc1769fc
📒 Files selected for processing (12)
packages/core/src/llm-core/chat/runtime.tspackages/core/src/middlewares/conversation/request_conversation.tspackages/core/src/services/chat.tspackages/core/src/services/conversation.tspackages/core/src/services/types.tspackages/core/src/types.tspackages/core/tests/helpers.tspackages/extension-agent/client/components/trigger/editors/schema-editor.vuepackages/extension-agent/src/service/trigger.tspackages/extension-agent/src/trigger/observer.tspackages/extension-agent/src/trigger/runner.tspackages/extension-agent/src/trigger/utils.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- packages/extension-agent/client/components/trigger/editors/schema-editor.vue
- packages/core/src/types.ts
- packages/extension-agent/src/trigger/runner.ts
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/core/src/services/conversation.ts (1)
604-638: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win非持久化的 task/fresh 不应直接转成 transient
input.persist === false且目标为task/fresh时会落到createEphemeral,返回transient: true并改写bindingKey,这和ActiveConversationResolution.transient的说明不一致。要么改这里的分支逻辑,要么同步修正types.ts注释。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/services/conversation.ts` around lines 604 - 638, Update the non-persistent branch in the active conversation resolution flow so task and fresh targets do not incorrectly route through createEphemeral, which marks them transient and rewrites bindingKey. Preserve the documented ActiveConversationResolution.transient semantics by adjusting the branch behavior or, if transient is intended, updating the corresponding types.ts documentation consistently.packages/core/src/middlewares/system/conversation_manage.ts (1)
920-986: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win补上
CONVERSATION_CREATE_DISABLED的格式化分支。
services/conversation.ts会抛出这个错误码,但这里没有对应处理,create被禁用时会退回到原始错误消息,丢失本地化文案和操作名。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/middlewares/system/conversation_manage.ts` around lines 920 - 986, 在 formatConversationError 中补充 ChatLunaErrorCode.CONVERSATION_CREATE_DISABLED 的处理分支,复用创建操作禁用的本地化文案与 action 信息,确保 services/conversation.ts 抛出该错误码时不会退回原始错误消息;不要改变其他错误码的处理逻辑。
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/core/src/types.ts`:
- Around line 74-82: 更新 ActiveConversationResolution.transient 的注释,使其仅说明
ConversationService 通过 createEphemeral() 创建临时记录时为 true。移除 fresh/task 永远不会标记为
transient 的表述,避免与 !input.persist 的实际行为冲突;保留其他类型定义不变。
In `@packages/extension-agent/src/trigger/runner.ts`:
- Around line 584-596: 修改 finally 中构造 next 的逻辑,不要再以入口时的 task.state.cursor 或旧
cursor 为基础;在获取 latest 后,以 latest.state.cursor 为基础仅叠加更新后的 gate.tokens,同时保留
day,避免覆盖 _execute 已消费的 reschedule 修改。确保 store.update 写回最新 cursor。
---
Outside diff comments:
In `@packages/core/src/middlewares/system/conversation_manage.ts`:
- Around line 920-986: 在 formatConversationError 中补充
ChatLunaErrorCode.CONVERSATION_CREATE_DISABLED 的处理分支,复用创建操作禁用的本地化文案与 action
信息,确保 services/conversation.ts 抛出该错误码时不会退回原始错误消息;不要改变其他错误码的处理逻辑。
In `@packages/core/src/services/conversation.ts`:
- Around line 604-638: Update the non-persistent branch in the active
conversation resolution flow so task and fresh targets do not incorrectly route
through createEphemeral, which marks them transient and rewrites bindingKey.
Preserve the documented ActiveConversationResolution.transient semantics by
adjusting the branch behavior or, if transient is intended, updating the
corresponding types.ts documentation consistently.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: ed2378b6-cb6d-4e99-840d-896d7d1ab138
📒 Files selected for processing (30)
packages/core/src/llm-core/chat/runtime.tspackages/core/src/middlewares/conversation/request_conversation.tspackages/core/src/middlewares/conversation/resolve_conversation.tspackages/core/src/middlewares/system/conversation_manage.tspackages/core/src/services/conversation.tspackages/core/src/services/types.tspackages/core/src/types.tspackages/core/src/utils/error.tspackages/core/tests/conversation-resolve.spec.tspackages/core/tests/conversation-service.spec.tspackages/core/tests/helpers.tspackages/extension-agent/client/components/computer/computer-page.vuepackages/extension-agent/client/components/mcp/mcp-page.vuepackages/extension-agent/client/components/skills/skills-page.vuepackages/extension-agent/client/components/sub-agent/sub-agent-catalog.vuepackages/extension-agent/client/components/sub-agent/sub-agent-page.vuepackages/extension-agent/client/components/tool/tool-page.vuepackages/extension-agent/client/components/trigger/editors/calendar-editor.vuepackages/extension-agent/client/components/trigger/trigger-catalog.vuepackages/extension-agent/client/components/trigger/trigger-editor.vuepackages/extension-agent/client/components/trigger/trigger-page.vuepackages/extension-agent/client/components/trigger/trigger-schedule-preview.vuepackages/extension-agent/src/service/trigger.tspackages/extension-agent/src/trigger/observer.tspackages/extension-agent/src/trigger/planner.tspackages/extension-agent/src/trigger/providers/registry.tspackages/extension-agent/src/trigger/runner.tspackages/extension-agent/src/trigger/shared.tspackages/extension-agent/src/trigger/store.tspackages/extension-agent/src/trigger/tool.ts
💤 Files with no reviewable changes (1)
- packages/core/src/services/types.ts
✅ Files skipped from review due to trivial changes (2)
- packages/extension-agent/client/components/mcp/mcp-page.vue
- packages/extension-agent/client/components/computer/computer-page.vue
🚧 Files skipped from review as they are similar to previous changes (11)
- packages/extension-agent/client/components/trigger/trigger-schedule-preview.vue
- packages/extension-agent/client/components/trigger/editors/calendar-editor.vue
- packages/extension-agent/client/components/trigger/trigger-catalog.vue
- packages/extension-agent/src/trigger/providers/registry.ts
- packages/core/src/llm-core/chat/runtime.ts
- packages/extension-agent/src/trigger/observer.ts
- packages/extension-agent/src/trigger/tool.ts
- packages/extension-agent/client/components/trigger/trigger-editor.vue
- packages/extension-agent/src/trigger/store.ts
- packages/extension-agent/src/trigger/planner.ts
- packages/extension-agent/src/service/trigger.ts
This pr redesigns the agent trigger system and console UI.
New Features
Bug Fixes
Other Changes
Validation