@agenticmail/enterprise 0.5.327 → 0.5.328
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/dist/dashboard/app.js +1 -1
- package/logs/cloudflared-error.log +6 -0
- package/logs/enterprise-out.log +1 -0
- package/package.json +1 -1
- package/src/admin/page-registry.ts +0 -290
- package/src/admin/routes.ts +0 -2968
- package/src/agent-tools/common.ts +0 -260
- package/src/agent-tools/index.ts +0 -542
- package/src/agent-tools/merge.ts +0 -62
- package/src/agent-tools/middleware.ts +0 -436
- package/src/agent-tools/schema/typebox.ts +0 -25
- package/src/agent-tools/security.ts +0 -352
- package/src/agent-tools/tool-resolver.ts +0 -1018
- package/src/agent-tools/tools/agenticmail.ts +0 -1017
- package/src/agent-tools/tools/bash.ts +0 -179
- package/src/agent-tools/tools/browser-tool.schema.ts +0 -112
- package/src/agent-tools/tools/browser-tool.ts +0 -388
- package/src/agent-tools/tools/browser.ts +0 -764
- package/src/agent-tools/tools/edit.ts +0 -100
- package/src/agent-tools/tools/enterprise-code-sandbox.ts +0 -395
- package/src/agent-tools/tools/enterprise-database.ts +0 -377
- package/src/agent-tools/tools/enterprise-diff.ts +0 -580
- package/src/agent-tools/tools/enterprise-documents.ts +0 -896
- package/src/agent-tools/tools/enterprise-http.ts +0 -485
- package/src/agent-tools/tools/enterprise-security-scan.ts +0 -528
- package/src/agent-tools/tools/enterprise-spreadsheet.ts +0 -825
- package/src/agent-tools/tools/glob.ts +0 -129
- package/src/agent-tools/tools/google/calendar.ts +0 -230
- package/src/agent-tools/tools/google/chat.ts +0 -725
- package/src/agent-tools/tools/google/contacts.ts +0 -209
- package/src/agent-tools/tools/google/docs.ts +0 -162
- package/src/agent-tools/tools/google/drive.ts +0 -392
- package/src/agent-tools/tools/google/forms.ts +0 -367
- package/src/agent-tools/tools/google/gmail.ts +0 -897
- package/src/agent-tools/tools/google/index.ts +0 -86
- package/src/agent-tools/tools/google/maps.ts +0 -543
- package/src/agent-tools/tools/google/meeting-voice.ts +0 -885
- package/src/agent-tools/tools/google/meetings.ts +0 -1094
- package/src/agent-tools/tools/google/sheets.ts +0 -215
- package/src/agent-tools/tools/google/slides.ts +0 -559
- package/src/agent-tools/tools/google/tasks.ts +0 -200
- package/src/agent-tools/tools/grep.ts +0 -178
- package/src/agent-tools/tools/integrations/_factory.ts +0 -102
- package/src/agent-tools/tools/integrations/activecampaign.ts +0 -14
- package/src/agent-tools/tools/integrations/adobe-sign.ts +0 -14
- package/src/agent-tools/tools/integrations/adp.ts +0 -14
- package/src/agent-tools/tools/integrations/airtable.ts +0 -14
- package/src/agent-tools/tools/integrations/apollo.ts +0 -14
- package/src/agent-tools/tools/integrations/asana.ts +0 -14
- package/src/agent-tools/tools/integrations/auth0.ts +0 -14
- package/src/agent-tools/tools/integrations/aws.ts +0 -14
- package/src/agent-tools/tools/integrations/azure-devops.ts +0 -14
- package/src/agent-tools/tools/integrations/bamboohr.ts +0 -14
- package/src/agent-tools/tools/integrations/basecamp.ts +0 -14
- package/src/agent-tools/tools/integrations/bigcommerce.ts +0 -14
- package/src/agent-tools/tools/integrations/bitbucket.ts +0 -14
- package/src/agent-tools/tools/integrations/box.ts +0 -14
- package/src/agent-tools/tools/integrations/brex.ts +0 -14
- package/src/agent-tools/tools/integrations/buffer.ts +0 -14
- package/src/agent-tools/tools/integrations/calendly.ts +0 -14
- package/src/agent-tools/tools/integrations/canva.ts +0 -14
- package/src/agent-tools/tools/integrations/chargebee.ts +0 -14
- package/src/agent-tools/tools/integrations/circleci.ts +0 -14
- package/src/agent-tools/tools/integrations/clickup.ts +0 -14
- package/src/agent-tools/tools/integrations/close.ts +0 -14
- package/src/agent-tools/tools/integrations/cloudflare.ts +0 -14
- package/src/agent-tools/tools/integrations/confluence.ts +0 -14
- package/src/agent-tools/tools/integrations/contentful.ts +0 -14
- package/src/agent-tools/tools/integrations/copper.ts +0 -14
- package/src/agent-tools/tools/integrations/crisp.ts +0 -14
- package/src/agent-tools/tools/integrations/crowdstrike.ts +0 -14
- package/src/agent-tools/tools/integrations/datadog.ts +0 -14
- package/src/agent-tools/tools/integrations/digitalocean.ts +0 -14
- package/src/agent-tools/tools/integrations/discord.ts +0 -14
- package/src/agent-tools/tools/integrations/docker.ts +0 -14
- package/src/agent-tools/tools/integrations/docusign.ts +0 -14
- package/src/agent-tools/tools/integrations/drift.ts +0 -14
- package/src/agent-tools/tools/integrations/dropbox.ts +0 -14
- package/src/agent-tools/tools/integrations/figma.ts +0 -14
- package/src/agent-tools/tools/integrations/firebase.ts +0 -14
- package/src/agent-tools/tools/integrations/flyio.ts +0 -14
- package/src/agent-tools/tools/integrations/freshbooks.ts +0 -14
- package/src/agent-tools/tools/integrations/freshdesk.ts +0 -14
- package/src/agent-tools/tools/integrations/freshsales.ts +0 -14
- package/src/agent-tools/tools/integrations/freshservice.ts +0 -14
- package/src/agent-tools/tools/integrations/front.ts +0 -14
- package/src/agent-tools/tools/integrations/github-actions.ts +0 -14
- package/src/agent-tools/tools/integrations/github.ts +0 -14
- package/src/agent-tools/tools/integrations/gitlab.ts +0 -14
- package/src/agent-tools/tools/integrations/gong.ts +0 -14
- package/src/agent-tools/tools/integrations/google-ads.ts +0 -14
- package/src/agent-tools/tools/integrations/google-analytics.ts +0 -14
- package/src/agent-tools/tools/integrations/google-cloud.ts +0 -14
- package/src/agent-tools/tools/integrations/gotomeeting.ts +0 -14
- package/src/agent-tools/tools/integrations/grafana.ts +0 -14
- package/src/agent-tools/tools/integrations/greenhouse.ts +0 -14
- package/src/agent-tools/tools/integrations/gusto.ts +0 -14
- package/src/agent-tools/tools/integrations/hashicorp-vault.ts +0 -14
- package/src/agent-tools/tools/integrations/heroku.ts +0 -14
- package/src/agent-tools/tools/integrations/hibob.ts +0 -14
- package/src/agent-tools/tools/integrations/hootsuite.ts +0 -14
- package/src/agent-tools/tools/integrations/hubspot.ts +0 -14
- package/src/agent-tools/tools/integrations/huggingface.ts +0 -14
- package/src/agent-tools/tools/integrations/index.ts +0 -474
- package/src/agent-tools/tools/integrations/intercom.ts +0 -14
- package/src/agent-tools/tools/integrations/jira.ts +0 -14
- package/src/agent-tools/tools/integrations/klaviyo.ts +0 -14
- package/src/agent-tools/tools/integrations/kubernetes.ts +0 -14
- package/src/agent-tools/tools/integrations/lattice.ts +0 -14
- package/src/agent-tools/tools/integrations/launchdarkly.ts +0 -14
- package/src/agent-tools/tools/integrations/lever.ts +0 -14
- package/src/agent-tools/tools/integrations/linear.ts +0 -14
- package/src/agent-tools/tools/integrations/linkedin.ts +0 -14
- package/src/agent-tools/tools/integrations/livechat.ts +0 -14
- package/src/agent-tools/tools/integrations/loom.ts +0 -14
- package/src/agent-tools/tools/integrations/mailchimp.ts +0 -14
- package/src/agent-tools/tools/integrations/mailgun.ts +0 -14
- package/src/agent-tools/tools/integrations/miro.ts +0 -14
- package/src/agent-tools/tools/integrations/mixpanel.ts +0 -14
- package/src/agent-tools/tools/integrations/monday.ts +0 -14
- package/src/agent-tools/tools/integrations/mongodb-atlas.ts +0 -14
- package/src/agent-tools/tools/integrations/neon.ts +0 -14
- package/src/agent-tools/tools/integrations/netlify.ts +0 -14
- package/src/agent-tools/tools/integrations/netsuite.ts +0 -14
- package/src/agent-tools/tools/integrations/newrelic.ts +0 -14
- package/src/agent-tools/tools/integrations/notion.ts +0 -14
- package/src/agent-tools/tools/integrations/okta.ts +0 -14
- package/src/agent-tools/tools/integrations/openai.ts +0 -14
- package/src/agent-tools/tools/integrations/opsgenie.ts +0 -14
- package/src/agent-tools/tools/integrations/outreach.ts +0 -14
- package/src/agent-tools/tools/integrations/paddle.ts +0 -14
- package/src/agent-tools/tools/integrations/pagerduty.ts +0 -14
- package/src/agent-tools/tools/integrations/pandadoc.ts +0 -14
- package/src/agent-tools/tools/integrations/paypal.ts +0 -14
- package/src/agent-tools/tools/integrations/personio.ts +0 -14
- package/src/agent-tools/tools/integrations/pinecone.ts +0 -14
- package/src/agent-tools/tools/integrations/pipedrive.ts +0 -14
- package/src/agent-tools/tools/integrations/plaid.ts +0 -14
- package/src/agent-tools/tools/integrations/postmark.ts +0 -14
- package/src/agent-tools/tools/integrations/power-automate.ts +0 -14
- package/src/agent-tools/tools/integrations/quickbooks.ts +0 -14
- package/src/agent-tools/tools/integrations/recurly.ts +0 -14
- package/src/agent-tools/tools/integrations/reddit.ts +0 -14
- package/src/agent-tools/tools/integrations/render.ts +0 -14
- package/src/agent-tools/tools/integrations/ringcentral.ts +0 -14
- package/src/agent-tools/tools/integrations/rippling.ts +0 -14
- package/src/agent-tools/tools/integrations/salesforce.ts +0 -14
- package/src/agent-tools/tools/integrations/salesloft.ts +0 -14
- package/src/agent-tools/tools/integrations/sanity.ts +0 -14
- package/src/agent-tools/tools/integrations/sap.ts +0 -14
- package/src/agent-tools/tools/integrations/segment.ts +0 -14
- package/src/agent-tools/tools/integrations/sendgrid.ts +0 -14
- package/src/agent-tools/tools/integrations/sentry.ts +0 -14
- package/src/agent-tools/tools/integrations/servicenow.ts +0 -14
- package/src/agent-tools/tools/integrations/shopify.ts +0 -14
- package/src/agent-tools/tools/integrations/shortcut.ts +0 -14
- package/src/agent-tools/tools/integrations/slack.ts +0 -14
- package/src/agent-tools/tools/integrations/smartsheet.ts +0 -14
- package/src/agent-tools/tools/integrations/snowflake.ts +0 -14
- package/src/agent-tools/tools/integrations/snyk.ts +0 -14
- package/src/agent-tools/tools/integrations/splunk.ts +0 -14
- package/src/agent-tools/tools/integrations/square.ts +0 -14
- package/src/agent-tools/tools/integrations/statuspage.ts +0 -14
- package/src/agent-tools/tools/integrations/stripe.ts +0 -14
- package/src/agent-tools/tools/integrations/supabase.ts +0 -14
- package/src/agent-tools/tools/integrations/teamwork.ts +0 -14
- package/src/agent-tools/tools/integrations/telegram.ts +0 -14
- package/src/agent-tools/tools/integrations/terraform.ts +0 -14
- package/src/agent-tools/tools/integrations/todoist.ts +0 -14
- package/src/agent-tools/tools/integrations/trello.ts +0 -14
- package/src/agent-tools/tools/integrations/twilio.ts +0 -14
- package/src/agent-tools/tools/integrations/twitter.ts +0 -14
- package/src/agent-tools/tools/integrations/vercel.ts +0 -14
- package/src/agent-tools/tools/integrations/weaviate.ts +0 -14
- package/src/agent-tools/tools/integrations/webex.ts +0 -14
- package/src/agent-tools/tools/integrations/webflow.ts +0 -14
- package/src/agent-tools/tools/integrations/whatsapp.ts +0 -14
- package/src/agent-tools/tools/integrations/whereby.ts +0 -14
- package/src/agent-tools/tools/integrations/woocommerce.ts +0 -14
- package/src/agent-tools/tools/integrations/wordpress.ts +0 -14
- package/src/agent-tools/tools/integrations/workday.ts +0 -14
- package/src/agent-tools/tools/integrations/wrike.ts +0 -14
- package/src/agent-tools/tools/integrations/xero.ts +0 -14
- package/src/agent-tools/tools/integrations/youtube.ts +0 -14
- package/src/agent-tools/tools/integrations/zendesk.ts +0 -14
- package/src/agent-tools/tools/integrations/zoho-crm.ts +0 -14
- package/src/agent-tools/tools/integrations/zoom.ts +0 -14
- package/src/agent-tools/tools/integrations/zuora.ts +0 -14
- package/src/agent-tools/tools/knowledge-search.ts +0 -318
- package/src/agent-tools/tools/local/coding.ts +0 -626
- package/src/agent-tools/tools/local/dependency-manager.ts +0 -647
- package/src/agent-tools/tools/local/file-edit.ts +0 -31
- package/src/agent-tools/tools/local/file-list.ts +0 -39
- package/src/agent-tools/tools/local/file-ops.ts +0 -48
- package/src/agent-tools/tools/local/file-read.ts +0 -39
- package/src/agent-tools/tools/local/file-search.ts +0 -46
- package/src/agent-tools/tools/local/file-write.ts +0 -28
- package/src/agent-tools/tools/local/filesystem.ts +0 -5
- package/src/agent-tools/tools/local/index.ts +0 -55
- package/src/agent-tools/tools/local/resolve-path.ts +0 -18
- package/src/agent-tools/tools/local/shell.ts +0 -277
- package/src/agent-tools/tools/local/system-info.ts +0 -29
- package/src/agent-tools/tools/management.ts +0 -425
- package/src/agent-tools/tools/mcp-bridge.ts +0 -142
- package/src/agent-tools/tools/mcp-server-tools.ts +0 -91
- package/src/agent-tools/tools/meeting-lifecycle.ts +0 -438
- package/src/agent-tools/tools/memory.ts +0 -509
- package/src/agent-tools/tools/messaging/index.ts +0 -6
- package/src/agent-tools/tools/messaging/telegram.ts +0 -167
- package/src/agent-tools/tools/messaging/whatsapp.ts +0 -651
- package/src/agent-tools/tools/microsoft/contacts.ts +0 -176
- package/src/agent-tools/tools/microsoft/excel-vba.ts +0 -331
- package/src/agent-tools/tools/microsoft/excel.ts +0 -261
- package/src/agent-tools/tools/microsoft/graph-api.ts +0 -161
- package/src/agent-tools/tools/microsoft/index.ts +0 -95
- package/src/agent-tools/tools/microsoft/onedrive.ts +0 -429
- package/src/agent-tools/tools/microsoft/onenote.ts +0 -186
- package/src/agent-tools/tools/microsoft/outlook-calendar.ts +0 -286
- package/src/agent-tools/tools/microsoft/outlook-mail.ts +0 -723
- package/src/agent-tools/tools/microsoft/planner.ts +0 -200
- package/src/agent-tools/tools/microsoft/powerbi.ts +0 -266
- package/src/agent-tools/tools/microsoft/powerpoint.ts +0 -186
- package/src/agent-tools/tools/microsoft/sharepoint.ts +0 -328
- package/src/agent-tools/tools/microsoft/teams.ts +0 -463
- package/src/agent-tools/tools/microsoft/todo.ts +0 -181
- package/src/agent-tools/tools/oauth-token-provider.ts +0 -101
- package/src/agent-tools/tools/read.ts +0 -160
- package/src/agent-tools/tools/visual-memory/capture.ts +0 -217
- package/src/agent-tools/tools/visual-memory/diff.ts +0 -283
- package/src/agent-tools/tools/visual-memory/index.ts +0 -698
- package/src/agent-tools/tools/visual-memory/phash.ts +0 -120
- package/src/agent-tools/tools/visual-memory/similarity.ts +0 -354
- package/src/agent-tools/tools/visual-memory/storage.ts +0 -534
- package/src/agent-tools/tools/visual-memory/types.ts +0 -100
- package/src/agent-tools/tools/web-fetch-utils.ts +0 -202
- package/src/agent-tools/tools/web-fetch.ts +0 -464
- package/src/agent-tools/tools/web-search.ts +0 -480
- package/src/agent-tools/tools/web-shared.ts +0 -232
- package/src/agent-tools/tools/write.ts +0 -68
- package/src/agent-tools/types.ts +0 -214
- package/src/agenticmail/index.ts +0 -34
- package/src/agenticmail/manager.ts +0 -253
- package/src/agenticmail/providers/google.ts +0 -391
- package/src/agenticmail/providers/imap.ts +0 -454
- package/src/agenticmail/providers/index.ts +0 -28
- package/src/agenticmail/providers/microsoft.ts +0 -260
- package/src/agenticmail/types.ts +0 -173
- package/src/auth/routes.ts +0 -1589
- package/src/browser/bridge-auth-registry.ts +0 -34
- package/src/browser/bridge-server.ts +0 -93
- package/src/browser/cdp.helpers.ts +0 -180
- package/src/browser/cdp.ts +0 -466
- package/src/browser/chrome.executables.ts +0 -625
- package/src/browser/chrome.profile-decoration.ts +0 -198
- package/src/browser/chrome.ts +0 -349
- package/src/browser/client-actions-core.ts +0 -259
- package/src/browser/client-actions-observe.ts +0 -184
- package/src/browser/client-actions-state.ts +0 -284
- package/src/browser/client-actions-types.ts +0 -16
- package/src/browser/client-actions-url.ts +0 -11
- package/src/browser/client-actions.ts +0 -4
- package/src/browser/client-fetch.ts +0 -253
- package/src/browser/client.ts +0 -337
- package/src/browser/config.ts +0 -301
- package/src/browser/constants.ts +0 -8
- package/src/browser/control-auth.ts +0 -94
- package/src/browser/control-service.ts +0 -81
- package/src/browser/csrf.ts +0 -87
- package/src/browser/enterprise-compat.ts +0 -562
- package/src/browser/extension-relay.ts +0 -834
- package/src/browser/http-auth.ts +0 -63
- package/src/browser/navigation-guard.ts +0 -50
- package/src/browser/paths.ts +0 -49
- package/src/browser/playwright.d.ts +0 -12
- package/src/browser/profiles-service.ts +0 -187
- package/src/browser/profiles.ts +0 -114
- package/src/browser/proxy-files.ts +0 -41
- package/src/browser/pw-ai-module.ts +0 -52
- package/src/browser/pw-ai-state.ts +0 -9
- package/src/browser/pw-ai.ts +0 -65
- package/src/browser/pw-role-snapshot.ts +0 -434
- package/src/browser/pw-session.ts +0 -810
- package/src/browser/pw-tools-core.activity.ts +0 -68
- package/src/browser/pw-tools-core.downloads.ts +0 -281
- package/src/browser/pw-tools-core.interactions.ts +0 -646
- package/src/browser/pw-tools-core.responses.ts +0 -124
- package/src/browser/pw-tools-core.shared.ts +0 -70
- package/src/browser/pw-tools-core.snapshot.ts +0 -213
- package/src/browser/pw-tools-core.state.ts +0 -209
- package/src/browser/pw-tools-core.storage.ts +0 -128
- package/src/browser/pw-tools-core.trace.ts +0 -37
- package/src/browser/pw-tools-core.ts +0 -8
- package/src/browser/resolved-config-refresh.ts +0 -59
- package/src/browser/routes/agent.act.shared.ts +0 -52
- package/src/browser/routes/agent.act.ts +0 -575
- package/src/browser/routes/agent.debug.ts +0 -149
- package/src/browser/routes/agent.shared.ts +0 -143
- package/src/browser/routes/agent.snapshot.ts +0 -333
- package/src/browser/routes/agent.storage.ts +0 -451
- package/src/browser/routes/agent.ts +0 -13
- package/src/browser/routes/basic.ts +0 -202
- package/src/browser/routes/dispatcher.ts +0 -126
- package/src/browser/routes/index.ts +0 -11
- package/src/browser/routes/path-output.ts +0 -1
- package/src/browser/routes/tabs.ts +0 -217
- package/src/browser/routes/types.ts +0 -26
- package/src/browser/routes/utils.ts +0 -73
- package/src/browser/screenshot.ts +0 -54
- package/src/browser/server-context.ts +0 -688
- package/src/browser/server-context.types.ts +0 -65
- package/src/browser/server-lifecycle.ts +0 -48
- package/src/browser/server-middleware.ts +0 -37
- package/src/browser/server.ts +0 -110
- package/src/browser/target-id.ts +0 -30
- package/src/browser/trash.ts +0 -21
- package/src/cli-agent.ts +0 -2452
- package/src/cli-reset-password.ts +0 -138
- package/src/cli-serve.ts +0 -314
- package/src/cli.ts +0 -103
- package/src/dashboard/HELP-TOOLTIPS-GUIDE.md +0 -45
- package/src/dashboard/app.js +0 -579
- package/src/dashboard/assets/brand-logos.js +0 -350
- package/src/dashboard/assets/icons/emoji-icons.js +0 -893
- package/src/dashboard/assets/logo.png +0 -0
- package/src/dashboard/assets/provider-logos.js +0 -139
- package/src/dashboard/components/error-boundary.js +0 -21
- package/src/dashboard/components/help-button.js +0 -65
- package/src/dashboard/components/icons.js +0 -64
- package/src/dashboard/components/knowledge-link.js +0 -79
- package/src/dashboard/components/modal.js +0 -125
- package/src/dashboard/components/org-switcher.js +0 -156
- package/src/dashboard/components/persona-fields.js +0 -460
- package/src/dashboard/components/settings-help.js +0 -193
- package/src/dashboard/components/tag-input.js +0 -96
- package/src/dashboard/components/timezones.js +0 -352
- package/src/dashboard/components/transport-encryption.js +0 -288
- package/src/dashboard/components/utils.js +0 -205
- package/src/dashboard/data/countries.js +0 -255
- package/src/dashboard/docs/activity.html +0 -253
- package/src/dashboard/docs/agent-activity.html +0 -199
- package/src/dashboard/docs/agent-autonomy.html +0 -161
- package/src/dashboard/docs/agent-budget.html +0 -190
- package/src/dashboard/docs/agent-channels.html +0 -189
- package/src/dashboard/docs/agent-communication.html +0 -171
- package/src/dashboard/docs/agent-configuration.html +0 -194
- package/src/dashboard/docs/agent-deployment.html +0 -323
- package/src/dashboard/docs/agent-email.html +0 -184
- package/src/dashboard/docs/agent-guardrails.html +0 -206
- package/src/dashboard/docs/agent-manager.html +0 -226
- package/src/dashboard/docs/agent-memory.html +0 -215
- package/src/dashboard/docs/agent-overview.html +0 -226
- package/src/dashboard/docs/agent-permissions.html +0 -305
- package/src/dashboard/docs/agent-personal.html +0 -155
- package/src/dashboard/docs/agent-security.html +0 -188
- package/src/dashboard/docs/agent-skills.html +0 -224
- package/src/dashboard/docs/agent-tool-security.html +0 -205
- package/src/dashboard/docs/agent-tools.html +0 -238
- package/src/dashboard/docs/agent-whatsapp.html +0 -210
- package/src/dashboard/docs/agent-workforce.html +0 -199
- package/src/dashboard/docs/agents.html +0 -258
- package/src/dashboard/docs/approvals.html +0 -200
- package/src/dashboard/docs/audit.html +0 -206
- package/src/dashboard/docs/browser-providers.html +0 -313
- package/src/dashboard/docs/cluster.html +0 -285
- package/src/dashboard/docs/community-skills.html +0 -253
- package/src/dashboard/docs/compliance.html +0 -221
- package/src/dashboard/docs/dashboard.html +0 -84
- package/src/dashboard/docs/database-access.html +0 -322
- package/src/dashboard/docs/dlp.html +0 -268
- package/src/dashboard/docs/docs-style.css +0 -26
- package/src/dashboard/docs/domain-status.html +0 -294
- package/src/dashboard/docs/guardrails.html +0 -265
- package/src/dashboard/docs/journal.html +0 -197
- package/src/dashboard/docs/knowledge-contributions.html +0 -286
- package/src/dashboard/docs/knowledge.html +0 -268
- package/src/dashboard/docs/memory-transfer.html +0 -311
- package/src/dashboard/docs/messages.html +0 -217
- package/src/dashboard/docs/multi-tenant.html +0 -311
- package/src/dashboard/docs/org-chart.html +0 -239
- package/src/dashboard/docs/organizations.html +0 -182
- package/src/dashboard/docs/roles.html +0 -195
- package/src/dashboard/docs/settings-network.html +0 -321
- package/src/dashboard/docs/settings-security.html +0 -347
- package/src/dashboard/docs/settings-tool-security.html +0 -176
- package/src/dashboard/docs/settings.html +0 -280
- package/src/dashboard/docs/skill-connections.html +0 -270
- package/src/dashboard/docs/skills.html +0 -206
- package/src/dashboard/docs/task-pipeline.html +0 -261
- package/src/dashboard/docs/transport-encryption.html +0 -359
- package/src/dashboard/docs/users.html +0 -225
- package/src/dashboard/docs/vault.html +0 -260
- package/src/dashboard/docs/workforce.html +0 -245
- package/src/dashboard/index.html +0 -444
- package/src/dashboard/pages/activity.js +0 -379
- package/src/dashboard/pages/agent-detail/activity.js +0 -277
- package/src/dashboard/pages/agent-detail/autonomy.js +0 -244
- package/src/dashboard/pages/agent-detail/budget.js +0 -269
- package/src/dashboard/pages/agent-detail/channels.js +0 -494
- package/src/dashboard/pages/agent-detail/communication.js +0 -296
- package/src/dashboard/pages/agent-detail/configuration.js +0 -882
- package/src/dashboard/pages/agent-detail/deployment.js +0 -958
- package/src/dashboard/pages/agent-detail/email.js +0 -674
- package/src/dashboard/pages/agent-detail/guardrails.js +0 -521
- package/src/dashboard/pages/agent-detail/index.js +0 -261
- package/src/dashboard/pages/agent-detail/manager.js +0 -357
- package/src/dashboard/pages/agent-detail/meeting-browser.js +0 -933
- package/src/dashboard/pages/agent-detail/memory.js +0 -368
- package/src/dashboard/pages/agent-detail/overview.js +0 -844
- package/src/dashboard/pages/agent-detail/permissions.js +0 -1163
- package/src/dashboard/pages/agent-detail/personal-details.js +0 -404
- package/src/dashboard/pages/agent-detail/security.js +0 -409
- package/src/dashboard/pages/agent-detail/shared.js +0 -85
- package/src/dashboard/pages/agent-detail/skills-section.js +0 -183
- package/src/dashboard/pages/agent-detail/tool-security.js +0 -380
- package/src/dashboard/pages/agent-detail/tools.js +0 -322
- package/src/dashboard/pages/agent-detail/whatsapp.js +0 -824
- package/src/dashboard/pages/agent-detail/workforce.js +0 -683
- package/src/dashboard/pages/agents.js +0 -1242
- package/src/dashboard/pages/approvals.js +0 -100
- package/src/dashboard/pages/audit.js +0 -198
- package/src/dashboard/pages/cluster.js +0 -512
- package/src/dashboard/pages/community-skills.js +0 -1219
- package/src/dashboard/pages/compliance.js +0 -475
- package/src/dashboard/pages/dashboard.js +0 -180
- package/src/dashboard/pages/database-access.js +0 -812
- package/src/dashboard/pages/dlp.js +0 -293
- package/src/dashboard/pages/domain-status.js +0 -951
- package/src/dashboard/pages/guardrails.js +0 -1035
- package/src/dashboard/pages/journal.js +0 -172
- package/src/dashboard/pages/knowledge-contributions.js +0 -1682
- package/src/dashboard/pages/knowledge-import.js +0 -455
- package/src/dashboard/pages/knowledge.js +0 -582
- package/src/dashboard/pages/login.js +0 -1056
- package/src/dashboard/pages/memory-transfer.js +0 -631
- package/src/dashboard/pages/messages.js +0 -303
- package/src/dashboard/pages/org-chart.js +0 -349
- package/src/dashboard/pages/organizations.js +0 -1081
- package/src/dashboard/pages/roles.js +0 -780
- package/src/dashboard/pages/settings.js +0 -3790
- package/src/dashboard/pages/skill-connections.js +0 -982
- package/src/dashboard/pages/skills.js +0 -879
- package/src/dashboard/pages/task-pipeline.js +0 -684
- package/src/dashboard/pages/users.js +0 -867
- package/src/dashboard/pages/vault.js +0 -791
- package/src/dashboard/pages/workforce.js +0 -851
- package/src/dashboard/vendor/react-dom.development.js +0 -29924
- package/src/dashboard/vendor/react-dom.production.min.js +0 -267
- package/src/dashboard/vendor/react.development.js +0 -3343
- package/src/dashboard/vendor/react.production.min.js +0 -31
- package/src/database-access/agent-tools.ts +0 -193
- package/src/database-access/connection-manager.ts +0 -1341
- package/src/database-access/index.ts +0 -21
- package/src/database-access/query-sanitizer.ts +0 -220
- package/src/database-access/routes.ts +0 -226
- package/src/database-access/types.ts +0 -226
- package/src/db/adapter.ts +0 -510
- package/src/db/dynamodb.ts +0 -454
- package/src/db/factory.ts +0 -129
- package/src/db/mongodb.ts +0 -360
- package/src/db/mysql.ts +0 -531
- package/src/db/postgres.ts +0 -863
- package/src/db/proxy.ts +0 -39
- package/src/db/resolve-driver.ts +0 -29
- package/src/db/sql-schema.ts +0 -124
- package/src/db/sqlite.ts +0 -493
- package/src/db/turso.ts +0 -470
- package/src/deploy/fly.ts +0 -368
- package/src/deploy/managed.ts +0 -235
- package/src/domain-lock/cli-recover.ts +0 -591
- package/src/domain-lock/cli-verify.ts +0 -190
- package/src/domain-lock/index.ts +0 -220
- package/src/engine/activity-routes.ts +0 -154
- package/src/engine/activity.ts +0 -568
- package/src/engine/agent-autonomy.ts +0 -974
- package/src/engine/agent-config.ts +0 -646
- package/src/engine/agent-heartbeat.ts +0 -720
- package/src/engine/agent-hierarchy.ts +0 -1064
- package/src/engine/agent-memory.ts +0 -806
- package/src/engine/agent-notify.ts +0 -50
- package/src/engine/agent-routes.ts +0 -2583
- package/src/engine/agent-status.ts +0 -311
- package/src/engine/ambient-memory.ts +0 -401
- package/src/engine/approvals.ts +0 -615
- package/src/engine/assets/thinking-hum.mp3 +0 -0
- package/src/engine/catalog-routes.ts +0 -232
- package/src/engine/chat-poller.ts +0 -913
- package/src/engine/chat-webhook-routes.ts +0 -304
- package/src/engine/cli-build-skill.ts +0 -285
- package/src/engine/cli-submit-skill.ts +0 -200
- package/src/engine/cli-validate.ts +0 -188
- package/src/engine/cluster.ts +0 -278
- package/src/engine/communication-routes.ts +0 -139
- package/src/engine/communication.ts +0 -765
- package/src/engine/community-registry.ts +0 -1529
- package/src/engine/community-routes.ts +0 -260
- package/src/engine/compliance-routes.ts +0 -133
- package/src/engine/compliance.ts +0 -1679
- package/src/engine/config-bus.ts +0 -103
- package/src/engine/db-adapter.ts +0 -1156
- package/src/engine/db-schema.ts +0 -1945
- package/src/engine/deploy-schema-routes.ts +0 -176
- package/src/engine/deployer.ts +0 -957
- package/src/engine/dlp-routes.ts +0 -101
- package/src/engine/dlp.ts +0 -410
- package/src/engine/email-poller.ts +0 -855
- package/src/engine/emoji.ts +0 -106
- package/src/engine/guardrail-routes.ts +0 -125
- package/src/engine/guardrails.ts +0 -465
- package/src/engine/index.ts +0 -255
- package/src/engine/journal-routes.ts +0 -56
- package/src/engine/journal.ts +0 -249
- package/src/engine/knowledge-contribution-routes.ts +0 -633
- package/src/engine/knowledge-contribution.ts +0 -1386
- package/src/engine/knowledge-import/chunker.ts +0 -241
- package/src/engine/knowledge-import/import-manager.ts +0 -416
- package/src/engine/knowledge-import/index.ts +0 -27
- package/src/engine/knowledge-import/processors/clean.ts +0 -149
- package/src/engine/knowledge-import/processors/extract-gdrive.ts +0 -102
- package/src/engine/knowledge-import/processors/extract-github.ts +0 -74
- package/src/engine/knowledge-import/processors/extract-sharepoint.ts +0 -69
- package/src/engine/knowledge-import/processors/extract-web.ts +0 -275
- package/src/engine/knowledge-import/processors/index.ts +0 -18
- package/src/engine/knowledge-import/processors/pipeline.ts +0 -171
- package/src/engine/knowledge-import/processors/types.ts +0 -78
- package/src/engine/knowledge-import/processors/validate.ts +0 -150
- package/src/engine/knowledge-import/provider-file-upload.ts +0 -95
- package/src/engine/knowledge-import/provider-github.ts +0 -144
- package/src/engine/knowledge-import/provider-google-sites.ts +0 -323
- package/src/engine/knowledge-import/provider-sharepoint.ts +0 -276
- package/src/engine/knowledge-import/provider-url.ts +0 -218
- package/src/engine/knowledge-import/routes.ts +0 -94
- package/src/engine/knowledge-import/types.ts +0 -92
- package/src/engine/knowledge-routes.ts +0 -231
- package/src/engine/knowledge.ts +0 -587
- package/src/engine/lifecycle.ts +0 -1420
- package/src/engine/mcp-process-manager.ts +0 -573
- package/src/engine/meeting-monitor.ts +0 -483
- package/src/engine/meeting-voice-intelligence.ts +0 -340
- package/src/engine/memory-routes.ts +0 -142
- package/src/engine/memory-transfer-routes.ts +0 -339
- package/src/engine/messaging-history.ts +0 -177
- package/src/engine/messaging-poller.ts +0 -786
- package/src/engine/model-fallback.ts +0 -141
- package/src/engine/oauth-connect-routes.ts +0 -603
- package/src/engine/oauth-connect.ts +0 -304
- package/src/engine/onboarding-routes.ts +0 -148
- package/src/engine/onboarding.ts +0 -574
- package/src/engine/org-approval-routes.ts +0 -146
- package/src/engine/org-integration-routes.ts +0 -399
- package/src/engine/org-integrations.ts +0 -608
- package/src/engine/org-policies.ts +0 -502
- package/src/engine/policy-import-routes.ts +0 -125
- package/src/engine/policy-import.ts +0 -1186
- package/src/engine/policy-routes.ts +0 -163
- package/src/engine/routes.ts +0 -1236
- package/src/engine/screen-unlock.ts +0 -136
- package/src/engine/session-router.ts +0 -212
- package/src/engine/skill-updater-routes.ts +0 -132
- package/src/engine/skill-updater.ts +0 -480
- package/src/engine/skill-validator.ts +0 -331
- package/src/engine/skills/agent-management.ts +0 -119
- package/src/engine/skills/agent-memory.ts +0 -19
- package/src/engine/skills/agenticmail.ts +0 -116
- package/src/engine/skills/core-tools.ts +0 -25
- package/src/engine/skills/database-access.ts +0 -78
- package/src/engine/skills/enterprise-code-sandbox.ts +0 -113
- package/src/engine/skills/enterprise-database.ts +0 -123
- package/src/engine/skills/enterprise-diff.ts +0 -95
- package/src/engine/skills/enterprise-documents.ts +0 -162
- package/src/engine/skills/enterprise-http.ts +0 -99
- package/src/engine/skills/enterprise-security-scan.ts +0 -125
- package/src/engine/skills/enterprise-spreadsheet.ts +0 -171
- package/src/engine/skills/gws-admin.ts +0 -18
- package/src/engine/skills/gws-calendar.ts +0 -21
- package/src/engine/skills/gws-chat.ts +0 -29
- package/src/engine/skills/gws-contacts.ts +0 -20
- package/src/engine/skills/gws-docs.ts +0 -18
- package/src/engine/skills/gws-drive.ts +0 -23
- package/src/engine/skills/gws-forms.ts +0 -23
- package/src/engine/skills/gws-gmail.ts +0 -30
- package/src/engine/skills/gws-groups.ts +0 -17
- package/src/engine/skills/gws-keep.ts +0 -17
- package/src/engine/skills/gws-maps.ts +0 -25
- package/src/engine/skills/gws-meet.ts +0 -23
- package/src/engine/skills/gws-sheets.ts +0 -22
- package/src/engine/skills/gws-sites.ts +0 -16
- package/src/engine/skills/gws-slides.ts +0 -27
- package/src/engine/skills/gws-tasks.ts +0 -22
- package/src/engine/skills/gws-vault.ts +0 -17
- package/src/engine/skills/index.ts +0 -159
- package/src/engine/skills/knowledge-search.ts +0 -18
- package/src/engine/skills/local-system.ts +0 -61
- package/src/engine/skills/m365-admin.ts +0 -18
- package/src/engine/skills/m365-bookings.ts +0 -17
- package/src/engine/skills/m365-copilot.ts +0 -17
- package/src/engine/skills/m365-excel.ts +0 -60
- package/src/engine/skills/m365-forms.ts +0 -17
- package/src/engine/skills/m365-onedrive.ts +0 -60
- package/src/engine/skills/m365-onenote.ts +0 -17
- package/src/engine/skills/m365-outlook.ts +0 -27
- package/src/engine/skills/m365-planner.ts +0 -18
- package/src/engine/skills/m365-power-automate.ts +0 -18
- package/src/engine/skills/m365-power-bi.ts +0 -19
- package/src/engine/skills/m365-powerpoint.ts +0 -33
- package/src/engine/skills/m365-sharepoint.ts +0 -20
- package/src/engine/skills/m365-teams.ts +0 -21
- package/src/engine/skills/m365-todo.ts +0 -17
- package/src/engine/skills/m365-whiteboard.ts +0 -16
- package/src/engine/skills/m365-word.ts +0 -42
- package/src/engine/skills/mcp-bridge.ts +0 -45
- package/src/engine/skills/meeting-lifecycle.ts +0 -20
- package/src/engine/skills/messaging.ts +0 -46
- package/src/engine/skills/visual-memory.ts +0 -25
- package/src/engine/skills.ts +0 -688
- package/src/engine/soul-library.ts +0 -142
- package/src/engine/soul-templates.json +0 -1525
- package/src/engine/storage-manager.ts +0 -252
- package/src/engine/storage-routes.ts +0 -113
- package/src/engine/storage.ts +0 -528
- package/src/engine/task-poller.ts +0 -394
- package/src/engine/task-queue-after-spawn.ts +0 -66
- package/src/engine/task-queue-before-spawn.ts +0 -113
- package/src/engine/task-queue-routes.ts +0 -161
- package/src/engine/task-queue.ts +0 -664
- package/src/engine/tenant.ts +0 -409
- package/src/engine/tool-catalog.ts +0 -354
- package/src/engine/vault-routes.ts +0 -134
- package/src/engine/vault.ts +0 -601
- package/src/engine/workforce-routes.ts +0 -331
- package/src/engine/workforce.ts +0 -1161
- package/src/index.ts +0 -77
- package/src/lib/cidr.ts +0 -122
- package/src/lib/config-store.ts +0 -86
- package/src/lib/resilience.ts +0 -326
- package/src/lib/text-search.ts +0 -358
- package/src/mcp/adapters/activecampaign.adapter.ts +0 -391
- package/src/mcp/adapters/adobe-sign.adapter.ts +0 -469
- package/src/mcp/adapters/adp.adapter.ts +0 -358
- package/src/mcp/adapters/airtable.adapter.ts +0 -273
- package/src/mcp/adapters/apollo.adapter.ts +0 -420
- package/src/mcp/adapters/asana.adapter.ts +0 -315
- package/src/mcp/adapters/auth0.adapter.ts +0 -386
- package/src/mcp/adapters/aws.adapter.ts +0 -345
- package/src/mcp/adapters/azure-devops.adapter.ts +0 -389
- package/src/mcp/adapters/bamboohr.adapter.ts +0 -376
- package/src/mcp/adapters/basecamp.adapter.ts +0 -366
- package/src/mcp/adapters/bigcommerce.adapter.ts +0 -429
- package/src/mcp/adapters/bitbucket.adapter.ts +0 -260
- package/src/mcp/adapters/box.adapter.ts +0 -350
- package/src/mcp/adapters/brex.adapter.ts +0 -367
- package/src/mcp/adapters/buffer.adapter.ts +0 -303
- package/src/mcp/adapters/calendly.adapter.ts +0 -262
- package/src/mcp/adapters/canva.adapter.ts +0 -256
- package/src/mcp/adapters/chargebee.adapter.ts +0 -448
- package/src/mcp/adapters/circleci.adapter.ts +0 -216
- package/src/mcp/adapters/clickup.adapter.ts +0 -335
- package/src/mcp/adapters/close.adapter.ts +0 -390
- package/src/mcp/adapters/cloudflare.adapter.ts +0 -378
- package/src/mcp/adapters/confluence.adapter.ts +0 -301
- package/src/mcp/adapters/contentful.adapter.ts +0 -355
- package/src/mcp/adapters/copper.adapter.ts +0 -468
- package/src/mcp/adapters/crisp.adapter.ts +0 -415
- package/src/mcp/adapters/crowdstrike.adapter.ts +0 -413
- package/src/mcp/adapters/datadog.adapter.ts +0 -373
- package/src/mcp/adapters/digitalocean.adapter.ts +0 -336
- package/src/mcp/adapters/discord.adapter.ts +0 -248
- package/src/mcp/adapters/docker.adapter.ts +0 -238
- package/src/mcp/adapters/docusign.adapter.ts +0 -431
- package/src/mcp/adapters/drift.adapter.ts +0 -386
- package/src/mcp/adapters/dropbox.adapter.ts +0 -315
- package/src/mcp/adapters/figma.adapter.ts +0 -302
- package/src/mcp/adapters/firebase.adapter.ts +0 -446
- package/src/mcp/adapters/flyio.adapter.ts +0 -302
- package/src/mcp/adapters/freshbooks.adapter.ts +0 -474
- package/src/mcp/adapters/freshdesk.adapter.ts +0 -441
- package/src/mcp/adapters/freshsales.adapter.ts +0 -457
- package/src/mcp/adapters/freshservice.adapter.ts +0 -481
- package/src/mcp/adapters/front.adapter.ts +0 -357
- package/src/mcp/adapters/github-actions.adapter.ts +0 -329
- package/src/mcp/adapters/github.adapter.ts +0 -387
- package/src/mcp/adapters/gitlab.adapter.ts +0 -368
- package/src/mcp/adapters/gong.adapter.ts +0 -386
- package/src/mcp/adapters/google-ads.adapter.ts +0 -363
- package/src/mcp/adapters/google-analytics.adapter.ts +0 -316
- package/src/mcp/adapters/google-cloud.adapter.ts +0 -312
- package/src/mcp/adapters/gotomeeting.adapter.ts +0 -255
- package/src/mcp/adapters/grafana.adapter.ts +0 -361
- package/src/mcp/adapters/greenhouse.adapter.ts +0 -354
- package/src/mcp/adapters/gusto.adapter.ts +0 -329
- package/src/mcp/adapters/hashicorp-vault.adapter.ts +0 -355
- package/src/mcp/adapters/heroku.adapter.ts +0 -291
- package/src/mcp/adapters/hibob.adapter.ts +0 -334
- package/src/mcp/adapters/hootsuite.adapter.ts +0 -322
- package/src/mcp/adapters/hubspot.adapter.ts +0 -400
- package/src/mcp/adapters/huggingface.adapter.ts +0 -349
- package/src/mcp/adapters/index.ts +0 -524
- package/src/mcp/adapters/intercom.adapter.ts +0 -269
- package/src/mcp/adapters/jira.adapter.ts +0 -482
- package/src/mcp/adapters/klaviyo.adapter.ts +0 -353
- package/src/mcp/adapters/kubernetes.adapter.ts +0 -431
- package/src/mcp/adapters/lattice.adapter.ts +0 -339
- package/src/mcp/adapters/launchdarkly.adapter.ts +0 -368
- package/src/mcp/adapters/lever.adapter.ts +0 -347
- package/src/mcp/adapters/linear.adapter.ts +0 -300
- package/src/mcp/adapters/linkedin.adapter.ts +0 -331
- package/src/mcp/adapters/livechat.adapter.ts +0 -259
- package/src/mcp/adapters/loom.adapter.ts +0 -230
- package/src/mcp/adapters/mailchimp.adapter.ts +0 -394
- package/src/mcp/adapters/mailgun.adapter.ts +0 -425
- package/src/mcp/adapters/miro.adapter.ts +0 -274
- package/src/mcp/adapters/mixpanel.adapter.ts +0 -324
- package/src/mcp/adapters/monday.adapter.ts +0 -308
- package/src/mcp/adapters/mongodb-atlas.adapter.ts +0 -345
- package/src/mcp/adapters/neon.adapter.ts +0 -312
- package/src/mcp/adapters/netlify.adapter.ts +0 -324
- package/src/mcp/adapters/netsuite.adapter.ts +0 -411
- package/src/mcp/adapters/newrelic.adapter.ts +0 -339
- package/src/mcp/adapters/notion.adapter.ts +0 -338
- package/src/mcp/adapters/okta.adapter.ts +0 -394
- package/src/mcp/adapters/openai.adapter.ts +0 -315
- package/src/mcp/adapters/opsgenie.adapter.ts +0 -375
- package/src/mcp/adapters/outreach.adapter.ts +0 -372
- package/src/mcp/adapters/paddle.adapter.ts +0 -467
- package/src/mcp/adapters/pagerduty.adapter.ts +0 -412
- package/src/mcp/adapters/pandadoc.adapter.ts +0 -389
- package/src/mcp/adapters/paypal.adapter.ts +0 -465
- package/src/mcp/adapters/personio.adapter.ts +0 -401
- package/src/mcp/adapters/pinecone.adapter.ts +0 -340
- package/src/mcp/adapters/pipedrive.adapter.ts +0 -324
- package/src/mcp/adapters/plaid.adapter.ts +0 -444
- package/src/mcp/adapters/postmark.adapter.ts +0 -387
- package/src/mcp/adapters/power-automate.adapter.ts +0 -388
- package/src/mcp/adapters/quickbooks.adapter.ts +0 -431
- package/src/mcp/adapters/recurly.adapter.ts +0 -433
- package/src/mcp/adapters/reddit.adapter.ts +0 -371
- package/src/mcp/adapters/render.adapter.ts +0 -332
- package/src/mcp/adapters/ringcentral.adapter.ts +0 -281
- package/src/mcp/adapters/rippling.adapter.ts +0 -287
- package/src/mcp/adapters/salesforce.adapter.ts +0 -321
- package/src/mcp/adapters/salesloft.adapter.ts +0 -413
- package/src/mcp/adapters/sanity.adapter.ts +0 -363
- package/src/mcp/adapters/sap.adapter.ts +0 -483
- package/src/mcp/adapters/segment.adapter.ts +0 -260
- package/src/mcp/adapters/sendgrid.adapter.ts +0 -265
- package/src/mcp/adapters/sentry.adapter.ts +0 -331
- package/src/mcp/adapters/servicenow.adapter.ts +0 -468
- package/src/mcp/adapters/shopify.adapter.ts +0 -451
- package/src/mcp/adapters/shortcut.adapter.ts +0 -290
- package/src/mcp/adapters/slack.adapter.ts +0 -380
- package/src/mcp/adapters/smartsheet.adapter.ts +0 -326
- package/src/mcp/adapters/snowflake.adapter.ts +0 -347
- package/src/mcp/adapters/snyk.adapter.ts +0 -394
- package/src/mcp/adapters/splunk.adapter.ts +0 -403
- package/src/mcp/adapters/square.adapter.ts +0 -467
- package/src/mcp/adapters/statuspage.adapter.ts +0 -401
- package/src/mcp/adapters/stripe.adapter.ts +0 -380
- package/src/mcp/adapters/supabase.adapter.ts +0 -334
- package/src/mcp/adapters/teamwork.adapter.ts +0 -404
- package/src/mcp/adapters/telegram.adapter.ts +0 -299
- package/src/mcp/adapters/terraform.adapter.ts +0 -300
- package/src/mcp/adapters/todoist.adapter.ts +0 -239
- package/src/mcp/adapters/trello.adapter.ts +0 -316
- package/src/mcp/adapters/twilio.adapter.ts +0 -233
- package/src/mcp/adapters/twitter.adapter.ts +0 -348
- package/src/mcp/adapters/vercel.adapter.ts +0 -219
- package/src/mcp/adapters/weaviate.adapter.ts +0 -371
- package/src/mcp/adapters/webex.adapter.ts +0 -237
- package/src/mcp/adapters/webflow.adapter.ts +0 -287
- package/src/mcp/adapters/whatsapp.adapter.ts +0 -273
- package/src/mcp/adapters/whereby.adapter.ts +0 -240
- package/src/mcp/adapters/woocommerce.adapter.ts +0 -454
- package/src/mcp/adapters/wordpress.adapter.ts +0 -455
- package/src/mcp/adapters/workday.adapter.ts +0 -354
- package/src/mcp/adapters/wrike.adapter.ts +0 -349
- package/src/mcp/adapters/xero.adapter.ts +0 -472
- package/src/mcp/adapters/youtube.adapter.ts +0 -401
- package/src/mcp/adapters/zendesk.adapter.ts +0 -399
- package/src/mcp/adapters/zoho-crm.adapter.ts +0 -410
- package/src/mcp/adapters/zoom.adapter.ts +0 -241
- package/src/mcp/adapters/zuora.adapter.ts +0 -476
- package/src/mcp/framework/api-executor.ts +0 -192
- package/src/mcp/framework/aws-sigv4.ts +0 -216
- package/src/mcp/framework/credential-resolver.ts +0 -128
- package/src/mcp/framework/oauth-token-manager.ts +0 -22
- package/src/mcp/framework/skill-mcp-framework.ts +0 -226
- package/src/mcp/framework/types.ts +0 -130
- package/src/mcp/index.ts +0 -124
- package/src/mcp/integration-catalog.ts +0 -178
- package/src/middleware/dns-rebinding.ts +0 -44
- package/src/middleware/egress-filter.ts +0 -104
- package/src/middleware/firewall.ts +0 -192
- package/src/middleware/geo-ip.ts +0 -156
- package/src/middleware/index.ts +0 -390
- package/src/middleware/network-config.ts +0 -90
- package/src/middleware/proxy-config.ts +0 -71
- package/src/middleware/request-limits.ts +0 -59
- package/src/middleware/transport-encryption.ts +0 -398
- package/src/registry/cli.ts +0 -63
- package/src/registry/server.ts +0 -504
- package/src/runtime/agent-loop.ts +0 -779
- package/src/runtime/compaction.ts +0 -638
- package/src/runtime/email-channel.ts +0 -120
- package/src/runtime/environment.ts +0 -300
- package/src/runtime/followup.ts +0 -211
- package/src/runtime/gateway.ts +0 -260
- package/src/runtime/hooks.ts +0 -564
- package/src/runtime/index.ts +0 -1110
- package/src/runtime/llm-client.ts +0 -1056
- package/src/runtime/model-router.ts +0 -97
- package/src/runtime/providers.ts +0 -228
- package/src/runtime/session-manager.ts +0 -345
- package/src/runtime/subagent.ts +0 -153
- package/src/runtime/tool-executor.ts +0 -208
- package/src/runtime/types.ts +0 -255
- package/src/security/brute-force.ts +0 -423
- package/src/security/config.ts +0 -159
- package/src/security/csp.ts +0 -407
- package/src/security/external-content.ts +0 -299
- package/src/security/index.ts +0 -557
- package/src/security/input-sanitizer.ts +0 -452
- package/src/security/output-filter.ts +0 -575
- package/src/security/port-scanner.ts +0 -342
- package/src/security/prompt-guard.ts +0 -387
- package/src/security/sql-guard.ts +0 -338
- package/src/security/threat-logger.ts +0 -484
- package/src/server.ts +0 -828
- package/src/setup/company.ts +0 -183
- package/src/setup/database.ts +0 -153
- package/src/setup/deployment.ts +0 -561
- package/src/setup/domain.ts +0 -112
- package/src/setup/index.ts +0 -171
- package/src/setup/provision.ts +0 -532
- package/src/setup/registration.ts +0 -302
- package/src/system-prompts/catchup.ts +0 -48
- package/src/system-prompts/google/calendar.ts +0 -37
- package/src/system-prompts/google/chat.ts +0 -92
- package/src/system-prompts/google/contacts.ts +0 -25
- package/src/system-prompts/google/docs.ts +0 -29
- package/src/system-prompts/google/drive.ts +0 -34
- package/src/system-prompts/google/forms.ts +0 -25
- package/src/system-prompts/google/gmail.ts +0 -50
- package/src/system-prompts/google/index.ts +0 -23
- package/src/system-prompts/google/maps.ts +0 -20
- package/src/system-prompts/google/meet.ts +0 -130
- package/src/system-prompts/google/sheets.ts +0 -32
- package/src/system-prompts/google/slides.ts +0 -26
- package/src/system-prompts/google/tasks.ts +0 -27
- package/src/system-prompts/index.ts +0 -88
- package/src/system-prompts/microsoft/contacts.ts +0 -34
- package/src/system-prompts/microsoft/excel.ts +0 -52
- package/src/system-prompts/microsoft/index.ts +0 -31
- package/src/system-prompts/microsoft/onedrive.ts +0 -41
- package/src/system-prompts/microsoft/onenote.ts +0 -36
- package/src/system-prompts/microsoft/outlook-calendar.ts +0 -37
- package/src/system-prompts/microsoft/outlook-mail.ts +0 -46
- package/src/system-prompts/microsoft/planner.ts +0 -37
- package/src/system-prompts/microsoft/powerbi.ts +0 -38
- package/src/system-prompts/microsoft/powerpoint.ts +0 -35
- package/src/system-prompts/microsoft/sharepoint.ts +0 -44
- package/src/system-prompts/microsoft/teams.ts +0 -49
- package/src/system-prompts/microsoft/todo.ts +0 -37
- package/src/system-prompts/shared-blocks.ts +0 -87
- package/src/system-prompts/task.ts +0 -21
- package/src/system-prompts/triage.ts +0 -34
- package/src/types/hono-env.ts +0 -18
- package/src/types/optional-deps.d.ts +0 -10
|
@@ -1,764 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgenticMail Agent Tools — Browser
|
|
3
|
-
*
|
|
4
|
-
* Browser automation using Playwright with per-agent isolation,
|
|
5
|
-
* SSRF protection, and configurable security controls.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AnyAgentTool, ToolCreationOptions } from '../types.js';
|
|
9
|
-
import { readStringParam, readNumberParam, jsonResult, textResult, errorResult } from '../common.js';
|
|
10
|
-
import type { SsrfGuard } from '../security.js';
|
|
11
|
-
import * as path from 'node:path';
|
|
12
|
-
import * as os from 'node:os';
|
|
13
|
-
import { promises as fs, existsSync } from 'node:fs';
|
|
14
|
-
|
|
15
|
-
const BROWSER_ACTIONS = ['navigate', 'screenshot', 'click', 'type', 'scroll', 'evaluate', 'content', 'close'] as const;
|
|
16
|
-
type BrowserAction = (typeof BROWSER_ACTIONS)[number];
|
|
17
|
-
|
|
18
|
-
const DEFAULT_VIEWPORT_WIDTH = 1280;
|
|
19
|
-
const DEFAULT_VIEWPORT_HEIGHT = 720;
|
|
20
|
-
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
21
|
-
const DEFAULT_MAX_CONTEXTS = 5;
|
|
22
|
-
const DEFAULT_IDLE_TIMEOUT_MS = 5 * 60_000; // 5 minutes
|
|
23
|
-
|
|
24
|
-
/** Per-agent browser context tracking */
|
|
25
|
-
type AgentBrowserContext = {
|
|
26
|
-
context: any;
|
|
27
|
-
page: any;
|
|
28
|
-
lastUsed: number;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Three browser pools:
|
|
33
|
-
* - "headless": Playwright Chromium, no UI — fast background scraping
|
|
34
|
-
* - "headed": Playwright Chromium, visible window — debugging/interactive
|
|
35
|
-
* - "chrome": Native Google Chrome via Playwright channel — for Google Meet, OAuth, etc.
|
|
36
|
-
* Google services block Playwright's bundled Chromium. Native Chrome works.
|
|
37
|
-
*/
|
|
38
|
-
type BrowserMode = 'headless' | 'headed' | 'chrome';
|
|
39
|
-
var browsers: Record<string, any> = { headless: null, headed: null, chrome: null };
|
|
40
|
-
/** Context key: "agentId:mode" */
|
|
41
|
-
var agentContexts = new Map<string, AgentBrowserContext>();
|
|
42
|
-
var idleCleanupTimer: ReturnType<typeof setInterval> | null = null;
|
|
43
|
-
|
|
44
|
-
/** Detect native Chrome installation path */
|
|
45
|
-
function findChromePath(): string | null {
|
|
46
|
-
const candidates = [
|
|
47
|
-
// macOS
|
|
48
|
-
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
49
|
-
'/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',
|
|
50
|
-
// Linux
|
|
51
|
-
'/usr/bin/google-chrome',
|
|
52
|
-
'/usr/bin/google-chrome-stable',
|
|
53
|
-
'/usr/bin/chromium-browser',
|
|
54
|
-
'/snap/bin/chromium',
|
|
55
|
-
// Windows (common paths)
|
|
56
|
-
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
57
|
-
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
|
|
58
|
-
];
|
|
59
|
-
for (const p of candidates) {
|
|
60
|
-
try { if (existsSync(p)) return p; } catch { /* skip */ }
|
|
61
|
-
}
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Check if native Chrome is available */
|
|
66
|
-
export function isChromeAvailable(): boolean {
|
|
67
|
-
return findChromePath() !== null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function startIdleCleanup() {
|
|
71
|
-
if (idleCleanupTimer) return;
|
|
72
|
-
idleCleanupTimer = setInterval(function() {
|
|
73
|
-
var now = Date.now();
|
|
74
|
-
for (var [key, ctx] of agentContexts) {
|
|
75
|
-
// Chrome/headed contexts get longer timeouts (meetings, Google services)
|
|
76
|
-
var timeout = (key.endsWith(':chrome') || key.endsWith(':headed')) ? 2 * 60 * 60_000 : DEFAULT_IDLE_TIMEOUT_MS;
|
|
77
|
-
if (now - ctx.lastUsed > timeout) {
|
|
78
|
-
try { ctx.context.close(); } catch { /* ignore */ }
|
|
79
|
-
agentContexts.delete(key);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// Close browser instances with no active contexts
|
|
83
|
-
for (var mode of ['headless', 'headed', 'chrome'] as const) {
|
|
84
|
-
var prefix = `:${mode}`;
|
|
85
|
-
var hasContexts = false;
|
|
86
|
-
for (var [key] of agentContexts) {
|
|
87
|
-
if (key.endsWith(prefix)) { hasContexts = true; break; }
|
|
88
|
-
}
|
|
89
|
-
if (!hasContexts && browsers[mode]) {
|
|
90
|
-
try { browsers[mode].close(); } catch { /* ignore */ }
|
|
91
|
-
browsers[mode] = null;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (!browsers.headless && !browsers.headed && !browsers.chrome && idleCleanupTimer) {
|
|
95
|
-
clearInterval(idleCleanupTimer);
|
|
96
|
-
idleCleanupTimer = null;
|
|
97
|
-
}
|
|
98
|
-
}, 60_000);
|
|
99
|
-
if (idleCleanupTimer && typeof idleCleanupTimer === 'object' && 'unref' in idleCleanupTimer) {
|
|
100
|
-
(idleCleanupTimer as any).unref();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Ensure a browser page is available.
|
|
106
|
-
* @param headless - true for headless Chromium, false for headed Chromium
|
|
107
|
-
* @param agentId - agent identifier for context isolation
|
|
108
|
-
* @param useChrome - true to use native Chrome (optional — Playwright Chromium works for Google Meet)
|
|
109
|
-
*/
|
|
110
|
-
export async function ensureBrowser(headless: boolean, agentId: string, useChrome?: boolean): Promise<{ page: any }> {
|
|
111
|
-
var mode: BrowserMode = useChrome ? 'chrome' : (headless ? 'headless' : 'headed');
|
|
112
|
-
var contextKey = `${agentId}:${mode}`;
|
|
113
|
-
|
|
114
|
-
// Return existing context for this agent+mode
|
|
115
|
-
var existing = agentContexts.get(contextKey);
|
|
116
|
-
if (existing) {
|
|
117
|
-
existing.lastUsed = Date.now();
|
|
118
|
-
return { page: existing.page };
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Check context limit — evict oldest if needed
|
|
122
|
-
if (agentContexts.size >= DEFAULT_MAX_CONTEXTS) {
|
|
123
|
-
var oldestId: string | null = null;
|
|
124
|
-
var oldestTime = Infinity;
|
|
125
|
-
for (var [id, ctx] of agentContexts) {
|
|
126
|
-
if (ctx.lastUsed < oldestTime) {
|
|
127
|
-
oldestTime = ctx.lastUsed;
|
|
128
|
-
oldestId = id;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (oldestId) {
|
|
132
|
-
var evicted = agentContexts.get(oldestId);
|
|
133
|
-
if (evicted) {
|
|
134
|
-
try { evicted.context.close(); } catch { /* ignore */ }
|
|
135
|
-
agentContexts.delete(oldestId);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
try {
|
|
141
|
-
var pw = await import('playwright');
|
|
142
|
-
|
|
143
|
-
// ── Headless mode: plain Chromium, no persistence needed ──
|
|
144
|
-
if (mode === 'headless') {
|
|
145
|
-
if (!browsers[mode]) {
|
|
146
|
-
browsers[mode] = await pw.chromium.launch({ headless: true });
|
|
147
|
-
console.log(`[browser] Launched headless Chromium`);
|
|
148
|
-
startIdleCleanup();
|
|
149
|
-
}
|
|
150
|
-
var context = await browsers[mode].newContext({
|
|
151
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
152
|
-
userAgent: 'AgenticMail-Agent/1.0',
|
|
153
|
-
});
|
|
154
|
-
var page = await context.newPage();
|
|
155
|
-
agentContexts.set(contextKey, { context, page, lastUsed: Date.now() });
|
|
156
|
-
return { page };
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// ── Headed / Chrome mode: persistent context (preserves login, cookies, etc.) ──
|
|
160
|
-
// This is critical for Google services — they detect and block fresh/bot contexts.
|
|
161
|
-
// launchPersistentContext creates a real browser profile on disk.
|
|
162
|
-
|
|
163
|
-
const { mkdirSync } = await import('node:fs');
|
|
164
|
-
const { join } = await import('node:path');
|
|
165
|
-
const userDataDir = join('/tmp', 'agenticmail-browser', agentId, mode);
|
|
166
|
-
mkdirSync(userDataDir, { recursive: true });
|
|
167
|
-
|
|
168
|
-
var launchArgs = [
|
|
169
|
-
'--disable-blink-features=AutomationControlled',
|
|
170
|
-
// NOTE: do NOT use --use-fake-device-for-media-stream — it overrides real audio devices
|
|
171
|
-
// We need Chrome to use the system's real audio input (BlackHole/VB-CABLE) for meeting voice
|
|
172
|
-
'--use-fake-ui-for-media-stream', // Auto-accept mic/camera permission prompts
|
|
173
|
-
'--auto-select-desktop-capture-source=Entire screen',
|
|
174
|
-
'--enable-usermedia-screen-capturing',
|
|
175
|
-
'--disable-infobars',
|
|
176
|
-
'--no-first-run',
|
|
177
|
-
'--no-default-browser-check',
|
|
178
|
-
];
|
|
179
|
-
|
|
180
|
-
var launchOpts: any = {
|
|
181
|
-
headless: false,
|
|
182
|
-
args: launchArgs,
|
|
183
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
184
|
-
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
|
|
185
|
-
permissions: ['microphone', 'camera', 'notifications'],
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
// For native Chrome, use the real executable
|
|
189
|
-
if (mode === 'chrome') {
|
|
190
|
-
const chromePath = findChromePath();
|
|
191
|
-
if (!chromePath) {
|
|
192
|
-
throw new Error('Native Google Chrome not found. Install: brew install --cask google-chrome');
|
|
193
|
-
}
|
|
194
|
-
launchOpts.executablePath = chromePath;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
var persistentContext = await pw.chromium.launchPersistentContext(userDataDir, launchOpts);
|
|
198
|
-
|
|
199
|
-
// Remove webdriver flag
|
|
200
|
-
await persistentContext.addInitScript(() => {
|
|
201
|
-
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
var page = persistentContext.pages()[0] || await persistentContext.newPage();
|
|
205
|
-
console.log(`[browser] Launched ${mode} persistent browser for ${agentId} (profile: ${userDataDir})`);
|
|
206
|
-
|
|
207
|
-
agentContexts.set(contextKey, { context: persistentContext, page, lastUsed: Date.now() });
|
|
208
|
-
startIdleCleanup();
|
|
209
|
-
|
|
210
|
-
return { page };
|
|
211
|
-
} catch (error: any) {
|
|
212
|
-
throw new Error(
|
|
213
|
-
'Browser launch failed. ' +
|
|
214
|
-
(mode === 'chrome' ? 'Ensure Google Chrome is installed.' : 'Install Playwright: npm install playwright') +
|
|
215
|
-
'\nError: ' + (error.message || 'unknown')
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// ═══════════════════════════════════════════════════════════
|
|
221
|
-
// Cloud/Remote Browser Provider Integration
|
|
222
|
-
// ═══════════════════════════════════════════════════════════
|
|
223
|
-
|
|
224
|
-
/** Browser config from managed agent settings */
|
|
225
|
-
export interface BrowserProviderConfig {
|
|
226
|
-
provider?: 'local' | 'remote-cdp' | 'browserless' | 'browserbase' | 'steel' | 'scrapingbee';
|
|
227
|
-
enabled?: boolean;
|
|
228
|
-
headless?: boolean;
|
|
229
|
-
// Remote CDP
|
|
230
|
-
cdpUrl?: string;
|
|
231
|
-
cdpAuthToken?: string;
|
|
232
|
-
cdpTimeout?: number;
|
|
233
|
-
sshTunnel?: string;
|
|
234
|
-
// Browserless
|
|
235
|
-
browserlessToken?: string;
|
|
236
|
-
browserlessEndpoint?: string;
|
|
237
|
-
browserlessConcurrency?: number;
|
|
238
|
-
browserlessStealth?: boolean;
|
|
239
|
-
browserlessProxy?: string;
|
|
240
|
-
// Browserbase
|
|
241
|
-
browserbaseApiKey?: string;
|
|
242
|
-
browserbaseProjectId?: string;
|
|
243
|
-
browserbaseRecording?: boolean;
|
|
244
|
-
browserbaseKeepAlive?: boolean;
|
|
245
|
-
// Steel
|
|
246
|
-
steelApiKey?: string;
|
|
247
|
-
steelEndpoint?: string;
|
|
248
|
-
steelSessionDuration?: number;
|
|
249
|
-
// ScrapingBee
|
|
250
|
-
scrapingbeeApiKey?: string;
|
|
251
|
-
scrapingbeeJsRendering?: boolean;
|
|
252
|
-
scrapingbeePremiumProxy?: boolean;
|
|
253
|
-
scrapingbeeCountry?: string;
|
|
254
|
-
// Local overrides
|
|
255
|
-
executablePath?: string;
|
|
256
|
-
userDataDir?: string;
|
|
257
|
-
extraArgs?: string[];
|
|
258
|
-
// Security
|
|
259
|
-
timeoutMs?: number;
|
|
260
|
-
maxPages?: number;
|
|
261
|
-
blockedDomains?: string[];
|
|
262
|
-
allowedDomains?: string[];
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/** Active SSH tunnel process tracking */
|
|
266
|
-
var activeSshTunnels = new Map<string, any>();
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Establish SSH tunnel if configured. Runs ssh in background and waits
|
|
270
|
-
* for the port to become available. Kills stale tunnels automatically.
|
|
271
|
-
*/
|
|
272
|
-
async function ensureSshTunnel(tunnelCmd: string, agentId: string): Promise<void> {
|
|
273
|
-
var tunnelKey = `ssh-tunnel:${agentId}`;
|
|
274
|
-
var existing = activeSshTunnels.get(tunnelKey);
|
|
275
|
-
if (existing && !existing.killed) {
|
|
276
|
-
// Tunnel already running — verify it's alive
|
|
277
|
-
try {
|
|
278
|
-
existing.kill(0); // Signal 0 just checks process existence
|
|
279
|
-
return;
|
|
280
|
-
} catch {
|
|
281
|
-
activeSshTunnels.delete(tunnelKey);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
console.log(`[browser] Establishing SSH tunnel for ${agentId}: ${tunnelCmd}`);
|
|
286
|
-
const { spawn } = await import('node:child_process');
|
|
287
|
-
|
|
288
|
-
// Parse tunnel command — extract just the SSH args, ignore "ssh" prefix
|
|
289
|
-
var args = tunnelCmd.replace(/^ssh\s+/, '').split(/\s+/).filter(Boolean);
|
|
290
|
-
// Add -N (no remote command) and -f would daemonize but we manage it ourselves
|
|
291
|
-
if (!args.includes('-N')) args.push('-N');
|
|
292
|
-
// Add StrictHostKeyChecking=accept-new for first-time connections
|
|
293
|
-
if (!args.some(a => a.includes('StrictHostKeyChecking'))) {
|
|
294
|
-
args.push('-o', 'StrictHostKeyChecking=accept-new');
|
|
295
|
-
}
|
|
296
|
-
// Add ServerAliveInterval to keep tunnel alive
|
|
297
|
-
if (!args.some(a => a.includes('ServerAliveInterval'))) {
|
|
298
|
-
args.push('-o', 'ServerAliveInterval=30');
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
var proc = spawn('ssh', args, { stdio: 'pipe', detached: false });
|
|
302
|
-
activeSshTunnels.set(tunnelKey, proc);
|
|
303
|
-
|
|
304
|
-
proc.on('exit', () => { activeSshTunnels.delete(tunnelKey); });
|
|
305
|
-
proc.on('error', (err: any) => {
|
|
306
|
-
console.error(`[browser] SSH tunnel error for ${agentId}:`, err.message);
|
|
307
|
-
activeSshTunnels.delete(tunnelKey);
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
// Wait for tunnel to be ready (port becomes connectable)
|
|
311
|
-
// Extract local port from -L flag: -L localPort:host:remotePort
|
|
312
|
-
var localPortMatch = tunnelCmd.match(/-L\s*(\d+):/);
|
|
313
|
-
if (localPortMatch) {
|
|
314
|
-
var port = parseInt(localPortMatch[1]);
|
|
315
|
-
var maxWait = 15000;
|
|
316
|
-
var start = Date.now();
|
|
317
|
-
const net = await import('node:net');
|
|
318
|
-
while (Date.now() - start < maxWait) {
|
|
319
|
-
var connected = await new Promise<boolean>((resolve) => {
|
|
320
|
-
var sock = net.connect({ port, host: '127.0.0.1' }, () => { sock.destroy(); resolve(true); });
|
|
321
|
-
sock.on('error', () => resolve(false));
|
|
322
|
-
sock.setTimeout(1000, () => { sock.destroy(); resolve(false); });
|
|
323
|
-
});
|
|
324
|
-
if (connected) {
|
|
325
|
-
console.log(`[browser] SSH tunnel ready on port ${port} for ${agentId}`);
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
await new Promise(r => setTimeout(r, 500));
|
|
329
|
-
}
|
|
330
|
-
console.warn(`[browser] SSH tunnel port ${port} not ready after ${maxWait}ms — proceeding anyway`);
|
|
331
|
-
} else {
|
|
332
|
-
// No -L flag found, just wait a bit for the tunnel to establish
|
|
333
|
-
await new Promise(r => setTimeout(r, 3000));
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Connect to a remote browser via Chrome DevTools Protocol.
|
|
339
|
-
* Supports direct WebSocket connections and SSH tunneling.
|
|
340
|
-
*/
|
|
341
|
-
async function connectRemoteCDP(cfg: BrowserProviderConfig, agentId: string): Promise<{ page: any }> {
|
|
342
|
-
var contextKey = `${agentId}:remote-cdp`;
|
|
343
|
-
var existing = agentContexts.get(contextKey);
|
|
344
|
-
if (existing) { existing.lastUsed = Date.now(); return { page: existing.page }; }
|
|
345
|
-
|
|
346
|
-
// Establish SSH tunnel if configured
|
|
347
|
-
if (cfg.sshTunnel) {
|
|
348
|
-
await ensureSshTunnel(cfg.sshTunnel, agentId);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
var pw = await import('playwright');
|
|
352
|
-
var cdpUrl = cfg.cdpUrl;
|
|
353
|
-
if (!cdpUrl) throw new Error('CDP WebSocket URL not configured. Go to Settings → Browser → Remote CDP and enter the WebSocket URL.');
|
|
354
|
-
|
|
355
|
-
// If user provided a bare host:port, auto-discover the WebSocket URL
|
|
356
|
-
if (!cdpUrl.startsWith('ws://') && !cdpUrl.startsWith('wss://')) {
|
|
357
|
-
// Treat as http endpoint — query /json/version for the real WS URL
|
|
358
|
-
var httpUrl = cdpUrl.startsWith('http') ? cdpUrl : `http://${cdpUrl}`;
|
|
359
|
-
if (!httpUrl.includes('/json/version')) httpUrl = httpUrl.replace(/\/$/, '') + '/json/version';
|
|
360
|
-
try {
|
|
361
|
-
var resp = await fetch(httpUrl, {
|
|
362
|
-
signal: AbortSignal.timeout(cfg.cdpTimeout || 10000),
|
|
363
|
-
headers: cfg.cdpAuthToken ? { 'Authorization': `Bearer ${cfg.cdpAuthToken}` } : {},
|
|
364
|
-
});
|
|
365
|
-
var versionData = await resp.json() as any;
|
|
366
|
-
cdpUrl = versionData.webSocketDebuggerUrl;
|
|
367
|
-
if (!cdpUrl) throw new Error('No webSocketDebuggerUrl in /json/version response');
|
|
368
|
-
console.log(`[browser] Auto-discovered CDP WebSocket: ${cdpUrl}`);
|
|
369
|
-
} catch (e: any) {
|
|
370
|
-
throw new Error(`Cannot discover CDP endpoint from ${httpUrl}: ${e.message}. Provide a full ws:// URL instead.`);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
var timeout = cfg.cdpTimeout || 30000;
|
|
375
|
-
var headers: Record<string, string> = {};
|
|
376
|
-
if (cfg.cdpAuthToken) headers['Authorization'] = `Bearer ${cfg.cdpAuthToken}`;
|
|
377
|
-
|
|
378
|
-
console.log(`[browser] Connecting to remote CDP: ${cdpUrl} (agent: ${agentId})`);
|
|
379
|
-
var browser = await pw.chromium.connectOverCDP(cdpUrl, { timeout, headers });
|
|
380
|
-
var contexts = browser.contexts();
|
|
381
|
-
var context = contexts[0] || await browser.newContext({
|
|
382
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
383
|
-
});
|
|
384
|
-
var page = context.pages()[0] || await context.newPage();
|
|
385
|
-
|
|
386
|
-
agentContexts.set(contextKey, { context: browser, page, lastUsed: Date.now() });
|
|
387
|
-
startIdleCleanup();
|
|
388
|
-
console.log(`[browser] Connected to remote CDP for ${agentId}`);
|
|
389
|
-
return { page };
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Connect to Browserless.io cloud browser service.
|
|
394
|
-
* Creates a new session via WebSocket using the API token.
|
|
395
|
-
*/
|
|
396
|
-
async function connectBrowserless(cfg: BrowserProviderConfig, agentId: string): Promise<{ page: any }> {
|
|
397
|
-
var contextKey = `${agentId}:browserless`;
|
|
398
|
-
var existing = agentContexts.get(contextKey);
|
|
399
|
-
if (existing) { existing.lastUsed = Date.now(); return { page: existing.page }; }
|
|
400
|
-
|
|
401
|
-
if (!cfg.browserlessToken) throw new Error('Browserless API token not configured. Go to Settings → Browser and enter your token.');
|
|
402
|
-
|
|
403
|
-
var pw = await import('playwright');
|
|
404
|
-
var endpoint = cfg.browserlessEndpoint || 'wss://chrome.browserless.io';
|
|
405
|
-
// Normalize endpoint — ensure it's a WebSocket URL
|
|
406
|
-
if (endpoint.startsWith('http://')) endpoint = endpoint.replace('http://', 'ws://');
|
|
407
|
-
if (endpoint.startsWith('https://')) endpoint = endpoint.replace('https://', 'wss://');
|
|
408
|
-
if (!endpoint.startsWith('ws://') && !endpoint.startsWith('wss://')) endpoint = 'wss://' + endpoint;
|
|
409
|
-
|
|
410
|
-
// Build connection URL with token and options
|
|
411
|
-
var connectUrl = `${endpoint}?token=${encodeURIComponent(cfg.browserlessToken)}`;
|
|
412
|
-
if (cfg.browserlessStealth) connectUrl += '&stealth';
|
|
413
|
-
if (cfg.browserlessProxy) connectUrl += `&--proxy-server=${encodeURIComponent(cfg.browserlessProxy)}`;
|
|
414
|
-
|
|
415
|
-
console.log(`[browser] Connecting to Browserless for ${agentId}`);
|
|
416
|
-
var browser = await pw.chromium.connectOverCDP(connectUrl, { timeout: 30000 });
|
|
417
|
-
var context = await browser.newContext({
|
|
418
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
419
|
-
});
|
|
420
|
-
var page = await context.newPage();
|
|
421
|
-
|
|
422
|
-
agentContexts.set(contextKey, { context: browser, page, lastUsed: Date.now() });
|
|
423
|
-
startIdleCleanup();
|
|
424
|
-
console.log(`[browser] Connected to Browserless for ${agentId}`);
|
|
425
|
-
return { page };
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
/**
|
|
429
|
-
* Connect to Browserbase cloud browser.
|
|
430
|
-
* Creates a session via REST API, then connects via CDP WebSocket.
|
|
431
|
-
*/
|
|
432
|
-
async function connectBrowserbase(cfg: BrowserProviderConfig, agentId: string): Promise<{ page: any }> {
|
|
433
|
-
var contextKey = `${agentId}:browserbase`;
|
|
434
|
-
var existing = agentContexts.get(contextKey);
|
|
435
|
-
if (existing) { existing.lastUsed = Date.now(); return { page: existing.page }; }
|
|
436
|
-
|
|
437
|
-
if (!cfg.browserbaseApiKey) throw new Error('Browserbase API key not configured. Go to Settings → Browser and enter your API key.');
|
|
438
|
-
if (!cfg.browserbaseProjectId) throw new Error('Browserbase Project ID not configured. Go to Settings → Browser and enter your project ID.');
|
|
439
|
-
|
|
440
|
-
// Step 1: Create a session via REST
|
|
441
|
-
console.log(`[browser] Creating Browserbase session for ${agentId}`);
|
|
442
|
-
var sessionResp = await fetch('https://www.browserbase.com/v1/sessions', {
|
|
443
|
-
method: 'POST',
|
|
444
|
-
headers: { 'x-bb-api-key': cfg.browserbaseApiKey, 'Content-Type': 'application/json' },
|
|
445
|
-
body: JSON.stringify({
|
|
446
|
-
projectId: cfg.browserbaseProjectId,
|
|
447
|
-
browserSettings: {
|
|
448
|
-
recordSession: cfg.browserbaseRecording !== false,
|
|
449
|
-
},
|
|
450
|
-
keepAlive: cfg.browserbaseKeepAlive || false,
|
|
451
|
-
}),
|
|
452
|
-
signal: AbortSignal.timeout(15000),
|
|
453
|
-
});
|
|
454
|
-
if (!sessionResp.ok) {
|
|
455
|
-
var errBody = await sessionResp.text().catch(() => '');
|
|
456
|
-
throw new Error(`Browserbase session creation failed (${sessionResp.status}): ${errBody}`);
|
|
457
|
-
}
|
|
458
|
-
var sessionData = await sessionResp.json() as any;
|
|
459
|
-
var connectUrl = sessionData.connectUrl || `wss://connect.browserbase.com?apiKey=${cfg.browserbaseApiKey}&sessionId=${sessionData.id}`;
|
|
460
|
-
|
|
461
|
-
// Step 2: Connect via CDP
|
|
462
|
-
var pw = await import('playwright');
|
|
463
|
-
var browser = await pw.chromium.connectOverCDP(connectUrl, { timeout: 30000 });
|
|
464
|
-
var context = browser.contexts()[0] || await browser.newContext({
|
|
465
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
466
|
-
});
|
|
467
|
-
var page = context.pages()[0] || await context.newPage();
|
|
468
|
-
|
|
469
|
-
agentContexts.set(contextKey, { context: browser, page, lastUsed: Date.now() });
|
|
470
|
-
startIdleCleanup();
|
|
471
|
-
console.log(`[browser] Connected to Browserbase session ${sessionData.id} for ${agentId}`);
|
|
472
|
-
return { page };
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/**
|
|
476
|
-
* Connect to Steel.dev browser API.
|
|
477
|
-
* Creates a session, then connects via CDP WebSocket.
|
|
478
|
-
*/
|
|
479
|
-
async function connectSteel(cfg: BrowserProviderConfig, agentId: string): Promise<{ page: any }> {
|
|
480
|
-
var contextKey = `${agentId}:steel`;
|
|
481
|
-
var existing = agentContexts.get(contextKey);
|
|
482
|
-
if (existing) { existing.lastUsed = Date.now(); return { page: existing.page }; }
|
|
483
|
-
|
|
484
|
-
if (!cfg.steelApiKey) throw new Error('Steel API key not configured. Go to Settings → Browser and enter your API key.');
|
|
485
|
-
|
|
486
|
-
var endpoint = cfg.steelEndpoint || 'https://api.steel.dev';
|
|
487
|
-
var duration = (cfg.steelSessionDuration || 15) * 60; // convert min to seconds
|
|
488
|
-
|
|
489
|
-
// Step 1: Create session
|
|
490
|
-
console.log(`[browser] Creating Steel session for ${agentId}`);
|
|
491
|
-
var sessionResp = await fetch(`${endpoint}/v1/sessions`, {
|
|
492
|
-
method: 'POST',
|
|
493
|
-
headers: { 'Authorization': `Bearer ${cfg.steelApiKey}`, 'Content-Type': 'application/json' },
|
|
494
|
-
body: JSON.stringify({ timeout: duration, useProxy: false }),
|
|
495
|
-
signal: AbortSignal.timeout(15000),
|
|
496
|
-
});
|
|
497
|
-
if (!sessionResp.ok) {
|
|
498
|
-
var errBody = await sessionResp.text().catch(() => '');
|
|
499
|
-
throw new Error(`Steel session creation failed (${sessionResp.status}): ${errBody}`);
|
|
500
|
-
}
|
|
501
|
-
var sessionData = await sessionResp.json() as any;
|
|
502
|
-
var connectUrl = sessionData.connectUrl || sessionData.websocketUrl || sessionData.cdpUrl;
|
|
503
|
-
if (!connectUrl) throw new Error('Steel session created but no connection URL returned');
|
|
504
|
-
|
|
505
|
-
// Step 2: Connect via CDP
|
|
506
|
-
var pw = await import('playwright');
|
|
507
|
-
var browser = await pw.chromium.connectOverCDP(connectUrl, { timeout: 30000 });
|
|
508
|
-
var context = browser.contexts()[0] || await browser.newContext({
|
|
509
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
510
|
-
});
|
|
511
|
-
var page = context.pages()[0] || await context.newPage();
|
|
512
|
-
|
|
513
|
-
agentContexts.set(contextKey, { context: browser, page, lastUsed: Date.now() });
|
|
514
|
-
startIdleCleanup();
|
|
515
|
-
console.log(`[browser] Connected to Steel session ${sessionData.id} for ${agentId}`);
|
|
516
|
-
return { page };
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
/**
|
|
520
|
-
* ScrapingBee proxy-based browser. Uses ScrapingBee's rendering API
|
|
521
|
-
* as a fetch proxy rather than a CDP connection (ScrapingBee doesn't expose CDP).
|
|
522
|
-
* For browser tool compatibility, we launch a local Chromium and route
|
|
523
|
-
* requests through ScrapingBee's proxy endpoint.
|
|
524
|
-
*/
|
|
525
|
-
async function connectScrapingBee(cfg: BrowserProviderConfig, agentId: string): Promise<{ page: any }> {
|
|
526
|
-
var contextKey = `${agentId}:scrapingbee`;
|
|
527
|
-
var existing = agentContexts.get(contextKey);
|
|
528
|
-
if (existing) { existing.lastUsed = Date.now(); return { page: existing.page }; }
|
|
529
|
-
|
|
530
|
-
if (!cfg.scrapingbeeApiKey) throw new Error('ScrapingBee API key not configured. Go to Settings → Browser and enter your API key.');
|
|
531
|
-
|
|
532
|
-
// ScrapingBee uses a proxy approach: we route the local browser through their proxy
|
|
533
|
-
// This gives us full Playwright control while ScrapingBee handles anti-detection + proxies
|
|
534
|
-
var pw = await import('playwright');
|
|
535
|
-
var proxyUrl = `http://${cfg.scrapingbeeApiKey}:${cfg.scrapingbeeJsRendering !== false ? 'render_js' : 'norender'}${cfg.scrapingbeePremiumProxy ? '&premium_proxy=true' : ''}${cfg.scrapingbeeCountry ? `&country_code=${cfg.scrapingbeeCountry}` : ''}@proxy.scrapingbee.com:8886`;
|
|
536
|
-
|
|
537
|
-
console.log(`[browser] Launching browser with ScrapingBee proxy for ${agentId}`);
|
|
538
|
-
var browser = await pw.chromium.launch({
|
|
539
|
-
headless: true,
|
|
540
|
-
proxy: { server: proxyUrl },
|
|
541
|
-
});
|
|
542
|
-
var context = await browser.newContext({
|
|
543
|
-
viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },
|
|
544
|
-
ignoreHTTPSErrors: true, // ScrapingBee proxy uses self-signed certs
|
|
545
|
-
});
|
|
546
|
-
var page = await context.newPage();
|
|
547
|
-
|
|
548
|
-
agentContexts.set(contextKey, { context: browser, page, lastUsed: Date.now() });
|
|
549
|
-
startIdleCleanup();
|
|
550
|
-
console.log(`[browser] ScrapingBee proxy browser ready for ${agentId}`);
|
|
551
|
-
return { page };
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
/**
|
|
555
|
-
* Unified browser provider router. Reads config and dispatches to the correct
|
|
556
|
-
* connection method. Falls back to local Chromium if provider is unset or 'local'.
|
|
557
|
-
*/
|
|
558
|
-
export async function ensureBrowserFromConfig(
|
|
559
|
-
cfg: BrowserProviderConfig | undefined,
|
|
560
|
-
agentId: string,
|
|
561
|
-
modeOverride?: BrowserMode
|
|
562
|
-
): Promise<{ page: any }> {
|
|
563
|
-
var provider = cfg?.provider || 'local';
|
|
564
|
-
|
|
565
|
-
// Mode override (e.g., agent explicitly requested chrome mode) takes precedence
|
|
566
|
-
if (modeOverride === 'chrome' || modeOverride === 'headed') {
|
|
567
|
-
return ensureBrowser(false, agentId, modeOverride === 'chrome');
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
switch (provider) {
|
|
571
|
-
case 'remote-cdp':
|
|
572
|
-
return connectRemoteCDP(cfg!, agentId);
|
|
573
|
-
case 'browserless':
|
|
574
|
-
return connectBrowserless(cfg!, agentId);
|
|
575
|
-
case 'browserbase':
|
|
576
|
-
return connectBrowserbase(cfg!, agentId);
|
|
577
|
-
case 'steel':
|
|
578
|
-
return connectSteel(cfg!, agentId);
|
|
579
|
-
case 'scrapingbee':
|
|
580
|
-
return connectScrapingBee(cfg!, agentId);
|
|
581
|
-
case 'local':
|
|
582
|
-
default:
|
|
583
|
-
return ensureBrowser(cfg?.headless !== false, agentId, false);
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
export function createBrowserTool(options?: ToolCreationOptions & {
|
|
588
|
-
ssrfGuard?: SsrfGuard;
|
|
589
|
-
}): AnyAgentTool | null {
|
|
590
|
-
var browserConfig = options?.config?.browser;
|
|
591
|
-
if (browserConfig?.enabled === false) return null;
|
|
592
|
-
|
|
593
|
-
var headless = browserConfig?.headless !== false;
|
|
594
|
-
var timeoutMs = browserConfig?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
595
|
-
var agentId = options?.agentId || 'default';
|
|
596
|
-
var sandboxed = options?.sandboxed ?? false;
|
|
597
|
-
var ssrfGuard = options?.ssrfGuard;
|
|
598
|
-
// Full browser provider config (from managed agent settings)
|
|
599
|
-
var providerConfig = browserConfig as BrowserProviderConfig | undefined;
|
|
600
|
-
|
|
601
|
-
return {
|
|
602
|
-
name: 'browser',
|
|
603
|
-
label: 'Browser',
|
|
604
|
-
description: 'Automate a browser for web interaction. Supports navigation, screenshots, clicking, typing, scrolling, and JavaScript evaluation. Requires Playwright.',
|
|
605
|
-
category: 'browser',
|
|
606
|
-
risk: 'critical',
|
|
607
|
-
parameters: {
|
|
608
|
-
type: 'object',
|
|
609
|
-
properties: {
|
|
610
|
-
action: {
|
|
611
|
-
type: 'string',
|
|
612
|
-
description: 'Action to perform: navigate, screenshot, click, type, scroll, evaluate, content, close.',
|
|
613
|
-
enum: BROWSER_ACTIONS as unknown as string[],
|
|
614
|
-
},
|
|
615
|
-
url: { type: 'string', description: 'URL to navigate to (for navigate action).' },
|
|
616
|
-
selector: { type: 'string', description: 'CSS selector for click/type actions.' },
|
|
617
|
-
text: { type: 'string', description: 'Text to type (for type action).' },
|
|
618
|
-
script: { type: 'string', description: 'JavaScript to evaluate in page context.' },
|
|
619
|
-
direction: { type: 'string', description: 'Scroll direction: up or down.' },
|
|
620
|
-
pixels: { type: 'number', description: 'Pixels to scroll (default 500).' },
|
|
621
|
-
headless: { type: 'string', description: 'Browser mode: "true" (default) = headless Chromium. "false" = visible Chromium window (use for Google Meet, Google services, and anything that needs to persist login). Do NOT use "chrome" unless explicitly told to.' },
|
|
622
|
-
},
|
|
623
|
-
required: ['action'],
|
|
624
|
-
},
|
|
625
|
-
execute: async function(_toolCallId, args) {
|
|
626
|
-
var params = args as Record<string, unknown>;
|
|
627
|
-
var action = readStringParam(params, 'action', { required: true }) as BrowserAction;
|
|
628
|
-
|
|
629
|
-
// Allow per-call mode override: "chrome" for native Chrome, "false" for headed, default headless
|
|
630
|
-
// Note: Google Meet works fine with Playwright Chromium (tested live Feb 24, 2026)
|
|
631
|
-
var useChrome = params.headless === 'chrome';
|
|
632
|
-
var useHeadless = useChrome ? false : (params.headless === 'false' || params.headless === false ? false : headless);
|
|
633
|
-
|
|
634
|
-
if (action === 'close') {
|
|
635
|
-
// Close both headless and headed contexts for this agent
|
|
636
|
-
for (var mode of ['headless', 'headed']) {
|
|
637
|
-
var key = `${agentId}:${mode}`;
|
|
638
|
-
var ctx = agentContexts.get(key);
|
|
639
|
-
if (ctx) {
|
|
640
|
-
try { ctx.context.close(); } catch { /* ignore */ }
|
|
641
|
-
agentContexts.delete(key);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
return textResult('Browser closed.');
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
try {
|
|
648
|
-
// If no URL in params, check if agent already has a Chrome session (meeting in progress)
|
|
649
|
-
if (!useChrome && (action as string) !== 'close') {
|
|
650
|
-
var chromeKey = `${agentId}:chrome`;
|
|
651
|
-
if (agentContexts.has(chromeKey) && browsers['chrome']) {
|
|
652
|
-
// Agent has an active Chrome session — use it (likely in a meeting)
|
|
653
|
-
useChrome = true;
|
|
654
|
-
useHeadless = false;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
// Use provider-aware connection if a cloud/remote provider is configured
|
|
659
|
-
var modeOverride: BrowserMode | undefined = useChrome ? 'chrome' : (!useHeadless ? 'headed' : undefined);
|
|
660
|
-
var hasCloudProvider = providerConfig?.provider && providerConfig.provider !== 'local';
|
|
661
|
-
var { page } = hasCloudProvider && !modeOverride
|
|
662
|
-
? await ensureBrowserFromConfig(providerConfig, agentId)
|
|
663
|
-
: await ensureBrowser(useHeadless, agentId, useChrome);
|
|
664
|
-
|
|
665
|
-
switch (action) {
|
|
666
|
-
case 'navigate': {
|
|
667
|
-
var url = readStringParam(params, 'url', { required: true });
|
|
668
|
-
// SSRF guard on navigation URL (skip for file:// — browser can open local files)
|
|
669
|
-
if (ssrfGuard && !url.startsWith('file://') && !url.startsWith('file:///')) {
|
|
670
|
-
try {
|
|
671
|
-
await ssrfGuard.validateUrl(url);
|
|
672
|
-
} catch (err: any) {
|
|
673
|
-
return errorResult('Navigation blocked: ' + err.message);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
// Intercept Meet URLs — redirect to meeting_join tool automatically
|
|
677
|
-
if (/meet\.google\.com\/[a-z]/.test(url)) {
|
|
678
|
-
// Find meeting_join in the current tool set and call it directly
|
|
679
|
-
const tools = (globalThis as any).__currentSessionTools as any[] | undefined;
|
|
680
|
-
const meetJoin = tools?.find((t: any) => t.name === 'meeting_join');
|
|
681
|
-
if (meetJoin?.execute) {
|
|
682
|
-
console.log(`[browser] Intercepted Meet URL — redirecting to meeting_join: ${url}`);
|
|
683
|
-
return await meetJoin.execute('meeting_join', { url });
|
|
684
|
-
}
|
|
685
|
-
return errorResult(
|
|
686
|
-
'Cannot navigate to Google Meet URLs. Use meeting_join(url: "' + url + '") instead. ' +
|
|
687
|
-
'Call request_tools(sets: ["meeting_lifecycle", "meeting_voice"]) first if meeting_join is not available.'
|
|
688
|
-
);
|
|
689
|
-
}
|
|
690
|
-
await page.goto(url, { timeout: timeoutMs, waitUntil: 'domcontentloaded' });
|
|
691
|
-
var title = await page.title();
|
|
692
|
-
return jsonResult({ action: 'navigate', url, title, status: 'loaded' });
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
case 'screenshot': {
|
|
696
|
-
var buf = await page.screenshot({ type: 'png', fullPage: false });
|
|
697
|
-
// Save to temp file so agent can attach it to emails
|
|
698
|
-
var screenshotDir = path.join(os.tmpdir(), 'agenticmail-screenshots');
|
|
699
|
-
await fs.mkdir(screenshotDir, { recursive: true });
|
|
700
|
-
var screenshotFile = `screenshot-${Date.now()}.png`;
|
|
701
|
-
var screenshotPath = path.join(screenshotDir, screenshotFile);
|
|
702
|
-
await fs.writeFile(screenshotPath, buf);
|
|
703
|
-
return {
|
|
704
|
-
content: [
|
|
705
|
-
{ type: 'text', text: `Screenshot of: ${page.url()}\nSaved to: ${screenshotPath}\nFilename: ${screenshotFile}\nSize: ${buf.length} bytes\n\nTo attach this screenshot to an email, use gmail_reply or gmail_send with:\nattachment_paths: ["${screenshotPath}"]` },
|
|
706
|
-
{ type: 'image', data: buf.toString('base64'), mimeType: 'image/png' },
|
|
707
|
-
],
|
|
708
|
-
};
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
case 'click': {
|
|
712
|
-
var selector = readStringParam(params, 'selector', { required: true });
|
|
713
|
-
await page.click(selector, { timeout: timeoutMs });
|
|
714
|
-
return textResult('Clicked: ' + selector);
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
case 'type': {
|
|
718
|
-
var selector = readStringParam(params, 'selector', { required: true });
|
|
719
|
-
var text = readStringParam(params, 'text', { required: true });
|
|
720
|
-
await page.fill(selector, text, { timeout: timeoutMs });
|
|
721
|
-
return textResult('Typed into: ' + selector);
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
case 'scroll': {
|
|
725
|
-
var direction = readStringParam(params, 'direction') || 'down';
|
|
726
|
-
var pixels = readNumberParam(params, 'pixels', { integer: true }) ?? 500;
|
|
727
|
-
var delta = direction === 'up' ? -pixels : pixels;
|
|
728
|
-
await page.evaluate(function(d: number) { window.scrollBy(0, d); }, delta);
|
|
729
|
-
return textResult('Scrolled ' + direction + ' ' + pixels + 'px');
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
case 'evaluate': {
|
|
733
|
-
// Block arbitrary JS execution in sandboxed mode
|
|
734
|
-
if (sandboxed) {
|
|
735
|
-
return errorResult('JavaScript evaluation is disabled in sandboxed mode.');
|
|
736
|
-
}
|
|
737
|
-
var script = readStringParam(params, 'script', { required: true });
|
|
738
|
-
var result = await page.evaluate(script);
|
|
739
|
-
return jsonResult({ action: 'evaluate', result });
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
case 'content': {
|
|
743
|
-
var html = await page.content();
|
|
744
|
-
var title = await page.title();
|
|
745
|
-
// Return text content, stripping tags
|
|
746
|
-
var textContent = html
|
|
747
|
-
.replace(/<script[\s\S]*?<\/script>/gi, '')
|
|
748
|
-
.replace(/<style[\s\S]*?<\/style>/gi, '')
|
|
749
|
-
.replace(/<[^>]+>/g, ' ')
|
|
750
|
-
.replace(/\s+/g, ' ')
|
|
751
|
-
.trim();
|
|
752
|
-
if (textContent.length > 50000) textContent = textContent.slice(0, 50000) + '... (truncated)';
|
|
753
|
-
return jsonResult({ action: 'content', title, url: page.url(), text: textContent });
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
default:
|
|
757
|
-
return errorResult('Unknown browser action: ' + action);
|
|
758
|
-
}
|
|
759
|
-
} catch (err: any) {
|
|
760
|
-
return errorResult('Browser error: ' + (err.message || 'unknown'));
|
|
761
|
-
}
|
|
762
|
-
},
|
|
763
|
-
};
|
|
764
|
-
}
|