@suifei/dsh-ai-team 0.3.13 → 0.3.14

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.14 — 2026-11-10
4
+
5
+ - 主对话顶部增加「团队动态」:显示正在推进的 Task、owner 和运行中的成员;
6
+ - 点击团队动态里的 Task 直接打开 Thread;没有 Task 时显示“成员已唤醒,正在拆解”;
7
+ - 解决 Human 发消息后主对话没有反馈、只能去任务看板找 Task 的问题。
8
+
3
9
  ## 0.3.13 — 2026-11-10
4
10
 
5
11
  - 点击成员名字进入成员视图:该成员负责/执行的任务列表 + 直接对话 + 资料入口;
package/README.md CHANGED
@@ -84,7 +84,7 @@ dsh --profile ai-team --no-open --port 33271
84
84
  └─────────────────┴────────────────────────────────────┴─────────────┘
85
85
  ```
86
86
 
87
- - **主对话**:Human 的一句话进入 Main stream,Project owner 拆 Task;Composer 支持讨论 / 任务模式。
87
+ - **主对话**:Human 的一句话进入 Main stream,Project owner 拆 Task;顶部「团队动态」直接显示正在推进的 Task 和运行中的成员,点击 Task 可打开 Thread。
88
88
  - **看板**:四列;进行中的卡片显示 accountable owner 与执行者;数量只统计 active Task。
89
89
  - **态势**:四象限——需要你、团队在做、等待受阻、最近完成。点击条目打开对应 Task 的 Thread。
90
90
  - **收件箱**:跨 Project 聚合;失败决策、需要你决定、关注 Task 的完成报告都在这里。
package/client.js CHANGED
@@ -188,6 +188,11 @@ window.__ModuleLoader__.load({
188
188
  memberNoTasksBody: '在项目里创建或指派 Task 后,会出现在这里。',
189
189
  taskOwner: '负责人',
190
190
  taskAssignee: '执行',
191
+ teamPulseTitle: '团队动态',
192
+ teamPulseCount: '{n} 个 Task 正在推进',
193
+ teamPulseWorking: '成员已接单',
194
+ teamPulseStarting: '成员已唤醒,正在拆解任务…',
195
+ teamPulseAgents: '运行中:{names}',
191
196
  newProject: '新建项目',
192
197
  addAgent: '添加成员',
193
198
  newProjectMock: 'spike:新建项目属于 S-01 流程,M1 之后接入。',
@@ -483,6 +488,11 @@ window.__ModuleLoader__.load({
483
488
  memberNoTasksBody: 'Create or assign a Task in the Project and it appears here.',
484
489
  taskOwner: 'Owner',
485
490
  taskAssignee: 'Assignee',
491
+ teamPulseTitle: 'Team activity',
492
+ teamPulseCount: '{n} Task(s) in motion',
493
+ teamPulseWorking: 'Members picked up the work',
494
+ teamPulseStarting: 'Members are awake and breaking the work down…',
495
+ teamPulseAgents: 'Running: {names}',
486
496
  newProject: 'New project',
487
497
  addAgent: 'Add member',
488
498
  newProjectMock: 'spike: project creation belongs to S-01 and lands after M1.',
@@ -948,6 +958,18 @@ window.__ModuleLoader__.load({
948
958
  .at-agentfail { flex: none; color: var(--dsw-alias-state-warn-primary); }
949
959
  .at-agentmore { flex: 0 0 auto; width: 28px; height: 28px; border: 0; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-tertiary); font: inherit; font-size: 13px; cursor: pointer; }
950
960
  .at-agentmore:hover { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }
961
+ .at-teampulse { width: 100%; max-width: 760px; margin: 4px auto 10px; padding: 10px 12px; border: 1px solid var(--dsw-alias-state-business-primary); border-radius: var(--dsw-radius-md); background: var(--dsw-alias-bg-module-platform); }
962
+ .at-teampulsehead { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
963
+ .at-teampulsetitle { font-size: 12px; font-weight: 600; color: var(--dsw-alias-label-primary); }
964
+ .at-teampulsecount { font-size: 11px; color: var(--dsw-alias-state-business-primary); }
965
+ .at-teampulselist { display: flex; flex-direction: column; gap: 4px; }
966
+ .at-teampulsetask { display: flex; align-items: center; gap: 7px; width: 100%; padding: 4px 6px; border: 0; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-primary); font: inherit; text-align: left; cursor: pointer; }
967
+ .at-teampulsetask:hover { background: var(--dsw-alias-interactive-bg-hover); }
968
+ .at-teampulseno { flex: 0 0 auto; color: var(--dsw-alias-label-tertiary); font-size: 11px; font-variant-numeric: tabular-nums; }
969
+ .at-teampulsetasktitle { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; }
970
+ .at-teampulseowner { flex: 0 0 auto; color: var(--dsw-alias-label-tertiary); font-size: 11px; }
971
+ .at-teampulsehint { color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }
972
+ .at-teampulseagents { margin-top: 6px; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }
951
973
  .at-memberview { flex: 1 1 auto; min-height: 0; overflow: auto; padding: 18px; }
952
974
  .at-memberviewhead { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; padding-bottom: 12px; border-bottom: 1px solid var(--dsw-alias-border-l1); }
953
975
  .at-memberviewid { display: flex; flex-direction: column; min-width: 0; flex: 1 1 180px; }
@@ -1544,6 +1566,29 @@ window.__ModuleLoader__.load({
1544
1566
  }, '⋯'));
1545
1567
  }
1546
1568
 
1569
+ function TeamPulse({ t, agents, tasks, onOpen }) {
1570
+ const active = tasks.filter((task) => ['pending', 'in_progress', 'pending_acceptance'].includes(task.status)).slice(-5);
1571
+ const running = agents.filter((agent) => agent.status === 'running');
1572
+ if (active.length === 0 && running.length === 0) return null;
1573
+ return h('section', { className: 'at-teampulse', 'aria-label': t('teamPulseTitle') },
1574
+ h('div', { className: 'at-teampulsehead' },
1575
+ h('span', { className: 'at-teampulsetitle' }, t('teamPulseTitle')),
1576
+ h('span', { className: 'at-teampulsecount' }, active.length ? t('teamPulseCount').replace('{n}', String(active.length)) : t('teamPulseWorking'))),
1577
+ active.length
1578
+ ? h('div', { className: 'at-teampulselist' }, active.map((task) => h('button', {
1579
+ key: task.id,
1580
+ className: 'at-teampulsetask',
1581
+ type: 'button',
1582
+ onClick: () => onOpen(task),
1583
+ },
1584
+ h('span', { className: 'at-teampulseno' }, '#' + taskNo(task)),
1585
+ h('span', { className: 'at-teampulsetasktitle' }, task.title),
1586
+ h(StatusPill, { t, status: task.status }),
1587
+ h('span', { className: 'at-teampulseowner' }, task.owner ?? ''))))
1588
+ : h('div', { className: 'at-teampulsehint' }, t('teamPulseStarting')),
1589
+ running.length ? h('div', { className: 'at-teampulseagents' }, t('teamPulseAgents').replace('{names}', running.map((agent) => agent.name).join('、'))) : null);
1590
+ }
1591
+
1547
1592
  function MemberView({ t, agent, tasks, onBack, onOpenTask, onOpenChat, onOpenProfile }) {
1548
1593
  return h('div', { className: 'at-memberview' },
1549
1594
  h('div', { className: 'at-memberviewhead' },
@@ -2921,6 +2966,7 @@ window.__ModuleLoader__.load({
2921
2966
  ? h(Situation, { t, quadrants, tasks, onItem: openQuadrantItem, onViewAll: viewQuadrant })
2922
2967
  : h('div', { className: 'at-stream', role: 'tabpanel', id: 'at-panel-main', 'aria-labelledby': 'at-tab-main' },
2923
2968
  h('div', { className: 'at-streaminner', role: 'log', 'aria-live': 'polite', 'aria-label': t('streamAria') },
2969
+ h(TeamPulse, { t, agents: data.agents, tasks, onOpen: openTask }),
2924
2970
  data.stream.length
2925
2971
  ? data.stream.map((item) => h(StreamMessage, {
2926
2972
  key: item.id,
package/index.js CHANGED
@@ -33,7 +33,7 @@ export const name = 'ai-team';
33
33
  /** The workbench only makes sense where the Web carrier exists. */
34
34
  export const inject = ['webServer', 'permissionPresets', 'sandboxPolicy'];
35
35
 
36
- const VERSION = '0.3.13';
36
+ const VERSION = '0.3.14';
37
37
  const PROJECT_ID = 'prj_main';
38
38
  const HUMAN_ID = 'mem_human';
39
39
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@suifei/dsh-ai-team",
3
- "version": "0.3.13",
3
+ "version": "0.3.14",
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",