feat(ext): expose extension to main-world and auth with token

This commit is contained in:
Simon
2026-01-28 19:47:15 +08:00
parent ff75aebc20
commit ef2d115742
7 changed files with 192 additions and 9 deletions

View File

@@ -1,4 +1,5 @@
import { initPageController } from '@/agent/RemotePageController.content'
import { DEMO_CONFIG } from '@/agent/constants'
const DEBUG_PREFIX = '[Content]'
@@ -9,5 +10,62 @@ export default defineContentScript({
main() {
console.debug(`${DEBUG_PREFIX} Loaded on ${window.location.href}`)
initPageController()
// if auth token matches, expose agent to page
chrome.storage.local.get('PageAgentExtUserAuthToken').then((result) => {
if (!result.PageAgentExtUserAuthToken) return
if (!localStorage.getItem('PageAgentExtUserAuthToken')) return
if (localStorage.getItem('PageAgentExtUserAuthToken') !== result.PageAgentExtUserAuthToken)
return
exposeAgentToPage()
injectScript('/main-world.js')
})
},
})
async function exposeAgentToPage() {
const { MultiPageAgent } = await import('@/agent/MultiPageAgent')
console.log('MultiPageAgent loaded', MultiPageAgent)
/**
* singleton MultiPageAgent to handle requests from the page
*/
let multiPageAgent: InstanceType<typeof MultiPageAgent> | null = null
window.addEventListener('message', async (e) => {
const data = e.data
if (typeof data !== 'object' || data === null) return
if (data.channel !== 'PAGE_AGENT_EXT_REQUEST') return
const { action, payload, id } = data
switch (action) {
case 'execute': {
if (!multiPageAgent) multiPageAgent = new MultiPageAgent(DEMO_CONFIG)
const result = await multiPageAgent.execute(payload)
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
payload: result,
},
'*'
)
break
}
case 'dispose': {
// @note stop ongoing processes but can still be re-used later
multiPageAgent?.dispose()
break
}
default:
console.warn(`${DEBUG_PREFIX} Unknown action from page:`, action)
break
}
})
}