@suifei/dsh-ai-team 0.3.23 → 0.3.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/client.js +1 -1
- package/index.js +2 -2
- package/lib/host/member-tools.js +18 -0
- package/lib/host/service.js +6 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.25 — 2026-11-10
|
|
4
|
+
|
|
5
|
+
- 收件箱未读数按 `state=unread` 统计,决策提交后「待你处理」立即消失;
|
|
6
|
+
- 已答/已 dismiss 的报告六问不会在重启后再次导入;
|
|
7
|
+
- 收件箱决策项显示提问成员名字,不再显示 `mem_*`。
|
|
8
|
+
|
|
9
|
+
## 0.3.24 — 2026-11-10
|
|
10
|
+
|
|
11
|
+
- 修复 member `team` 工具 accept 未透传 `checks` 的缺口:agent QA 带 checklist 验收不再 E_INVALID_STATE;
|
|
12
|
+
- 增加 `checks` schema,并覆盖 QA agent 带清单验收测试。
|
|
13
|
+
|
|
3
14
|
## 0.3.23 — 2026-11-10
|
|
4
15
|
|
|
5
16
|
- 报告六问只生成一个结构化收件箱项,不再按每条 Thread mention 重复;
|
package/client.js
CHANGED
|
@@ -3024,7 +3024,7 @@ window.__ModuleLoader__.load({
|
|
|
3024
3024
|
h('div', { className: 'at-inboxmeta' },
|
|
3025
3025
|
item.projectName ? item.projectName + ' · ' : '',
|
|
3026
3026
|
item.ref?.category ? item.ref.category + ' · ' : '',
|
|
3027
|
-
item.ref?.memberId ? item.ref.memberId : '',
|
|
3027
|
+
item.ref?.memberName ?? (item.ref?.memberId ? item.ref.memberId : ''),
|
|
3028
3028
|
' · ',
|
|
3029
3029
|
fmtTime(item.createdAt)),
|
|
3030
3030
|
item.state !== 'unread' ? h('div', { className: 'at-inboxstate' }, item.state) : null),
|
package/index.js
CHANGED
|
@@ -34,7 +34,7 @@ export const name = 'ai-team';
|
|
|
34
34
|
/** The workbench only makes sense where the Web carrier exists. */
|
|
35
35
|
export const inject = ['webServer', 'permissionPresets', 'sandboxPolicy'];
|
|
36
36
|
|
|
37
|
-
const VERSION = '0.3.
|
|
37
|
+
const VERSION = '0.3.25';
|
|
38
38
|
const PROJECT_ID = 'prj_main';
|
|
39
39
|
const HUMAN_ID = 'mem_human';
|
|
40
40
|
|
|
@@ -748,7 +748,7 @@ export function apply(ctx) {
|
|
|
748
748
|
return send(res, {
|
|
749
749
|
...bootstrap,
|
|
750
750
|
inbox,
|
|
751
|
-
inboxUnread: inbox.filter((item) => item.
|
|
751
|
+
inboxUnread: inbox.filter((item) => item.state === 'unread').length,
|
|
752
752
|
projects: booted.registry.list().map((project) => {
|
|
753
753
|
const active = bootstrap.projects?.find((entry) => entry.id === project.id);
|
|
754
754
|
return {
|
package/lib/host/member-tools.js
CHANGED
|
@@ -72,6 +72,18 @@ export function createTeamTool(options) {
|
|
|
72
72
|
assigneeId: { type: 'string', description: 'Optional assignee id from members for create.' },
|
|
73
73
|
qaRequired: { type: 'boolean', description: 'Require a QA member to accept this task.' },
|
|
74
74
|
qaChecklist: { type: 'array', items: { type: 'string' }, description: 'QA checklist items; all must pass before acceptance.' },
|
|
75
|
+
checks: {
|
|
76
|
+
type: 'array',
|
|
77
|
+
description: 'Acceptance checks for accept; include every qaChecklist item with passed=true/false.',
|
|
78
|
+
items: {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
item: { type: 'string', description: 'Exact qaChecklist item.' },
|
|
82
|
+
passed: { type: 'boolean' },
|
|
83
|
+
},
|
|
84
|
+
required: ['item', 'passed'],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
75
87
|
questions: {
|
|
76
88
|
type: 'array',
|
|
77
89
|
description: 'Human decision questions for askHuman; include every question instead of pointing at a report.',
|
|
@@ -258,6 +270,12 @@ export function createTeamTool(options) {
|
|
|
258
270
|
payload.evidence = evidence.map((value) => ({ kind: 'text', value }));
|
|
259
271
|
}
|
|
260
272
|
if (args.action === 'accept' || args.action === 'requestChanges') payload.note = typeof args.note === 'string' ? args.note : '';
|
|
273
|
+
if (args.action === 'accept') {
|
|
274
|
+
const checks = Array.isArray(args.checks)
|
|
275
|
+
? args.checks.filter((check) => typeof check?.item === 'string' && check.item !== '' && typeof check.passed === 'boolean')
|
|
276
|
+
: [];
|
|
277
|
+
if (checks.length > 0) payload.checks = checks;
|
|
278
|
+
}
|
|
261
279
|
const type = args.action === 'requestChanges' ? 'task.request_changes' : `task.${args.action}`;
|
|
262
280
|
const result = await command(type, payload);
|
|
263
281
|
return { ok: true, task: taskCard(options.getState(), result.task), event: result.event?.type ?? null };
|
package/lib/host/service.js
CHANGED
|
@@ -184,8 +184,7 @@ export class TeamService {
|
|
|
184
184
|
item.memberId === humanId
|
|
185
185
|
&& item.ref?.source === reportPath
|
|
186
186
|
&& Array.isArray(item.ref?.questions)
|
|
187
|
-
&& item.ref.questions.length > 0
|
|
188
|
-
&& !['resolved', 'dismissed', 'superseded'].includes(item.state));
|
|
187
|
+
&& item.ref.questions.length > 0);
|
|
189
188
|
if (alreadyStructured) return 0;
|
|
190
189
|
const chosen = candidates.find((candidate) => /§6|六问/.test(candidate.entry.body))
|
|
191
190
|
?? candidates.sort((left, right) => (right.entry.seq ?? 0) - (left.entry.seq ?? 0))[0];
|
|
@@ -196,6 +195,7 @@ export class TeamService {
|
|
|
196
195
|
taskId: chosen.task.id,
|
|
197
196
|
entrySeq: chosen.entry.seq,
|
|
198
197
|
memberId: chosen.entry.authorId,
|
|
198
|
+
memberName: this.state.members?.[chosen.entry.authorId]?.name ?? chosen.entry.authorId,
|
|
199
199
|
category: 'thread_mention',
|
|
200
200
|
title: `需 Human 决策 · ${reportQuestions.length} 问`,
|
|
201
201
|
questions: reportQuestions,
|
|
@@ -223,6 +223,7 @@ export class TeamService {
|
|
|
223
223
|
taskId: task.id,
|
|
224
224
|
entrySeq: entry.seq,
|
|
225
225
|
memberId: entry.authorId,
|
|
226
|
+
memberName: this.state.members?.[entry.authorId]?.name ?? entry.authorId,
|
|
226
227
|
category: 'thread_mention',
|
|
227
228
|
title: String(entry.body).slice(0, 180),
|
|
228
229
|
},
|
|
@@ -928,6 +929,7 @@ export class TeamService {
|
|
|
928
929
|
taskId,
|
|
929
930
|
entrySeq: outcome.entry.seq,
|
|
930
931
|
memberId: authorId,
|
|
932
|
+
memberName: this.state.members?.[authorId]?.name ?? authorId,
|
|
931
933
|
category: 'thread_mention',
|
|
932
934
|
title: String(body).slice(0, 180),
|
|
933
935
|
},
|
|
@@ -982,6 +984,8 @@ export class TeamService {
|
|
|
982
984
|
ref: {
|
|
983
985
|
taskId,
|
|
984
986
|
title,
|
|
987
|
+
memberId: command.actor.memberId ?? null,
|
|
988
|
+
memberName: this.state.members?.[command.actor.memberId]?.name ?? command.actor.memberId ?? null,
|
|
985
989
|
questions,
|
|
986
990
|
...(typeof payload.source === 'string' && payload.source !== '' ? { source: payload.source } : {}),
|
|
987
991
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@suifei/dsh-ai-team",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.25",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "文渊阁 (Wenyuan Pavilion) — AI Team mode for DeepSeek Harness: concurrent projects, owned tasks, threads, inbox and an append-only team ledger",
|
|
6
6
|
"license": "MIT",
|