Files
lobehub__lobehub/packages/builtin-tool-task/package.json
Rdmclin2 a4caede6f5 ✨ feat(task): member assign notifications, mentions & tool assignee (#19035)
* ✨ feat: workspace task assignment & comment notifications with member mentions

- notify the assignee when a workspace task is assigned to them
- notify participants on task comment activity and workspace member @mentions
- task builtin tool: assigneeUserId support with dual (agent + member) assignee model
- workspace member directory exposes email for assignee resolution

* 🌐 style: update i18n

* 🐛 fix(task): retain notifications after the response and gate them by task access

Codex review round 1 on #19035:
- deliver assignment / comment pings through after() with try/catch instead of
  bare void calls (serverless keeps the work alive, rejections are logged);
  same lifecycle in the tool server runtime
- re-authorize comment-ping recipients against the task before delivery:
  private tasks never leak to members who cannot open them, and creator /
  assignee rows are re-checked for active membership (shared helper
  filterActiveWorkspaceMemberIds)
- listWorkspaceMembers: optional query + limit (default 50, max 100) on both
  the server runtime and the client executor, header announces the cap; the
  tool description only promises IM identities where available
- My tasks: hideCompleted is sent as a server status filter and ordering is
  pinned to the updatedAt-desc page order, so cuts happen before pagination

* 🐛 fix(task): unwrap native Slack/Discord mentions in the member directory query

Codex review round 2 on #19035: `<@U123>`, `<@U123|name>`, `<@4521>` and
`<@!4521>` are folded to the bare platform id (and a leading @ stripped) in
normalizeMemberQuery before matching, so the deterministic resolution the tool
description promises works when the model passes a mention through verbatim.

* 🐛 fix(task): scope member directory lookups to the workspace and push search into SQL

Codex review round 3 on #19035:
- MessengerAccountLinkModel.findByUserIds takes a scope: only identities
  active under the current workspace (or personal scope) are exposed, so a
  member's IM handles linked elsewhere never reach coworkers' tool output
- WorkspaceMemberModel.searchAssignableMembers applies the role gate, the
  query (id / name / handle / email / workspace-scoped IM identity) and the
  limit in SQL with a separate count; the runtime decorates only the page
- My tasks / scheduled: use the comparator token that renders a page
  newest-first (compareTaskItems inverts orderDirection for date columns)

* ✅ test(task): fix test-file type errors flagged by the OSS type-check

- integration test: otherUserId is string | undefined at the insert sites
- member directory test: seed the owner row directly (addMember is typed to
  non-owner roles)

* 🐛 fix(task): render every fetched row in the paginated task collections

Codex review round 4 on #19035 (LOBE-13749): with showSubTasks off, TaskList
folded a sub-task away whenever its parent shared the page, so a server page
came back sparse while total still counted the hidden rows. My tasks and the
scheduled tab now pin showSubTasks alongside the server page order; nesting
still tucks a child under a parent on the same page.
2026-09-02 17:55:01 +08:00

26 lines
571 B
JSON

{
"name": "@lobechat/builtin-tool-task",
"version": "1.0.0",
"private": true,
"exports": {
".": "./src/index.ts",
"./client": "./src/client/index.ts",
"./client/executor": "./src/client/executor/index.ts"
},
"main": "./src/index.ts",
"dependencies": {
"@lobechat/const": "workspace:*",
"@lobechat/prompts": "workspace:*"
},
"devDependencies": {
"@lobechat/types": "workspace:*"
},
"peerDependencies": {
"@lobehub/ui": "^5",
"antd-style": "*",
"lucide-react": "*",
"react": "*",
"react-i18next": "*"
}
}