mu-agent-bridge 1.0.47 → 1.0.53
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/dist/packages/mu-agent-bridge-1.0.53.tgz +0 -0
- package/dist/src-ts/plugins/workbuddy/cdp-client.js +1 -1
- package/dist/tests-ts/installer-assets.test.js +7 -0
- package/dist/tests-ts/workbuddy-plugin.test.js +16 -0
- package/package.json +1 -1
- package/plugins/workbuddy/dist/src-ts/plugins/workbuddy/cdp-client.js +1 -1
- package/plugins/workbuddy/package.json +1 -1
|
Binary file
|
|
@@ -108,7 +108,7 @@ class WorkbuddyCdpClient {
|
|
|
108
108
|
const before = await this.evaluate(`(() => { const state = ${snapshot}; const loginRequired = [...document.querySelectorAll('a,button,[role="button"]')].some(item => /^(?:登录|立即登录|sign in)$/i.test(item.textContent?.trim() ?? '')); return { ...state, loginRequired }; })()`);
|
|
109
109
|
if (before.loginRequired)
|
|
110
110
|
throw new Error("WorkBuddy 尚未登录,请先在桌面端登录后重试");
|
|
111
|
-
if (!await this.evaluate(`(() => { const button = [...document.querySelectorAll('button,[role="button"]')].find(
|
|
111
|
+
if (!await this.evaluate(`(() => { const button = [...document.querySelectorAll('button,[role="button"]')].find(item => { const label = [item.innerText, item.textContent, item.getAttribute('aria-label'), item.getAttribute('title'), item.getAttribute('data-testid')].filter(Boolean).map(value => String(value).normalize('NFKC').replace(/\\s+/g, ' ').trim().toLowerCase()); return label.some(value => /^(?:新建任务|新建会话|新建对话|开始新任务|new (?:task|chat|conversation))$/.test(value)) && (!item.getClientRects || item.getClientRects().length > 0); }); if (!button || button.disabled || button.getAttribute('aria-disabled') === 'true') return false; button.click(); return true; })()`))
|
|
112
112
|
throw new Error("WorkBuddy 新建任务入口未找到或不可用");
|
|
113
113
|
// WorkBuddy 首页不分配任务 ID;此时仅接受无选中任务的空白首页。
|
|
114
114
|
await this.waitFor(`(() => { const state = ${snapshot}; const blank = state.editor !== null && state.editor.trim() === '' && state.messages === 0; return blank && ((state.conversationId && state.conversationId !== ${JSON.stringify(before.conversationId)}) || state.url !== ${JSON.stringify(before.url)} || (state.home && !state.selected)); })()`, "WorkBuddy 新任务状态校验失败");
|
|
@@ -52,6 +52,9 @@ const node_util_1 = require("node:util");
|
|
|
52
52
|
strict_1.default.match(setup, /\[void\]\$grid\.EndEdit\(\)/);
|
|
53
53
|
strict_1.default.match(setup, /\$grid\.Rows\.Add\(\$true, \$aid, \$null\)/);
|
|
54
54
|
strict_1.default.match(setup, /显示详细信息/);
|
|
55
|
+
strict_1.default.match(setup, /WizardBusyTimer/);
|
|
56
|
+
strict_1.default.match(setup, /timer\.Interval = 120/);
|
|
57
|
+
strict_1.default.match(setup, /⟳/);
|
|
55
58
|
strict_1.default.match(setup, /环境与桥接服务/);
|
|
56
59
|
strict_1.default.match(setup, /Get-ChildItem -LiteralPath \$root -Filter \$fileName -File -Recurse/);
|
|
57
60
|
strict_1.default.match(setup, /api\/plugins\/\$agent\/config/);
|
|
@@ -105,6 +108,10 @@ const node_util_1 = require("node:util");
|
|
|
105
108
|
strict_1.default.match(setup, /taskkill\.exe \/PID/);
|
|
106
109
|
strict_1.default.match(setup, /function Stop-BridgeDaemons/);
|
|
107
110
|
strict_1.default.match(setup, /api\/plugins\/aun\/commands/);
|
|
111
|
+
const bindingFlow = setup.slice(setup.indexOf('function Invoke-GuiBindingPlan'), setup.indexOf('\ntry {\n Initialize-WizardGui'));
|
|
112
|
+
strict_1.default.match(bindingFlow, /api\/plugins\/aun\/identities/);
|
|
113
|
+
strict_1.default.match(bindingFlow, /Method Patch -Uri "http:\/\/127\.0\.0\.1:\$port\/api\/plugins\/\$agent\/aid"/);
|
|
114
|
+
strict_1.default.doesNotMatch(bindingFlow, /Invoke-AunCommand @\('(?:list|bind)'/);
|
|
108
115
|
strict_1.default.doesNotMatch(setup, /Invoke-Mab/);
|
|
109
116
|
strict_1.default.match(setup, /Read-Host '输入 YES 关闭 WorkBuddy 并以 CDP 模式重启'\)\.Trim\(\) -ne 'YES'/);
|
|
110
117
|
strict_1.default.match(setup, /确认改为 \$agent?输入 YES 继续\"\)\.Trim\(\) -ne 'YES'/);
|
|
@@ -956,6 +956,22 @@ const cdp_client_1 = require("../src-ts/plugins/workbuddy/cdp-client");
|
|
|
956
956
|
await client.createTask();
|
|
957
957
|
}
|
|
958
958
|
});
|
|
959
|
+
(0, node_test_1.default)("workbuddy CDP 通过无障碍名称识别无可见文字的新建任务图标", async () => {
|
|
960
|
+
let conversationId = "old-conversation";
|
|
961
|
+
let messages = 1;
|
|
962
|
+
const button = { textContent: "", getAttribute: (name) => name === "aria-label" ? "新建任务" : null, disabled: false, click: () => { conversationId = null; messages = 0; }, getClientRects: () => [{}] };
|
|
963
|
+
const editor = { innerText: "今天帮你做些什么?", querySelector: () => conversationId === null ? {} : null, cloneNode: () => ({ textContent: "", querySelectorAll: () => [] }) };
|
|
964
|
+
const document = {
|
|
965
|
+
querySelectorAll: (selector) => selector === '.cr-agent[data-message-id]' ? Array(messages).fill({}) : selector === '[data-conversation-id]' ? conversationId ? [{ className: "_selected_old", getAttribute: () => conversationId }] : [] : [button],
|
|
966
|
+
querySelector: () => editor,
|
|
967
|
+
};
|
|
968
|
+
const client = new cdp_client_1.WorkbuddyCdpClient({ timeoutMs: 1 });
|
|
969
|
+
const internal = client;
|
|
970
|
+
internal.evaluate = async (expression) => (0, node_vm_1.runInNewContext)(expression, { document, location: { href: "app://workbuddy/task/old" } });
|
|
971
|
+
await client.createTask();
|
|
972
|
+
strict_1.default.equal(conversationId, null);
|
|
973
|
+
strict_1.default.equal(messages, 0);
|
|
974
|
+
});
|
|
959
975
|
(0, node_test_1.default)("workbuddy CDP 新建不接受缺少任务身份的旧消息界面直接清空", async () => {
|
|
960
976
|
let messages = 1;
|
|
961
977
|
const button = { textContent: "新建任务", disabled: false, getAttribute: () => null, click: () => { messages = 0; } };
|
package/package.json
CHANGED
|
@@ -108,7 +108,7 @@ class WorkbuddyCdpClient {
|
|
|
108
108
|
const before = await this.evaluate(`(() => { const state = ${snapshot}; const loginRequired = [...document.querySelectorAll('a,button,[role="button"]')].some(item => /^(?:登录|立即登录|sign in)$/i.test(item.textContent?.trim() ?? '')); return { ...state, loginRequired }; })()`);
|
|
109
109
|
if (before.loginRequired)
|
|
110
110
|
throw new Error("WorkBuddy 尚未登录,请先在桌面端登录后重试");
|
|
111
|
-
if (!await this.evaluate(`(() => { const button = [...document.querySelectorAll('button,[role="button"]')].find(
|
|
111
|
+
if (!await this.evaluate(`(() => { const button = [...document.querySelectorAll('button,[role="button"]')].find(item => { const label = [item.innerText, item.textContent, item.getAttribute('aria-label'), item.getAttribute('title'), item.getAttribute('data-testid')].filter(Boolean).map(value => String(value).normalize('NFKC').replace(/\\s+/g, ' ').trim().toLowerCase()); return label.some(value => /^(?:新建任务|新建会话|新建对话|开始新任务|new (?:task|chat|conversation))$/.test(value)) && (!item.getClientRects || item.getClientRects().length > 0); }); if (!button || button.disabled || button.getAttribute('aria-disabled') === 'true') return false; button.click(); return true; })()`))
|
|
112
112
|
throw new Error("WorkBuddy 新建任务入口未找到或不可用");
|
|
113
113
|
// WorkBuddy 首页不分配任务 ID;此时仅接受无选中任务的空白首页。
|
|
114
114
|
await this.waitFor(`(() => { const state = ${snapshot}; const blank = state.editor !== null && state.editor.trim() === '' && state.messages === 0; return blank && ((state.conversationId && state.conversationId !== ${JSON.stringify(before.conversationId)}) || state.url !== ${JSON.stringify(before.url)} || (state.home && !state.selected)); })()`, "WorkBuddy 新任务状态校验失败");
|