@agenticmail/enterprise 0.5.326 → 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/dist/dashboard/pages/cluster.js +1 -1
- package/logs/cloudflared-error.log +6 -0
- package/logs/enterprise-out.log +2 -0
- package/package.json +1 -1
- package/god_is_great.html +0 -35
- 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,913 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized Google Chat Poller
|
|
3
|
-
*
|
|
4
|
-
* ONE poller per enterprise server — polls all monitored spaces,
|
|
5
|
-
* routes messages to the right agent via smart dispatch.
|
|
6
|
-
*
|
|
7
|
-
* Architecture:
|
|
8
|
-
* Google Chat API ← single poller (30s interval)
|
|
9
|
-
* │
|
|
10
|
-
* Smart Router (no LLM for 90% of messages)
|
|
11
|
-
* │
|
|
12
|
-
* ┌─────┼─────┐
|
|
13
|
-
* ▼ ▼ ▼
|
|
14
|
-
* Agent1 Agent2 Agent3 ← via POST /api/runtime/chat
|
|
15
|
-
*
|
|
16
|
-
* Routing priority:
|
|
17
|
-
* 1. Direct @mention → that agent
|
|
18
|
-
* 2. Thread ownership → whoever started the thread owns it
|
|
19
|
-
* 3. DM → space's assigned agent
|
|
20
|
-
* 4. Role/keyword match → agent whose role matches
|
|
21
|
-
* 5. Round-robin / default agent → fallback
|
|
22
|
-
*
|
|
23
|
-
* Scaling notes:
|
|
24
|
-
* - Single poller regardless of agent count
|
|
25
|
-
* - One API call per space per interval (not per agent)
|
|
26
|
-
* - Message dedup via DB-persisted cursor (last message name per space)
|
|
27
|
-
* - Circuit breaker on API failures (exponential backoff)
|
|
28
|
-
* - No LLM calls for routing — pure rule-based
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import type { AgentLifecycleManager } from './lifecycle.js';
|
|
32
|
-
|
|
33
|
-
// ─── Types ──────────────────────────────────────────────
|
|
34
|
-
|
|
35
|
-
interface ChatMessage {
|
|
36
|
-
name: string; // spaces/XXX/messages/YYY
|
|
37
|
-
sender: {
|
|
38
|
-
name?: string; // users/123
|
|
39
|
-
displayName?: string;
|
|
40
|
-
email?: string;
|
|
41
|
-
type?: 'HUMAN' | 'BOT';
|
|
42
|
-
};
|
|
43
|
-
text: string;
|
|
44
|
-
createTime: string;
|
|
45
|
-
thread?: { name?: string };
|
|
46
|
-
space?: { name?: string; displayName?: string; type?: string };
|
|
47
|
-
argumentText?: string; // text without @mention prefix
|
|
48
|
-
annotations?: any[]; // Google Chat annotations (mentions, etc.)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
interface MonitoredSpace {
|
|
52
|
-
spaceId: string; // spaces/XXX
|
|
53
|
-
displayName: string;
|
|
54
|
-
/** Agent IDs that are "members" of this space */
|
|
55
|
-
agentIds: string[];
|
|
56
|
-
/** Default agent for unrouted messages */
|
|
57
|
-
defaultAgentId?: string;
|
|
58
|
-
/** Last processed message name (cursor) */
|
|
59
|
-
lastMessageName?: string;
|
|
60
|
-
/** Last processed message timestamp */
|
|
61
|
-
lastMessageTime?: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface AgentEndpoint {
|
|
65
|
-
id: string;
|
|
66
|
-
name: string;
|
|
67
|
-
displayName: string;
|
|
68
|
-
email: string; // agent's email — used to skip own messages
|
|
69
|
-
port: number;
|
|
70
|
-
host: string;
|
|
71
|
-
roles: string[]; // e.g. ['calendar', 'email', 'general']
|
|
72
|
-
keywords: string[]; // trigger keywords for routing
|
|
73
|
-
enabled: boolean;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
interface ChatPollerConfig {
|
|
77
|
-
lifecycle: AgentLifecycleManager;
|
|
78
|
-
getToken: () => Promise<string>; // OAuth token for Chat API
|
|
79
|
-
engineDb: any;
|
|
80
|
-
/** Agent endpoints for forwarding */
|
|
81
|
-
agents: AgentEndpoint[];
|
|
82
|
-
/** Poll interval in ms (default: 30000) */
|
|
83
|
-
intervalMs?: number;
|
|
84
|
-
/** Max backoff on errors in ms (default: 300000 = 5 min) */
|
|
85
|
-
maxBackoffMs?: number;
|
|
86
|
-
/** Workforce manager for work hours enforcement */
|
|
87
|
-
workforce?: any;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
interface ThreadOwnership {
|
|
91
|
-
threadName: string;
|
|
92
|
-
agentId: string;
|
|
93
|
-
lastActivity: number;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// ─── Constants ──────────────────────────────────────────
|
|
97
|
-
|
|
98
|
-
const CHAT_BASE = 'https://chat.googleapis.com/v1';
|
|
99
|
-
const DEFAULT_INTERVAL = 30_000;
|
|
100
|
-
const MAX_BACKOFF = 300_000;
|
|
101
|
-
const THREAD_OWNERSHIP_TTL = 24 * 60 * 60 * 1000; // 24h
|
|
102
|
-
|
|
103
|
-
// ─── Chat Poller Class ──────────────────────────────────
|
|
104
|
-
|
|
105
|
-
export class ChatPoller {
|
|
106
|
-
private config: ChatPollerConfig;
|
|
107
|
-
private spaces: Map<string, MonitoredSpace> = new Map();
|
|
108
|
-
private threadOwners: Map<string, ThreadOwnership> = new Map();
|
|
109
|
-
private processedMessages: Set<string> = new Set();
|
|
110
|
-
private userEmailCache: Map<string, string> = new Map(); // users/123 → email
|
|
111
|
-
private userDisplayNames: Map<string, string> = new Map(); // users/123 → display name
|
|
112
|
-
private timer: ReturnType<typeof setInterval> | null = null;
|
|
113
|
-
private backoffMs = 0;
|
|
114
|
-
private consecutiveErrors = 0;
|
|
115
|
-
private running = false;
|
|
116
|
-
private pollCount = 0;
|
|
117
|
-
|
|
118
|
-
constructor(config: ChatPollerConfig) {
|
|
119
|
-
this.config = config;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// ─── Lifecycle ──────────────────────────────────────
|
|
123
|
-
|
|
124
|
-
async start(): Promise<void> {
|
|
125
|
-
if (this.running) return;
|
|
126
|
-
this.running = true;
|
|
127
|
-
|
|
128
|
-
// Discover spaces to monitor (before loadState, so cursors can be restored)
|
|
129
|
-
await this.discoverSpaces();
|
|
130
|
-
|
|
131
|
-
// Load persisted state (cursors, thread ownership)
|
|
132
|
-
await this.loadState();
|
|
133
|
-
|
|
134
|
-
if (this.spaces.size === 0) {
|
|
135
|
-
console.log('[chat-poller] No spaces to monitor. Will check again on next poll.');
|
|
136
|
-
} else {
|
|
137
|
-
console.log(`[chat-poller] Monitoring ${this.spaces.size} space(s): ${[...this.spaces.values()].map(s => s.displayName).join(', ')}`);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Start polling loop
|
|
141
|
-
const interval = this.config.intervalMs || DEFAULT_INTERVAL;
|
|
142
|
-
console.log(`[chat-poller] ✅ Started (interval: ${interval / 1000}s)`);
|
|
143
|
-
|
|
144
|
-
// Load manual user→email mappings from DB (for external spaces where API can't resolve)
|
|
145
|
-
try {
|
|
146
|
-
const rows = await this.config.engineDb.query(
|
|
147
|
-
`SELECT value FROM engine_settings WHERE key = 'chat_user_mappings'`
|
|
148
|
-
);
|
|
149
|
-
if (rows?.[0]?.value) {
|
|
150
|
-
const mappings = typeof rows[0].value === 'string' ? JSON.parse(rows[0].value) : rows[0].value;
|
|
151
|
-
// Format: { "users/123": "email" } or { "users/123": { email: "...", displayName: "..." } }
|
|
152
|
-
for (const [key, val] of Object.entries(mappings as Record<string, any>)) {
|
|
153
|
-
const email = typeof val === 'string' ? val : val?.email;
|
|
154
|
-
const displayName = typeof val === 'object' ? val?.displayName : undefined;
|
|
155
|
-
if (email) this.userEmailCache.set(key, email);
|
|
156
|
-
if (displayName) this.userDisplayNames.set(key, displayName);
|
|
157
|
-
}
|
|
158
|
-
console.log(`[chat-poller] Loaded ${Object.keys(mappings).length} manual user→email mapping(s)`);
|
|
159
|
-
}
|
|
160
|
-
} catch {}
|
|
161
|
-
|
|
162
|
-
// Resolve user emails from space memberships (needs a token)
|
|
163
|
-
try {
|
|
164
|
-
const token = await this.config.getToken();
|
|
165
|
-
await this.resolveSpaceMembers(token);
|
|
166
|
-
} catch (err: any) {
|
|
167
|
-
console.warn(`[chat-poller] Could not resolve member emails: ${err.message}`);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// If we have no persisted state, do a "catch-up" poll to mark existing messages as seen
|
|
171
|
-
// This prevents replying to old messages on first startup
|
|
172
|
-
const hadState = this.processedMessages.size > 0;
|
|
173
|
-
if (!hadState && this.spaces.size > 0) {
|
|
174
|
-
await this.catchUpExistingMessages().catch(err =>
|
|
175
|
-
console.error(`[chat-poller] Catch-up error: ${err.message}`)
|
|
176
|
-
);
|
|
177
|
-
} else {
|
|
178
|
-
// Normal first poll
|
|
179
|
-
this.poll().catch(err => console.error(`[chat-poller] Initial poll error: ${err.message}`));
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
this.timer = setInterval(() => {
|
|
183
|
-
if (this.backoffMs > 0) {
|
|
184
|
-
this.backoffMs = Math.max(0, this.backoffMs - interval);
|
|
185
|
-
if (this.backoffMs > 0) {
|
|
186
|
-
console.log(`[chat-poller] Backing off (${Math.round(this.backoffMs / 1000)}s remaining)`);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
this.poll().catch(err => console.error(`[chat-poller] Poll error: ${err.message}`));
|
|
191
|
-
}, interval);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
stop(): void {
|
|
195
|
-
this.running = false;
|
|
196
|
-
if (this.timer) {
|
|
197
|
-
clearInterval(this.timer);
|
|
198
|
-
this.timer = null;
|
|
199
|
-
}
|
|
200
|
-
this.saveState().catch(() => {});
|
|
201
|
-
console.log('[chat-poller] Stopped');
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// ─── Space Management ───────────────────────────────
|
|
205
|
-
|
|
206
|
-
/** Add a space to monitor */
|
|
207
|
-
addSpace(space: MonitoredSpace): void {
|
|
208
|
-
this.spaces.set(space.spaceId, space);
|
|
209
|
-
console.log(`[chat-poller] Added space: ${space.displayName} (${space.spaceId}), agents: ${space.agentIds.join(', ')}`);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/** Remove a space from monitoring */
|
|
213
|
-
removeSpace(spaceId: string): void {
|
|
214
|
-
this.spaces.delete(spaceId);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/** Get monitoring status */
|
|
218
|
-
getStatus(): { running: boolean; spaces: number; pollCount: number; consecutiveErrors: number; backoffMs: number } {
|
|
219
|
-
return {
|
|
220
|
-
running: this.running,
|
|
221
|
-
spaces: this.spaces.size,
|
|
222
|
-
pollCount: this.pollCount,
|
|
223
|
-
consecutiveErrors: this.consecutiveErrors,
|
|
224
|
-
backoffMs: this.backoffMs,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// ─── Resolve User Emails via Space Members ───────────
|
|
229
|
-
|
|
230
|
-
/** Pre-load user ID → email mappings from space membership lists */
|
|
231
|
-
private async resolveSpaceMembers(token: string): Promise<void> {
|
|
232
|
-
for (const [, space] of this.spaces) {
|
|
233
|
-
try {
|
|
234
|
-
const url = new URL(`${CHAT_BASE}/${space.spaceId}/members`);
|
|
235
|
-
url.searchParams.set('pageSize', '100');
|
|
236
|
-
const res = await fetch(url.toString(), {
|
|
237
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
238
|
-
signal: AbortSignal.timeout(10_000),
|
|
239
|
-
});
|
|
240
|
-
if (!res.ok) continue;
|
|
241
|
-
const data = await res.json() as any;
|
|
242
|
-
for (const m of (data.memberships || [])) {
|
|
243
|
-
const userId = m.member?.name; // users/123456
|
|
244
|
-
const email = m.member?.email || m.member?.domainId || '';
|
|
245
|
-
const displayName = m.member?.displayName || '';
|
|
246
|
-
if (userId && email) {
|
|
247
|
-
this.userEmailCache.set(userId, email);
|
|
248
|
-
}
|
|
249
|
-
// Cache displayName for all users (even without email)
|
|
250
|
-
if (userId && displayName) {
|
|
251
|
-
this.userDisplayNames.set(userId, displayName);
|
|
252
|
-
}
|
|
253
|
-
// Also try People API for users without email
|
|
254
|
-
if (userId && !email) {
|
|
255
|
-
const personEmail = await this.resolveViaDirectory(token, userId).catch(() => '');
|
|
256
|
-
if (personEmail) {
|
|
257
|
-
this.userEmailCache.set(userId, personEmail);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
// Cache displayName → email mapping too (for agent filtering)
|
|
261
|
-
if (displayName && email) {
|
|
262
|
-
this.userEmailCache.set(`name:${displayName}`, email);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
} catch {}
|
|
266
|
-
}
|
|
267
|
-
if (this.userEmailCache.size > 0) {
|
|
268
|
-
console.log(`[chat-poller] Resolved ${this.userEmailCache.size} user mapping(s) from space memberships`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Resolve email for a user ID using multiple strategies.
|
|
274
|
-
* Works for both Workspace and external (Gmail) users.
|
|
275
|
-
*/
|
|
276
|
-
private async resolveViaDirectory(token: string, userId: string): Promise<string> {
|
|
277
|
-
const numericId = userId.replace('users/', '');
|
|
278
|
-
|
|
279
|
-
// Strategy 1: People API (works for Workspace users)
|
|
280
|
-
try {
|
|
281
|
-
const res = await fetch(
|
|
282
|
-
`https://people.googleapis.com/v1/people/${numericId}?personFields=emailAddresses`,
|
|
283
|
-
{ headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(5_000) }
|
|
284
|
-
);
|
|
285
|
-
if (res.ok) {
|
|
286
|
-
const data = await res.json() as any;
|
|
287
|
-
const email = data.emailAddresses?.[0]?.value;
|
|
288
|
-
if (email) return email;
|
|
289
|
-
}
|
|
290
|
-
} catch {}
|
|
291
|
-
|
|
292
|
-
// Strategy 2: Check all monitored spaces for member details
|
|
293
|
-
// Chat API returns member info including email for space members
|
|
294
|
-
for (const space of this.spaces.values()) {
|
|
295
|
-
try {
|
|
296
|
-
const res = await fetch(
|
|
297
|
-
`${CHAT_BASE}/${space.spaceId}/members?filter=member.type%3D%22HUMAN%22&pageSize=100`,
|
|
298
|
-
{ headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(5_000) }
|
|
299
|
-
);
|
|
300
|
-
if (!res.ok) continue;
|
|
301
|
-
const data = await res.json() as any;
|
|
302
|
-
for (const m of (data.memberships || [])) {
|
|
303
|
-
const memberId = m.member?.name;
|
|
304
|
-
const email = m.member?.email || '';
|
|
305
|
-
const displayName = m.member?.displayName || '';
|
|
306
|
-
if (memberId && email) {
|
|
307
|
-
this.userEmailCache.set(memberId, email);
|
|
308
|
-
if (displayName) this.userDisplayNames.set(memberId, displayName);
|
|
309
|
-
}
|
|
310
|
-
if (memberId === userId && email) return email;
|
|
311
|
-
}
|
|
312
|
-
} catch {}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Strategy 3: Google Contacts / Other People connections
|
|
316
|
-
try {
|
|
317
|
-
const res = await fetch(
|
|
318
|
-
`https://people.googleapis.com/v1/people:searchContacts?query=${numericId}&readMask=emailAddresses,names&pageSize=5`,
|
|
319
|
-
{ headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(5_000) }
|
|
320
|
-
);
|
|
321
|
-
if (res.ok) {
|
|
322
|
-
const data = await res.json() as any;
|
|
323
|
-
const email = data.results?.[0]?.person?.emailAddresses?.[0]?.value;
|
|
324
|
-
if (email) return email;
|
|
325
|
-
}
|
|
326
|
-
} catch {}
|
|
327
|
-
|
|
328
|
-
return '';
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Lazy-resolve email for a sender on first encounter.
|
|
333
|
-
* Called during message processing when cache misses.
|
|
334
|
-
*/
|
|
335
|
-
private async lazyResolveEmail(userId: string): Promise<string> {
|
|
336
|
-
// Already cached?
|
|
337
|
-
if (this.userEmailCache.has(userId)) return this.userEmailCache.get(userId)!;
|
|
338
|
-
|
|
339
|
-
try {
|
|
340
|
-
const token = await this.config.getToken();
|
|
341
|
-
const email = await this.resolveViaDirectory(token, userId);
|
|
342
|
-
if (email) {
|
|
343
|
-
this.userEmailCache.set(userId, email);
|
|
344
|
-
console.log(`[chat-poller] Lazy-resolved ${userId} → ${email}`);
|
|
345
|
-
return email;
|
|
346
|
-
}
|
|
347
|
-
} catch {}
|
|
348
|
-
return '';
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/** Look up email for a sender user ID */
|
|
352
|
-
private resolveEmail(senderName: string, rawEmail: string): string {
|
|
353
|
-
if (rawEmail) return rawEmail;
|
|
354
|
-
// Check cache
|
|
355
|
-
if (senderName && this.userEmailCache.has(senderName)) {
|
|
356
|
-
return this.userEmailCache.get(senderName)!;
|
|
357
|
-
}
|
|
358
|
-
// Extract from users/email@domain format (sometimes used)
|
|
359
|
-
if (senderName?.startsWith('users/') && senderName.includes('@')) {
|
|
360
|
-
return senderName.replace('users/', '');
|
|
361
|
-
}
|
|
362
|
-
return '';
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// ─── Initial Catch-Up (mark existing messages as seen) ──
|
|
366
|
-
|
|
367
|
-
private async catchUpExistingMessages(): Promise<void> {
|
|
368
|
-
let token: string;
|
|
369
|
-
try {
|
|
370
|
-
token = await this.config.getToken();
|
|
371
|
-
} catch (err: any) {
|
|
372
|
-
console.error(`[chat-poller] Catch-up token refresh failed: ${err.message}`);
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
for (const [, space] of this.spaces) {
|
|
377
|
-
try {
|
|
378
|
-
let totalMarked = 0;
|
|
379
|
-
let pageToken: string | undefined;
|
|
380
|
-
|
|
381
|
-
// Paginate through ALL messages to mark them as seen
|
|
382
|
-
do {
|
|
383
|
-
const url = new URL(`${CHAT_BASE}/${space.spaceId}/messages`);
|
|
384
|
-
url.searchParams.set('pageSize', '1000');
|
|
385
|
-
url.searchParams.set('orderBy', 'createTime desc');
|
|
386
|
-
if (pageToken) url.searchParams.set('pageToken', pageToken);
|
|
387
|
-
|
|
388
|
-
const res = await fetch(url.toString(), {
|
|
389
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
390
|
-
signal: AbortSignal.timeout(15_000),
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
if (!res.ok) {
|
|
394
|
-
console.warn(`[chat-poller] Catch-up failed for ${space.displayName}: ${res.status}`);
|
|
395
|
-
break;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
const data = await res.json() as any;
|
|
399
|
-
const messages = data.messages || [];
|
|
400
|
-
|
|
401
|
-
for (const m of messages) {
|
|
402
|
-
if (m.name) this.processedMessages.add(m.name);
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
// Set cursor to the latest message (first page, first item = newest)
|
|
406
|
-
if (totalMarked === 0 && messages.length > 0) {
|
|
407
|
-
space.lastMessageName = messages[0].name;
|
|
408
|
-
space.lastMessageTime = messages[0].createTime;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
totalMarked += messages.length;
|
|
412
|
-
pageToken = data.nextPageToken;
|
|
413
|
-
|
|
414
|
-
// Safety: cap at 5000 messages
|
|
415
|
-
if (totalMarked >= 5000) break;
|
|
416
|
-
} while (pageToken);
|
|
417
|
-
|
|
418
|
-
console.log(`[chat-poller] Catch-up: marked ${totalMarked} existing messages in ${space.displayName} as seen`);
|
|
419
|
-
} catch (err: any) {
|
|
420
|
-
console.warn(`[chat-poller] Catch-up error for ${space.displayName}: ${err.message}`);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Persist the initial state
|
|
425
|
-
await this.saveState().catch(() => {});
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// ─── Core Poll Loop ─────────────────────────────────
|
|
429
|
-
|
|
430
|
-
private async poll(): Promise<void> {
|
|
431
|
-
if (!this.running) return;
|
|
432
|
-
this.pollCount++;
|
|
433
|
-
|
|
434
|
-
// Re-discover spaces periodically (every 20 polls ≈ 10 min)
|
|
435
|
-
if (this.pollCount % 20 === 0) {
|
|
436
|
-
await this.discoverSpaces();
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// Clean up expired thread ownership
|
|
440
|
-
this.cleanThreadOwnership();
|
|
441
|
-
|
|
442
|
-
let token: string;
|
|
443
|
-
try {
|
|
444
|
-
token = await this.config.getToken();
|
|
445
|
-
} catch (err: any) {
|
|
446
|
-
console.error(`[chat-poller] Token refresh failed: ${err.message}`);
|
|
447
|
-
this.handleError();
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
let hadError = false;
|
|
452
|
-
|
|
453
|
-
for (const [_spaceId, space] of this.spaces) {
|
|
454
|
-
try {
|
|
455
|
-
await this.pollSpace(token, space);
|
|
456
|
-
} catch (err: any) {
|
|
457
|
-
console.error(`[chat-poller] Error polling ${space.displayName}: ${err.message}`);
|
|
458
|
-
hadError = true;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
if (hadError) {
|
|
463
|
-
this.handleError();
|
|
464
|
-
} else {
|
|
465
|
-
// Reset backoff on success
|
|
466
|
-
this.consecutiveErrors = 0;
|
|
467
|
-
this.backoffMs = 0;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// Persist state periodically (every 5 polls)
|
|
471
|
-
if (this.pollCount % 5 === 0) {
|
|
472
|
-
await this.saveState().catch(() => {});
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
private async pollSpace(token: string, space: MonitoredSpace): Promise<void> {
|
|
477
|
-
// Build filter: only messages after our cursor
|
|
478
|
-
const query: Record<string, string> = {
|
|
479
|
-
pageSize: '50',
|
|
480
|
-
orderBy: 'createTime asc',
|
|
481
|
-
};
|
|
482
|
-
if (space.lastMessageTime) {
|
|
483
|
-
// Fetch messages created after our last known time
|
|
484
|
-
query.filter = `createTime > "${space.lastMessageTime}"`;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const url = new URL(`${CHAT_BASE}/${space.spaceId}/messages`);
|
|
488
|
-
for (const [k, v] of Object.entries(query)) url.searchParams.set(k, v);
|
|
489
|
-
|
|
490
|
-
const res = await fetch(url.toString(), {
|
|
491
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
492
|
-
signal: AbortSignal.timeout(15_000),
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
if (!res.ok) {
|
|
496
|
-
const errText = await res.text().catch(() => '');
|
|
497
|
-
throw new Error(`Chat API ${res.status}: ${errText.slice(0, 200)}`);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
const data = await res.json() as any;
|
|
501
|
-
const messages: ChatMessage[] = (data.messages || []).map((m: any) => {
|
|
502
|
-
return {
|
|
503
|
-
name: m.name,
|
|
504
|
-
sender: {
|
|
505
|
-
name: m.sender?.name,
|
|
506
|
-
displayName: m.sender?.displayName || this.userDisplayNames.get(m.sender?.name || '') || '',
|
|
507
|
-
// Resolve email from cache, domainId, or users/email@domain format
|
|
508
|
-
email: this.resolveEmail(m.sender?.name, m.sender?.email || m.sender?.domainId || ''),
|
|
509
|
-
type: m.sender?.type,
|
|
510
|
-
},
|
|
511
|
-
text: m.argumentText?.trim() || m.text?.trim() || '',
|
|
512
|
-
annotations: m.annotations, // preserve for mention detection
|
|
513
|
-
createTime: m.createTime,
|
|
514
|
-
thread: m.thread,
|
|
515
|
-
space: m.space || { name: space.spaceId, displayName: space.displayName },
|
|
516
|
-
};});
|
|
517
|
-
|
|
518
|
-
if (messages.length === 0) return;
|
|
519
|
-
if (this.pollCount <= 5) {
|
|
520
|
-
console.log(`[chat-poller] ${space.displayName}: fetched ${messages.length} messages (poll #${this.pollCount}, cursor: ${space.lastMessageTime || 'none'})`);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Build set of agent emails/names to skip (agents' own messages)
|
|
524
|
-
const agentEmails = new Set(this.config.agents.map(a => a.email?.toLowerCase()).filter(Boolean));
|
|
525
|
-
const agentDisplayNames = new Set(this.config.agents.map(a => a.displayName).filter(Boolean));
|
|
526
|
-
|
|
527
|
-
// Process new messages (skip already-seen, bot messages, and agent's own messages)
|
|
528
|
-
let newCount = 0;
|
|
529
|
-
for (const msg of messages) {
|
|
530
|
-
// Skip bot messages
|
|
531
|
-
if (msg.sender.type === 'BOT') continue;
|
|
532
|
-
|
|
533
|
-
// Skip messages FROM our own agents (they send via OAuth, look like humans)
|
|
534
|
-
const senderEmail = (msg.sender.email || '').toLowerCase();
|
|
535
|
-
const senderName = msg.sender.displayName || '';
|
|
536
|
-
const senderUserId = msg.sender.name || '';
|
|
537
|
-
if (senderEmail && agentEmails.has(senderEmail)) continue;
|
|
538
|
-
if (senderName && agentDisplayNames.has(senderName)) continue;
|
|
539
|
-
// Also check via user ID cache
|
|
540
|
-
const cachedEmail = senderUserId ? this.userEmailCache.get(senderUserId) : '';
|
|
541
|
-
if (cachedEmail && agentEmails.has(cachedEmail.toLowerCase())) continue;
|
|
542
|
-
|
|
543
|
-
// Skip already processed
|
|
544
|
-
if (this.processedMessages.has(msg.name)) continue;
|
|
545
|
-
|
|
546
|
-
// Lazy-resolve email if still unknown
|
|
547
|
-
if (!msg.sender.email && msg.sender.name) {
|
|
548
|
-
const resolved = await this.lazyResolveEmail(msg.sender.name);
|
|
549
|
-
if (resolved) {
|
|
550
|
-
msg.sender.email = resolved;
|
|
551
|
-
// Also try to get display name from cache
|
|
552
|
-
if (!msg.sender.displayName || msg.sender.displayName === 'Unknown') {
|
|
553
|
-
msg.sender.displayName = this.userDisplayNames.get(msg.sender.name) || msg.sender.displayName;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
// Route and dispatch
|
|
559
|
-
await this.routeMessage(msg, space);
|
|
560
|
-
this.processedMessages.add(msg.name);
|
|
561
|
-
newCount++;
|
|
562
|
-
|
|
563
|
-
// Update cursor
|
|
564
|
-
space.lastMessageName = msg.name;
|
|
565
|
-
space.lastMessageTime = msg.createTime;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
// Always update cursor to latest message time (even if all skipped)
|
|
569
|
-
// so we don't re-fetch the same messages next poll
|
|
570
|
-
if (messages.length > 0) {
|
|
571
|
-
const last = messages[messages.length - 1];
|
|
572
|
-
if (!space.lastMessageTime || last.createTime > space.lastMessageTime) {
|
|
573
|
-
space.lastMessageName = last.name;
|
|
574
|
-
space.lastMessageTime = last.createTime;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
if (newCount > 0) {
|
|
579
|
-
console.log(`[chat-poller] ${space.displayName}: ${newCount} new message(s) processed`);
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
// Cap processedMessages set size (keep last 5000)
|
|
583
|
-
if (this.processedMessages.size > 5000) {
|
|
584
|
-
const arr = [...this.processedMessages];
|
|
585
|
-
this.processedMessages = new Set(arr.slice(arr.length - 3000));
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
// ─── Smart Message Router ───────────────────────────
|
|
590
|
-
|
|
591
|
-
private async routeMessage(msg: ChatMessage, space: MonitoredSpace): Promise<void> {
|
|
592
|
-
const agents = this.config.agents.filter(a => a.enabled && space.agentIds.includes(a.id));
|
|
593
|
-
|
|
594
|
-
if (agents.length === 0) {
|
|
595
|
-
console.warn(`[chat-poller] No active agents for space ${space.displayName}, dropping message`);
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
// ─── Priority 1: Direct @mention (check ALL space agents, not just enabled) ──
|
|
600
|
-
// If someone @mentions a disabled agent, we still route to that agent (wake it up).
|
|
601
|
-
const allSpaceAgents = this.config.agents.filter(a => space.agentIds.includes(a.id));
|
|
602
|
-
console.log(`[chat-poller] Routing: text="${msg.text.slice(0,80)}", agents=[${allSpaceAgents.map(a => `${a.name}/${a.displayName}(${a.enabled?'on':'off'})`).join(', ')}], annotations=${JSON.stringify(msg.annotations?.length || 0)}`);
|
|
603
|
-
const mentionedAgent = this.findMentionedAgent(msg.text, allSpaceAgents, msg.annotations);
|
|
604
|
-
if (mentionedAgent) {
|
|
605
|
-
// Record thread ownership
|
|
606
|
-
if (msg.thread?.name) {
|
|
607
|
-
this.threadOwners.set(msg.thread.name, {
|
|
608
|
-
threadName: msg.thread.name,
|
|
609
|
-
agentId: mentionedAgent.id,
|
|
610
|
-
lastActivity: Date.now(),
|
|
611
|
-
});
|
|
612
|
-
}
|
|
613
|
-
await this.dispatchToAgent(mentionedAgent, msg, space);
|
|
614
|
-
return;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
// If only one enabled agent and no mention match, route to them
|
|
618
|
-
if (agents.length === 1) {
|
|
619
|
-
await this.dispatchToAgent(agents[0], msg, space);
|
|
620
|
-
return;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
// ─── Priority 2: Thread ownership ─────────────────
|
|
624
|
-
if (msg.thread?.name) {
|
|
625
|
-
const owner = this.threadOwners.get(msg.thread.name);
|
|
626
|
-
if (owner) {
|
|
627
|
-
const ownerAgent = agents.find(a => a.id === owner.agentId);
|
|
628
|
-
if (ownerAgent) {
|
|
629
|
-
owner.lastActivity = Date.now();
|
|
630
|
-
await this.dispatchToAgent(ownerAgent, msg, space);
|
|
631
|
-
return;
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
// ─── Priority 3: Role/keyword match ───────────────
|
|
637
|
-
const keywordAgent = this.findKeywordAgent(msg.text, agents);
|
|
638
|
-
if (keywordAgent) {
|
|
639
|
-
if (msg.thread?.name) {
|
|
640
|
-
this.threadOwners.set(msg.thread.name, {
|
|
641
|
-
threadName: msg.thread.name,
|
|
642
|
-
agentId: keywordAgent.id,
|
|
643
|
-
lastActivity: Date.now(),
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
await this.dispatchToAgent(keywordAgent, msg, space);
|
|
647
|
-
return;
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
// ─── Priority 4: Default agent ────────────────────
|
|
651
|
-
if (space.defaultAgentId) {
|
|
652
|
-
const defaultAgent = agents.find(a => a.id === space.defaultAgentId);
|
|
653
|
-
if (defaultAgent) {
|
|
654
|
-
await this.dispatchToAgent(defaultAgent, msg, space);
|
|
655
|
-
return;
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
// ─── Priority 5: Round-robin fallback ─────────────
|
|
660
|
-
// Use message hash to distribute evenly (deterministic, not random)
|
|
661
|
-
const hash = this.simpleHash(msg.name);
|
|
662
|
-
const target = agents[hash % agents.length];
|
|
663
|
-
await this.dispatchToAgent(target, msg, space);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
/** Check if message directly mentions an agent by name or via annotations */
|
|
667
|
-
private findMentionedAgent(text: string, agents: AgentEndpoint[], annotations?: any[]): AgentEndpoint | null {
|
|
668
|
-
const lower = text.toLowerCase();
|
|
669
|
-
|
|
670
|
-
// Method 1: Check Google Chat annotations (most reliable — structured mention data)
|
|
671
|
-
if (annotations?.length) {
|
|
672
|
-
for (const ann of annotations) {
|
|
673
|
-
if (ann.type === 'USER_MENTION' && ann.userMention) {
|
|
674
|
-
const mentionedEmail = ann.userMention.user?.email?.toLowerCase();
|
|
675
|
-
const mentionedName = ann.userMention.user?.displayName?.toLowerCase();
|
|
676
|
-
for (const agent of agents) {
|
|
677
|
-
if (mentionedEmail && agent.email?.toLowerCase() === mentionedEmail) return agent;
|
|
678
|
-
if (mentionedName && agent.displayName?.toLowerCase() === mentionedName) return agent;
|
|
679
|
-
if (mentionedName && agent.name?.toLowerCase() === mentionedName) return agent;
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
// Method 2: Text pattern matching (fallback)
|
|
686
|
-
for (const agent of agents) {
|
|
687
|
-
const names = [agent.name, agent.displayName].filter(Boolean).map(n => n.toLowerCase());
|
|
688
|
-
for (const name of names) {
|
|
689
|
-
// Match @name, name at start, or just name anywhere preceded by space/start
|
|
690
|
-
if (lower.includes(`@${name}`) || lower.startsWith(`${name},`) || lower.startsWith(`${name} `)) {
|
|
691
|
-
return agent;
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
return null;
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
/** Match message to agent by keywords/role */
|
|
699
|
-
private findKeywordAgent(text: string, agents: AgentEndpoint[]): AgentEndpoint | null {
|
|
700
|
-
const lower = text.toLowerCase();
|
|
701
|
-
let bestMatch: AgentEndpoint | null = null;
|
|
702
|
-
let bestScore = 0;
|
|
703
|
-
|
|
704
|
-
for (const agent of agents) {
|
|
705
|
-
let score = 0;
|
|
706
|
-
for (const kw of agent.keywords) {
|
|
707
|
-
if (lower.includes(kw.toLowerCase())) {
|
|
708
|
-
score += kw.length; // Longer keyword = stronger match
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
if (score > bestScore) {
|
|
712
|
-
bestScore = score;
|
|
713
|
-
bestMatch = agent;
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
// Only return if we have a meaningful match (at least one keyword hit)
|
|
718
|
-
return bestScore > 0 ? bestMatch : null;
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
// ─── Dispatch to Agent ──────────────────────────────
|
|
722
|
-
|
|
723
|
-
private async dispatchToAgent(agent: AgentEndpoint, msg: ChatMessage, space: MonitoredSpace): Promise<void> {
|
|
724
|
-
// ── Work hours enforcement ──
|
|
725
|
-
if (this.config.workforce) {
|
|
726
|
-
const { onDuty, reason } = this.config.workforce.shouldBeWorking(agent.id);
|
|
727
|
-
if (!onDuty) {
|
|
728
|
-
const managerEmail = this.config.workforce.getManagerEmail(agent.id);
|
|
729
|
-
const senderEmail = msg.sender.email || this.userEmailCache.get(msg.sender.name || '') || '';
|
|
730
|
-
const isFromManager = managerEmail && senderEmail.toLowerCase() === managerEmail.toLowerCase();
|
|
731
|
-
if (!isFromManager) {
|
|
732
|
-
const senderId2 = msg.sender.name || 'no-id';
|
|
733
|
-
const senderDisplay = msg.sender.displayName || 'no-name';
|
|
734
|
-
console.log(`[chat-poller] ${agent.displayName}: SKIPPED chat from ${senderEmail || 'unknown'} (id=${senderId2}, name="${senderDisplay}") — ${reason}. Only manager can wake agent off-hours.`);
|
|
735
|
-
return;
|
|
736
|
-
}
|
|
737
|
-
console.log(`[chat-poller] ${agent.displayName}: off-hours but manager message — waking agent`);
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
const senderId = msg.sender.name || '';
|
|
742
|
-
const chatContext = {
|
|
743
|
-
source: 'google_chat',
|
|
744
|
-
senderName: msg.sender.displayName || this.userDisplayNames.get(senderId) || 'Unknown',
|
|
745
|
-
senderEmail: msg.sender.email || this.userEmailCache.get(senderId) || '',
|
|
746
|
-
spaceName: space.displayName || 'Chat',
|
|
747
|
-
spaceId: space.spaceId,
|
|
748
|
-
threadId: msg.thread?.name || '',
|
|
749
|
-
isDM: space.agentIds.length === 1, // heuristic: single-agent space is like a DM
|
|
750
|
-
messageText: msg.text,
|
|
751
|
-
};
|
|
752
|
-
|
|
753
|
-
const url = `http://${agent.host}:${agent.port}/api/runtime/chat`;
|
|
754
|
-
|
|
755
|
-
try {
|
|
756
|
-
const _rtSecret = process.env.AGENT_RUNTIME_SECRET || process.env.RUNTIME_SECRET || '';
|
|
757
|
-
const _hdrs: Record<string, string> = { 'Content-Type': 'application/json' };
|
|
758
|
-
if (_rtSecret) _hdrs['x-agent-internal-key'] = _rtSecret;
|
|
759
|
-
const resp = await fetch(url, {
|
|
760
|
-
method: 'POST',
|
|
761
|
-
headers: _hdrs,
|
|
762
|
-
body: JSON.stringify(chatContext),
|
|
763
|
-
signal: AbortSignal.timeout(10_000),
|
|
764
|
-
});
|
|
765
|
-
|
|
766
|
-
if (resp.ok) {
|
|
767
|
-
console.log(`[chat-poller] → ${agent.displayName}: [from: ${chatContext.senderName} <${chatContext.senderEmail}>] "${msg.text.slice(0, 60)}"`);
|
|
768
|
-
} else {
|
|
769
|
-
console.warn(`[chat-poller] Agent ${agent.displayName} returned ${resp.status}`);
|
|
770
|
-
}
|
|
771
|
-
} catch (err: any) {
|
|
772
|
-
console.warn(`[chat-poller] Agent ${agent.displayName} unreachable (${agent.host}:${agent.port}): ${err.message}`);
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
// ─── Space Discovery ────────────────────────────────
|
|
777
|
-
|
|
778
|
-
/** Discover spaces from agent configs in DB */
|
|
779
|
-
private async discoverSpaces(): Promise<void> {
|
|
780
|
-
try {
|
|
781
|
-
// Load chat_spaces config from DB (admin-configured)
|
|
782
|
-
const rows = await this.config.engineDb.query(
|
|
783
|
-
`SELECT key, value FROM engine_settings WHERE key = 'chat_spaces'`
|
|
784
|
-
);
|
|
785
|
-
if (rows && rows.length > 0) {
|
|
786
|
-
const spacesConfig = JSON.parse((rows[0] as any).value);
|
|
787
|
-
for (const sc of spacesConfig) {
|
|
788
|
-
if (!this.spaces.has(sc.spaceId)) {
|
|
789
|
-
this.addSpace({
|
|
790
|
-
spaceId: sc.spaceId,
|
|
791
|
-
displayName: sc.displayName || sc.spaceId,
|
|
792
|
-
agentIds: sc.agentIds || [],
|
|
793
|
-
defaultAgentId: sc.defaultAgentId,
|
|
794
|
-
});
|
|
795
|
-
} else {
|
|
796
|
-
// Update agent assignments
|
|
797
|
-
const existing = this.spaces.get(sc.spaceId)!;
|
|
798
|
-
existing.agentIds = sc.agentIds || existing.agentIds;
|
|
799
|
-
existing.defaultAgentId = sc.defaultAgentId || existing.defaultAgentId;
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
} catch {
|
|
804
|
-
// engine_settings table might not exist yet or no chat_spaces key — that's fine
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
// ─── State Persistence ──────────────────────────────
|
|
809
|
-
|
|
810
|
-
private async loadState(): Promise<void> {
|
|
811
|
-
try {
|
|
812
|
-
const rows = await this.config.engineDb.query(
|
|
813
|
-
`SELECT key, value FROM engine_settings WHERE key = 'chat_poller_state'`
|
|
814
|
-
);
|
|
815
|
-
if (rows && rows.length > 0) {
|
|
816
|
-
const state = JSON.parse((rows[0] as any).value);
|
|
817
|
-
|
|
818
|
-
// Restore cursors
|
|
819
|
-
if (state.cursors) {
|
|
820
|
-
for (const [spaceId, cursor] of Object.entries(state.cursors as Record<string, any>)) {
|
|
821
|
-
const space = this.spaces.get(spaceId);
|
|
822
|
-
if (space) {
|
|
823
|
-
space.lastMessageName = cursor.lastMessageName;
|
|
824
|
-
space.lastMessageTime = cursor.lastMessageTime;
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
// Restore thread ownership
|
|
830
|
-
if (state.threadOwners) {
|
|
831
|
-
for (const to of state.threadOwners) {
|
|
832
|
-
this.threadOwners.set(to.threadName, to);
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
// Restore processed message IDs (last 1000)
|
|
837
|
-
if (state.processedIds) {
|
|
838
|
-
for (const id of state.processedIds) {
|
|
839
|
-
this.processedMessages.add(id);
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
console.log(`[chat-poller] Restored state: ${this.processedMessages.size} processed IDs, ${this.threadOwners.size} thread owners`);
|
|
844
|
-
}
|
|
845
|
-
} catch {
|
|
846
|
-
// Fresh start — no persisted state
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
private async saveState(): Promise<void> {
|
|
851
|
-
const cursors: Record<string, any> = {};
|
|
852
|
-
for (const [spaceId, space] of this.spaces) {
|
|
853
|
-
if (space.lastMessageName) {
|
|
854
|
-
cursors[spaceId] = {
|
|
855
|
-
lastMessageName: space.lastMessageName,
|
|
856
|
-
lastMessageTime: space.lastMessageTime,
|
|
857
|
-
};
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
const state = {
|
|
862
|
-
cursors,
|
|
863
|
-
threadOwners: [...this.threadOwners.values()].filter(to => Date.now() - to.lastActivity < THREAD_OWNERSHIP_TTL),
|
|
864
|
-
processedIds: [...this.processedMessages].slice(-1000), // Keep last 1000
|
|
865
|
-
savedAt: new Date().toISOString(),
|
|
866
|
-
};
|
|
867
|
-
|
|
868
|
-
try {
|
|
869
|
-
await this.config.engineDb.execute(
|
|
870
|
-
`INSERT INTO engine_settings (key, value) VALUES ('chat_poller_state', $1)
|
|
871
|
-
ON CONFLICT (key) DO UPDATE SET value = $1`,
|
|
872
|
-
[JSON.stringify(state)]
|
|
873
|
-
);
|
|
874
|
-
} catch (err: any) {
|
|
875
|
-
console.warn(`[chat-poller] Failed to persist state: ${err.message}`);
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
// ─── Error Handling / Circuit Breaker ───────────────
|
|
880
|
-
|
|
881
|
-
private handleError(): void {
|
|
882
|
-
this.consecutiveErrors++;
|
|
883
|
-
const maxBackoff = this.config.maxBackoffMs || MAX_BACKOFF;
|
|
884
|
-
// Exponential backoff: 30s, 60s, 120s, 240s, capped at max
|
|
885
|
-
this.backoffMs = Math.min(maxBackoff, DEFAULT_INTERVAL * Math.pow(2, this.consecutiveErrors - 1));
|
|
886
|
-
console.warn(`[chat-poller] ${this.consecutiveErrors} consecutive errors, backing off ${Math.round(this.backoffMs / 1000)}s`);
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
// ─── Utilities ──────────────────────────────────────
|
|
890
|
-
|
|
891
|
-
private cleanThreadOwnership(): void {
|
|
892
|
-
const now = Date.now();
|
|
893
|
-
for (const [key, to] of this.threadOwners) {
|
|
894
|
-
if (now - to.lastActivity > THREAD_OWNERSHIP_TTL) {
|
|
895
|
-
this.threadOwners.delete(key);
|
|
896
|
-
}
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
private simpleHash(str: string): number {
|
|
901
|
-
let hash = 0;
|
|
902
|
-
for (let i = 0; i < str.length; i++) {
|
|
903
|
-
hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;
|
|
904
|
-
}
|
|
905
|
-
return Math.abs(hash);
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
// ─── Factory ────────────────────────────────────────────
|
|
910
|
-
|
|
911
|
-
export function createChatPoller(config: ChatPollerConfig): ChatPoller {
|
|
912
|
-
return new ChatPoller(config);
|
|
913
|
-
}
|