@suifei/dsh-ai-team 0.3.28 → 0.3.30
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 +12 -0
- package/client.js +27 -2
- package/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.30 — 2026-11-10
|
|
4
|
+
|
|
5
|
+
- 已提交的决策项增加「重新决策」:复用原六问/选项/建议重开一份未读项,可直接采纳建议后修改;
|
|
6
|
+
- 看板已完成默认展开、按 Task 号倒序;
|
|
7
|
+
- 决策建议逐条/全部采纳。
|
|
8
|
+
|
|
9
|
+
## 0.3.29 — 2026-11-10
|
|
10
|
+
|
|
11
|
+
- 看板「已完成」默认展开,不再先折叠成「展开全部」;
|
|
12
|
+
- 看板各列按 Task number 倒序,最新任务优先显示;
|
|
13
|
+
- 收件箱决策支持逐条「采纳」与「全部采纳建议」,建议直接填入可编辑输入框。
|
|
14
|
+
|
|
3
15
|
## 0.3.28 — 2026-11-10
|
|
4
16
|
|
|
5
17
|
- 收件箱决策项增加逐条「采纳」与「全部采纳建议」;建议直接填入可编辑输入框,不再手抄;
|
package/client.js
CHANGED
|
@@ -118,6 +118,9 @@ window.__ModuleLoader__.load({
|
|
|
118
118
|
decisionAdopt: '采纳',
|
|
119
119
|
decisionAdoptAll: '全部采纳建议',
|
|
120
120
|
decisionAdoptHint: '建议可直接采纳,再按需修改',
|
|
121
|
+
decisionReopen: '重新决策',
|
|
122
|
+
decisionReopenSuffix: '复核',
|
|
123
|
+
decisionReopened: '已重开一份可编辑的决策项。',
|
|
121
124
|
decisionSubmit: '提交决策',
|
|
122
125
|
decisionSubmitted: '决策已提交给团队。',
|
|
123
126
|
inboxEmptyAction: '看任务看板',
|
|
@@ -433,6 +436,9 @@ window.__ModuleLoader__.load({
|
|
|
433
436
|
decisionAdopt: 'Adopt',
|
|
434
437
|
decisionAdoptAll: 'Adopt all suggestions',
|
|
435
438
|
decisionAdoptHint: 'Adopt a suggestion, then edit if needed',
|
|
439
|
+
decisionReopen: 'Decide again',
|
|
440
|
+
decisionReopenSuffix: 'review',
|
|
441
|
+
decisionReopened: 'A new editable decision item is ready.',
|
|
436
442
|
decisionSubmit: 'Submit decision',
|
|
437
443
|
decisionSubmitted: 'Decision sent to the team.',
|
|
438
444
|
inboxEmptyAction: 'Open the board',
|
|
@@ -1515,7 +1521,9 @@ window.__ModuleLoader__.load({
|
|
|
1515
1521
|
}
|
|
1516
1522
|
|
|
1517
1523
|
function Board({ t, tasks, selected, follows, doneOpen, onToggleDone, onOpen, onToggleFollow, filter, onClearFilter, q1Extra, onBackMain }) {
|
|
1518
|
-
const filtered = filter === 'all' ? tasks : tasks.filter((task) => matchesFilter(task, filter))
|
|
1524
|
+
const filtered = (filter === 'all' ? tasks : tasks.filter((task) => matchesFilter(task, filter)))
|
|
1525
|
+
.slice()
|
|
1526
|
+
.sort((left, right) => (right.number ?? 0) - (left.number ?? 0));
|
|
1519
1527
|
const filterName = filter === 'all' ? '' : t(filter === 'q1' ? 'q1Title' : filter === 'q2' ? 'q2Title' : filter === 'q3' ? 'q3Title' : 'q4Title');
|
|
1520
1528
|
const bar = filter === 'all' ? null : h('div', { className: 'at-boardbar', role: 'status' },
|
|
1521
1529
|
h('span', { className: 'at-filterchip' }, tf(t, 'filterLabel', { name: filterName }) + ' · ' + tf(t, 'itemCount', { n: filtered.length })),
|
|
@@ -2180,7 +2188,7 @@ window.__ModuleLoader__.load({
|
|
|
2180
2188
|
const [rightNote, setRightNote] = React.useState('');
|
|
2181
2189
|
const [reply, setReply] = React.useState('');
|
|
2182
2190
|
const [follows, setFollows] = React.useState({});
|
|
2183
|
-
const [doneOpen, setDoneOpen] = React.useState(
|
|
2191
|
+
const [doneOpen, setDoneOpen] = React.useState(true);
|
|
2184
2192
|
const [boardFilter, setBoardFilter] = React.useState('all');
|
|
2185
2193
|
const [converting, setConverting] = React.useState(false);
|
|
2186
2194
|
const [cTitle, setCTitle] = React.useState('');
|
|
@@ -2862,6 +2870,20 @@ window.__ModuleLoader__.load({
|
|
|
2862
2870
|
say(tf(t, 'sendFailed', { message: error?.message ?? String(error) }));
|
|
2863
2871
|
}
|
|
2864
2872
|
}
|
|
2873
|
+
async function reopenDecision(item) {
|
|
2874
|
+
try {
|
|
2875
|
+
await runCommand('decision.request', {
|
|
2876
|
+
title: (item.ref?.title || t('inboxDecisionTitle')) + ' · ' + t('decisionReopenSuffix'),
|
|
2877
|
+
questions: item.ref?.questions ?? [],
|
|
2878
|
+
taskId: item.ref?.taskId ?? null,
|
|
2879
|
+
source: item.ref?.source ?? 'reopen',
|
|
2880
|
+
}, item.projectId ?? projectId);
|
|
2881
|
+
say(t('decisionReopened'));
|
|
2882
|
+
await reloadData();
|
|
2883
|
+
} catch (error) {
|
|
2884
|
+
say(tf(t, 'sendFailed', { message: error?.message ?? String(error) }));
|
|
2885
|
+
}
|
|
2886
|
+
}
|
|
2865
2887
|
async function ackInbox(item) {
|
|
2866
2888
|
try {
|
|
2867
2889
|
await runCommand('inbox.ack', { itemId: item.id, disposition: 'read' }, item.projectId ?? projectId);
|
|
@@ -3114,6 +3136,9 @@ window.__ModuleLoader__.load({
|
|
|
3114
3136
|
item.state !== 'unread' ? h('div', { className: 'at-inboxstate' }, item.state) : null),
|
|
3115
3137
|
h('div', { className: 'at-inboxactions' },
|
|
3116
3138
|
item.ref?.taskId ? h('button', { className: 'at-btn at-btn-small', type: 'button', onClick: () => openInboxTask(item) }, t('inboxOpenTask')) : null,
|
|
3139
|
+
item.type === 'decision_required' && item.state !== 'unread' && Array.isArray(item.ref?.questions) && item.ref.questions.length
|
|
3140
|
+
? h('button', { className: 'at-btn at-btn-small', type: 'button', onClick: () => reopenDecision(item) }, t('decisionReopen'))
|
|
3141
|
+
: null,
|
|
3117
3142
|
item.state === 'unread' && !(item.type === 'decision_required' && Array.isArray(item.ref?.questions) && item.ref.questions.length)
|
|
3118
3143
|
? h('button', { className: 'at-btn at-btn-small at-btn-primary', type: 'button', onClick: () => ackInbox(item) }, t('inboxAck'))
|
|
3119
3144
|
: 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.30';
|
|
38
38
|
const PROJECT_ID = 'prj_main';
|
|
39
39
|
const HUMAN_ID = 'mem_human';
|
|
40
40
|
|
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.30",
|
|
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",
|