@weavetab/mcp 2.5.0-beta.0 → 2.5.0-beta.2
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/AGENTS.md +1 -0
- package/LICENSE +2 -2
- package/README.md +208 -43
- package/SECURITY.md +3 -3
- package/TROUBLESHOOTING.md +1 -1
- package/dist/cdp/bridge.d.ts +10 -0
- package/dist/cdp/bridge.js +288 -68
- package/dist/cdp/connector.d.ts +5 -3
- package/dist/cdp/connector.js +188 -74
- package/dist/cdp/extension.js +0 -1
- package/dist/cdp/helpers.js +0 -2
- package/dist/cdp/lock.d.ts +9 -6
- package/dist/cdp/lock.js +72 -59
- package/dist/cdp/omni_broker.d.ts +1 -0
- package/dist/cdp/omni_broker.js +12 -6
- package/dist/cdp/profiles.d.ts +10 -0
- package/dist/cdp/profiles.js +65 -0
- package/dist/cdp/walker.js +50 -0
- package/dist/cli/plugin.d.ts +0 -2
- package/dist/cli/plugin.js +31 -683
- package/dist/cli/updater.js +2 -2
- package/dist/config/loader.d.ts +25 -6
- package/dist/config/loader.js +133 -20
- package/dist/index.js +48 -52
- package/dist/lifecycle/mission_manager.d.ts +0 -1
- package/dist/lifecycle/mission_manager.js +0 -3
- package/dist/overlay/ghost.d.ts +4 -0
- package/dist/overlay/ghost.js +118 -94
- package/dist/overlay/injector.d.ts +1 -1
- package/dist/overlay/injector.js +1 -15
- package/dist/plugin/extension_bridge.d.ts +40 -0
- package/dist/plugin/extension_bridge.js +158 -0
- package/dist/plugin/interface.d.ts +78 -16
- package/dist/plugin/loader.d.ts +4 -0
- package/dist/plugin/loader.js +178 -57
- package/dist/plugin/registry.js +11 -1
- package/dist/plugin/storage.d.ts +51 -0
- package/dist/plugin/storage.js +164 -0
- package/dist/server.js +217 -151
- package/dist/state/session.d.ts +2 -2
- package/dist/state/session.js +33 -13
- package/dist/tools/browser_detect.d.ts +2 -1
- package/dist/tools/browser_detect.js +6 -5
- package/dist/tools/burst.d.ts +1 -0
- package/dist/tools/burst.js +4 -6
- package/dist/tools/click.js +23 -28
- package/dist/tools/clipboard.js +31 -24
- package/dist/tools/navigate.d.ts +1 -1
- package/dist/tools/navigate.js +28 -10
- package/dist/tools/read.js +1 -1
- package/dist/tools/tabs.d.ts +10 -10
- package/dist/tools/tabs.js +47 -39
- package/dist/tools/type.js +2 -2
- package/docs/DOCUMENTATION.md +63 -6
- package/docs/architecture/blind-injection.md +20 -0
- package/docs/architecture/dual-injection.md +32 -0
- package/docs/architecture/overview.md +49 -0
- package/docs/architecture/security.md +35 -0
- package/docs/architecture/transport.md +37 -0
- package/docs/captcha-stealth/captcha-solver.md +75 -0
- package/docs/captcha-stealth/stealth-physics.md +60 -0
- package/docs/cli/cli-commands.md +44 -0
- package/docs/cli/cli-flags.md +20 -0
- package/docs/cli/cli-introduction.md +20 -0
- package/docs/cli/cli-scripting.md +32 -0
- package/docs/cli/g-ide/ide-antigravity.md +24 -0
- package/docs/cli/g-ide/ide-claude-code.md +24 -0
- package/docs/cli/g-ide/ide-claude-desktop.md +32 -0
- package/docs/cli/g-ide/ide-cursor.md +31 -0
- package/docs/cli/g-ide/ide-generic.md +34 -0
- package/docs/cli/g-ide/ide-opencode.md +24 -0
- package/docs/cli/g-ide/ide-vscode-copilot.md +24 -0
- package/docs/cli/g-ide/ide-windsurf.md +24 -0
- package/docs/configuration/config-locations.md +24 -0
- package/docs/configuration/configuration.md +73 -0
- package/docs/configuration/env-variables.md +19 -0
- package/docs/configuration/folders.md +54 -0
- package/docs/desktop-automation/electron-apps.md +162 -0
- package/docs/get-started/installation.md +47 -0
- package/docs/get-started/introduction.md +60 -0
- package/docs/get-started/quickstart.md +54 -0
- package/docs/get-started/setup-wizard.md +26 -0
- package/docs/skills-ecosystem/skills-overview.md +35 -0
- package/docs/skills-ecosystem/skills-recipes.md +36 -0
- package/docs/tools/tools.md +293 -0
- package/docs/troubleshooting/trouble-browser.md +27 -0
- package/docs/troubleshooting/trouble-config.md +20 -0
- package/docs/troubleshooting/trouble-loop.md +31 -0
- package/ext-dist/content.js +126 -101
- package/mcp.json +8 -15
- package/package.json +11 -5
- package/server.json +3 -3
- package/dist/tools/plan.d.ts +0 -39
- package/dist/tools/plan.js +0 -161
- package/docs/DEV_MODE.md +0 -68
- package/docs/PLUGINS.md +0 -538
- package/docs/TOOLS.md +0 -104
- package/docs/dev_plugin.md +0 -310
package/ext-dist/content.js
CHANGED
|
@@ -164,7 +164,9 @@ function __wt_safeAppendToBody(el) {
|
|
|
164
164
|
}
|
|
165
165
|
if (typeof __weaveCursor !== 'undefined' && __weaveCursor) {
|
|
166
166
|
__weaveCursor.setVisible(__wt_masterVisualsEnabled);
|
|
167
|
-
if (__weaveCursor.
|
|
167
|
+
if (__weaveCursor._cursor) {
|
|
168
|
+
__weaveCursor._cursor.style.display = __wt_masterVisualsEnabled ? 'block' : 'none';
|
|
169
|
+
} else if (__weaveCursor._canvas) {
|
|
168
170
|
__weaveCursor._canvas.style.display = __wt_masterVisualsEnabled ? 'block' : 'none';
|
|
169
171
|
}
|
|
170
172
|
}
|
|
@@ -213,8 +215,13 @@ function __wt_safeAppendToBody(el) {
|
|
|
213
215
|
if (msg.type === 'WT_TOGGLE_MASTER_VISUALS') {
|
|
214
216
|
__wt_applyMasterVisuals(msg.enabled);
|
|
215
217
|
}
|
|
216
|
-
if (msg.type === 'GHOST_CURSOR_MOVE'
|
|
217
|
-
|
|
218
|
+
if (msg.type === 'GHOST_CURSOR_MOVE') {
|
|
219
|
+
if (typeof msg.x === 'number' && typeof msg.y === 'number') {
|
|
220
|
+
moveCursor(msg.x, msg.y, msg.phase);
|
|
221
|
+
}
|
|
222
|
+
if (iframe && iframe.contentWindow) {
|
|
223
|
+
iframe.contentWindow.postMessage({ type: 'RT_CURSOR_MOVE', x: msg.x, y: msg.y, phase: msg.phase }, '*');
|
|
224
|
+
}
|
|
218
225
|
}
|
|
219
226
|
if (msg.type === 'TOOL_CALL_EVENT' && iframe && iframe.contentWindow) {
|
|
220
227
|
iframe.contentWindow.postMessage({ type: 'TOOL_CALL_EVENT', payload: msg.payload }, '*');
|
|
@@ -932,71 +939,88 @@ window.__Weavetab_readConsole = function({ since = 'last', level = null } = {})
|
|
|
932
939
|
return level ? entries.filter(e => e.level === level) : entries;
|
|
933
940
|
};
|
|
934
941
|
|
|
935
|
-
// ──
|
|
936
|
-
// Shadow-DOM-isolated,
|
|
937
|
-
// and state-driven visual transitions: idle, moving, reading, typing, clicking, thinking
|
|
942
|
+
// ── BLUE SVG WEAVE CURSOR ───────────────────────────────────────
|
|
943
|
+
// Shadow-DOM-isolated, hardware-accelerated SVG cursor with smooth interpolation
|
|
938
944
|
class WeaveCursor {
|
|
939
945
|
constructor() {
|
|
940
946
|
// Attach a shadow host that sits above all page content
|
|
941
947
|
this._host = document.createElement('div');
|
|
942
948
|
this._host.id = '__Weavetab_cursor_host';
|
|
949
|
+
this._host.setAttribute('data-wt-ignore', 'true');
|
|
943
950
|
Object.assign(this._host.style, {
|
|
944
951
|
position: 'fixed',
|
|
945
952
|
top: '0',
|
|
946
953
|
left: '0',
|
|
947
954
|
width: '0',
|
|
948
955
|
height: '0',
|
|
949
|
-
zIndex: '
|
|
956
|
+
zIndex: '2147483647',
|
|
950
957
|
pointerEvents: 'none',
|
|
951
958
|
overflow: 'visible',
|
|
952
959
|
});
|
|
953
960
|
|
|
954
961
|
const shadow = this._host.attachShadow({ mode: 'closed' });
|
|
955
962
|
|
|
956
|
-
//
|
|
957
|
-
this.
|
|
958
|
-
this.
|
|
959
|
-
this.
|
|
960
|
-
|
|
963
|
+
// Hotspot aligned with the top-left pointer tip (3.0, 5.0 in 32x32 viewBox)
|
|
964
|
+
this._hotX = 3.0;
|
|
965
|
+
this._hotY = 5.0;
|
|
966
|
+
this._scale = 0.4;
|
|
967
|
+
|
|
968
|
+
const initX = typeof window !== 'undefined' && window.innerWidth ? Math.round(window.innerWidth / 2) : 640;
|
|
969
|
+
const initY = typeof window !== 'undefined' && window.innerHeight ? Math.round(window.innerHeight / 2) : 400;
|
|
970
|
+
|
|
971
|
+
// Exact vector SVG cursor matching user design
|
|
972
|
+
this._cursor = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
973
|
+
this._cursor.setAttribute('class', 'cursor');
|
|
974
|
+
this._cursor.setAttribute('viewBox', '0 0 32 32');
|
|
975
|
+
this._cursor.setAttribute('width', '32');
|
|
976
|
+
this._cursor.setAttribute('height', '32');
|
|
977
|
+
this._cursor.setAttribute('aria-hidden', 'true');
|
|
978
|
+
Object.assign(this._cursor.style, {
|
|
961
979
|
position: 'fixed',
|
|
962
980
|
top: '0',
|
|
963
981
|
left: '0',
|
|
964
|
-
width: '
|
|
965
|
-
height: '
|
|
982
|
+
width: '32px',
|
|
983
|
+
height: '32px',
|
|
984
|
+
display: 'block',
|
|
985
|
+
transformOrigin: `${this._hotX}px ${this._hotY}px`,
|
|
986
|
+
transform: `translate3d(${initX - this._hotX}px, ${initY - this._hotY}px, 0) scale(${this._scale})`,
|
|
987
|
+
overflow: 'visible',
|
|
966
988
|
pointerEvents: 'none',
|
|
967
|
-
transform: 'translate(-9999px,-9999px)',
|
|
968
989
|
willChange: 'transform',
|
|
969
|
-
transition: 'opacity 0.
|
|
990
|
+
transition: 'opacity 0.2s ease-out',
|
|
991
|
+
opacity: '1',
|
|
992
|
+
zIndex: '2147483647',
|
|
993
|
+
filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.35))',
|
|
970
994
|
});
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
995
|
+
|
|
996
|
+
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
997
|
+
path.setAttribute('class', 'cursor-shape');
|
|
998
|
+
path.setAttribute('d', 'M 6.1,4.7 C 4.5,4.1 3.0,5.0 3.0,6.7 C 3.0,7.1 3.1,7.5 3.3,8.0 L 10.2,27.0 C 10.8,28.7 12.0,29.6 13.6,29.5 C 15.1,29.4 16.0,28.5 16.5,27.0 L 19.4,18.8 L 25.9,17.0 C 27.7,16.5 28.9,15.2 28.9,13.6 C 28.9,12.1 28.0,10.9 26.4,10.3 Z');
|
|
999
|
+
path.setAttribute('fill', '#1268ff');
|
|
1000
|
+
path.setAttribute('stroke', '#ffffff');
|
|
1001
|
+
path.setAttribute('stroke-width', '3.1');
|
|
1002
|
+
path.setAttribute('stroke-linejoin', 'round');
|
|
1003
|
+
path.setAttribute('stroke-linecap', 'round');
|
|
1004
|
+
|
|
1005
|
+
this._cursor.appendChild(path);
|
|
1006
|
+
shadow.appendChild(this._cursor);
|
|
1007
|
+
|
|
1008
|
+
// Alias _canvas to _cursor for backward compatibility
|
|
1009
|
+
this._canvas = this._cursor;
|
|
1010
|
+
|
|
1011
|
+
this._x = initX;
|
|
1012
|
+
this._y = initY;
|
|
1013
|
+
this._targetX = initX;
|
|
1014
|
+
this._targetY = initY;
|
|
1015
|
+
this._lerpX = initX;
|
|
1016
|
+
this._lerpY = initY;
|
|
980
1017
|
this._state = 'idle';
|
|
981
|
-
this._visible =
|
|
1018
|
+
this._visible = true;
|
|
982
1019
|
this._animFrame = null;
|
|
983
|
-
this._lastMoveTime = 0;
|
|
984
1020
|
this._lastTime = performance.now();
|
|
985
1021
|
this._waypointQueue = [];
|
|
986
1022
|
this._playingQueue = false;
|
|
987
1023
|
|
|
988
|
-
this._hotX = 0;
|
|
989
|
-
this._hotY = 0;
|
|
990
|
-
|
|
991
|
-
// Sharp precision arrow pointer path (tip at 0,0)
|
|
992
|
-
this._outerPath = new Path2D("M 0 0 L 0 16 L 4.2 12.2 L 7.5 19 L 10.2 17.6 L 6.8 10.8 L 11.8 10.8 Z");
|
|
993
|
-
this._innerPath = new Path2D("M 1.2 2.5 L 1.2 13.5 L 3.8 10.8 L 6.6 16.5 L 8.2 15.6 L 5.4 9.8 L 9.8 9.8 Z");
|
|
994
|
-
|
|
995
|
-
// Vivid linear gradient (#06B6D4 -> #3B82F6)
|
|
996
|
-
this._blueGrad = this._ctx.createLinearGradient(0, 0, 12, 19);
|
|
997
|
-
this._blueGrad.addColorStop(0, '#06B6D4');
|
|
998
|
-
this._blueGrad.addColorStop(1, '#3B82F6');
|
|
999
|
-
|
|
1000
1024
|
__wt_safeAppendToBody(this._host);
|
|
1001
1025
|
this._startLoop();
|
|
1002
1026
|
}
|
|
@@ -1018,23 +1042,25 @@ class WeaveCursor {
|
|
|
1018
1042
|
setVisible(visible) {
|
|
1019
1043
|
if (typeof __wt_masterVisualsEnabled !== 'undefined' && !__wt_masterVisualsEnabled) {
|
|
1020
1044
|
this._visible = false;
|
|
1021
|
-
this.
|
|
1045
|
+
this._cursor.style.opacity = '0';
|
|
1022
1046
|
return;
|
|
1023
1047
|
}
|
|
1024
1048
|
this._visible = visible;
|
|
1025
|
-
this.
|
|
1049
|
+
this._cursor.style.opacity = visible ? '1' : '0';
|
|
1026
1050
|
}
|
|
1027
1051
|
|
|
1028
1052
|
moveTo(x, y) {
|
|
1029
1053
|
if (typeof __wt_masterVisualsEnabled !== 'undefined' && !__wt_masterVisualsEnabled) return;
|
|
1030
|
-
if (
|
|
1054
|
+
if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) return;
|
|
1031
1055
|
this._targetX = x;
|
|
1032
1056
|
this._targetY = y;
|
|
1033
|
-
if (this._lerpX === -9999) {
|
|
1034
|
-
|
|
1057
|
+
if (this._lerpX === -9999) {
|
|
1058
|
+
this._lerpX = x;
|
|
1059
|
+
this._lerpY = y;
|
|
1060
|
+
}
|
|
1035
1061
|
if (!this._visible) {
|
|
1036
1062
|
this._visible = true;
|
|
1037
|
-
this.
|
|
1063
|
+
this._cursor.style.opacity = '1';
|
|
1038
1064
|
}
|
|
1039
1065
|
if (!this._animFrame) {
|
|
1040
1066
|
this._startLoop();
|
|
@@ -1043,20 +1069,23 @@ class WeaveCursor {
|
|
|
1043
1069
|
|
|
1044
1070
|
setWaypoints(waypoints, durationMs) {
|
|
1045
1071
|
if (typeof __wt_masterVisualsEnabled !== 'undefined' && !__wt_masterVisualsEnabled) return;
|
|
1072
|
+
if (!waypoints || !waypoints.length) return;
|
|
1046
1073
|
this._waypointQueue = waypoints;
|
|
1047
1074
|
this._playingQueue = true;
|
|
1048
1075
|
this._waypointStartTime = performance.now();
|
|
1049
|
-
this._waypointDuration = durationMs;
|
|
1076
|
+
this._waypointDuration = durationMs || (waypoints.length * 16);
|
|
1050
1077
|
if (waypoints.length > 0 && this._lerpX === -9999) {
|
|
1051
1078
|
this._lerpX = waypoints[0].x;
|
|
1052
1079
|
this._lerpY = waypoints[0].y;
|
|
1053
1080
|
}
|
|
1054
|
-
if (!this._visible) {
|
|
1081
|
+
if (!this._visible) {
|
|
1082
|
+
this._visible = true;
|
|
1083
|
+
this._cursor.style.opacity = '1';
|
|
1084
|
+
}
|
|
1055
1085
|
if (!this._animFrame) this._startLoop();
|
|
1056
1086
|
}
|
|
1057
1087
|
|
|
1058
1088
|
_startLoop() {
|
|
1059
|
-
this._idleFrames = 0;
|
|
1060
1089
|
this._lastTime = performance.now();
|
|
1061
1090
|
const draw = (currentTime) => {
|
|
1062
1091
|
const dt = Math.min((currentTime - this._lastTime) / 1000, 0.1);
|
|
@@ -1064,89 +1093,86 @@ class WeaveCursor {
|
|
|
1064
1093
|
|
|
1065
1094
|
if (this._playingQueue && this._waypointQueue.length > 0) {
|
|
1066
1095
|
const elapsed = currentTime - this._waypointStartTime;
|
|
1067
|
-
const progress = Math.min(elapsed / this._waypointDuration, 1);
|
|
1068
|
-
const
|
|
1069
|
-
|
|
1070
|
-
if (
|
|
1071
|
-
this._targetX =
|
|
1072
|
-
this._targetY =
|
|
1073
|
-
|
|
1096
|
+
const progress = Math.max(0, Math.min(elapsed / (this._waypointDuration || 1), 1));
|
|
1097
|
+
const totalSegments = this._waypointQueue.length - 1;
|
|
1098
|
+
|
|
1099
|
+
if (totalSegments <= 0) {
|
|
1100
|
+
this._targetX = this._waypointQueue[0].x;
|
|
1101
|
+
this._targetY = this._waypointQueue[0].y;
|
|
1102
|
+
} else {
|
|
1103
|
+
const floatIdx = progress * totalSegments;
|
|
1104
|
+
const i0 = Math.floor(floatIdx);
|
|
1105
|
+
const i1 = Math.min(i0 + 1, totalSegments);
|
|
1106
|
+
const t = floatIdx - i0;
|
|
1107
|
+
|
|
1108
|
+
const p0 = this._waypointQueue[i0];
|
|
1109
|
+
const p1 = this._waypointQueue[i1];
|
|
1110
|
+
if (p0 && p1) {
|
|
1111
|
+
this._targetX = p0.x + (p1.x - p0.x) * t;
|
|
1112
|
+
this._targetY = p0.y + (p1.y - p0.y) * t;
|
|
1113
|
+
}
|
|
1074
1114
|
}
|
|
1115
|
+
|
|
1075
1116
|
if (progress >= 1) {
|
|
1076
1117
|
this._playingQueue = false;
|
|
1077
1118
|
this._waypointQueue = [];
|
|
1078
1119
|
}
|
|
1079
1120
|
}
|
|
1080
1121
|
|
|
1081
|
-
// Smooth lerp (k =
|
|
1082
|
-
const lerpFactor = 1 - Math.exp(-
|
|
1122
|
+
// Smooth exponential lerp (k = 24 for fluid human-smooth tracking)
|
|
1123
|
+
const lerpFactor = 1 - Math.exp(-24 * dt);
|
|
1083
1124
|
if (this._targetX !== -9999) {
|
|
1084
1125
|
this._lerpX += (this._targetX - this._lerpX) * lerpFactor;
|
|
1085
1126
|
this._lerpY += (this._targetY - this._lerpY) * lerpFactor;
|
|
1086
|
-
if (Math.abs(this._targetX - this._lerpX) < 0.
|
|
1087
|
-
if (Math.abs(this._targetY - this._lerpY) < 0.
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
}
|
|
1096
|
-
this._idleFrames = 0;
|
|
1097
|
-
} else {
|
|
1098
|
-
this._idleFrames++;
|
|
1099
|
-
if (this._idleFrames > 90 || !__wt_masterVisualsEnabled) {
|
|
1127
|
+
if (Math.abs(this._targetX - this._lerpX) < 0.1) this._lerpX = this._targetX;
|
|
1128
|
+
if (Math.abs(this._targetY - this._lerpY) < 0.1) this._lerpY = this._targetY;
|
|
1129
|
+
|
|
1130
|
+
// "always show in browser" - stays visible once loaded and active
|
|
1131
|
+
if (typeof __wt_masterVisualsEnabled === 'undefined' || __wt_masterVisualsEnabled) {
|
|
1132
|
+
if (!this._visible) {
|
|
1133
|
+
this._visible = true;
|
|
1134
|
+
this._cursor.style.opacity = '1';
|
|
1135
|
+
}
|
|
1136
|
+
} else {
|
|
1100
1137
|
if (this._visible) {
|
|
1101
1138
|
this._visible = false;
|
|
1102
|
-
this.
|
|
1139
|
+
this._cursor.style.opacity = '0';
|
|
1103
1140
|
}
|
|
1104
1141
|
}
|
|
1142
|
+
|
|
1143
|
+
this._render();
|
|
1105
1144
|
}
|
|
1106
1145
|
|
|
1107
|
-
this._render();
|
|
1108
1146
|
this._animFrame = requestAnimationFrame(draw);
|
|
1109
1147
|
};
|
|
1148
|
+
if (this._animFrame) cancelAnimationFrame(this._animFrame);
|
|
1110
1149
|
this._animFrame = requestAnimationFrame(draw);
|
|
1111
1150
|
}
|
|
1112
1151
|
|
|
1113
1152
|
_render() {
|
|
1114
1153
|
if (typeof __wt_masterVisualsEnabled !== 'undefined' && !__wt_masterVisualsEnabled) {
|
|
1115
|
-
this.
|
|
1154
|
+
this._cursor.style.opacity = '0';
|
|
1116
1155
|
return;
|
|
1117
1156
|
}
|
|
1118
|
-
|
|
1119
|
-
const
|
|
1120
|
-
|
|
1121
|
-
this.
|
|
1122
|
-
ctx.clearRect(0, 0, 64, 64);
|
|
1123
|
-
|
|
1124
|
-
ctx.save();
|
|
1125
|
-
ctx.translate(2, 2);
|
|
1126
|
-
|
|
1127
|
-
// Sharp outer stroke — White
|
|
1128
|
-
ctx.fillStyle = '#FFFFFF';
|
|
1129
|
-
ctx.strokeStyle = '#FFFFFF';
|
|
1130
|
-
ctx.lineWidth = 2;
|
|
1131
|
-
ctx.lineJoin = 'miter';
|
|
1132
|
-
ctx.miterLimit = 3;
|
|
1133
|
-
ctx.fill(this._outerPath);
|
|
1134
|
-
ctx.stroke(this._outerPath);
|
|
1135
|
-
|
|
1136
|
-
// Sharp inner core — Gradient
|
|
1137
|
-
ctx.fillStyle = this._blueGrad;
|
|
1138
|
-
ctx.fill(this._innerPath);
|
|
1139
|
-
|
|
1140
|
-
ctx.restore();
|
|
1157
|
+
const x = this._lerpX;
|
|
1158
|
+
const y = this._lerpY;
|
|
1159
|
+
if (x === -9999 || y === -9999) return;
|
|
1160
|
+
this._cursor.style.transform = `translate3d(${x - this._hotX}px, ${y - this._hotY}px, 0) scale(${this._scale})`;
|
|
1141
1161
|
}
|
|
1142
1162
|
}
|
|
1143
1163
|
|
|
1144
|
-
// Instantiate the
|
|
1145
|
-
let __weaveCursor =
|
|
1164
|
+
// Instantiate the active cursor
|
|
1165
|
+
let __weaveCursor = new WeaveCursor();
|
|
1146
1166
|
window.__weaveCursor_instance = __weaveCursor;
|
|
1147
1167
|
|
|
1148
1168
|
function moveCursor(x, y, state) {
|
|
1149
|
-
|
|
1169
|
+
if (typeof __wt_masterVisualsEnabled !== 'undefined' && !__wt_masterVisualsEnabled) return;
|
|
1170
|
+
if (__weaveCursor && typeof __weaveCursor.moveTo === 'function') {
|
|
1171
|
+
if (typeof x === 'number' && typeof y === 'number' && x >= 0 && y >= 0) {
|
|
1172
|
+
__weaveCursor.moveTo(x, y);
|
|
1173
|
+
}
|
|
1174
|
+
if (state) __weaveCursor.setState(state);
|
|
1175
|
+
}
|
|
1150
1176
|
}
|
|
1151
1177
|
|
|
1152
1178
|
|
|
@@ -1751,7 +1777,6 @@ function __wt_handleWeavetabMsg(msg) {
|
|
|
1751
1777
|
}
|
|
1752
1778
|
}
|
|
1753
1779
|
}
|
|
1754
|
-
if (msg.darkMode !== undefined) document.body.classList.toggle('Weavetab-dark', msg.darkMode);
|
|
1755
1780
|
if (msg.cursor || msg.hud) {
|
|
1756
1781
|
controlledIndicator.show('#3B82F6');
|
|
1757
1782
|
}
|
package/mcp.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavetab/mcp",
|
|
3
3
|
"mcpName": "io.github.weavetab/mcp",
|
|
4
|
-
"version": "2.5.0-beta.
|
|
5
|
-
"description": "Weavetab MCP —
|
|
4
|
+
"version": "2.5.0-beta.2",
|
|
5
|
+
"description": "Weavetab MCP — Direct Layer 0 interface for AI agents across web and desktop applications. Direct socket transport, zero wrapper overhead, deterministic state execution.",
|
|
6
6
|
"icon": "icon.png",
|
|
7
7
|
"author": "fy2ne",
|
|
8
8
|
"license": "AGPL-3.0-only",
|
|
9
|
-
"homepage": "https://weavetab
|
|
9
|
+
"homepage": "https://github.com/weavetab/mcp",
|
|
10
10
|
"repository": "https://github.com/weavetab/mcp",
|
|
11
11
|
"keywords": [
|
|
12
12
|
"weavetab",
|
|
13
13
|
"mcp",
|
|
14
14
|
"model context protocol",
|
|
15
15
|
"browser automation",
|
|
16
|
+
"electron automation",
|
|
17
|
+
"desktop automation",
|
|
16
18
|
"chrome devtools protocol",
|
|
17
19
|
"cdp",
|
|
18
20
|
"ai agent",
|
|
@@ -185,15 +187,6 @@
|
|
|
185
187
|
"Optional form submission click step"
|
|
186
188
|
]
|
|
187
189
|
},
|
|
188
|
-
"browser_plan": {
|
|
189
|
-
"category": "mission_execution",
|
|
190
|
-
"description": "Create or update a live task panel in the browser. Renders a real-time task dashboard within a Shadow DOM overlay displaying goal progress and step status.",
|
|
191
|
-
"features": [
|
|
192
|
-
"Real-time task state and progress display",
|
|
193
|
-
"Isolated Shadow DOM layout structure",
|
|
194
|
-
"Structured task state tracking (pending, in-progress, done, failed)"
|
|
195
|
-
]
|
|
196
|
-
},
|
|
197
190
|
"browser_highlight": {
|
|
198
191
|
"category": "canvas_and_visual",
|
|
199
192
|
"description": "Highlight an element with a colored overlay. Renders temporary visual CDP overlay highlights over target elements without DOM tree mutations.",
|
|
@@ -723,10 +716,10 @@
|
|
|
723
716
|
"default": 0,
|
|
724
717
|
"description": "Chrome DevTools Protocol attach port"
|
|
725
718
|
},
|
|
726
|
-
"
|
|
719
|
+
"extension": {
|
|
727
720
|
"type": "boolean",
|
|
728
|
-
"default":
|
|
729
|
-
"description": "
|
|
721
|
+
"default": true,
|
|
722
|
+
"description": "Enable Weavetab Chrome extension integration"
|
|
730
723
|
},
|
|
731
724
|
"maxTabs": {
|
|
732
725
|
"type": "number",
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavetab/mcp",
|
|
3
|
-
"version": "2.5.0-beta.
|
|
4
|
-
"description": "
|
|
5
|
-
"author":
|
|
3
|
+
"version": "2.5.0-beta.2",
|
|
4
|
+
"description": "Direct Layer 0 interface for AI agents across web and desktop applications. No WebDriver. No cloud. Pure control.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "fy2ne",
|
|
7
|
+
"email": "hello@fy2ne.me",
|
|
8
|
+
"url": "https://fy2ne.me"
|
|
9
|
+
},
|
|
6
10
|
"license": "AGPL-3.0-only",
|
|
7
|
-
"homepage": "https://
|
|
11
|
+
"homepage": "https://github.com/weavetab/mcp",
|
|
8
12
|
"repository": {
|
|
9
13
|
"type": "git",
|
|
10
14
|
"url": "https://github.com/weavetab/mcp.git"
|
|
@@ -17,6 +21,8 @@
|
|
|
17
21
|
"mcp",
|
|
18
22
|
"model context protocol",
|
|
19
23
|
"browser automation",
|
|
24
|
+
"electron automation",
|
|
25
|
+
"desktop automation",
|
|
20
26
|
"ai agent",
|
|
21
27
|
"claude mcp",
|
|
22
28
|
"cursor mcp",
|
|
@@ -74,7 +80,7 @@
|
|
|
74
80
|
"start": "node dist/index.js",
|
|
75
81
|
"prepublishOnly": "npm run verify && npm run build",
|
|
76
82
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
77
|
-
"test:unit": "node --import tsx/esm --test \"tests/unit/cache.test.ts\" \"tests/unit/delta.test.ts\" \"tests/unit/sessionMemory.test.ts\" \"tests/unit/trail.test.ts\" \"tests/unit/walker.test.ts\" \"tests/unit/burst.test.ts\" \"tests/unit/navigate.test.ts\" \"tests/unit/select.test.ts\" \"tests/unit/design_extract.test.ts\" \"tests/unit/plugin.test.ts\"",
|
|
83
|
+
"test:unit": "node --import tsx/esm --test \"tests/unit/cache.test.ts\" \"tests/unit/delta.test.ts\" \"tests/unit/sessionMemory.test.ts\" \"tests/unit/trail.test.ts\" \"tests/unit/walker.test.ts\" \"tests/unit/burst.test.ts\" \"tests/unit/navigate.test.ts\" \"tests/unit/select.test.ts\" \"tests/unit/design_extract.test.ts\" \"tests/unit/plugin.test.ts\" \"tests/unit/electron.test.ts\"",
|
|
78
84
|
"test:e2e": "tsx tests/e2e/smoke_test.ts"
|
|
79
85
|
},
|
|
80
86
|
"dependencies": {
|
package/server.json
CHANGED
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.weavetab/mcp",
|
|
4
4
|
"title": "Weavetab MCP",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Direct Layer 0 interface for AI agents across web and desktop applications. No WebDriver. No cloud. Pure control.",
|
|
6
6
|
"repository": {
|
|
7
7
|
"url": "https://github.com/weavetab/mcp",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.5.0-beta.
|
|
10
|
+
"version": "2.5.0-beta.2",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
15
|
"identifier": "@weavetab/mcp",
|
|
16
|
-
"version": "2.5.0-beta.
|
|
16
|
+
"version": "2.5.0-beta.2",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
},
|
package/dist/tools/plan.d.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import CDP from "chrome-remote-interface";
|
|
2
|
-
import type { Config } from "../config/loader.js";
|
|
3
|
-
interface PlanTask {
|
|
4
|
-
id: number;
|
|
5
|
-
description: string;
|
|
6
|
-
status: "pending" | "in-progress" | "done" | "failed";
|
|
7
|
-
comment?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface PlanOptions {
|
|
10
|
-
action: "create" | "update" | "comments" | "hide";
|
|
11
|
-
goal?: string;
|
|
12
|
-
tasks?: PlanTask[];
|
|
13
|
-
taskId?: number;
|
|
14
|
-
status?: PlanTask["status"];
|
|
15
|
-
}
|
|
16
|
-
interface PlanComment {
|
|
17
|
-
taskId: number;
|
|
18
|
-
comment: string;
|
|
19
|
-
time: number;
|
|
20
|
-
}
|
|
21
|
-
export declare function weavePlan(session: CDP.Client, options: PlanOptions, _config: Config): Promise<{
|
|
22
|
-
success: boolean;
|
|
23
|
-
plan?: {
|
|
24
|
-
goal: string;
|
|
25
|
-
tasks: PlanTask[];
|
|
26
|
-
};
|
|
27
|
-
comments?: PlanComment[];
|
|
28
|
-
error?: string;
|
|
29
|
-
}>;
|
|
30
|
-
export declare function addPlanComment(taskId: number, comment: string): void;
|
|
31
|
-
/** Returns current in-memory plan (goal + tasks) — used to re-inject on page navigation */
|
|
32
|
-
export declare function getActivePlan(): {
|
|
33
|
-
goal: string;
|
|
34
|
-
tasks: PlanTask[];
|
|
35
|
-
} | null;
|
|
36
|
-
export declare function setActivePlan(goal: string, tasks: PlanTask[]): void;
|
|
37
|
-
/** Re-inject plan into a (possibly fresh) page session — used after navigation / reconnect */
|
|
38
|
-
export declare function restoreActivePlanIntoPage(session: CDP.Client): Promise<void>;
|
|
39
|
-
export {};
|