@xmanrui/dsh-im 3.0.5 → 3.0.7
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/README.en.md +5 -1
- package/README.md +5 -1
- package/lib/client.js +72 -5
- package/lib/index.js +188 -187
- package/package.json +1 -1
- package/plugin-src/client/i18n.js +5 -0
- package/plugin-src/client/styles.js +15 -1
- package/plugin-src/client/workspace-directory-picker.js +42 -3
- package/plugin-src/host/harness-command-executor.mjs +26 -6
- package/src/channels/shared/i18n-en/weixin.mjs +2 -0
- package/src/channels/weixin/weixin-api.mjs +7 -2
- package/src/channels/weixin/weixin-bridge.mjs +111 -14
package/README.en.md
CHANGED
|
@@ -257,13 +257,14 @@ Without a setting, Chinese is used. Chinese is always the fallback language —
|
|
|
257
257
|
|
|
258
258
|
## Contact
|
|
259
259
|
|
|
260
|
-
You can reach me by email, WeChat, or
|
|
260
|
+
You can reach me by email, WeChat, Xiaohongshu, or WhatsApp.
|
|
261
261
|
|
|
262
262
|
<table>
|
|
263
263
|
<tr>
|
|
264
264
|
<th align="center">Email</th>
|
|
265
265
|
<th align="center">WeChat</th>
|
|
266
266
|
<th align="center">Xiaohongshu</th>
|
|
267
|
+
<th align="center">WhatsApp</th>
|
|
267
268
|
</tr>
|
|
268
269
|
<tr>
|
|
269
270
|
<td align="center" valign="middle">
|
|
@@ -275,5 +276,8 @@ You can reach me by email, WeChat, or Xiaohongshu.
|
|
|
275
276
|
<td align="center" valign="top">
|
|
276
277
|
<a href="docs/images/xhs.jpg"><img src="docs/images/xhs.jpg" alt="Xiaohongshu QR code" width="240"></a>
|
|
277
278
|
</td>
|
|
279
|
+
<td align="center" valign="top">
|
|
280
|
+
<a href="docs/images/WhatsApp.jpg"><img src="docs/images/WhatsApp.jpg" alt="WhatsApp QR code" width="240"></a>
|
|
281
|
+
</td>
|
|
278
282
|
</tr>
|
|
279
283
|
</table>
|
package/README.md
CHANGED
|
@@ -260,13 +260,14 @@ IM 管理 RPC 默认仅接受回环浏览器。如果 Web profile 在受信任
|
|
|
260
260
|
|
|
261
261
|
## 联系方式
|
|
262
262
|
|
|
263
|
-
|
|
263
|
+
欢迎通过邮箱、微信、小红书或 WhatsApp 联系我。
|
|
264
264
|
|
|
265
265
|
<table>
|
|
266
266
|
<tr>
|
|
267
267
|
<th align="center">邮箱</th>
|
|
268
268
|
<th align="center">微信</th>
|
|
269
269
|
<th align="center">小红书</th>
|
|
270
|
+
<th align="center">WhatsApp</th>
|
|
270
271
|
</tr>
|
|
271
272
|
<tr>
|
|
272
273
|
<td align="center" valign="middle">
|
|
@@ -278,5 +279,8 @@ IM 管理 RPC 默认仅接受回环浏览器。如果 Web profile 在受信任
|
|
|
278
279
|
<td align="center" valign="top">
|
|
279
280
|
<a href="docs/images/xhs.jpg"><img src="docs/images/xhs.jpg" alt="小红书二维码" width="240"></a>
|
|
280
281
|
</td>
|
|
282
|
+
<td align="center" valign="top">
|
|
283
|
+
<a href="docs/images/WhatsApp.jpg"><img src="docs/images/WhatsApp.jpg" alt="WhatsApp 二维码" width="240"></a>
|
|
284
|
+
</td>
|
|
281
285
|
</tr>
|
|
282
286
|
</table>
|
package/lib/client.js
CHANGED
|
@@ -47,7 +47,7 @@ var React20 = __toESM(require("react"), 1);
|
|
|
47
47
|
// package.json
|
|
48
48
|
var package_default = {
|
|
49
49
|
name: "@xmanrui/dsh-im",
|
|
50
|
-
version: "3.0.
|
|
50
|
+
version: "3.0.7",
|
|
51
51
|
description: "\u628A\u4E5D\u79CD IM \u673A\u5668\u4EBA\u548C\u516C\u7F51 AI Office \u63A5\u5165\u672C\u673A DeepSeek Harness\u3002 Connect nine IM channels and a public AI Office to a local DeepSeek Harness.",
|
|
52
52
|
keywords: [
|
|
53
53
|
"deepseek-harness",
|
|
@@ -423,6 +423,11 @@ var EN = Object.freeze({
|
|
|
423
423
|
"\u9009\u62E9\u673A\u5668\u4EBA\u5DE5\u4F5C\u533A\u76EE\u5F55": "Select bot workspace folder",
|
|
424
424
|
"\u5F53\u524D\u76EE\u5F55": "Current folder",
|
|
425
425
|
"\u4E3B\u76EE\u5F55": "Home",
|
|
426
|
+
"\u76F4\u63A5\u8F93\u5165\u8DEF\u5F84": "Enter a path directly",
|
|
427
|
+
"\u652F\u6301 Windows \u76D8\u7B26\u3001UNC \u4E0E POSIX \u7EDD\u5BF9\u8DEF\u5F84\u3002": "Supports Windows drives, UNC paths, and POSIX absolute paths.",
|
|
428
|
+
"\u8F93\u5165 Host \u4E0A\u7684\u5B8C\u6574\u7EDD\u5BF9\u8DEF\u5F84": "Enter a full absolute path on the Host",
|
|
429
|
+
"\u524D\u5F80": "Go",
|
|
430
|
+
"\u8BFB\u53D6\u4E2D\u2026": "Loading\u2026",
|
|
426
431
|
"\u6B63\u5728\u51C6\u5907\u76EE\u5F55\u9009\u62E9\u5668\u2026": "Preparing folder picker\u2026",
|
|
427
432
|
"\u6B63\u5728\u8BFB\u53D6\u76EE\u5F55\u2026": "Loading folders\u2026",
|
|
428
433
|
"\u8FD9\u4E2A\u76EE\u5F55\u4E2D\u6CA1\u6709\u5B50\u6587\u4EF6\u5939\u3002": "This folder has no subfolders.",
|
|
@@ -1548,6 +1553,7 @@ function WorkspaceDirectoryPicker({
|
|
|
1548
1553
|
const [listing, setListing] = React5.useState(null);
|
|
1549
1554
|
const [loading, setLoading] = React5.useState(false);
|
|
1550
1555
|
const [error, setError] = React5.useState(null);
|
|
1556
|
+
const [pathDraft, setPathDraft] = React5.useState(startPath ?? "");
|
|
1551
1557
|
const [showHidden, setShowHidden] = React5.useState(false);
|
|
1552
1558
|
const [retryKey, setRetryKey] = React5.useState(0);
|
|
1553
1559
|
const requestRef = React5.useRef(0);
|
|
@@ -1556,6 +1562,8 @@ function WorkspaceDirectoryPicker({
|
|
|
1556
1562
|
const bodyRef = React5.useRef(null);
|
|
1557
1563
|
const titleId = React5.useId();
|
|
1558
1564
|
const noticeId = React5.useId();
|
|
1565
|
+
const pathInputId = React5.useId();
|
|
1566
|
+
const errorId = React5.useId();
|
|
1559
1567
|
const initialPathRef = React5.useRef(startPath);
|
|
1560
1568
|
const onPickedRef = React5.useRef(onPicked);
|
|
1561
1569
|
const onCancelRef = React5.useRef(onCancel);
|
|
@@ -1576,6 +1584,7 @@ function WorkspaceDirectoryPicker({
|
|
|
1576
1584
|
if (request !== requestRef.current || controller.signal.aborted) return { aborted: true };
|
|
1577
1585
|
if (bodyRef.current) bodyRef.current.scrollTop = 0;
|
|
1578
1586
|
setListing(next);
|
|
1587
|
+
if (typeof next?.path === "string") setPathDraft(next.path);
|
|
1579
1588
|
setError(null);
|
|
1580
1589
|
return { value: next };
|
|
1581
1590
|
} catch (cause) {
|
|
@@ -1591,6 +1600,7 @@ function WorkspaceDirectoryPicker({
|
|
|
1591
1600
|
let active = true;
|
|
1592
1601
|
setListing(null);
|
|
1593
1602
|
setError(null);
|
|
1603
|
+
setPathDraft(initialPathRef.current ?? "");
|
|
1594
1604
|
setShowHidden(false);
|
|
1595
1605
|
dialogRef.current?.focus?.();
|
|
1596
1606
|
const handleKeyDown = (event) => {
|
|
@@ -1637,6 +1647,7 @@ function WorkspaceDirectoryPicker({
|
|
|
1637
1647
|
const entries = (listing?.entries ?? []).filter((entry) => showHidden || !entry.hidden);
|
|
1638
1648
|
const crumbs = listing ? displayCrumbs(listing) : [];
|
|
1639
1649
|
const presentedError = saveError ?? error;
|
|
1650
|
+
const pathReady = listing !== null && pathDraft === listing.path;
|
|
1640
1651
|
const content = h2(
|
|
1641
1652
|
"div",
|
|
1642
1653
|
{
|
|
@@ -1675,7 +1686,49 @@ function WorkspaceDirectoryPicker({
|
|
|
1675
1686
|
onClick: () => void loadDirectory(crumb.path)
|
|
1676
1687
|
}, crumb.path === listing.home ? h2("span", null, "\u4E3B\u76EE\u5F55") : crumb.name || crumb.path)
|
|
1677
1688
|
))
|
|
1678
|
-
) : h2("p", null, "\u6B63\u5728\u51C6\u5907\u76EE\u5F55\u9009\u62E9\u5668\u2026")
|
|
1689
|
+
) : h2("p", null, "\u6B63\u5728\u51C6\u5907\u76EE\u5F55\u9009\u62E9\u5668\u2026"),
|
|
1690
|
+
h2(
|
|
1691
|
+
"form",
|
|
1692
|
+
{
|
|
1693
|
+
className: "dim-directoryPathForm",
|
|
1694
|
+
onSubmit: (event) => {
|
|
1695
|
+
event.preventDefault();
|
|
1696
|
+
if (!busy && !loading && pathDraft.trim()) void loadDirectory(pathDraft);
|
|
1697
|
+
}
|
|
1698
|
+
},
|
|
1699
|
+
h2(
|
|
1700
|
+
"div",
|
|
1701
|
+
{ className: "dim-directoryPathMeta" },
|
|
1702
|
+
h2("label", { htmlFor: pathInputId }, "\u76F4\u63A5\u8F93\u5165\u8DEF\u5F84"),
|
|
1703
|
+
h2("span", null, "\u652F\u6301 Windows \u76D8\u7B26\u3001UNC \u4E0E POSIX \u7EDD\u5BF9\u8DEF\u5F84\u3002")
|
|
1704
|
+
),
|
|
1705
|
+
h2(
|
|
1706
|
+
"div",
|
|
1707
|
+
{ className: "dim-directoryPathControl" },
|
|
1708
|
+
h2("input", {
|
|
1709
|
+
id: pathInputId,
|
|
1710
|
+
className: "dim-directoryPathInput",
|
|
1711
|
+
value: pathDraft,
|
|
1712
|
+
placeholder: "\u8F93\u5165 Host \u4E0A\u7684\u5B8C\u6574\u7EDD\u5BF9\u8DEF\u5F84",
|
|
1713
|
+
"aria-label": "\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84",
|
|
1714
|
+
"aria-describedby": presentedError ? errorId : void 0,
|
|
1715
|
+
"aria-invalid": presentedError ? "true" : void 0,
|
|
1716
|
+
autoCapitalize: "none",
|
|
1717
|
+
autoCorrect: "off",
|
|
1718
|
+
spellCheck: false,
|
|
1719
|
+
maxLength: 4096,
|
|
1720
|
+
disabled: busy || loading,
|
|
1721
|
+
onChange: (event) => {
|
|
1722
|
+
setPathDraft(event.target.value);
|
|
1723
|
+
setError(null);
|
|
1724
|
+
}
|
|
1725
|
+
}),
|
|
1726
|
+
h2("button", {
|
|
1727
|
+
type: "submit",
|
|
1728
|
+
disabled: busy || loading || !pathDraft.trim()
|
|
1729
|
+
}, loading ? "\u8BFB\u53D6\u4E2D\u2026" : "\u524D\u5F80")
|
|
1730
|
+
)
|
|
1731
|
+
)
|
|
1679
1732
|
),
|
|
1680
1733
|
h2(
|
|
1681
1734
|
"div",
|
|
@@ -1708,7 +1761,7 @@ function WorkspaceDirectoryPicker({
|
|
|
1708
1761
|
listing?.truncated ? h2("p", { className: "dim-directoryPickerTruncated" }, "\u6B64\u76EE\u5F55\u7684\u5B50\u6587\u4EF6\u5939\u8FC7\u591A\uFF0C\u4EC5\u663E\u793A\u524D\u4E00\u90E8\u5206\u3002") : null,
|
|
1709
1762
|
presentedError ? h2(
|
|
1710
1763
|
"div",
|
|
1711
|
-
{ className: "dim-directoryPickerError", role: "alert" },
|
|
1764
|
+
{ id: errorId, className: "dim-directoryPickerError", role: "alert" },
|
|
1712
1765
|
h2("span", null, presentedError),
|
|
1713
1766
|
!listing && !busy ? h2("button", {
|
|
1714
1767
|
type: "button",
|
|
@@ -1739,7 +1792,7 @@ function WorkspaceDirectoryPicker({
|
|
|
1739
1792
|
h2("button", {
|
|
1740
1793
|
type: "button",
|
|
1741
1794
|
className: "dim-directoryPickerPrimary",
|
|
1742
|
-
disabled: busy || loading || !
|
|
1795
|
+
disabled: busy || loading || !pathReady,
|
|
1743
1796
|
onClick: () => listing && void onPicked(listing.path)
|
|
1744
1797
|
}, busy ? "\u5207\u6362\u4E2D\u2026" : "\u9009\u62E9\u6B64\u76EE\u5F55")
|
|
1745
1798
|
)
|
|
@@ -10501,8 +10554,21 @@ var CSS11 = String.raw`
|
|
|
10501
10554
|
.dim-directoryCrumbs button { max-width: 210px; overflow: hidden; padding: 3px 5px; border: 0; border-radius: 6px; color: var(--dsw-alias-label-secondary, #646a73); background: transparent; font: inherit; font-size: 12px; line-height: 18px; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; }
|
|
10502
10555
|
.dim-directoryCrumbs button:hover:not(:disabled) { color: var(--dim-blue); background: var(--dim-blue-soft); }
|
|
10503
10556
|
.dim-directoryCrumbs button[aria-current="page"] { color: var(--dsw-alias-label-primary, #1f2329); font-weight: 650; }
|
|
10504
|
-
.dim-directoryCrumbs button:focus-visible, .dim-directoryList button:focus-visible, .dim-directoryPickerActions button:focus-visible { outline: 2px solid color-mix(in srgb, var(--dim-blue) 65%, white); outline-offset: 1px; }
|
|
10557
|
+
.dim-directoryCrumbs button:focus-visible, .dim-directoryPathInput:focus-visible, .dim-directoryPathControl button:focus-visible, .dim-directoryList button:focus-visible, .dim-directoryPickerActions button:focus-visible { outline: 2px solid color-mix(in srgb, var(--dim-blue) 65%, white); outline-offset: 1px; }
|
|
10505
10558
|
.dim-directoryCrumbSeparator { flex: none; font-size: 12px; }
|
|
10559
|
+
.dim-directoryPathForm { display: grid; gap: 7px; margin-top: 14px; }
|
|
10560
|
+
.dim-directoryPathMeta { min-width: 0; display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
|
|
10561
|
+
.dim-directoryPathMeta label { flex: none; color: var(--dsw-alias-label-secondary, #646a73); font-size: 12px; font-weight: 650; }
|
|
10562
|
+
.dim-directoryPathMeta span { min-width: 0; overflow: hidden; color: var(--dsw-alias-label-tertiary, #8f959e); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
|
|
10563
|
+
.dim-directoryPathControl { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) max-content; gap: 8px; }
|
|
10564
|
+
.dim-directoryPathInput { min-width: 0; height: 38px; padding: 0 11px; border: 1px solid var(--dsw-alias-border-l2, #dfe1e5); border-radius: 8px; color: var(--dsw-alias-label-primary, #1f2329); background: var(--dsw-alias-bg-layer-1, #fff); font: 12px ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; line-height: 38px; }
|
|
10565
|
+
.dim-directoryPathInput::placeholder { color: var(--dsw-alias-label-tertiary, #8f959e); }
|
|
10566
|
+
.dim-directoryPathInput:hover:not(:disabled) { border-color: var(--dsw-alias-border-l3, #bbbfc4); }
|
|
10567
|
+
.dim-directoryPathInput:focus { border-color: var(--dim-blue); }
|
|
10568
|
+
.dim-directoryPathInput[aria-invalid="true"] { border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d54941) 62%, var(--dsw-alias-border-l2, #dfe1e5)); }
|
|
10569
|
+
.dim-directoryPathControl button { min-height: 38px; padding: 0 14px; border: 1px solid color-mix(in srgb, var(--dim-blue) 30%, var(--dsw-alias-border-l2, #dfe1e5)); border-radius: 8px; color: var(--dim-blue); background: var(--dim-blue-soft); font: inherit; font-size: 13px; font-weight: 650; cursor: pointer; }
|
|
10570
|
+
.dim-directoryPathControl button:hover:not(:disabled) { border-color: color-mix(in srgb, var(--dim-blue) 48%, var(--dsw-alias-border-l2, #dfe1e5)); background: color-mix(in srgb, var(--dim-blue) 13%, transparent); }
|
|
10571
|
+
.dim-directoryPathInput:disabled, .dim-directoryPathControl button:disabled { cursor: not-allowed; opacity: .55; }
|
|
10506
10572
|
.dim-directoryPickerBody { min-height: 0; overflow-y: auto; padding: 14px 16px; scrollbar-width: thin; scrollbar-color: var(--dsw-alias-border-l2, #dfe1e5) transparent; }
|
|
10507
10573
|
.dim-directoryList { display: grid; gap: 3px; margin: 0; padding: 0; list-style: none; }
|
|
10508
10574
|
.dim-directoryList button { width: 100%; min-height: 46px; display: grid; grid-template-columns: 24px minmax(0, 1fr) 18px; align-items: center; gap: 10px; padding: 7px 11px; border: 0; border-radius: 9px; color: var(--dsw-alias-label-primary, #1f2329); background: transparent; font: inherit; text-align: left; cursor: pointer; }
|
|
@@ -10596,6 +10662,7 @@ var CSS11 = String.raw`
|
|
|
10596
10662
|
.dim-directoryPicker { height: calc(100vh - 20px); min-height: 0; border-radius: 14px; }
|
|
10597
10663
|
.dim-directoryPickerHeader { padding: 18px 17px 14px; }
|
|
10598
10664
|
.dim-directoryPickerHeader h3 { font-size: 18px; }
|
|
10665
|
+
.dim-directoryPathMeta span { display: none; }
|
|
10599
10666
|
.dim-directoryPickerBody { padding: 10px; }
|
|
10600
10667
|
.dim-directoryPickerFooter { grid-template-columns: minmax(0, 1fr) max-content; gap: 10px; padding: 13px 14px; }
|
|
10601
10668
|
.dim-directoryPickerNotice { grid-column: 1 / -1; grid-row: 1; text-align: left; }
|