surf-cli 2.5.2 → 2.7.0
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.md +46 -3
- package/dist/content/accessibility-tree.js +8 -8
- package/dist/content/accessibility-tree.js.map +1 -1
- package/dist/content/visual-indicator.js +17 -17
- package/dist/content/visual-indicator.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/service-worker/index.js +27 -27
- package/dist/service-worker/index.js.map +1 -1
- package/native/aistudio-build.cjs +562 -0
- package/native/aistudio-client.cjs +502 -0
- package/native/aistudio-model.cjs +225 -0
- package/native/aistudio-parser.cjs +424 -0
- package/native/aistudio-response.cjs +336 -0
- package/native/cli.cjs +95 -14
- package/native/do-executor.cjs +1 -1
- package/native/gemini-client.cjs +304 -63
- package/native/host-helpers.cjs +29 -0
- package/native/host.cjs +261 -14
- package/native/mcp-server.cjs +1 -1
- package/native/network-store.cjs +3 -1
- package/package.json +10 -9
- package/scripts/install-native-host.cjs +14 -2
- package/scripts/uninstall-native-host.cjs +7 -1
- package/skills/README.md +21 -0
- package/skills/surf/SKILL.md +575 -0
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
const
|
|
1
|
+
const a="59, 178, 191";let i=null,s=null,r=null,o=!1,c=!1,p=!1,u=!1,l=null,f=1e4;chrome.storage.local.get("heartbeatInterval").then(({heartbeatInterval:e})=>{e&&typeof e=="number"&&(f=e*1e3)});chrome.storage.onChanged.addListener((e,t)=>{if(t==="local"&&e.heartbeatInterval){const n=e.heartbeatInterval.newValue;n&&typeof n=="number"&&(f=n*1e3,c&&l&&(clearInterval(l),y()))}});function y(){l=window.setInterval(async()=>{try{(await chrome.runtime.sendMessage({type:"STATIC_INDICATOR_HEARTBEAT"}))?.success||d()}catch{d()}},f)}function x(){if(document.getElementById("pi-agent-styles"))return;const e=document.createElement("style");e.id="pi-agent-styles",e.textContent=`
|
|
2
2
|
@keyframes pi-pulse {
|
|
3
3
|
0% {
|
|
4
4
|
box-shadow:
|
|
5
|
-
inset 0 0 10px rgba(${
|
|
6
|
-
inset 0 0 20px rgba(${
|
|
7
|
-
inset 0 0 30px rgba(${
|
|
5
|
+
inset 0 0 10px rgba(${a}, 0.5),
|
|
6
|
+
inset 0 0 20px rgba(${a}, 0.3),
|
|
7
|
+
inset 0 0 30px rgba(${a}, 0.1);
|
|
8
8
|
}
|
|
9
9
|
50% {
|
|
10
10
|
box-shadow:
|
|
11
|
-
inset 0 0 15px rgba(${
|
|
12
|
-
inset 0 0 25px rgba(${
|
|
13
|
-
inset 0 0 35px rgba(${
|
|
11
|
+
inset 0 0 15px rgba(${a}, 0.7),
|
|
12
|
+
inset 0 0 25px rgba(${a}, 0.5),
|
|
13
|
+
inset 0 0 35px rgba(${a}, 0.2);
|
|
14
14
|
}
|
|
15
15
|
100% {
|
|
16
16
|
box-shadow:
|
|
17
|
-
inset 0 0 10px rgba(${
|
|
18
|
-
inset 0 0 20px rgba(${
|
|
19
|
-
inset 0 0 30px rgba(${
|
|
17
|
+
inset 0 0 10px rgba(${a}, 0.5),
|
|
18
|
+
inset 0 0 20px rgba(${a}, 0.3),
|
|
19
|
+
inset 0 0 30px rgba(${a}, 0.1);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
`,document.head.appendChild(e)}function b(){const e=document.createElement("div");return e.id="pi-agent-glow",e.style.cssText=`
|
|
@@ -31,9 +31,9 @@ const s="59, 178, 191";let i=null,a=null,r=null,o=!1,c=!1,p=!1,u=!1,l=null,f=1e4
|
|
|
31
31
|
transition: opacity 0.3s ease-in-out;
|
|
32
32
|
animation: pi-pulse 2s ease-in-out infinite;
|
|
33
33
|
box-shadow:
|
|
34
|
-
inset 0 0 10px rgba(${
|
|
35
|
-
inset 0 0 20px rgba(${
|
|
36
|
-
inset 0 0 30px rgba(${
|
|
34
|
+
inset 0 0 10px rgba(${a}, 0.5),
|
|
35
|
+
inset 0 0 20px rgba(${a}, 0.3),
|
|
36
|
+
inset 0 0 30px rgba(${a}, 0.1);
|
|
37
37
|
`,e}function h(){const e=document.createElement("div");e.id="pi-agent-stop-container",e.style.cssText=`
|
|
38
38
|
position: fixed;
|
|
39
39
|
bottom: 16px;
|
|
@@ -65,8 +65,8 @@ const s="59, 178, 191";let i=null,a=null,r=null,o=!1,c=!1,p=!1,u=!1,l=null,f=1e4
|
|
|
65
65
|
align-items: center;
|
|
66
66
|
justify-content: center;
|
|
67
67
|
box-shadow:
|
|
68
|
-
0 40px 80px rgba(${
|
|
69
|
-
0 4px 14px rgba(${
|
|
68
|
+
0 40px 80px rgba(${a}, 0.24),
|
|
69
|
+
0 4px 14px rgba(${a}, 0.24);
|
|
70
70
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
71
71
|
opacity: 0;
|
|
72
72
|
user-select: none;
|
|
@@ -75,7 +75,7 @@ const s="59, 178, 191";let i=null,a=null,r=null,o=!1,c=!1,p=!1,u=!1,l=null,f=1e4
|
|
|
75
75
|
margin: 0 auto;
|
|
76
76
|
`,t.addEventListener("mouseenter",()=>{o&&(t.style.background="#F5F4F0")}),t.addEventListener("mouseleave",()=>{o&&(t.style.background="#FAF9F5")}),t.addEventListener("click",async()=>{await chrome.runtime.sendMessage({type:"STOP_AGENT",fromTabId:"CURRENT_TAB"})}),e.appendChild(t),e}function m(){const e=document.createElement("div");e.id="pi-agent-static-indicator",e.innerHTML=`
|
|
77
77
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" style="width: 16px; height: 16px; margin-right: 8px; flex-shrink: 0;">
|
|
78
|
-
<circle cx="8" cy="8" r="7" fill="rgb(${
|
|
78
|
+
<circle cx="8" cy="8" r="7" fill="rgb(${a})"/>
|
|
79
79
|
<text x="8" y="11" font-size="9" fill="white" text-anchor="middle" font-weight="bold">π</text>
|
|
80
80
|
</svg>
|
|
81
81
|
<span style="color: #141413; font-size: 14px;">Surf is active in this tab group</span>
|
|
@@ -107,5 +107,5 @@ const s="59, 178, 191";let i=null,a=null,r=null,o=!1,c=!1,p=!1,u=!1,l=null,f=1e4
|
|
|
107
107
|
white-space: nowrap;
|
|
108
108
|
user-select: none;
|
|
109
109
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
110
|
-
`;const t=e.querySelector("#pi-static-chat-button"),n=e.querySelector("#pi-static-close-button");return t&&(t.style.pointerEvents="auto",t.addEventListener("mouseenter",()=>t.style.background="#F0EEE6"),t.addEventListener("mouseleave",()=>t.style.background="transparent"),t.addEventListener("click",async()=>{await chrome.runtime.sendMessage({type:"OPEN_SIDEPANEL"})})),n&&(n.style.pointerEvents="auto",n.addEventListener("mouseenter",()=>n.style.background="#F0EEE6"),n.addEventListener("mouseleave",()=>n.style.background="transparent"),n.addEventListener("click",async()=>{await chrome.runtime.sendMessage({type:"DISMISS_STATIC_INDICATOR"}),d()})),e}function v(){o||(o=!0,x(),i?i.style.display="":(i=b(),document.body.appendChild(i)),
|
|
110
|
+
`;const t=e.querySelector("#pi-static-chat-button"),n=e.querySelector("#pi-static-close-button");return t&&(t.style.pointerEvents="auto",t.addEventListener("mouseenter",()=>t.style.background="#F0EEE6"),t.addEventListener("mouseleave",()=>t.style.background="transparent"),t.addEventListener("click",async()=>{await chrome.runtime.sendMessage({type:"OPEN_SIDEPANEL"})})),n&&(n.style.pointerEvents="auto",n.addEventListener("mouseenter",()=>n.style.background="#F0EEE6"),n.addEventListener("mouseleave",()=>n.style.background="transparent"),n.addEventListener("click",async()=>{await chrome.runtime.sendMessage({type:"DISMISS_STATIC_INDICATOR"}),d()})),e}function v(){o||(o=!0,x(),i?i.style.display="":(i=b(),document.body.appendChild(i)),s?s.style.display="":(s=h(),document.body.appendChild(s)),requestAnimationFrame(()=>{if(i&&(i.style.opacity="1"),s){const e=s.querySelector("#pi-agent-stop-button");e&&(e.style.transform="translateY(0)",e.style.opacity="1")}}))}function g(){if(o){if(o=!1,i&&(i.style.opacity="0"),s){const e=s.querySelector("#pi-agent-stop-button");e&&(e.style.transform="translateY(100px)",e.style.opacity="0")}setTimeout(()=>{o||(i?.parentNode&&(i.parentNode.removeChild(i),i=null),s?.parentNode&&(s.parentNode.removeChild(s),s=null))},300)}}function E(){c||(c=!0,r?r.style.display="":(r=m(),document.body.appendChild(r)),l&&clearInterval(l),y())}function d(){c&&(c=!1,l&&(clearInterval(l),l=null),r?.parentNode&&(r.parentNode.removeChild(r),r=null))}chrome.runtime.onMessage.addListener((e,t,n)=>{switch(e.type){case"SHOW_AGENT_INDICATORS":return v(),n({success:!0}),!1;case"HIDE_AGENT_INDICATORS":return g(),n({success:!0}),!1;case"HIDE_FOR_TOOL_USE":return p=o,u=c,i&&(i.style.display="none"),s&&(s.style.display="none"),r&&c&&(r.style.display="none"),n({success:!0}),!1;case"SHOW_AFTER_TOOL_USE":return p&&(i&&(i.style.display=""),s&&(s.style.display="")),u&&r&&(r.style.display=""),p=!1,u=!1,n({success:!0}),!1;case"SHOW_STATIC_INDICATOR":return E(),n({success:!0}),!1;case"HIDE_STATIC_INDICATOR":return d(),n({success:!0}),!1;default:return!1}});window.addEventListener("beforeunload",()=>{g(),d()});
|
|
111
111
|
//# sourceMappingURL=visual-indicator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visual-indicator.js","sources":["../../src/content/visual-indicator.ts"],"sourcesContent":["const PI_COLOR = \"59, 178, 191\";\nconst DEFAULT_HEARTBEAT_INTERVAL = 10000;\n\nlet glowBorder: HTMLDivElement | null = null;\nlet stopButton: HTMLDivElement | null = null;\nlet staticIndicator: HTMLDivElement | null = null;\nlet isActive = false;\nlet isStaticActive = false;\nlet wasActiveBeforeToolUse = false;\nlet wasStaticActiveBeforeToolUse = false;\nlet heartbeatIntervalId: number | null = null;\nlet heartbeatIntervalMs = DEFAULT_HEARTBEAT_INTERVAL;\n\nchrome.storage.local.get(\"heartbeatInterval\").then(({ heartbeatInterval }) => {\n if (heartbeatInterval && typeof heartbeatInterval === \"number\") {\n heartbeatIntervalMs = heartbeatInterval * 1000;\n }\n});\n\nchrome.storage.onChanged.addListener((changes, areaName) => {\n if (areaName === \"local\" && changes.heartbeatInterval) {\n const newValue = changes.heartbeatInterval.newValue;\n if (newValue && typeof newValue === \"number\") {\n heartbeatIntervalMs = newValue * 1000;\n if (isStaticActive && heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n startHeartbeat();\n }\n }\n }\n});\n\nfunction startHeartbeat() {\n heartbeatIntervalId = window.setInterval(async () => {\n try {\n const response = await chrome.runtime.sendMessage({ type: \"STATIC_INDICATOR_HEARTBEAT\" });\n if (!response?.success) hideStaticIndicator();\n } catch {\n hideStaticIndicator();\n }\n }, heartbeatIntervalMs);\n}\n\nfunction injectStyles() {\n if (document.getElementById(\"pi-agent-styles\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"pi-agent-styles\";\n style.textContent = `\n @keyframes pi-pulse {\n 0% {\n box-shadow: \n inset 0 0 10px rgba(${PI_COLOR}, 0.5),\n inset 0 0 20px rgba(${PI_COLOR}, 0.3),\n inset 0 0 30px rgba(${PI_COLOR}, 0.1);\n }\n 50% {\n box-shadow: \n inset 0 0 15px rgba(${PI_COLOR}, 0.7),\n inset 0 0 25px rgba(${PI_COLOR}, 0.5),\n inset 0 0 35px rgba(${PI_COLOR}, 0.2);\n }\n 100% {\n box-shadow: \n inset 0 0 10px rgba(${PI_COLOR}, 0.5),\n inset 0 0 20px rgba(${PI_COLOR}, 0.3),\n inset 0 0 30px rgba(${PI_COLOR}, 0.1);\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction createGlowBorder(): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.id = \"pi-agent-glow\";\n el.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 2147483646;\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n animation: pi-pulse 2s ease-in-out infinite;\n box-shadow: \n inset 0 0 10px rgba(${PI_COLOR}, 0.5),\n inset 0 0 20px rgba(${PI_COLOR}, 0.3),\n inset 0 0 30px rgba(${PI_COLOR}, 0.1);\n `;\n return el;\n}\n\nfunction createStopButton(): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.id = \"pi-agent-stop-container\";\n container.style.cssText = `\n position: fixed;\n bottom: 16px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n z-index: 2147483647;\n `;\n\n const button = document.createElement(\"button\");\n button.id = \"pi-agent-stop-button\";\n button.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\" style=\"margin-right: 12px; vertical-align: middle;\">\n <path d=\"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm40-112v56a12,12,0,0,1-12,12H100a12,12,0,0,1-12-12V100a12,12,0,0,1,12-12h56A12,12,0,0,1,168,100Z\"></path>\n </svg>\n <span style=\"vertical-align: middle;\">Stop Surf</span>\n `;\n button.style.cssText = `\n position: relative;\n transform: translateY(100px);\n padding: 12px 16px;\n background: #FAF9F5;\n color: #141413;\n border: 0.5px solid rgba(31, 30, 29, 0.4);\n border-radius: 12px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-shadow: \n 0 40px 80px rgba(${PI_COLOR}, 0.24),\n 0 4px 14px rgba(${PI_COLOR}, 0.24);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n opacity: 0;\n user-select: none;\n pointer-events: auto;\n white-space: nowrap;\n margin: 0 auto;\n `;\n\n button.addEventListener(\"mouseenter\", () => {\n if (isActive) button.style.background = \"#F5F4F0\";\n });\n\n button.addEventListener(\"mouseleave\", () => {\n if (isActive) button.style.background = \"#FAF9F5\";\n });\n\n button.addEventListener(\"click\", async () => {\n await chrome.runtime.sendMessage({ type: \"STOP_AGENT\", fromTabId: \"CURRENT_TAB\" });\n });\n\n container.appendChild(button);\n return container;\n}\n\nfunction createStaticIndicator(): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.id = \"pi-agent-static-indicator\";\n container.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"width: 16px; height: 16px; margin-right: 8px; flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"rgb(${PI_COLOR})\"/>\n <text x=\"8\" y=\"11\" font-size=\"9\" fill=\"white\" text-anchor=\"middle\" font-weight=\"bold\">π</text>\n </svg>\n <span style=\"color: #141413; font-size: 14px;\">Surf is active in this tab group</span>\n <div style=\"width: 0.5px; height: 32px; background: rgba(31, 30, 29, 0.15); margin: 0 8px;\"></div>\n <button id=\"pi-static-chat-button\" style=\"display: inline-flex; align-items: center; justify-content: center; padding: 6px; background: transparent; border: none; cursor: pointer; width: 32px; height: 32px; border-radius: 8px; transition: background 0.2s;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"#141413\">\n <path d=\"M10 2.5C14.1421 2.5 17.5 5.85786 17.5 10C17.5 14.1421 14.1421 17.5 10 17.5H3C2.79779 17.5 2.61549 17.3782 2.53809 17.1914C2.4607 17.0046 2.50349 16.7895 2.64648 16.6465L4.35547 14.9365C3.20124 13.6175 2.5 11.8906 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5Z\"/>\n </svg>\n </button>\n <button id=\"pi-static-close-button\" style=\"display: inline-flex; align-items: center; justify-content: center; padding: 6px; background: transparent; border: none; cursor: pointer; width: 32px; height: 32px; margin-left: 4px; border-radius: 8px; transition: background 0.2s;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15.1464 4.14642C15.3417 3.95121 15.6582 3.95118 15.8534 4.14642C16.0486 4.34168 16.0486 4.65822 15.8534 4.85346L10.7069 9.99997L15.8534 15.1465C16.0486 15.3417 16.0486 15.6583 15.8534 15.8535C15.6826 16.0244 15.4186 16.0461 15.2245 15.918L15.1464 15.8535L9.99989 10.707L4.85338 15.8535C4.65813 16.0486 4.34155 16.0486 4.14634 15.8535C3.95115 15.6583 3.95129 15.3418 4.14634 15.1465L9.29286 9.99997L4.14634 4.85346C3.95129 4.65818 3.95115 4.34162 4.14634 4.14642C4.34154 3.95128 4.65812 3.95138 4.85338 4.14642L9.99989 9.29294L15.1464 4.14642Z\" fill=\"#141413\"/>\n </svg>\n </button>\n `;\n container.style.cssText = `\n position: fixed;\n bottom: 16px;\n left: 50%;\n transform: translateX(-50%);\n display: inline-flex;\n align-items: center;\n padding: 6px 6px 6px 16px;\n background: #FAF9F5;\n border: 0.5px solid rgba(31, 30, 29, 0.30);\n border-radius: 14px;\n box-shadow: 0 40px 80px 0 rgba(0, 0, 0, 0.15);\n z-index: 2147483647;\n pointer-events: none;\n white-space: nowrap;\n user-select: none;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n `;\n\n const chatButton = container.querySelector(\"#pi-static-chat-button\") as HTMLButtonElement;\n const closeButton = container.querySelector(\"#pi-static-close-button\") as HTMLButtonElement;\n\n if (chatButton) {\n chatButton.style.pointerEvents = \"auto\";\n chatButton.addEventListener(\"mouseenter\", () => chatButton.style.background = \"#F0EEE6\");\n chatButton.addEventListener(\"mouseleave\", () => chatButton.style.background = \"transparent\");\n chatButton.addEventListener(\"click\", async () => {\n await chrome.runtime.sendMessage({ type: \"OPEN_SIDEPANEL\" });\n });\n }\n\n if (closeButton) {\n closeButton.style.pointerEvents = \"auto\";\n closeButton.addEventListener(\"mouseenter\", () => closeButton.style.background = \"#F0EEE6\");\n closeButton.addEventListener(\"mouseleave\", () => closeButton.style.background = \"transparent\");\n closeButton.addEventListener(\"click\", async () => {\n await chrome.runtime.sendMessage({ type: \"DISMISS_STATIC_INDICATOR\" });\n hideStaticIndicator();\n });\n }\n\n return container;\n}\n\nfunction showIndicators() {\n if (isActive) return;\n isActive = true;\n\n injectStyles();\n\n if (!glowBorder) {\n glowBorder = createGlowBorder();\n document.body.appendChild(glowBorder);\n } else {\n glowBorder.style.display = \"\";\n }\n\n if (!stopButton) {\n stopButton = createStopButton();\n document.body.appendChild(stopButton);\n } else {\n stopButton.style.display = \"\";\n }\n\n requestAnimationFrame(() => {\n if (glowBorder) glowBorder.style.opacity = \"1\";\n if (stopButton) {\n const btn = stopButton.querySelector(\"#pi-agent-stop-button\") as HTMLElement;\n if (btn) {\n btn.style.transform = \"translateY(0)\";\n btn.style.opacity = \"1\";\n }\n }\n });\n}\n\nfunction hideIndicators() {\n if (!isActive) return;\n isActive = false;\n\n if (glowBorder) glowBorder.style.opacity = \"0\";\n if (stopButton) {\n const btn = stopButton.querySelector(\"#pi-agent-stop-button\") as HTMLElement;\n if (btn) {\n btn.style.transform = \"translateY(100px)\";\n btn.style.opacity = \"0\";\n }\n }\n\n setTimeout(() => {\n if (!isActive) {\n if (glowBorder?.parentNode) {\n glowBorder.parentNode.removeChild(glowBorder);\n glowBorder = null;\n }\n if (stopButton?.parentNode) {\n stopButton.parentNode.removeChild(stopButton);\n stopButton = null;\n }\n }\n }, 300);\n}\n\nfunction showStaticIndicator() {\n if (isStaticActive) return;\n isStaticActive = true;\n\n if (!staticIndicator) {\n staticIndicator = createStaticIndicator();\n document.body.appendChild(staticIndicator);\n } else {\n staticIndicator.style.display = \"\";\n }\n\n if (heartbeatIntervalId) clearInterval(heartbeatIntervalId);\n startHeartbeat();\n}\n\nfunction hideStaticIndicator() {\n if (!isStaticActive) return;\n isStaticActive = false;\n\n if (heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n heartbeatIntervalId = null;\n }\n\n if (staticIndicator?.parentNode) {\n staticIndicator.parentNode.removeChild(staticIndicator);\n staticIndicator = null;\n }\n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n switch (message.type) {\n case \"SHOW_AGENT_INDICATORS\":\n showIndicators();\n sendResponse({ success: true });\n return false;\n case \"HIDE_AGENT_INDICATORS\":\n hideIndicators();\n sendResponse({ success: true });\n return false;\n case \"HIDE_FOR_TOOL_USE\":\n wasActiveBeforeToolUse = isActive;\n wasStaticActiveBeforeToolUse = isStaticActive;\n if (glowBorder) glowBorder.style.display = \"none\";\n if (stopButton) stopButton.style.display = \"none\";\n if (staticIndicator && isStaticActive) staticIndicator.style.display = \"none\";\n sendResponse({ success: true });\n return false;\n case \"SHOW_AFTER_TOOL_USE\":\n if (wasActiveBeforeToolUse) {\n if (glowBorder) glowBorder.style.display = \"\";\n if (stopButton) stopButton.style.display = \"\";\n }\n if (wasStaticActiveBeforeToolUse && staticIndicator) {\n staticIndicator.style.display = \"\";\n }\n wasActiveBeforeToolUse = false;\n wasStaticActiveBeforeToolUse = false;\n sendResponse({ success: true });\n return false;\n case \"SHOW_STATIC_INDICATOR\":\n showStaticIndicator();\n sendResponse({ success: true });\n return false;\n case \"HIDE_STATIC_INDICATOR\":\n hideStaticIndicator();\n sendResponse({ success: true });\n return false;\n default:\n return false;\n }\n});\n\nwindow.addEventListener(\"beforeunload\", () => {\n hideIndicators();\n hideStaticIndicator();\n});\n"],"names":["PI_COLOR","glowBorder","stopButton","staticIndicator","isActive","isStaticActive","wasActiveBeforeToolUse","wasStaticActiveBeforeToolUse","heartbeatIntervalId","heartbeatIntervalMs","heartbeatInterval","changes","areaName","newValue","startHeartbeat","response","hideStaticIndicator","injectStyles","style","createGlowBorder","el","createStopButton","container","button","createStaticIndicator","chatButton","closeButton","showIndicators","btn","hideIndicators","showStaticIndicator","message","sender","sendResponse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"visual-indicator.js","sources":["../../src/content/visual-indicator.ts"],"sourcesContent":["const PI_COLOR = \"59, 178, 191\";\nconst DEFAULT_HEARTBEAT_INTERVAL = 10000;\n\nlet glowBorder: HTMLDivElement | null = null;\nlet stopButton: HTMLDivElement | null = null;\nlet staticIndicator: HTMLDivElement | null = null;\nlet isActive = false;\nlet isStaticActive = false;\nlet wasActiveBeforeToolUse = false;\nlet wasStaticActiveBeforeToolUse = false;\nlet heartbeatIntervalId: number | null = null;\nlet heartbeatIntervalMs = DEFAULT_HEARTBEAT_INTERVAL;\n\nchrome.storage.local.get(\"heartbeatInterval\").then(({ heartbeatInterval }) => {\n if (heartbeatInterval && typeof heartbeatInterval === \"number\") {\n heartbeatIntervalMs = heartbeatInterval * 1000;\n }\n});\n\nchrome.storage.onChanged.addListener((changes, areaName) => {\n if (areaName === \"local\" && changes.heartbeatInterval) {\n const newValue = changes.heartbeatInterval.newValue;\n if (newValue && typeof newValue === \"number\") {\n heartbeatIntervalMs = newValue * 1000;\n if (isStaticActive && heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n startHeartbeat();\n }\n }\n }\n});\n\nfunction startHeartbeat() {\n heartbeatIntervalId = window.setInterval(async () => {\n try {\n const response = await chrome.runtime.sendMessage({ type: \"STATIC_INDICATOR_HEARTBEAT\" });\n if (!response?.success) hideStaticIndicator();\n } catch {\n hideStaticIndicator();\n }\n }, heartbeatIntervalMs);\n}\n\nfunction injectStyles() {\n if (document.getElementById(\"pi-agent-styles\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"pi-agent-styles\";\n style.textContent = `\n @keyframes pi-pulse {\n 0% {\n box-shadow: \n inset 0 0 10px rgba(${PI_COLOR}, 0.5),\n inset 0 0 20px rgba(${PI_COLOR}, 0.3),\n inset 0 0 30px rgba(${PI_COLOR}, 0.1);\n }\n 50% {\n box-shadow: \n inset 0 0 15px rgba(${PI_COLOR}, 0.7),\n inset 0 0 25px rgba(${PI_COLOR}, 0.5),\n inset 0 0 35px rgba(${PI_COLOR}, 0.2);\n }\n 100% {\n box-shadow: \n inset 0 0 10px rgba(${PI_COLOR}, 0.5),\n inset 0 0 20px rgba(${PI_COLOR}, 0.3),\n inset 0 0 30px rgba(${PI_COLOR}, 0.1);\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction createGlowBorder(): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.id = \"pi-agent-glow\";\n el.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 2147483646;\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n animation: pi-pulse 2s ease-in-out infinite;\n box-shadow: \n inset 0 0 10px rgba(${PI_COLOR}, 0.5),\n inset 0 0 20px rgba(${PI_COLOR}, 0.3),\n inset 0 0 30px rgba(${PI_COLOR}, 0.1);\n `;\n return el;\n}\n\nfunction createStopButton(): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.id = \"pi-agent-stop-container\";\n container.style.cssText = `\n position: fixed;\n bottom: 16px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n z-index: 2147483647;\n `;\n\n const button = document.createElement(\"button\");\n button.id = \"pi-agent-stop-button\";\n button.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\" style=\"margin-right: 12px; vertical-align: middle;\">\n <path d=\"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm40-112v56a12,12,0,0,1-12,12H100a12,12,0,0,1-12-12V100a12,12,0,0,1,12-12h56A12,12,0,0,1,168,100Z\"></path>\n </svg>\n <span style=\"vertical-align: middle;\">Stop Surf</span>\n `;\n button.style.cssText = `\n position: relative;\n transform: translateY(100px);\n padding: 12px 16px;\n background: #FAF9F5;\n color: #141413;\n border: 0.5px solid rgba(31, 30, 29, 0.4);\n border-radius: 12px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-shadow: \n 0 40px 80px rgba(${PI_COLOR}, 0.24),\n 0 4px 14px rgba(${PI_COLOR}, 0.24);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n opacity: 0;\n user-select: none;\n pointer-events: auto;\n white-space: nowrap;\n margin: 0 auto;\n `;\n\n button.addEventListener(\"mouseenter\", () => {\n if (isActive) button.style.background = \"#F5F4F0\";\n });\n\n button.addEventListener(\"mouseleave\", () => {\n if (isActive) button.style.background = \"#FAF9F5\";\n });\n\n button.addEventListener(\"click\", async () => {\n await chrome.runtime.sendMessage({ type: \"STOP_AGENT\", fromTabId: \"CURRENT_TAB\" });\n });\n\n container.appendChild(button);\n return container;\n}\n\nfunction createStaticIndicator(): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.id = \"pi-agent-static-indicator\";\n container.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"width: 16px; height: 16px; margin-right: 8px; flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"rgb(${PI_COLOR})\"/>\n <text x=\"8\" y=\"11\" font-size=\"9\" fill=\"white\" text-anchor=\"middle\" font-weight=\"bold\">π</text>\n </svg>\n <span style=\"color: #141413; font-size: 14px;\">Surf is active in this tab group</span>\n <div style=\"width: 0.5px; height: 32px; background: rgba(31, 30, 29, 0.15); margin: 0 8px;\"></div>\n <button id=\"pi-static-chat-button\" style=\"display: inline-flex; align-items: center; justify-content: center; padding: 6px; background: transparent; border: none; cursor: pointer; width: 32px; height: 32px; border-radius: 8px; transition: background 0.2s;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"#141413\">\n <path d=\"M10 2.5C14.1421 2.5 17.5 5.85786 17.5 10C17.5 14.1421 14.1421 17.5 10 17.5H3C2.79779 17.5 2.61549 17.3782 2.53809 17.1914C2.4607 17.0046 2.50349 16.7895 2.64648 16.6465L4.35547 14.9365C3.20124 13.6175 2.5 11.8906 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5Z\"/>\n </svg>\n </button>\n <button id=\"pi-static-close-button\" style=\"display: inline-flex; align-items: center; justify-content: center; padding: 6px; background: transparent; border: none; cursor: pointer; width: 32px; height: 32px; margin-left: 4px; border-radius: 8px; transition: background 0.2s;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15.1464 4.14642C15.3417 3.95121 15.6582 3.95118 15.8534 4.14642C16.0486 4.34168 16.0486 4.65822 15.8534 4.85346L10.7069 9.99997L15.8534 15.1465C16.0486 15.3417 16.0486 15.6583 15.8534 15.8535C15.6826 16.0244 15.4186 16.0461 15.2245 15.918L15.1464 15.8535L9.99989 10.707L4.85338 15.8535C4.65813 16.0486 4.34155 16.0486 4.14634 15.8535C3.95115 15.6583 3.95129 15.3418 4.14634 15.1465L9.29286 9.99997L4.14634 4.85346C3.95129 4.65818 3.95115 4.34162 4.14634 4.14642C4.34154 3.95128 4.65812 3.95138 4.85338 4.14642L9.99989 9.29294L15.1464 4.14642Z\" fill=\"#141413\"/>\n </svg>\n </button>\n `;\n container.style.cssText = `\n position: fixed;\n bottom: 16px;\n left: 50%;\n transform: translateX(-50%);\n display: inline-flex;\n align-items: center;\n padding: 6px 6px 6px 16px;\n background: #FAF9F5;\n border: 0.5px solid rgba(31, 30, 29, 0.30);\n border-radius: 14px;\n box-shadow: 0 40px 80px 0 rgba(0, 0, 0, 0.15);\n z-index: 2147483647;\n pointer-events: none;\n white-space: nowrap;\n user-select: none;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n `;\n\n const chatButton = container.querySelector(\"#pi-static-chat-button\") as HTMLButtonElement;\n const closeButton = container.querySelector(\"#pi-static-close-button\") as HTMLButtonElement;\n\n if (chatButton) {\n chatButton.style.pointerEvents = \"auto\";\n chatButton.addEventListener(\"mouseenter\", () => chatButton.style.background = \"#F0EEE6\");\n chatButton.addEventListener(\"mouseleave\", () => chatButton.style.background = \"transparent\");\n chatButton.addEventListener(\"click\", async () => {\n await chrome.runtime.sendMessage({ type: \"OPEN_SIDEPANEL\" });\n });\n }\n\n if (closeButton) {\n closeButton.style.pointerEvents = \"auto\";\n closeButton.addEventListener(\"mouseenter\", () => closeButton.style.background = \"#F0EEE6\");\n closeButton.addEventListener(\"mouseleave\", () => closeButton.style.background = \"transparent\");\n closeButton.addEventListener(\"click\", async () => {\n await chrome.runtime.sendMessage({ type: \"DISMISS_STATIC_INDICATOR\" });\n hideStaticIndicator();\n });\n }\n\n return container;\n}\n\nfunction showIndicators() {\n if (isActive) return;\n isActive = true;\n\n injectStyles();\n\n if (!glowBorder) {\n glowBorder = createGlowBorder();\n document.body.appendChild(glowBorder);\n } else {\n glowBorder.style.display = \"\";\n }\n\n if (!stopButton) {\n stopButton = createStopButton();\n document.body.appendChild(stopButton);\n } else {\n stopButton.style.display = \"\";\n }\n\n requestAnimationFrame(() => {\n if (glowBorder) glowBorder.style.opacity = \"1\";\n if (stopButton) {\n const btn = stopButton.querySelector(\"#pi-agent-stop-button\") as HTMLElement;\n if (btn) {\n btn.style.transform = \"translateY(0)\";\n btn.style.opacity = \"1\";\n }\n }\n });\n}\n\nfunction hideIndicators() {\n if (!isActive) return;\n isActive = false;\n\n if (glowBorder) glowBorder.style.opacity = \"0\";\n if (stopButton) {\n const btn = stopButton.querySelector(\"#pi-agent-stop-button\") as HTMLElement;\n if (btn) {\n btn.style.transform = \"translateY(100px)\";\n btn.style.opacity = \"0\";\n }\n }\n\n setTimeout(() => {\n if (!isActive) {\n if (glowBorder?.parentNode) {\n glowBorder.parentNode.removeChild(glowBorder);\n glowBorder = null;\n }\n if (stopButton?.parentNode) {\n stopButton.parentNode.removeChild(stopButton);\n stopButton = null;\n }\n }\n }, 300);\n}\n\nfunction showStaticIndicator() {\n if (isStaticActive) return;\n isStaticActive = true;\n\n if (!staticIndicator) {\n staticIndicator = createStaticIndicator();\n document.body.appendChild(staticIndicator);\n } else {\n staticIndicator.style.display = \"\";\n }\n\n if (heartbeatIntervalId) clearInterval(heartbeatIntervalId);\n startHeartbeat();\n}\n\nfunction hideStaticIndicator() {\n if (!isStaticActive) return;\n isStaticActive = false;\n\n if (heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n heartbeatIntervalId = null;\n }\n\n if (staticIndicator?.parentNode) {\n staticIndicator.parentNode.removeChild(staticIndicator);\n staticIndicator = null;\n }\n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n switch (message.type) {\n case \"SHOW_AGENT_INDICATORS\":\n showIndicators();\n sendResponse({ success: true });\n return false;\n case \"HIDE_AGENT_INDICATORS\":\n hideIndicators();\n sendResponse({ success: true });\n return false;\n case \"HIDE_FOR_TOOL_USE\":\n wasActiveBeforeToolUse = isActive;\n wasStaticActiveBeforeToolUse = isStaticActive;\n if (glowBorder) glowBorder.style.display = \"none\";\n if (stopButton) stopButton.style.display = \"none\";\n if (staticIndicator && isStaticActive) staticIndicator.style.display = \"none\";\n sendResponse({ success: true });\n return false;\n case \"SHOW_AFTER_TOOL_USE\":\n if (wasActiveBeforeToolUse) {\n if (glowBorder) glowBorder.style.display = \"\";\n if (stopButton) stopButton.style.display = \"\";\n }\n if (wasStaticActiveBeforeToolUse && staticIndicator) {\n staticIndicator.style.display = \"\";\n }\n wasActiveBeforeToolUse = false;\n wasStaticActiveBeforeToolUse = false;\n sendResponse({ success: true });\n return false;\n case \"SHOW_STATIC_INDICATOR\":\n showStaticIndicator();\n sendResponse({ success: true });\n return false;\n case \"HIDE_STATIC_INDICATOR\":\n hideStaticIndicator();\n sendResponse({ success: true });\n return false;\n default:\n return false;\n }\n});\n\nwindow.addEventListener(\"beforeunload\", () => {\n hideIndicators();\n hideStaticIndicator();\n});\n"],"names":["PI_COLOR","glowBorder","stopButton","staticIndicator","isActive","isStaticActive","wasActiveBeforeToolUse","wasStaticActiveBeforeToolUse","heartbeatIntervalId","heartbeatIntervalMs","heartbeatInterval","changes","areaName","newValue","startHeartbeat","hideStaticIndicator","injectStyles","style","createGlowBorder","el","createStopButton","container","button","createStaticIndicator","chatButton","closeButton","showIndicators","btn","hideIndicators","showStaticIndicator","message","sender","sendResponse"],"mappings":"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"}
|