11import browser from 'webextension-polyfill' ;
22import { defineContentScript } from 'wxt/utils/define-content-script' ;
33import { createLLMHelper } from '~/utils/llm-helper' ;
4+ import type { ContentScriptFunctionRequest } from '~/utils/types' ;
5+
6+ // Validation functions for tool arguments
7+ function validateStringArg ( value : unknown , name : string ) : string {
8+ if ( typeof value !== 'string' ) {
9+ throw new Error ( `${ name } must be a string, got ${ typeof value } ` ) ;
10+ }
11+ return value ;
12+ }
13+
14+ function validateOptionalStringArg ( value : unknown , name : string ) : string | undefined {
15+ if ( value === undefined || value === null ) {
16+ return undefined ;
17+ }
18+ if ( typeof value !== 'string' ) {
19+ throw new Error ( `${ name } must be a string or undefined, got ${ typeof value } ` ) ;
20+ }
21+ return value ;
22+ }
23+
24+ function validateNumberArg ( value : unknown , name : string ) : number {
25+ if ( typeof value !== 'number' ) {
26+ throw new Error ( `${ name } must be a number, got ${ typeof value } ` ) ;
27+ }
28+ return value ;
29+ }
430
531export default defineContentScript ( {
632 matches : [ '<all_urls>' ] ,
@@ -9,33 +35,52 @@ export default defineContentScript({
935 const LLMHelper = createLLMHelper ( ) ;
1036
1137 // Make LLMHelper globally available
12- ( window as any ) . LLMHelper = LLMHelper ;
38+ ( window as typeof window & { LLMHelper : ReturnType < typeof createLLMHelper > } ) . LLMHelper =
39+ LLMHelper ;
1340
1441 // Listen for messages from the extension
15- browser . runtime . onMessage . addListener ( ( request : any , _sender , sendResponse ) => {
16- if ( request . type === 'EXECUTE_FUNCTION' ) {
42+ browser . runtime . onMessage . addListener ( ( request : unknown , _sender , sendResponse ) => {
43+ const typedRequest = request as ContentScriptFunctionRequest ;
44+ if ( typedRequest . type === 'EXECUTE_FUNCTION' ) {
1745 try {
18- const functionName = request . function ;
19- const args = request . arguments || { } ;
46+ const functionName = typedRequest . function ;
47+ const args = typedRequest . arguments || { } ;
2048
2149 if ( functionName in LLMHelper ) {
2250 // Handle function arguments properly based on function signature
23- let result ;
51+ let result : unknown ;
2452 switch ( functionName ) {
2553 case 'find' :
26- result = LLMHelper . find ( args . pattern , args . options ) ;
54+ result = LLMHelper . find (
55+ validateStringArg ( args . pattern , 'pattern' ) ,
56+ args . options as
57+ | { limit ?: number ; type ?: string ; visible ?: boolean ; offset ?: number }
58+ | undefined ,
59+ ) ;
2760 break ;
2861 case 'click' :
29- result = LLMHelper . click ( args . selector , args . text ) ;
62+ result = LLMHelper . click (
63+ validateStringArg ( args . selector , 'selector' ) ,
64+ validateOptionalStringArg ( args . text , 'text' ) ,
65+ ) ;
3066 break ;
3167 case 'type' :
32- result = LLMHelper . type ( args . selector , args . text , args . options ) ;
68+ result = LLMHelper . type (
69+ validateStringArg ( args . selector , 'selector' ) ,
70+ validateStringArg ( args . text , 'text' ) ,
71+ args . options as
72+ | { clear ?: boolean ; delay ?: number ; pressEnter ?: boolean }
73+ | undefined ,
74+ ) ;
3375 break ;
3476 case 'extract' :
35- result = LLMHelper . extract ( args . selector , args . property ) ;
77+ result = LLMHelper . extract (
78+ validateStringArg ( args . selector , 'selector' ) ,
79+ validateOptionalStringArg ( args . property , 'property' ) ,
80+ ) ;
3681 break ;
3782 case 'describe' :
38- result = LLMHelper . describe ( args . selector ) ;
83+ result = LLMHelper . describe ( validateStringArg ( args . selector , 'selector' ) ) ;
3984 break ;
4085 case 'summary' :
4186 result = LLMHelper . summary ( ) ;
@@ -55,8 +100,11 @@ export default defineContentScript({
55100 return true ; // Keep message channel open for async response
56101 case 'getResponsePage' :
57102 // Handle getResponsePage asynchronously
58- LLMHelper . getResponsePage ( args . responseId , args . page )
59- . then ( ( result : any ) => {
103+ LLMHelper . getResponsePage (
104+ validateStringArg ( args . responseId , 'responseId' ) ,
105+ validateNumberArg ( args . page , 'page' ) ,
106+ )
107+ . then ( ( result : { result : unknown ; _meta : unknown } ) => {
60108 sendResponse ( { success : true , result : result . result , _meta : result . _meta } ) ;
61109 } )
62110 . catch ( ( error : unknown ) => {
0 commit comments