@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
package/src/engine/db-adapter.ts
DELETED
|
@@ -1,1156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Engine Database Adapter
|
|
3
|
-
*
|
|
4
|
-
* Extends the base DatabaseAdapter with engine-specific persistence.
|
|
5
|
-
* Works with SQLite, Postgres, MySQL, Turso — anything that speaks SQL.
|
|
6
|
-
*
|
|
7
|
-
* MongoDB and DynamoDB would need their own implementations.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { ManagedAgent, AgentState, StateTransition, AgentUsage, LifecycleEvent } from './lifecycle.js';
|
|
11
|
-
|
|
12
|
-
/** Safe JSON parse — returns fallback on malformed data instead of throwing */
|
|
13
|
-
function sj(val: any, fallback: any = {}): any {
|
|
14
|
-
if (val == null) return fallback;
|
|
15
|
-
if (typeof val === 'object') return val; // Postgres JSON/JSONB returns parsed objects
|
|
16
|
-
if (typeof val !== 'string') return fallback;
|
|
17
|
-
try { return JSON.parse(val); } catch { return fallback; }
|
|
18
|
-
}
|
|
19
|
-
import type { AgentPermissionProfile } from './skills.js';
|
|
20
|
-
import type { Organization, OrgPlan } from './tenant.js';
|
|
21
|
-
import type { ApprovalRequest, ApprovalPolicy } from './approvals.js';
|
|
22
|
-
import type { KnowledgeBase, KBDocument, KBChunk } from './knowledge.js';
|
|
23
|
-
import type { ActivityEvent, ToolCallRecord, ConversationEntry } from './activity.js';
|
|
24
|
-
import {
|
|
25
|
-
ENGINE_TABLES,
|
|
26
|
-
MIGRATIONS,
|
|
27
|
-
MIGRATIONS_TABLE,
|
|
28
|
-
MIGRATIONS_TABLE_POSTGRES,
|
|
29
|
-
sqliteToPostgres,
|
|
30
|
-
sqliteToMySQL,
|
|
31
|
-
type Migration,
|
|
32
|
-
type DynamicTableDef,
|
|
33
|
-
} from './db-schema.js';
|
|
34
|
-
|
|
35
|
-
// ─── Types ──────────────────────────────────────────────
|
|
36
|
-
|
|
37
|
-
export interface EngineDB {
|
|
38
|
-
// Execute raw SQL (adapter-specific)
|
|
39
|
-
run(sql: string, params?: any[]): Promise<void>;
|
|
40
|
-
get<T = any>(sql: string, params?: any[]): Promise<T | undefined>;
|
|
41
|
-
all<T = any>(sql: string, params?: any[]): Promise<T[]>;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ─── Engine Database Layer ──────────────────────────────
|
|
45
|
-
|
|
46
|
-
export class EngineDatabase {
|
|
47
|
-
private db: EngineDB;
|
|
48
|
-
private dialect: 'sqlite' | 'postgres' | 'mysql' | 'mongodb' | 'dynamodb' | 'turso';
|
|
49
|
-
/** Raw driver handle for NoSQL migrations (MongoClient db, DynamoDB client, etc.) */
|
|
50
|
-
private rawDriver?: any;
|
|
51
|
-
|
|
52
|
-
constructor(db: EngineDB, dialect: 'sqlite' | 'postgres' | 'mysql' | 'mongodb' | 'dynamodb' | 'turso' = 'sqlite', rawDriver?: any) {
|
|
53
|
-
this.db = db;
|
|
54
|
-
this.dialect = dialect;
|
|
55
|
-
this.rawDriver = rawDriver;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ─── Migration System ─────────────────────────────────
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Run all pending migrations in order.
|
|
62
|
-
* Creates the migration tracking table first, then applies any unapplied migrations.
|
|
63
|
-
*/
|
|
64
|
-
async migrate(): Promise<{ applied: number; total: number }> {
|
|
65
|
-
// Create migration tracking table
|
|
66
|
-
const trackingDDL = this.dialect === 'postgres' ? MIGRATIONS_TABLE_POSTGRES : MIGRATIONS_TABLE;
|
|
67
|
-
for (const stmt of this.splitStatements(trackingDDL)) {
|
|
68
|
-
await this.db.run(stmt);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Get already-applied versions
|
|
72
|
-
const applied = await this.db.all<{ version: number }>('SELECT version FROM engine_migrations ORDER BY version');
|
|
73
|
-
const appliedSet = new Set(applied.map(r => r.version));
|
|
74
|
-
|
|
75
|
-
let count = 0;
|
|
76
|
-
for (const migration of MIGRATIONS) {
|
|
77
|
-
if (appliedSet.has(migration.version)) continue;
|
|
78
|
-
|
|
79
|
-
// Pick the right SQL for the dialect
|
|
80
|
-
if ((this.dialect === 'mongodb' || this.dialect === 'dynamodb') && migration.nosql) {
|
|
81
|
-
await migration.nosql(this.rawDriver, this.dialect);
|
|
82
|
-
} else {
|
|
83
|
-
const sql = this.getSqlForDialect(migration);
|
|
84
|
-
if (sql) {
|
|
85
|
-
for (const stmt of this.splitStatements(sql)) {
|
|
86
|
-
try {
|
|
87
|
-
await this.db.run(stmt);
|
|
88
|
-
} catch (e: any) {
|
|
89
|
-
// Ignore "duplicate column" errors from ALTER TABLE on fresh DBs
|
|
90
|
-
// where the column already exists in the CREATE TABLE schema.
|
|
91
|
-
if (e?.message?.includes('duplicate column')) continue;
|
|
92
|
-
throw e;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Record migration
|
|
99
|
-
await this.db.run(
|
|
100
|
-
'INSERT INTO engine_migrations (version, name) VALUES (?, ?)',
|
|
101
|
-
[migration.version, migration.name]
|
|
102
|
-
);
|
|
103
|
-
count++;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Post-migration: ensure critical tables exist (handles partial first-install or re-install scenarios)
|
|
107
|
-
const settingsDDL = this.dialect === 'postgres'
|
|
108
|
-
? `CREATE TABLE IF NOT EXISTS engine_settings (key TEXT PRIMARY KEY, value TEXT, updated_at TIMESTAMP DEFAULT NOW())`
|
|
109
|
-
: `CREATE TABLE IF NOT EXISTS engine_settings (key TEXT PRIMARY KEY, value TEXT, updated_at TEXT DEFAULT (datetime('now')))`;
|
|
110
|
-
try { await this.db.run(settingsDDL); } catch { /* ok — may already exist */ }
|
|
111
|
-
|
|
112
|
-
// Post-migration: fix version columns that were incorrectly created as BOOLEAN on Postgres
|
|
113
|
-
if (this.dialect === 'postgres') {
|
|
114
|
-
try {
|
|
115
|
-
const boolVersionCols = await this.db.all<any>(
|
|
116
|
-
`SELECT table_name FROM information_schema.columns WHERE column_name = 'version' AND data_type = 'boolean' AND table_schema = 'public'`
|
|
117
|
-
);
|
|
118
|
-
for (const row of boolVersionCols) {
|
|
119
|
-
try {
|
|
120
|
-
await this.db.run(`ALTER TABLE ${row.table_name} ALTER COLUMN version DROP DEFAULT`);
|
|
121
|
-
await this.db.run(`ALTER TABLE ${row.table_name} ALTER COLUMN version TYPE INTEGER USING CASE WHEN version THEN 1 ELSE 0 END`);
|
|
122
|
-
await this.db.run(`ALTER TABLE ${row.table_name} ALTER COLUMN version SET DEFAULT 1`);
|
|
123
|
-
console.log(`[engine] Fixed version column type on ${row.table_name}: BOOLEAN → INTEGER`);
|
|
124
|
-
} catch (e: any) {
|
|
125
|
-
console.error(`[engine] Failed to fix version column on ${row.table_name}:`, e.message);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
} catch { /* ignore */ }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Auto-seed community skills on first run or when empty
|
|
132
|
-
await this.seedCommunitySkills();
|
|
133
|
-
|
|
134
|
-
return { applied: count, total: MIGRATIONS.length };
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Seed community_skill_index with all MCP integration skills.
|
|
139
|
-
* Uses INSERT ... ON CONFLICT DO NOTHING so it's safe to re-run.
|
|
140
|
-
* Only seeds if the table has fewer entries than the seed data.
|
|
141
|
-
*/
|
|
142
|
-
private async seedCommunitySkills(): Promise<void> {
|
|
143
|
-
try {
|
|
144
|
-
const countRow = await this.db.get<any>('SELECT COUNT(*) as c FROM community_skill_index');
|
|
145
|
-
const existingCount = countRow?.c || 0;
|
|
146
|
-
|
|
147
|
-
// Load seed data (compiled into dist by bundler)
|
|
148
|
-
const { SEED_SKILLS } = await import('../agent-tools/tools/integrations/_seed-data.js');
|
|
149
|
-
if (!SEED_SKILLS?.length) return;
|
|
150
|
-
await this._doSeed(SEED_SKILLS, existingCount);
|
|
151
|
-
} catch (e: any) {
|
|
152
|
-
console.warn(`[engine] Community skill seeding failed: ${e.message}`);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
private async _doSeed(seedData: any[], existingCount: number): Promise<void> {
|
|
157
|
-
if (existingCount >= seedData.length) return; // Already seeded
|
|
158
|
-
|
|
159
|
-
let seeded = 0;
|
|
160
|
-
for (const skill of seedData) {
|
|
161
|
-
try {
|
|
162
|
-
const onConflict = this.dialect === 'postgres'
|
|
163
|
-
? 'ON CONFLICT (id) DO NOTHING'
|
|
164
|
-
: 'ON CONFLICT(id) DO NOTHING';
|
|
165
|
-
|
|
166
|
-
await this.db.run(
|
|
167
|
-
`INSERT INTO community_skill_index (id, name, description, version, author, repository, license, category, risk, tags, tools, verified, featured)
|
|
168
|
-
VALUES (?, ?, ?, '1.0.0', 'agenticmail', 'https://github.com/agenticmail/enterprise', 'MIT', ?, 'medium', '[]', ?, 1, 0)
|
|
169
|
-
${onConflict}`,
|
|
170
|
-
[
|
|
171
|
-
skill.id,
|
|
172
|
-
skill.name,
|
|
173
|
-
`${skill.name} integration — ${skill.toolCount} tools for ${skill.category} workflows`,
|
|
174
|
-
skill.category,
|
|
175
|
-
JSON.stringify(skill.tools),
|
|
176
|
-
]
|
|
177
|
-
);
|
|
178
|
-
seeded++;
|
|
179
|
-
} catch { /* skip duplicates */ }
|
|
180
|
-
}
|
|
181
|
-
if (seeded > 0) console.log(`[engine] Seeded ${seeded} community skills (${seedData.length} total available)`);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Register and create a dynamic table at runtime.
|
|
186
|
-
* Used by plugins, skills, or engine extensions that need their own storage.
|
|
187
|
-
* Table name is auto-prefixed with `ext_` to avoid collisions with core tables.
|
|
188
|
-
*/
|
|
189
|
-
async createDynamicTable(def: DynamicTableDef): Promise<void> {
|
|
190
|
-
const prefixedName = def.name.startsWith('ext_') ? def.name : `ext_${def.name}`;
|
|
191
|
-
|
|
192
|
-
if (this.dialect === 'mongodb' && def.mongoSetup) {
|
|
193
|
-
await def.mongoSetup(this.rawDriver);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
if (this.dialect === 'dynamodb' && def.dynamoSetup) {
|
|
197
|
-
await def.dynamoSetup(this.rawDriver);
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// SQL-based: pick dialect-specific DDL or auto-convert
|
|
202
|
-
let ddl: string;
|
|
203
|
-
if (this.dialect === 'postgres' && def.postgres) {
|
|
204
|
-
ddl = def.postgres;
|
|
205
|
-
} else if (this.dialect === 'mysql' && def.mysql) {
|
|
206
|
-
ddl = def.mysql;
|
|
207
|
-
} else if (this.dialect === 'postgres') {
|
|
208
|
-
ddl = sqliteToPostgres(def.sql);
|
|
209
|
-
} else if (this.dialect === 'mysql') {
|
|
210
|
-
ddl = sqliteToMySQL(def.sql);
|
|
211
|
-
} else {
|
|
212
|
-
ddl = def.sql;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Replace the table name with prefixed version
|
|
216
|
-
ddl = ddl.replace(new RegExp(`\\b${def.name}\\b`, 'g'), prefixedName);
|
|
217
|
-
|
|
218
|
-
for (const stmt of this.splitStatements(ddl)) {
|
|
219
|
-
await this.db.run(stmt);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Create any additional indexes
|
|
223
|
-
if (def.indexes) {
|
|
224
|
-
for (const idx of def.indexes) {
|
|
225
|
-
const prefixedIdx = idx.replace(new RegExp(`\\b${def.name}\\b`, 'g'), prefixedName);
|
|
226
|
-
await this.db.run(prefixedIdx);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Run arbitrary SQL — for custom queries on dynamic tables.
|
|
233
|
-
* Returns rows for SELECT, void for mutations.
|
|
234
|
-
*/
|
|
235
|
-
async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
|
|
236
|
-
return this.db.all<T>(sql, params);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
async get<T = any>(sql: string, params?: any[]): Promise<T | undefined> {
|
|
240
|
-
return this.db.get<T>(sql, params);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async getSettings(): Promise<Record<string, any>> {
|
|
244
|
-
const rows = await this.db.all<any>('SELECT key, value FROM engine_settings', []);
|
|
245
|
-
const result: Record<string, any> = {};
|
|
246
|
-
for (const row of rows) {
|
|
247
|
-
try { result[row.key] = JSON.parse(row.value); } catch { result[row.key] = row.value; }
|
|
248
|
-
}
|
|
249
|
-
return result;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
async execute(sql: string, params?: any[]): Promise<void> {
|
|
253
|
-
return this.db.run(sql, params);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/** Alias for execute() — used by SessionManager and other components */
|
|
257
|
-
async run(sql: string, params?: any[]): Promise<void> {
|
|
258
|
-
return this.db.run(sql, params);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* List all dynamic (ext_*) tables currently in the database.
|
|
263
|
-
*/
|
|
264
|
-
async listDynamicTables(): Promise<string[]> {
|
|
265
|
-
if (this.dialect === 'postgres') {
|
|
266
|
-
const rows = await this.db.all<{ tablename: string }>(
|
|
267
|
-
"SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE 'ext_%'"
|
|
268
|
-
);
|
|
269
|
-
return rows.map(r => r.tablename);
|
|
270
|
-
} else if (this.dialect === 'mysql') {
|
|
271
|
-
const rows = await this.db.all<{ table_name: string }>(
|
|
272
|
-
"SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name LIKE 'ext_%'"
|
|
273
|
-
);
|
|
274
|
-
return rows.map(r => r.table_name);
|
|
275
|
-
} else {
|
|
276
|
-
// SQLite / Turso
|
|
277
|
-
const rows = await this.db.all<{ name: string }>(
|
|
278
|
-
"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'ext_%'"
|
|
279
|
-
);
|
|
280
|
-
return rows.map(r => r.name);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// ─── Helpers ────────────────────────────────────────
|
|
285
|
-
|
|
286
|
-
private splitStatements(sql: string): string[] {
|
|
287
|
-
return sql.split(';').map(s => s.trim()).filter(s => s.length > 0);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
private getSqlForDialect(migration: Migration): string | undefined {
|
|
291
|
-
if (this.dialect === 'postgres' && migration.postgres) return migration.postgres;
|
|
292
|
-
if (this.dialect === 'mysql' && migration.mysql) return migration.mysql;
|
|
293
|
-
if (this.dialect === 'postgres' && migration.sql) return sqliteToPostgres(migration.sql);
|
|
294
|
-
if (this.dialect === 'mysql' && migration.sql) return sqliteToMySQL(migration.sql);
|
|
295
|
-
return migration.sql;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// ─── Managed Agents ─────────────────────────────────
|
|
299
|
-
|
|
300
|
-
async upsertManagedAgent(agent: ManagedAgent): Promise<void> {
|
|
301
|
-
// Strip budgetConfig from config blob — it lives in its own column (budget_config)
|
|
302
|
-
const configToWrite = { ...(agent.config as any) };
|
|
303
|
-
delete configToWrite.budgetConfig;
|
|
304
|
-
|
|
305
|
-
await this.db.run(`
|
|
306
|
-
INSERT INTO managed_agents (id, org_id, name, display_name, state, config, health, usage, budget_config, permission_profile_id, version, last_deployed_at, last_health_check_at, created_at, updated_at)
|
|
307
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
308
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
309
|
-
state = excluded.state,
|
|
310
|
-
config = excluded.config,
|
|
311
|
-
health = excluded.health,
|
|
312
|
-
permission_profile_id = excluded.permission_profile_id,
|
|
313
|
-
version = excluded.version,
|
|
314
|
-
last_deployed_at = excluded.last_deployed_at,
|
|
315
|
-
last_health_check_at = excluded.last_health_check_at,
|
|
316
|
-
updated_at = excluded.updated_at
|
|
317
|
-
`, [
|
|
318
|
-
agent.id, agent.orgId, agent.config.name, agent.config.displayName,
|
|
319
|
-
agent.state, JSON.stringify(configToWrite), JSON.stringify(agent.health),
|
|
320
|
-
JSON.stringify(agent.usage), JSON.stringify(agent.budgetConfig || {}),
|
|
321
|
-
agent.config.permissionProfileId,
|
|
322
|
-
agent.version, agent.lastDeployedAt || null, agent.lastHealthCheckAt || null,
|
|
323
|
-
agent.createdAt, agent.updatedAt,
|
|
324
|
-
]);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
async getManagedAgent(id: string): Promise<ManagedAgent | null> {
|
|
328
|
-
const row = await this.db.get<any>('SELECT * FROM managed_agents WHERE id = ?', [id]);
|
|
329
|
-
return row ? this.rowToManagedAgent(row) : null;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
async getManagedAgentsByOrg(orgId: string): Promise<ManagedAgent[]> {
|
|
333
|
-
const rows = await this.db.all<any>('SELECT * FROM managed_agents WHERE org_id = ? ORDER BY created_at DESC', [orgId]);
|
|
334
|
-
return rows.map(r => this.rowToManagedAgent(r));
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async getManagedAgentsByState(state: AgentState): Promise<ManagedAgent[]> {
|
|
338
|
-
const rows = await this.db.all<any>('SELECT * FROM managed_agents WHERE state = ?', [state]);
|
|
339
|
-
return rows.map(r => this.rowToManagedAgent(r));
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
async getAllManagedAgents(): Promise<ManagedAgent[]> {
|
|
343
|
-
const rows = await this.db.all<any>('SELECT * FROM managed_agents ORDER BY created_at DESC');
|
|
344
|
-
return rows.map(r => this.rowToManagedAgent(r));
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
async deleteManagedAgent(id: string): Promise<void> {
|
|
348
|
-
await this.db.run('DELETE FROM managed_agents WHERE id = ?', [id]);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
async countManagedAgents(orgId: string, state?: AgentState): Promise<number> {
|
|
352
|
-
const sql = state
|
|
353
|
-
? 'SELECT COUNT(*) as count FROM managed_agents WHERE org_id = ? AND state = ?'
|
|
354
|
-
: 'SELECT COUNT(*) as count FROM managed_agents WHERE org_id = ?';
|
|
355
|
-
const row = await this.db.get<any>(sql, state ? [orgId, state] : [orgId]);
|
|
356
|
-
return row?.count || 0;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// ─── State History ──────────────────────────────────
|
|
360
|
-
|
|
361
|
-
async addStateTransition(agentId: string, transition: StateTransition): Promise<void> {
|
|
362
|
-
await this.db.run(`
|
|
363
|
-
INSERT INTO agent_state_history (id, agent_id, from_state, to_state, reason, triggered_by, error, created_at)
|
|
364
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
365
|
-
`, [
|
|
366
|
-
crypto.randomUUID(), agentId, transition.from, transition.to,
|
|
367
|
-
transition.reason, transition.triggeredBy, transition.error || null, transition.timestamp,
|
|
368
|
-
]);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
async getStateHistory(agentId: string, limit: number = 50): Promise<StateTransition[]> {
|
|
372
|
-
const rows = await this.db.all<any>(
|
|
373
|
-
'SELECT * FROM agent_state_history WHERE agent_id = ? ORDER BY created_at DESC LIMIT ?',
|
|
374
|
-
[agentId, limit]
|
|
375
|
-
);
|
|
376
|
-
return rows.map(r => ({
|
|
377
|
-
from: r.from_state, to: r.to_state, reason: r.reason,
|
|
378
|
-
triggeredBy: r.triggered_by, timestamp: r.created_at, error: r.error,
|
|
379
|
-
}));
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// ─── Permission Profiles ────────────────────────────
|
|
383
|
-
|
|
384
|
-
async upsertPermissionProfile(orgId: string, profile: AgentPermissionProfile): Promise<void> {
|
|
385
|
-
await this.db.run(`
|
|
386
|
-
INSERT INTO permission_profiles (id, org_id, name, description, config, is_preset, created_at, updated_at)
|
|
387
|
-
VALUES (?, ?, ?, ?, ?, false, ?, ?)
|
|
388
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
389
|
-
name = excluded.name, description = excluded.description,
|
|
390
|
-
config = excluded.config, updated_at = excluded.updated_at
|
|
391
|
-
`, [
|
|
392
|
-
profile.id, orgId, profile.name, profile.description || null,
|
|
393
|
-
JSON.stringify(profile), profile.createdAt, profile.updatedAt,
|
|
394
|
-
]);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
async getPermissionProfile(id: string): Promise<AgentPermissionProfile | null> {
|
|
398
|
-
const row = await this.db.get<any>('SELECT * FROM permission_profiles WHERE id = ?', [id]);
|
|
399
|
-
return row ? sj(row.config) : null;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
async getPermissionProfilesByOrg(orgId: string): Promise<AgentPermissionProfile[]> {
|
|
403
|
-
const rows = await this.db.all<any>('SELECT config FROM permission_profiles WHERE org_id = ? ORDER BY name', [orgId]);
|
|
404
|
-
return rows.map(r => sj(r.config));
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
async getAllPermissionProfiles(): Promise<AgentPermissionProfile[]> {
|
|
408
|
-
const rows = await this.db.all<any>('SELECT config FROM permission_profiles ORDER BY name');
|
|
409
|
-
return rows.map(r => sj(r.config));
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
async deletePermissionProfile(id: string): Promise<void> {
|
|
413
|
-
await this.db.run('DELETE FROM permission_profiles WHERE id = ?', [id]);
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
// ─── Organizations ──────────────────────────────────
|
|
417
|
-
|
|
418
|
-
async upsertOrganization(org: Organization): Promise<void> {
|
|
419
|
-
await this.db.run(`
|
|
420
|
-
INSERT INTO organizations (id, name, slug, plan, limits, usage, settings, sso_config, allowed_domains, billing, created_at, updated_at)
|
|
421
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
422
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
423
|
-
name = excluded.name, slug = excluded.slug, plan = excluded.plan,
|
|
424
|
-
limits = excluded.limits, usage = excluded.usage, settings = excluded.settings,
|
|
425
|
-
sso_config = excluded.sso_config, allowed_domains = excluded.allowed_domains,
|
|
426
|
-
billing = excluded.billing, updated_at = excluded.updated_at
|
|
427
|
-
`, [
|
|
428
|
-
org.id, org.name, org.slug, org.plan,
|
|
429
|
-
JSON.stringify(org.limits), JSON.stringify(org.usage),
|
|
430
|
-
JSON.stringify(org.settings), org.ssoConfig ? JSON.stringify(org.ssoConfig) : null,
|
|
431
|
-
JSON.stringify(org.allowedDomains), org.billing ? JSON.stringify(org.billing) : null,
|
|
432
|
-
org.createdAt, org.updatedAt,
|
|
433
|
-
]);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
async getOrganization(id: string): Promise<Organization | null> {
|
|
437
|
-
const row = await this.db.get<any>('SELECT * FROM organizations WHERE id = ?', [id]);
|
|
438
|
-
return row ? this.rowToOrg(row) : null;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
async getOrganizationBySlug(slug: string): Promise<Organization | null> {
|
|
442
|
-
const row = await this.db.get<any>('SELECT * FROM organizations WHERE slug = ?', [slug]);
|
|
443
|
-
return row ? this.rowToOrg(row) : null;
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
async listOrganizations(): Promise<Organization[]> {
|
|
447
|
-
const rows = await this.db.all<any>('SELECT * FROM organizations ORDER BY created_at DESC');
|
|
448
|
-
return rows.map(r => this.rowToOrg(r));
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
async deleteOrganization(id: string): Promise<void> {
|
|
452
|
-
await this.db.run('DELETE FROM organizations WHERE id = ?', [id]);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// ─── Knowledge Bases ────────────────────────────────
|
|
456
|
-
|
|
457
|
-
async upsertKnowledgeBase(kb: KnowledgeBase): Promise<void> {
|
|
458
|
-
await this.db.run(`
|
|
459
|
-
INSERT INTO knowledge_bases (id, org_id, name, description, agent_ids, config, stats, created_at, updated_at)
|
|
460
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
461
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
462
|
-
name = excluded.name, description = excluded.description,
|
|
463
|
-
agent_ids = excluded.agent_ids, config = excluded.config,
|
|
464
|
-
stats = excluded.stats, updated_at = excluded.updated_at
|
|
465
|
-
`, [
|
|
466
|
-
kb.id, kb.orgId, kb.name, kb.description || null,
|
|
467
|
-
JSON.stringify(kb.agentIds), JSON.stringify(kb.config),
|
|
468
|
-
JSON.stringify(kb.stats), kb.createdAt, kb.updatedAt,
|
|
469
|
-
]);
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
async getKnowledgeBase(id: string): Promise<KnowledgeBase | null> {
|
|
473
|
-
const row = await this.db.get<any>('SELECT * FROM knowledge_bases WHERE id = ?', [id]);
|
|
474
|
-
if (!row) return null;
|
|
475
|
-
const kb: any = {
|
|
476
|
-
id: row.id, orgId: row.org_id, name: row.name, description: row.description,
|
|
477
|
-
agentIds: sj(row.agent_ids), clientOrgId: row.client_org_id || null, config: sj(row.config),
|
|
478
|
-
stats: sj(row.stats), createdAt: row.created_at, updatedAt: row.updated_at,
|
|
479
|
-
documents: [],
|
|
480
|
-
};
|
|
481
|
-
// Load documents
|
|
482
|
-
kb.documents = await this.getKBDocuments(id);
|
|
483
|
-
return kb;
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
async getKnowledgeBasesByOrg(orgId: string): Promise<KnowledgeBase[]> {
|
|
487
|
-
const rows = await this.db.all<any>('SELECT * FROM knowledge_bases WHERE org_id = ? ORDER BY name', [orgId]);
|
|
488
|
-
return rows.map(r => ({
|
|
489
|
-
id: r.id, orgId: r.org_id, name: r.name, description: r.description,
|
|
490
|
-
agentIds: sj(r.agent_ids), clientOrgId: r.client_org_id || null, config: sj(r.config),
|
|
491
|
-
stats: sj(r.stats), createdAt: r.created_at, updatedAt: r.updated_at,
|
|
492
|
-
documents: [], // Loaded on demand
|
|
493
|
-
}));
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
async deleteKnowledgeBase(id: string): Promise<void> {
|
|
497
|
-
await this.db.run('DELETE FROM knowledge_bases WHERE id = ?', [id]);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// ─── KB Documents & Chunks ──────────────────────────
|
|
501
|
-
|
|
502
|
-
async insertKBDocument(doc: KBDocument): Promise<void> {
|
|
503
|
-
await this.db.run(`
|
|
504
|
-
INSERT INTO kb_documents (id, knowledge_base_id, name, source_type, source_url, mime_type, size, metadata, status, error, created_at, updated_at)
|
|
505
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
506
|
-
`, [
|
|
507
|
-
doc.id, doc.knowledgeBaseId, doc.name, doc.sourceType,
|
|
508
|
-
doc.sourceUrl || null, doc.mimeType, doc.size,
|
|
509
|
-
JSON.stringify(doc.metadata), doc.status, doc.error || null,
|
|
510
|
-
doc.createdAt, doc.updatedAt,
|
|
511
|
-
]);
|
|
512
|
-
|
|
513
|
-
// Insert chunks
|
|
514
|
-
for (const chunk of doc.chunks) {
|
|
515
|
-
await this.db.run(`
|
|
516
|
-
INSERT INTO kb_chunks (id, document_id, content, token_count, position, embedding, metadata)
|
|
517
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
518
|
-
`, [
|
|
519
|
-
chunk.id, doc.id, chunk.content, chunk.tokenCount,
|
|
520
|
-
chunk.position, chunk.embedding ? Buffer.from(new Float32Array(chunk.embedding).buffer) : null,
|
|
521
|
-
JSON.stringify(chunk.metadata),
|
|
522
|
-
]);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
async getKBDocuments(kbId: string): Promise<KBDocument[]> {
|
|
527
|
-
const docs = await this.db.all<any>('SELECT * FROM kb_documents WHERE knowledge_base_id = ?', [kbId]);
|
|
528
|
-
const result: KBDocument[] = [];
|
|
529
|
-
for (const d of docs) {
|
|
530
|
-
const chunks = await this.db.all<any>('SELECT * FROM kb_chunks WHERE document_id = ? ORDER BY position', [d.id]);
|
|
531
|
-
result.push({
|
|
532
|
-
id: d.id, knowledgeBaseId: d.knowledge_base_id, name: d.name,
|
|
533
|
-
sourceType: d.source_type, sourceUrl: d.source_url, mimeType: d.mime_type,
|
|
534
|
-
size: d.size, metadata: sj(d.metadata), status: d.status, error: d.error,
|
|
535
|
-
createdAt: d.created_at, updatedAt: d.updated_at,
|
|
536
|
-
chunks: chunks.map((c: any) => ({
|
|
537
|
-
id: c.id, documentId: c.document_id, content: c.content,
|
|
538
|
-
tokenCount: c.token_count, position: c.position,
|
|
539
|
-
embedding: c.embedding ? Array.from(new Float32Array(c.embedding)) : undefined,
|
|
540
|
-
metadata: sj(c.metadata),
|
|
541
|
-
})),
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
return result;
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
async deleteKBDocument(docId: string): Promise<void> {
|
|
548
|
-
await this.db.run('DELETE FROM kb_documents WHERE id = ?', [docId]);
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
// ─── Tool Calls (Activity) ──────────────────────────
|
|
552
|
-
|
|
553
|
-
async insertToolCall(record: ToolCallRecord): Promise<void> {
|
|
554
|
-
await this.db.run(`
|
|
555
|
-
INSERT INTO tool_calls (id, agent_id, org_id, session_id, tool_id, tool_name, parameters, result, timing, cost, permission, created_at)
|
|
556
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
557
|
-
`, [
|
|
558
|
-
record.id, record.agentId, record.orgId, record.sessionId || null,
|
|
559
|
-
record.toolId, record.toolName, JSON.stringify(record.parameters),
|
|
560
|
-
record.result ? JSON.stringify(record.result) : null,
|
|
561
|
-
JSON.stringify(record.timing), record.cost ? JSON.stringify(record.cost) : null,
|
|
562
|
-
JSON.stringify(record.permission), record.timing.startedAt,
|
|
563
|
-
]);
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
async updateToolCallResult(id: string, result: ToolCallRecord['result'], timing: ToolCallRecord['timing'], cost?: ToolCallRecord['cost']): Promise<void> {
|
|
567
|
-
await this.db.run(
|
|
568
|
-
'UPDATE tool_calls SET result = ?, timing = ?, cost = ? WHERE id = ?',
|
|
569
|
-
[JSON.stringify(result), JSON.stringify(timing), cost ? JSON.stringify(cost) : null, id]
|
|
570
|
-
);
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
async getToolCalls(opts: { agentId?: string; orgId?: string; toolId?: string; since?: string; limit?: number }): Promise<ToolCallRecord[]> {
|
|
574
|
-
const conditions: string[] = [];
|
|
575
|
-
const params: any[] = [];
|
|
576
|
-
if (opts.agentId) { conditions.push('agent_id = ?'); params.push(opts.agentId); }
|
|
577
|
-
if (opts.orgId) { conditions.push('org_id = ?'); params.push(opts.orgId); }
|
|
578
|
-
if (opts.toolId) { conditions.push('tool_id = ?'); params.push(opts.toolId); }
|
|
579
|
-
if (opts.since) { conditions.push('created_at >= ?'); params.push(opts.since); }
|
|
580
|
-
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
|
|
581
|
-
params.push(opts.limit || 50);
|
|
582
|
-
const rows = await this.db.all<any>(`SELECT * FROM tool_calls ${where} ORDER BY created_at DESC LIMIT ?`, params);
|
|
583
|
-
return rows.map(r => ({
|
|
584
|
-
id: r.id, agentId: r.agent_id, orgId: r.org_id, sessionId: r.session_id,
|
|
585
|
-
toolId: r.tool_id, toolName: r.tool_name, parameters: sj(r.parameters || '{}'),
|
|
586
|
-
result: r.result ? sj(r.result) : undefined,
|
|
587
|
-
timing: sj(r.timing), cost: r.cost ? sj(r.cost) : undefined,
|
|
588
|
-
permission: sj(r.permission),
|
|
589
|
-
}));
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// ─── Activity Events ────────────────────────────────
|
|
593
|
-
|
|
594
|
-
async insertActivityEvent(event: ActivityEvent): Promise<void> {
|
|
595
|
-
await this.db.run(`
|
|
596
|
-
INSERT INTO activity_events (id, agent_id, org_id, session_id, type, data, created_at)
|
|
597
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
598
|
-
`, [event.id, event.agentId, event.orgId, event.sessionId || null, event.type, JSON.stringify(event.data), event.timestamp]);
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
async getActivityEvents(opts: { agentId?: string; orgId?: string; types?: string[]; since?: string; limit?: number }): Promise<ActivityEvent[]> {
|
|
602
|
-
const conditions: string[] = [];
|
|
603
|
-
const params: any[] = [];
|
|
604
|
-
if (opts.agentId) { conditions.push('agent_id = ?'); params.push(opts.agentId); }
|
|
605
|
-
if (opts.orgId) { conditions.push('org_id = ?'); params.push(opts.orgId); }
|
|
606
|
-
if (opts.types?.length) { conditions.push(`type IN (${opts.types.map(() => '?').join(',')})`); params.push(...opts.types); }
|
|
607
|
-
if (opts.since) { conditions.push('created_at >= ?'); params.push(opts.since); }
|
|
608
|
-
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
|
|
609
|
-
params.push(opts.limit || 50);
|
|
610
|
-
const rows = await this.db.all<any>(`SELECT * FROM activity_events ${where} ORDER BY created_at DESC LIMIT ?`, params);
|
|
611
|
-
return rows.map(r => ({
|
|
612
|
-
id: r.id, agentId: r.agent_id, orgId: r.org_id, sessionId: r.session_id,
|
|
613
|
-
type: r.type, data: sj(r.data), timestamp: r.created_at,
|
|
614
|
-
}));
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
// ─── Conversations ──────────────────────────────────
|
|
618
|
-
|
|
619
|
-
async insertConversation(entry: ConversationEntry): Promise<void> {
|
|
620
|
-
await this.db.run(`
|
|
621
|
-
INSERT INTO conversations (id, agent_id, session_id, role, content, channel, token_count, tool_calls, created_at)
|
|
622
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
623
|
-
`, [
|
|
624
|
-
entry.id, entry.agentId, entry.sessionId, entry.role,
|
|
625
|
-
entry.content, entry.channel || null, entry.tokenCount,
|
|
626
|
-
entry.toolCalls ? JSON.stringify(entry.toolCalls) : null, entry.timestamp,
|
|
627
|
-
]);
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
async getConversation(sessionId: string, limit: number = 50): Promise<ConversationEntry[]> {
|
|
631
|
-
const rows = await this.db.all<any>(
|
|
632
|
-
'SELECT * FROM conversations WHERE session_id = ? ORDER BY created_at ASC LIMIT ?',
|
|
633
|
-
[sessionId, limit]
|
|
634
|
-
);
|
|
635
|
-
return rows.map(r => ({
|
|
636
|
-
id: r.id, agentId: r.agent_id, sessionId: r.session_id, role: r.role,
|
|
637
|
-
content: r.content, channel: r.channel, tokenCount: r.token_count,
|
|
638
|
-
toolCalls: r.tool_calls ? sj(r.tool_calls) : undefined, timestamp: r.created_at,
|
|
639
|
-
}));
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
// ─── Approval Requests ──────────────────────────────
|
|
643
|
-
|
|
644
|
-
async insertApprovalRequest(req: ApprovalRequest, orgId: string): Promise<void> {
|
|
645
|
-
await this.db.run(`
|
|
646
|
-
INSERT INTO approval_requests (id, agent_id, agent_name, org_id, tool_id, tool_name, reason, risk_level, side_effects, parameters, context, status, decision, expires_at, created_at)
|
|
647
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
648
|
-
`, [
|
|
649
|
-
req.id, req.agentId, req.agentName, orgId, req.toolId, req.toolName,
|
|
650
|
-
req.reason, req.riskLevel, JSON.stringify(req.sideEffects),
|
|
651
|
-
req.parameters ? JSON.stringify(req.parameters) : null, req.context || null,
|
|
652
|
-
req.status, req.decision ? JSON.stringify(req.decision) : null,
|
|
653
|
-
req.expiresAt, req.createdAt,
|
|
654
|
-
]);
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
async updateApprovalRequest(id: string, status: string, decision?: any): Promise<void> {
|
|
658
|
-
await this.db.run(
|
|
659
|
-
'UPDATE approval_requests SET status = ?, decision = ? WHERE id = ?',
|
|
660
|
-
[status, decision ? JSON.stringify(decision) : null, id]
|
|
661
|
-
);
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
async getApprovalRequests(opts: { orgId?: string; status?: string; agentId?: string; limit?: number }): Promise<ApprovalRequest[]> {
|
|
665
|
-
const conditions: string[] = [];
|
|
666
|
-
const params: any[] = [];
|
|
667
|
-
if (opts.orgId) { conditions.push('org_id = ?'); params.push(opts.orgId); }
|
|
668
|
-
if (opts.status) { conditions.push('status = ?'); params.push(opts.status); }
|
|
669
|
-
if (opts.agentId) { conditions.push('agent_id = ?'); params.push(opts.agentId); }
|
|
670
|
-
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
|
|
671
|
-
params.push(opts.limit || 50);
|
|
672
|
-
const rows = await this.db.all<any>(`SELECT * FROM approval_requests ${where} ORDER BY created_at DESC LIMIT ?`, params);
|
|
673
|
-
return rows.map(r => ({
|
|
674
|
-
id: r.id, agentId: r.agent_id, agentName: r.agent_name, toolId: r.tool_id,
|
|
675
|
-
toolName: r.tool_name, reason: r.reason, riskLevel: r.risk_level,
|
|
676
|
-
sideEffects: sj(r.side_effects), parameters: r.parameters ? sj(r.parameters) : undefined,
|
|
677
|
-
context: r.context, status: r.status,
|
|
678
|
-
decision: r.decision ? sj(r.decision) : undefined,
|
|
679
|
-
createdAt: r.created_at, expiresAt: r.expires_at,
|
|
680
|
-
}));
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
// ─── Approval Policies ──────────────────────────────
|
|
684
|
-
|
|
685
|
-
async upsertApprovalPolicy(orgId: string, policy: ApprovalPolicy): Promise<void> {
|
|
686
|
-
await this.db.run(`
|
|
687
|
-
INSERT INTO approval_policies (id, org_id, name, description, triggers, approvers, timeout, notify, enabled, created_at, updated_at)
|
|
688
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
689
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
690
|
-
name = excluded.name, description = excluded.description,
|
|
691
|
-
triggers = excluded.triggers, approvers = excluded.approvers,
|
|
692
|
-
timeout = excluded.timeout, notify = excluded.notify,
|
|
693
|
-
enabled = excluded.enabled, updated_at = excluded.updated_at
|
|
694
|
-
`, [
|
|
695
|
-
policy.id, orgId, policy.name, policy.description || null,
|
|
696
|
-
JSON.stringify(policy.triggers), JSON.stringify(policy.approvers),
|
|
697
|
-
JSON.stringify(policy.timeout), JSON.stringify(policy.notify),
|
|
698
|
-
policy.enabled ? 1 : 0, new Date().toISOString(), new Date().toISOString(),
|
|
699
|
-
]);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
async getApprovalPolicies(orgId: string): Promise<ApprovalPolicy[]> {
|
|
703
|
-
const rows = await this.db.all<any>('SELECT * FROM approval_policies WHERE org_id = ? ORDER BY name', [orgId]);
|
|
704
|
-
return rows.map(r => ({
|
|
705
|
-
id: r.id, name: r.name, description: r.description,
|
|
706
|
-
triggers: sj(r.triggers), approvers: sj(r.approvers),
|
|
707
|
-
timeout: sj(r.timeout), notify: sj(r.notify),
|
|
708
|
-
enabled: !!r.enabled,
|
|
709
|
-
}));
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
async getAllApprovalPolicies(): Promise<ApprovalPolicy[]> {
|
|
713
|
-
const rows = await this.db.all<any>('SELECT * FROM approval_policies WHERE enabled = TRUE ORDER BY name');
|
|
714
|
-
return rows.map(r => ({
|
|
715
|
-
id: r.id, name: r.name, description: r.description,
|
|
716
|
-
triggers: sj(r.triggers), approvers: sj(r.approvers),
|
|
717
|
-
timeout: sj(r.timeout), notify: sj(r.notify),
|
|
718
|
-
enabled: !!r.enabled,
|
|
719
|
-
}));
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
async deleteApprovalPolicy(id: string): Promise<void> {
|
|
723
|
-
await this.db.run('DELETE FROM approval_policies WHERE id = ?', [id]);
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
// ─── SSO Integrations ─────────────────────────────
|
|
727
|
-
|
|
728
|
-
async upsertSsoIntegration(integration: {
|
|
729
|
-
id: string; orgId: string; providerType: string; name: string;
|
|
730
|
-
enabled: boolean; config: Record<string, any>; metadataUrl?: string;
|
|
731
|
-
}): Promise<void> {
|
|
732
|
-
await this.db.run(`
|
|
733
|
-
INSERT INTO sso_integrations (id, org_id, provider_type, name, enabled, config, metadata_url, created_at, updated_at)
|
|
734
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
735
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
736
|
-
name = excluded.name, enabled = excluded.enabled,
|
|
737
|
-
config = excluded.config, metadata_url = excluded.metadata_url,
|
|
738
|
-
updated_at = excluded.updated_at
|
|
739
|
-
`, [
|
|
740
|
-
integration.id, integration.orgId, integration.providerType,
|
|
741
|
-
integration.name, integration.enabled ? 1 : 0,
|
|
742
|
-
JSON.stringify(integration.config), integration.metadataUrl || null,
|
|
743
|
-
new Date().toISOString(), new Date().toISOString(),
|
|
744
|
-
]);
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
async getSsoIntegration(id: string): Promise<any | null> {
|
|
748
|
-
const row = await this.db.get<any>('SELECT * FROM sso_integrations WHERE id = ?', [id]);
|
|
749
|
-
return row ? this.rowToSso(row) : null;
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
async getSsoIntegrationsByOrg(orgId: string): Promise<any[]> {
|
|
753
|
-
const rows = await this.db.all<any>('SELECT * FROM sso_integrations WHERE org_id = ? ORDER BY name', [orgId]);
|
|
754
|
-
return rows.map(r => this.rowToSso(r));
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
async getSsoIntegrationByType(orgId: string, providerType: string): Promise<any | null> {
|
|
758
|
-
const row = await this.db.get<any>('SELECT * FROM sso_integrations WHERE org_id = ? AND provider_type = ? AND enabled = TRUE', [orgId, providerType]);
|
|
759
|
-
return row ? this.rowToSso(row) : null;
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
async deleteSsoIntegration(id: string): Promise<void> {
|
|
763
|
-
await this.db.run('DELETE FROM sso_integrations WHERE id = ?', [id]);
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
private rowToSso(row: any) {
|
|
767
|
-
return {
|
|
768
|
-
id: row.id, orgId: row.org_id, providerType: row.provider_type,
|
|
769
|
-
name: row.name, enabled: !!row.enabled, config: sj(row.config),
|
|
770
|
-
metadataUrl: row.metadata_url, createdAt: row.created_at, updatedAt: row.updated_at,
|
|
771
|
-
};
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
// ─── OIDC State Tracking ─────────────────────────
|
|
775
|
-
|
|
776
|
-
async saveOidcState(state: string, providerId: string, opts: {
|
|
777
|
-
redirectUri?: string; nonce?: string; codeVerifier?: string; ttlSeconds?: number;
|
|
778
|
-
}): Promise<void> {
|
|
779
|
-
const expiresAt = new Date(Date.now() + (opts.ttlSeconds || 600) * 1000).toISOString();
|
|
780
|
-
await this.db.run(`
|
|
781
|
-
INSERT INTO oidc_states (state, provider_id, redirect_uri, nonce, code_verifier, created_at, expires_at)
|
|
782
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
783
|
-
`, [state, providerId, opts.redirectUri || null, opts.nonce || null, opts.codeVerifier || null, new Date().toISOString(), expiresAt]);
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
async getOidcState(state: string): Promise<{
|
|
787
|
-
state: string; providerId: string; redirectUri?: string; nonce?: string; codeVerifier?: string; expiresAt: string;
|
|
788
|
-
} | null> {
|
|
789
|
-
const row = await this.db.get<any>('SELECT * FROM oidc_states WHERE state = ?', [state]);
|
|
790
|
-
if (!row) return null;
|
|
791
|
-
// Check expiry
|
|
792
|
-
if (new Date(row.expires_at) < new Date()) {
|
|
793
|
-
await this.db.run('DELETE FROM oidc_states WHERE state = ?', [state]);
|
|
794
|
-
return null;
|
|
795
|
-
}
|
|
796
|
-
return {
|
|
797
|
-
state: row.state, providerId: row.provider_id, redirectUri: row.redirect_uri,
|
|
798
|
-
nonce: row.nonce, codeVerifier: row.code_verifier, expiresAt: row.expires_at,
|
|
799
|
-
};
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
async deleteOidcState(state: string): Promise<void> {
|
|
803
|
-
await this.db.run('DELETE FROM oidc_states WHERE state = ?', [state]);
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
async cleanupExpiredOidcStates(): Promise<void> {
|
|
807
|
-
await this.db.run('DELETE FROM oidc_states WHERE expires_at < ?', [new Date().toISOString()]);
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
// ─── Deploy Credentials ─────────────────────────
|
|
811
|
-
|
|
812
|
-
async upsertDeployCredential(cred: {
|
|
813
|
-
id: string; orgId: string; name: string; targetType: string;
|
|
814
|
-
config: Record<string, any>; createdBy: string;
|
|
815
|
-
}): Promise<void> {
|
|
816
|
-
await this.db.run(`
|
|
817
|
-
INSERT INTO deploy_credentials (id, org_id, name, target_type, config, created_by, created_at, updated_at)
|
|
818
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
819
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
820
|
-
name = excluded.name, target_type = excluded.target_type,
|
|
821
|
-
config = excluded.config, updated_at = excluded.updated_at
|
|
822
|
-
`, [
|
|
823
|
-
cred.id, cred.orgId, cred.name, cred.targetType,
|
|
824
|
-
JSON.stringify(cred.config), cred.createdBy,
|
|
825
|
-
new Date().toISOString(), new Date().toISOString(),
|
|
826
|
-
]);
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
async getDeployCredential(id: string): Promise<any | null> {
|
|
830
|
-
const row = await this.db.get<any>('SELECT * FROM deploy_credentials WHERE id = ?', [id]);
|
|
831
|
-
return row ? this.rowToDeployCred(row) : null;
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
async getDeployCredentialsByOrg(orgId: string): Promise<any[]> {
|
|
835
|
-
const rows = await this.db.all<any>('SELECT * FROM deploy_credentials WHERE org_id = ? ORDER BY name', [orgId]);
|
|
836
|
-
return rows.map(r => this.rowToDeployCred(r));
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
async getDeployCredentialsByType(orgId: string, targetType: string): Promise<any[]> {
|
|
840
|
-
const rows = await this.db.all<any>('SELECT * FROM deploy_credentials WHERE org_id = ? AND target_type = ?', [orgId, targetType]);
|
|
841
|
-
return rows.map(r => this.rowToDeployCred(r));
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
async deleteDeployCredential(id: string): Promise<void> {
|
|
845
|
-
await this.db.run('DELETE FROM deploy_credentials WHERE id = ?', [id]);
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
private rowToDeployCred(row: any) {
|
|
849
|
-
return {
|
|
850
|
-
id: row.id, orgId: row.org_id, name: row.name, targetType: row.target_type,
|
|
851
|
-
config: sj(row.config), createdBy: row.created_by,
|
|
852
|
-
createdAt: row.created_at, updatedAt: row.updated_at,
|
|
853
|
-
};
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
// ─── Aggregate Stats ───────────────────────────────
|
|
857
|
-
|
|
858
|
-
async getEngineStats(orgId: string): Promise<{
|
|
859
|
-
totalManagedAgents: number;
|
|
860
|
-
runningAgents: number;
|
|
861
|
-
totalToolCallsToday: number;
|
|
862
|
-
totalActivityToday: number;
|
|
863
|
-
pendingApprovals: number;
|
|
864
|
-
totalKnowledgeBases: number;
|
|
865
|
-
}> {
|
|
866
|
-
const today = new Date().toISOString().split('T')[0];
|
|
867
|
-
|
|
868
|
-
const [agents, running, toolCalls, activity, approvals, kbs] = await Promise.all([
|
|
869
|
-
this.db.get<any>('SELECT COUNT(*) as c FROM managed_agents WHERE org_id = ?', [orgId]),
|
|
870
|
-
this.db.get<any>('SELECT COUNT(*) as c FROM managed_agents WHERE org_id = ? AND state = ?', [orgId, 'running']),
|
|
871
|
-
this.db.get<any>('SELECT COUNT(*) as c FROM tool_calls WHERE org_id = ? AND created_at >= ?', [orgId, today]),
|
|
872
|
-
this.db.get<any>('SELECT COUNT(*) as c FROM activity_events WHERE org_id = ? AND created_at >= ?', [orgId, today]),
|
|
873
|
-
this.db.get<any>('SELECT COUNT(*) as c FROM approval_requests WHERE org_id = ? AND status = ?', [orgId, 'pending']),
|
|
874
|
-
this.db.get<any>('SELECT COUNT(*) as c FROM knowledge_bases WHERE org_id = ?', [orgId]),
|
|
875
|
-
]);
|
|
876
|
-
|
|
877
|
-
return {
|
|
878
|
-
totalManagedAgents: agents?.c || 0,
|
|
879
|
-
runningAgents: running?.c || 0,
|
|
880
|
-
totalToolCallsToday: toolCalls?.c || 0,
|
|
881
|
-
totalActivityToday: activity?.c || 0,
|
|
882
|
-
pendingApprovals: approvals?.c || 0,
|
|
883
|
-
totalKnowledgeBases: kbs?.c || 0,
|
|
884
|
-
};
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
/**
|
|
888
|
-
* Cleanup old data based on retention
|
|
889
|
-
*/
|
|
890
|
-
async cleanup(retainDays: number): Promise<{ toolCalls: number; events: number; conversations: number }> {
|
|
891
|
-
const cutoff = new Date(Date.now() - retainDays * 86_400_000).toISOString();
|
|
892
|
-
|
|
893
|
-
const tc = await this.db.get<any>('SELECT COUNT(*) as c FROM tool_calls WHERE created_at < ?', [cutoff]);
|
|
894
|
-
const ev = await this.db.get<any>('SELECT COUNT(*) as c FROM activity_events WHERE created_at < ?', [cutoff]);
|
|
895
|
-
const cv = await this.db.get<any>('SELECT COUNT(*) as c FROM conversations WHERE created_at < ?', [cutoff]);
|
|
896
|
-
|
|
897
|
-
await this.db.run('DELETE FROM tool_calls WHERE created_at < ?', [cutoff]);
|
|
898
|
-
await this.db.run('DELETE FROM activity_events WHERE created_at < ?', [cutoff]);
|
|
899
|
-
await this.db.run('DELETE FROM conversations WHERE created_at < ?', [cutoff]);
|
|
900
|
-
|
|
901
|
-
return {
|
|
902
|
-
toolCalls: tc?.c || 0,
|
|
903
|
-
events: ev?.c || 0,
|
|
904
|
-
conversations: cv?.c || 0,
|
|
905
|
-
};
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
// ─── Community Skill Index ──────────────────────────
|
|
909
|
-
|
|
910
|
-
async upsertCommunitySkill(skill: {
|
|
911
|
-
id: string; name: string; description: string; version: string;
|
|
912
|
-
author: string; repository: string; license: string;
|
|
913
|
-
category?: string; risk?: string; icon?: string;
|
|
914
|
-
tags?: string[]; tools?: any[]; configSchema?: Record<string, any>;
|
|
915
|
-
minEngineVersion?: string; homepage?: string;
|
|
916
|
-
downloads?: number; rating?: number; ratingCount?: number;
|
|
917
|
-
verified?: boolean; featured?: boolean;
|
|
918
|
-
}): Promise<void> {
|
|
919
|
-
const now = new Date().toISOString();
|
|
920
|
-
await this.db.run(`
|
|
921
|
-
INSERT INTO community_skill_index (id, name, description, version, author, repository, license, category, risk, icon, tags, tools, config_schema, min_engine_version, homepage, downloads, rating, rating_count, verified, featured, created_at, updated_at)
|
|
922
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
923
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
924
|
-
name = excluded.name, description = excluded.description, version = excluded.version,
|
|
925
|
-
author = excluded.author, repository = excluded.repository, license = excluded.license,
|
|
926
|
-
category = excluded.category, risk = excluded.risk, icon = excluded.icon,
|
|
927
|
-
tags = excluded.tags, tools = excluded.tools, config_schema = excluded.config_schema,
|
|
928
|
-
min_engine_version = excluded.min_engine_version, homepage = excluded.homepage,
|
|
929
|
-
downloads = excluded.downloads, rating = excluded.rating, rating_count = excluded.rating_count,
|
|
930
|
-
verified = excluded.verified, featured = excluded.featured,
|
|
931
|
-
updated_at = excluded.updated_at
|
|
932
|
-
`, [
|
|
933
|
-
skill.id, skill.name, skill.description, skill.version,
|
|
934
|
-
skill.author, skill.repository, skill.license,
|
|
935
|
-
skill.category || null, skill.risk || 'medium', skill.icon || null,
|
|
936
|
-
JSON.stringify(skill.tags || []), JSON.stringify(skill.tools || []),
|
|
937
|
-
JSON.stringify(skill.configSchema || {}), skill.minEngineVersion || null,
|
|
938
|
-
skill.homepage || null, skill.downloads || 0, skill.rating || 0,
|
|
939
|
-
skill.ratingCount || 0, skill.verified ? 1 : 0, skill.featured ? 1 : 0,
|
|
940
|
-
now, now,
|
|
941
|
-
]);
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
async getCommunitySkill(id: string): Promise<any | null> {
|
|
945
|
-
const row = await this.db.get<any>('SELECT * FROM community_skill_index WHERE id = ?', [id]);
|
|
946
|
-
return row ? this.rowToCommunitySkill(row) : null;
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
async getAllCommunitySkills(opts?: {
|
|
950
|
-
category?: string; risk?: string; tag?: string; author?: string;
|
|
951
|
-
verified?: boolean; featured?: boolean;
|
|
952
|
-
search?: string; sortBy?: string; order?: string;
|
|
953
|
-
limit?: number; offset?: number;
|
|
954
|
-
}): Promise<{ skills: any[]; total: number }> {
|
|
955
|
-
const conditions: string[] = [];
|
|
956
|
-
const params: any[] = [];
|
|
957
|
-
|
|
958
|
-
if (opts?.category) { conditions.push('category = ?'); params.push(opts.category); }
|
|
959
|
-
if (opts?.risk) { conditions.push('risk = ?'); params.push(opts.risk); }
|
|
960
|
-
if (opts?.author) { conditions.push('author = ?'); params.push(opts.author); }
|
|
961
|
-
if (opts?.verified !== undefined) { conditions.push('verified = ?'); params.push(opts.verified ? 1 : 0); }
|
|
962
|
-
if (opts?.featured !== undefined) { conditions.push('featured = ?'); params.push(opts.featured ? 1 : 0); }
|
|
963
|
-
if (opts?.tag) { conditions.push("tags LIKE ?"); params.push(`%"${opts.tag}"%`); }
|
|
964
|
-
if (opts?.search) {
|
|
965
|
-
conditions.push('(name LIKE ? OR description LIKE ? OR author LIKE ?)');
|
|
966
|
-
const q = `%${opts.search}%`;
|
|
967
|
-
params.push(q, q, q);
|
|
968
|
-
}
|
|
969
|
-
|
|
970
|
-
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
|
|
971
|
-
const sortCol = opts?.sortBy === 'popular' ? 'downloads' : opts?.sortBy === 'rating' ? 'rating' : opts?.sortBy === 'name' ? 'name' : 'created_at';
|
|
972
|
-
const sortOrder = opts?.order === 'asc' ? 'ASC' : 'DESC';
|
|
973
|
-
const limit = opts?.limit || 50;
|
|
974
|
-
const offset = opts?.offset || 0;
|
|
975
|
-
|
|
976
|
-
const countRow = await this.db.get<any>(`SELECT COUNT(*) as c FROM community_skill_index ${where}`, params);
|
|
977
|
-
const rows = await this.db.all<any>(
|
|
978
|
-
`SELECT * FROM community_skill_index ${where} ORDER BY ${sortCol} ${sortOrder} LIMIT ? OFFSET ?`,
|
|
979
|
-
[...params, limit, offset],
|
|
980
|
-
);
|
|
981
|
-
|
|
982
|
-
return { skills: rows.map((r: any) => this.rowToCommunitySkill(r)), total: countRow?.c || 0 };
|
|
983
|
-
}
|
|
984
|
-
|
|
985
|
-
async deleteCommunitySkill(id: string): Promise<void> {
|
|
986
|
-
await this.db.run('DELETE FROM community_skill_index WHERE id = ?', [id]);
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
async incrementDownloads(skillId: string): Promise<void> {
|
|
990
|
-
await this.db.run('UPDATE community_skill_index SET downloads = downloads + 1 WHERE id = ?', [skillId]);
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
// ─── Community Skill Installed ──────────────────────
|
|
994
|
-
|
|
995
|
-
async upsertInstalledSkill(install: {
|
|
996
|
-
id: string; orgId: string; skillId: string; version: string;
|
|
997
|
-
enabled: boolean; config: Record<string, any>; installedBy: string;
|
|
998
|
-
}): Promise<void> {
|
|
999
|
-
const now = new Date().toISOString();
|
|
1000
|
-
await this.db.run(`
|
|
1001
|
-
INSERT INTO community_skill_installed (id, org_id, skill_id, version, enabled, config, installed_by, installed_at, updated_at)
|
|
1002
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1003
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
1004
|
-
version = excluded.version, enabled = excluded.enabled,
|
|
1005
|
-
config = excluded.config, updated_at = excluded.updated_at
|
|
1006
|
-
`, [
|
|
1007
|
-
install.id, install.orgId, install.skillId, install.version,
|
|
1008
|
-
install.enabled ? 1 : 0, JSON.stringify(install.config),
|
|
1009
|
-
install.installedBy, now, now,
|
|
1010
|
-
]);
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
async getInstalledSkill(orgId: string, skillId: string): Promise<any | null> {
|
|
1014
|
-
const row = await this.db.get<any>(
|
|
1015
|
-
'SELECT * FROM community_skill_installed WHERE org_id = ? AND skill_id = ?',
|
|
1016
|
-
[orgId, skillId],
|
|
1017
|
-
);
|
|
1018
|
-
return row ? this.rowToInstalledSkill(row) : null;
|
|
1019
|
-
}
|
|
1020
|
-
|
|
1021
|
-
async getInstalledSkillsByOrg(orgId: string): Promise<any[]> {
|
|
1022
|
-
const rows = await this.db.all<any>(
|
|
1023
|
-
'SELECT * FROM community_skill_installed WHERE org_id = ? ORDER BY installed_at DESC',
|
|
1024
|
-
[orgId],
|
|
1025
|
-
);
|
|
1026
|
-
return rows.map((r: any) => this.rowToInstalledSkill(r));
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
async deleteInstalledSkill(orgId: string, skillId: string): Promise<void> {
|
|
1030
|
-
await this.db.run(
|
|
1031
|
-
'DELETE FROM community_skill_installed WHERE org_id = ? AND skill_id = ?',
|
|
1032
|
-
[orgId, skillId],
|
|
1033
|
-
);
|
|
1034
|
-
}
|
|
1035
|
-
|
|
1036
|
-
// ─── Community Skill Reviews ────────────────────────
|
|
1037
|
-
|
|
1038
|
-
async insertReview(review: {
|
|
1039
|
-
id: string; skillId: string; userId: string; userName?: string;
|
|
1040
|
-
rating: number; reviewText?: string;
|
|
1041
|
-
}): Promise<void> {
|
|
1042
|
-
// Check if user already reviewed this skill — update instead of duplicate
|
|
1043
|
-
const existing = await this.db.get<any>(
|
|
1044
|
-
'SELECT id FROM community_skill_reviews WHERE skill_id = ? AND user_id = ?',
|
|
1045
|
-
[review.skillId, review.userId],
|
|
1046
|
-
);
|
|
1047
|
-
if (existing) {
|
|
1048
|
-
await this.db.run(`
|
|
1049
|
-
UPDATE community_skill_reviews SET rating = ?, review_text = ?, user_name = ?, created_at = ? WHERE id = ?
|
|
1050
|
-
`, [review.rating, review.reviewText || null, review.userName || null, new Date().toISOString(), existing.id]);
|
|
1051
|
-
} else {
|
|
1052
|
-
await this.db.run(`
|
|
1053
|
-
INSERT INTO community_skill_reviews (id, skill_id, org_id, user_id, user_name, rating, review_text, created_at)
|
|
1054
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
1055
|
-
`, [
|
|
1056
|
-
review.id, review.skillId, 'global', review.userId, review.userName || null,
|
|
1057
|
-
review.rating, review.reviewText || null, new Date().toISOString(),
|
|
1058
|
-
]);
|
|
1059
|
-
}
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
async getReviews(skillId: string, limit: number = 50): Promise<any[]> {
|
|
1063
|
-
const rows = await this.db.all<any>(
|
|
1064
|
-
'SELECT * FROM community_skill_reviews WHERE skill_id = ? ORDER BY created_at DESC LIMIT ?',
|
|
1065
|
-
[skillId, limit],
|
|
1066
|
-
);
|
|
1067
|
-
return rows.map((r: any) => ({
|
|
1068
|
-
id: r.id, skillId: r.skill_id, userId: r.user_id,
|
|
1069
|
-
userName: r.user_name || undefined, rating: r.rating,
|
|
1070
|
-
reviewText: r.review_text, createdAt: r.created_at,
|
|
1071
|
-
}));
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1074
|
-
async getAverageRating(skillId: string): Promise<{ avg: number; count: number }> {
|
|
1075
|
-
const row = await this.db.get<any>(
|
|
1076
|
-
'SELECT AVG(rating) as avg, COUNT(*) as count FROM community_skill_reviews WHERE skill_id = ?',
|
|
1077
|
-
[skillId],
|
|
1078
|
-
);
|
|
1079
|
-
return { avg: row?.avg || 0, count: row?.count || 0 };
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
// ─── Row Mappers ────────────────────────────────────
|
|
1083
|
-
|
|
1084
|
-
private rowToCommunitySkill(row: any) {
|
|
1085
|
-
return {
|
|
1086
|
-
id: row.id, name: row.name, description: row.description, version: row.version,
|
|
1087
|
-
author: row.author, repository: row.repository, license: row.license,
|
|
1088
|
-
category: row.category, risk: row.risk, icon: row.icon,
|
|
1089
|
-
tags: sj(row.tags || '[]'), tools: sj(row.tools || '[]'),
|
|
1090
|
-
configSchema: sj(row.config_schema || '{}'),
|
|
1091
|
-
minEngineVersion: row.min_engine_version, homepage: row.homepage,
|
|
1092
|
-
downloads: row.downloads, rating: row.rating, ratingCount: row.rating_count,
|
|
1093
|
-
verified: !!row.verified, featured: !!row.featured,
|
|
1094
|
-
createdAt: row.created_at, updatedAt: row.updated_at,
|
|
1095
|
-
};
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
private rowToInstalledSkill(row: any) {
|
|
1099
|
-
return {
|
|
1100
|
-
id: row.id, orgId: row.org_id, skillId: row.skill_id, version: row.version,
|
|
1101
|
-
enabled: !!row.enabled, config: sj(row.config || '{}'),
|
|
1102
|
-
installedBy: row.installed_by, installedAt: row.installed_at, updatedAt: row.updated_at,
|
|
1103
|
-
};
|
|
1104
|
-
}
|
|
1105
|
-
|
|
1106
|
-
private rowToManagedAgent(row: any): ManagedAgent {
|
|
1107
|
-
const config = sj(row.config);
|
|
1108
|
-
const agent: ManagedAgent = {
|
|
1109
|
-
id: row.id,
|
|
1110
|
-
name: row.display_name || row.name || config?.displayName || config?.name || row.id,
|
|
1111
|
-
displayName: row.display_name || config?.displayName || config?.name,
|
|
1112
|
-
display_name: row.display_name || config?.displayName || config?.name,
|
|
1113
|
-
orgId: row.org_id,
|
|
1114
|
-
config,
|
|
1115
|
-
state: row.state,
|
|
1116
|
-
stateHistory: [], // Loaded separately via getStateHistory
|
|
1117
|
-
health: sj(row.health || '{}'),
|
|
1118
|
-
usage: sj(row.usage || '{}'),
|
|
1119
|
-
createdAt: row.created_at,
|
|
1120
|
-
updatedAt: row.updated_at,
|
|
1121
|
-
lastDeployedAt: row.last_deployed_at,
|
|
1122
|
-
lastHealthCheckAt: row.last_health_check_at,
|
|
1123
|
-
version: row.version,
|
|
1124
|
-
};
|
|
1125
|
-
// Map client_org_id
|
|
1126
|
-
if (row.client_org_id) {
|
|
1127
|
-
(agent as any).client_org_id = row.client_org_id;
|
|
1128
|
-
}
|
|
1129
|
-
// Read budgetConfig from dedicated column (not config JSON)
|
|
1130
|
-
const bc = sj(row.budget_config || '{}');
|
|
1131
|
-
if (bc && Object.keys(bc).length > 0) {
|
|
1132
|
-
agent.budgetConfig = bc;
|
|
1133
|
-
} else if ((config as any)?.budgetConfig) {
|
|
1134
|
-
// Fallback: migrate from config JSON if budget_config column is empty
|
|
1135
|
-
agent.budgetConfig = (config as any).budgetConfig;
|
|
1136
|
-
}
|
|
1137
|
-
return agent;
|
|
1138
|
-
}
|
|
1139
|
-
|
|
1140
|
-
private rowToOrg(row: any): Organization {
|
|
1141
|
-
return {
|
|
1142
|
-
id: row.id,
|
|
1143
|
-
name: row.name,
|
|
1144
|
-
slug: row.slug,
|
|
1145
|
-
plan: row.plan as OrgPlan,
|
|
1146
|
-
limits: sj(row.limits || '{}'),
|
|
1147
|
-
usage: sj(row.usage || '{}'),
|
|
1148
|
-
settings: sj(row.settings || '{}'),
|
|
1149
|
-
ssoConfig: row.sso_config ? sj(row.sso_config) : undefined,
|
|
1150
|
-
allowedDomains: sj(row.allowed_domains || '[]'),
|
|
1151
|
-
billing: row.billing ? sj(row.billing) : undefined,
|
|
1152
|
-
createdAt: row.created_at,
|
|
1153
|
-
updatedAt: row.updated_at,
|
|
1154
|
-
};
|
|
1155
|
-
}
|
|
1156
|
-
}
|