@twinsearth/w2m-dsh-plugin 1.9.5 → 1.9.6

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.
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "The w2m fleet plugins: one account, many machines, any of Windows, macOS or Linux.",
8
- "version": "1.9.5"
8
+ "version": "1.9.6"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "w2m-fleet",
13
13
  "source": "./",
14
14
  "description": "Read fleet state and dispatch commands across the machines registered to one account. Read-only MCP surface: the five exposed tools cannot change anything.",
15
- "version": "1.9.5",
15
+ "version": "1.9.6",
16
16
  "author": {
17
17
  "name": "TwinsEarth"
18
18
  },
@@ -26,5 +26,5 @@
26
26
  ]
27
27
  }
28
28
  ],
29
- "version": "1.9.5"
29
+ "version": "1.9.6"
30
30
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "w2m-fleet",
3
3
  "description": "Drive the same project on online Windows, macOS and Linux machines from one account: read fleet state, dispatch commands and read results. The MCP surface is deliberately read-only.",
4
- "version": "1.9.5",
4
+ "version": "1.9.6",
5
5
  "author": {
6
6
  "name": "TwinsEarth"
7
7
  },
package/CHANGELOG.md CHANGED
@@ -7,10 +7,13 @@
7
7
 
8
8
  All notable changes to this project are documented here.
9
9
 
10
- ## [1.9.5] - 2026-10-27
11
-
10
+ ## [1.9.6] - 2026-10-28
11
+ - 修复:左侧栏 GPW 点击无效。侧栏入口改用 `main` 槽位(key 与 panellist id 一致),点击切换到主工作区的完整 GPW 页面。
12
+ - GPW 页面改为主工作区整页布局(960px 内容、独立滚动、卡片化分区),不再是右下角弹窗形态。
13
+ - 修复:设置页 GPW 标签沿用设置页样式(与通用设置页一致的卡片/分区)。
14
+ - 新增:「编队群组」对话视图标签(conversation.view,order 2,位于对话与规矩之后),点击进入主工作区完整聊天页;聊天页支持内置表情,参考群聊布局(消息区+输入区+表情行)。
15
+ - 底部状态栏保持:本编队在线/总数、全部机器在线/总数。
12
16
  本次为 v1.9.5 五方发布(1.9.4 未发布,内容并入本版本)。
13
-
14
17
  - 顶部标签栏新增「编队聊天」入口:点击进入完整分页面,支持内置表情。
15
18
  - 底部状态栏常驻显示:本编队在线/总数、全部机器在线/总数,无需展开 Composer 的机器列表。
16
19
  - 左侧导航栏新增 GPW 入口(🌐 图标),位于插件与自动化任务之间;点击进入完整分页面(960px 工作区),右下角浮标与 Composer 入口保持不变。
@@ -18,6 +21,8 @@ All notable changes to this project are documented here.
18
21
  - 插件详情页(与卸载按钮同页)新增「W2M 插件更新」:检测更新、立即更新、自动更新开关;安装完成后自动刷新页面,无需卸载、无需重启应用。
19
22
  - 更新检测打开即执行;旧版本直接显示新版本号与安装按钮;npm 镜像失败回退 registry.npmjs.org。
20
23
 
24
+ ## [1.9.5] - 2026-10-27
25
+
21
26
  ## [1.9.3] - 2026-10-27
22
27
  - 左侧边栏新增常驻 GPW 入口(默认显示、无关闭按钮),Composer 与右下角浮窗保留。
23
28
  - 插件设置页新增“W2M 插件更新”分区:检测更新、发现新版本后立即安装、自动更新开关(开启后每次启动自动安装)。
@@ -12,6 +12,6 @@
12
12
 
13
13
  [mcp_servers.w2m-fleet]
14
14
  command = "npx"
15
- args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@1.9.5", "w2m-mcp"]
15
+ args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@1.9.6", "w2m-mcp"]
16
16
  startup_timeout_sec = 20
17
17
  tool_timeout_sec = 60
@@ -0,0 +1,22 @@
1
+ {
2
+ "version": "1.9.6",
3
+ "case": "RELEASE-196",
4
+ "kind": "positive",
5
+ "machines": [
6
+ "b53a37f4-1464-4512-9259-33a7df091e3e"
7
+ ],
8
+ "executed_at": "2026-10-27T21:33:24.367Z",
9
+ "executor": "lead",
10
+ "task_id": "pre-release-196-1793136804369",
11
+ "requirement": "V1.9.6:GPW 侧栏可切换到主工作区整页;设置页 GPW 标签;编队群组对话视图;底部编队状态栏",
12
+ "result": {
13
+ "outcome": "ok",
14
+ "assertions": {
15
+ "gpw_nav": "sidebar.panellist id w2m-gpw + main slot key w2m-gpw",
16
+ "gpw_page": "full main-workspace page, 960px, sections",
17
+ "settings_tab": "settings.section order 12",
18
+ "chat_view": "conversation.view id w2m-chat order 2 with emoji row",
19
+ "status_bar": "shell.bottom fleet/server counts"
20
+ }
21
+ }
22
+ }
package/lib/client.js CHANGED
@@ -499,6 +499,12 @@ const PLUGIN_UPDATE_ROUTE = '/api/w2m/plugin-update';
499
499
  '.w2mChat_emoji{padding:2px 4px;border:0;background:transparent;font-size:16px;line-height:1;cursor:pointer}',
500
500
  '.w2mFleetStatus{display:flex;gap:16px;align-items:center;padding:2px 12px;font-size:11px;opacity:.8;white-space:nowrap}',
501
501
  '.w2mFleetStatusItem{white-space:nowrap}',
502
+ '.w2mGpw_mainWrap{height:100%;min-height:0;overflow-y:auto;padding:24px 16px 48px;box-sizing:border-box}',
503
+ '.w2mGpw_mainWrap .w2mGpw_inline{max-width:960px;margin:0 auto}',
504
+ '.w2mGpw_mainWrap .w2mGpw_card{width:100%;max-width:none;max-height:none;position:static;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-background-secondary)}',
505
+ '.w2mGpw_settingsBody .w2mGpw_inline{max-width:960px;margin:0 auto}',
506
+ '.w2mChat_view{position:static;inset:auto;width:100%;max-height:none;height:100%;border-radius:0}',
507
+ '.w2mChat_view .w2mChat_list{max-height:none;flex:1;min-height:0}',
502
508
  '.w2mGpw_fullPage{position:fixed;inset:0;z-index:80;display:flex;flex-direction:column;background:var(--dsw-alias-background-primary)}',
503
509
  '.w2mGpw_fullHead{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid rgba(127,127,127,.25)}',
504
510
  '.w2mGpw_fullTitle{font-size:14px;font-weight:600}',
@@ -780,6 +786,11 @@ const PLUGIN_UPDATE_ROUTE = '/api/w2m/plugin-update';
780
786
  ]);
781
787
  }
782
788
 
789
+ /** v1.9.6: the GPW page rendered in the main workspace (slot main, key w2m-gpw). */
790
+ function GpwMainPage({ t }) {
791
+ return h('div', { className: 'w2mGpw_mainWrap' }, h(GpwPanel, { t, sessionId: undefined, inline: true, onClose: () => {} }));
792
+ }
793
+
783
794
  /** v1.9.4: the GPW tab in Settings, between Models and Plugins. */
784
795
  function GpwSettingsPage({ t }) {
785
796
  return h('div', { className: 'w2mGpw_settingsBody' }, h(GpwPanel, { t, sessionId: undefined, inline: true, onClose: () => {} }));
@@ -1336,7 +1347,7 @@ function TargetSelect({ sessionId, locked: _locked, t }) {
1336
1347
  }
1337
1348
 
1338
1349
  /** v1.9.4: the fleet-chat tab in the top bar; opens the full workspace page. */
1339
- function FleetChatTab() {
1350
+ function _FleetChatTab() {
1340
1351
  return h('button', {
1341
1352
  type: 'button',
1342
1353
  className: 'w2mChatTab',
@@ -1373,7 +1384,7 @@ function TargetSelect({ sessionId, locked: _locked, t }) {
1373
1384
  ]);
1374
1385
  }
1375
1386
 
1376
- function FleetChat({ sessionId }) {
1387
+ function FleetChat({ sessionId, viewMode }) {
1377
1388
  const CHAT_EMOJIS = ['👍', '✅', '🚀', '😄', '❤️', '🎉', '🔧', '📌'];
1378
1389
  const [open, setOpen] = React.useState(false);
1379
1390
  const [messages, setMessages] = React.useState([]);
@@ -1399,6 +1410,7 @@ function TargetSelect({ sessionId, locked: _locked, t }) {
1399
1410
  // v1.7.2: screenshot state is clipboard-only (no preview); `toast` is the only visible feedback.
1400
1411
  const [shotBusy, setShotBusy] = React.useState(false);
1401
1412
  const [chatFull, setChatFull] = React.useState(false);
1413
+ React.useEffect(() => { if (viewMode === true) setOpen(true); }, [viewMode]);
1402
1414
  React.useEffect(() => {
1403
1415
  const onFull = () => { setChatFull(true); setOpen(true); };
1404
1416
  window.addEventListener('w2m-chat-full', onFull);
@@ -1649,7 +1661,7 @@ function TargetSelect({ sessionId, locked: _locked, t }) {
1649
1661
  onClick: () => setOpen((value) => !value),
1650
1662
  }, '💬', h('span', { className: 'w2mChat_label' }, '编队聊天'), unseenCount > 0 && !open ? h('span', { className: 'w2mChat_unseen' }, String(unseenCount)) : null),
1651
1663
  open
1652
- ? h('div', { className: chatFull ? 'w2mChat_panel w2mChat_panelFull' : 'w2mChat_panel', role: 'dialog', 'aria-label': '编队聊天' },
1664
+ ? h('div', { className: 'w2mChat_panel' + (chatFull || viewMode === true ? ' w2mChat_panelFull' : '') + (viewMode === true ? ' w2mChat_view' : ''), role: 'dialog', 'aria-label': '编队聊天' },
1653
1665
  h('div', { className: 'w2mChat_head' },
1654
1666
  h('select', {
1655
1667
  className: 'w2mChat_to',
@@ -1920,6 +1932,17 @@ function TargetSelect({ sessionId, locked: _locked, t }) {
1920
1932
  } catch (error) {
1921
1933
  console.error('@twinsearth/w2m-dsh-plugin: the sidebar GPW entry was not mounted; the composer and launcher still work', error);
1922
1934
  }
1935
+ // v1.9.6: the page the sidebar row switches to; the key must match the panellist id.
1936
+ try {
1937
+ slots.inject('main', () => slots.register({
1938
+ name: 'main',
1939
+ key: 'w2m-gpw',
1940
+ label: () => 'GPW 文件夹策略',
1941
+ inject: () => ({ t }),
1942
+ }, GpwMainPage));
1943
+ } catch (error) {
1944
+ console.error('@twinsearth/w2m-dsh-plugin: the GPW main page was not mounted', error);
1945
+ }
1923
1946
  // v1.9.3: check-update + auto-update on the plugin settings page.
1924
1947
  try {
1925
1948
  slots.inject('settings.section', () => slots.register({
@@ -1971,17 +1994,18 @@ function TargetSelect({ sessionId, locked: _locked, t }) {
1971
1994
 
1972
1995
 
1973
1996
 
1974
- // v1.9.4: fleet chat in the top bar and the fleet counts in the bottom bar.
1997
+ // v1.9.6: fleet chat as a real conversation View tab (after Chat and Rules), rendering the
1998
+ // full chat page in the main workspace.
1975
1999
  try {
1976
- slots.inject('conversation.header.views.actions', () => slots.register({
1977
- name: 'conversation.header.views.actions',
1978
- id: 'w2m-chat-tab',
1979
- order: 10,
1980
- label: () => '编队聊天',
1981
- inject: () => ({}),
1982
- }, FleetChatTab));
2000
+ slots.inject('conversation.view', () => slots.register({
2001
+ name: 'conversation.view',
2002
+ id: 'w2m-chat',
2003
+ order: 2,
2004
+ label: () => '编队群组',
2005
+ inject: (sessionId) => ({ sessionId, viewMode: true }),
2006
+ }, FleetChat));
1983
2007
  } catch (error) {
1984
- console.error('@twinsearth/w2m-dsh-plugin: the fleet-chat tab was not mounted', error);
2008
+ console.error('@twinsearth/w2m-dsh-plugin: the fleet-chat view tab was not mounted', error);
1985
2009
  }
1986
2010
  try {
1987
2011
  slots.inject('shell.bottom', () => slots.register({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/w2m-dsh-plugin",
3
- "version": "1.9.5",
3
+ "version": "1.9.6",
4
4
  "description": "Run one project across your own Windows and macOS machines from a single DeepSeek account, through 11 w2m_* tools. Four coordination modes (replicate, split, broadcast, pipeline) and six aggregate verdicts (consistent, divergent, divergent-platform, failed, partial, unverifiable). P2P hole punching by default, with a bundled relay, STUN responder and ledger fallback, so the fleet needs no third-party service. Joining needs a pairing code plus autoStartAgent: true; installing alone does not join.",
5
5
  "type": "module",
6
6
  "exports": {
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "twinsearth-w2m-dsh",
4
- "version": "1.9.5",
4
+ "version": "1.9.6",
5
5
  "description": "Run one project across your own Windows and macOS machines from a single DeepSeek account, through 12 w2m_* tools. Four coordination modes (replicate, split, broadcast, pipeline) and six aggregate verdicts (consistent, divergent, divergent-platform, failed, partial, unverifiable). P2P hole punching by default, with a bundled relay, STUN responder and ledger fallback, so the fleet needs no third-party service. Joining needs a pairing code plus autoStartAgent: true; installing alone does not join.",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -283,7 +283,7 @@ const MAX_STAGES = 16;
283
283
  * `package.json` during `scripts/pack.mjs` rather than hand-maintained, and `W2M_PLUGIN_VERSION`
284
284
  * overrides it at runtime for tests and packagers.
285
285
  */
286
- const PLUGIN_VERSION = '1.9.5';
286
+ const PLUGIN_VERSION = '1.9.6';
287
287
 
288
288
  /** How long any single HTTP call may take before it is aborted, in milliseconds. */
289
289
  const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;