browse-code 0.2.9__tar.gz → 0.2.12__tar.gz

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.
Files changed (23) hide show
  1. {browse_code-0.2.9 → browse_code-0.2.12}/PKG-INFO +1 -1
  2. browse_code-0.2.12/browse_code/__init__.py +1 -0
  3. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/content.js +28 -11
  4. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code.egg-info/PKG-INFO +1 -1
  5. {browse_code-0.2.9 → browse_code-0.2.12}/setup.py +1 -1
  6. browse_code-0.2.9/browse_code/__init__.py +0 -1
  7. {browse_code-0.2.9 → browse_code-0.2.12}/README.md +0 -0
  8. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/cli.py +0 -0
  9. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/icon128.png +0 -0
  10. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/icon16.png +0 -0
  11. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/icon48.png +0 -0
  12. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/manifest.json +0 -0
  13. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/popup.html +0 -0
  14. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/popup.js +0 -0
  15. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/extension/spoof.js +0 -0
  16. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code/server.py +0 -0
  17. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code.egg-info/SOURCES.txt +0 -0
  18. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code.egg-info/dependency_links.txt +0 -0
  19. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code.egg-info/entry_points.txt +0 -0
  20. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code.egg-info/requires.txt +0 -0
  21. {browse_code-0.2.9 → browse_code-0.2.12}/browse_code.egg-info/top_level.txt +0 -0
  22. {browse_code-0.2.9 → browse_code-0.2.12}/pyproject.toml +0 -0
  23. {browse_code-0.2.9 → browse_code-0.2.12}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: browse_code
3
- Version: 0.2.9
3
+ Version: 0.2.12
4
4
  Summary: Turn any AI chatbot into an autonomous coding agent
5
5
  Description-Content-Type: text/markdown
6
6
  Requires-Dist: fastapi
@@ -0,0 +1 @@
1
+ __version__ = "0.2.12"
@@ -6,7 +6,7 @@ let PLATFORM = {};
6
6
  if (hostname.includes('gemini.google.com')) {
7
7
  PLATFORM = {
8
8
  name: "Gemini",
9
- inputBox: 'rich-textarea div[contenteditable="true"], div[role="textbox"][contenteditable="true"]',
9
+ inputBox: 'rich-textarea div[contenteditable="true"], div[role="textbox"][contenteditable="true"], .ql-editor, textarea, input',
10
10
  sendBtn: 'button[aria-label*="Send"], button[aria-label*="send"], button[mattooltip*="Send"]',
11
11
  responseContainer: 'message-content, model-response, .model-response-text'
12
12
  };
@@ -231,11 +231,34 @@ async function injectAndSend(promptText) {
231
231
 
232
232
  await new Promise(r => setTimeout(r, 800));
233
233
 
234
- const sendButton = document.querySelector(PLATFORM.sendBtn);
235
- if (sendButton && (!sendButton.disabled && sendButton.getAttribute('aria-disabled') !== 'true')) {
236
- sendButton.click();
237
- } else {
234
+ const trySend = () => {
235
+ const btn = document.querySelector(PLATFORM.sendBtn);
236
+ if (btn && !btn.disabled && btn.getAttribute('aria-disabled') !== 'true') {
237
+ btn.click();
238
+ return true;
239
+ }
240
+ return false;
241
+ };
242
+
243
+ if (!trySend()) {
238
244
  inputBox.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: true, key: 'Enter', code: 'Enter' }));
245
+
246
+ // If the user switched tabs, React might suspend and the button stays disabled.
247
+ // Setup an aggressive retry loop that clicks it the moment they focus the tab and React wakes up.
248
+ const clickInterval = setInterval(() => {
249
+ const currentText = inputBox.tagName === 'INPUT' || inputBox.tagName === 'TEXTAREA' ? inputBox.value : inputBox.textContent;
250
+ // Abort if the user manually cleared or changed the input significantly
251
+ if (!currentText || currentText.length < promptText.length * 0.5) {
252
+ clearInterval(clickInterval);
253
+ return;
254
+ }
255
+ if (trySend()) {
256
+ clearInterval(clickInterval);
257
+ }
258
+ }, 500);
259
+
260
+ // Clear interval after 15 seconds to avoid infinite loops
261
+ setTimeout(() => clearInterval(clickInterval), 15000);
239
262
  }
240
263
  }
241
264
 
@@ -257,12 +280,6 @@ function processQueue() {
257
280
  const userText = inputBox.tagName === 'INPUT' || inputBox.tagName === 'TEXTAREA' ? inputBox.value : inputBox.textContent;
258
281
  if (userText && userText.trim() !== "") return;
259
282
 
260
- // Do not inject if the LLM is currently generating (Send button is missing or disabled)
261
- const sendButton = document.querySelector(PLATFORM.sendBtn);
262
- if (!sendButton || sendButton.disabled || sendButton.getAttribute('aria-disabled') === 'true') {
263
- return;
264
- }
265
-
266
283
  const nextMessage = messageQueue.shift();
267
284
  isInjectingQueue = true;
268
285
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: browse_code
3
- Version: 0.2.9
3
+ Version: 0.2.12
4
4
  Summary: Turn any AI chatbot into an autonomous coding agent
5
5
  Description-Content-Type: text/markdown
6
6
  Requires-Dist: fastapi
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="browse_code",
5
- version="0.2.9",
5
+ version="0.2.12",
6
6
  description="Turn any AI chatbot into an autonomous coding agent",
7
7
  long_description=open("README.md").read(),
8
8
  long_description_content_type="text/markdown",
@@ -1 +0,0 @@
1
- __version__ = "0.2.9"
File without changes
File without changes
File without changes