@agenticmail/enterprise 0.5.326 → 0.5.328
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard/app.js +1 -1
- package/dist/dashboard/pages/cluster.js +1 -1
- package/logs/cloudflared-error.log +6 -0
- package/logs/enterprise-out.log +2 -0
- package/package.json +1 -1
- package/god_is_great.html +0 -35
- package/src/admin/page-registry.ts +0 -290
- package/src/admin/routes.ts +0 -2968
- package/src/agent-tools/common.ts +0 -260
- package/src/agent-tools/index.ts +0 -542
- package/src/agent-tools/merge.ts +0 -62
- package/src/agent-tools/middleware.ts +0 -436
- package/src/agent-tools/schema/typebox.ts +0 -25
- package/src/agent-tools/security.ts +0 -352
- package/src/agent-tools/tool-resolver.ts +0 -1018
- package/src/agent-tools/tools/agenticmail.ts +0 -1017
- package/src/agent-tools/tools/bash.ts +0 -179
- package/src/agent-tools/tools/browser-tool.schema.ts +0 -112
- package/src/agent-tools/tools/browser-tool.ts +0 -388
- package/src/agent-tools/tools/browser.ts +0 -764
- package/src/agent-tools/tools/edit.ts +0 -100
- package/src/agent-tools/tools/enterprise-code-sandbox.ts +0 -395
- package/src/agent-tools/tools/enterprise-database.ts +0 -377
- package/src/agent-tools/tools/enterprise-diff.ts +0 -580
- package/src/agent-tools/tools/enterprise-documents.ts +0 -896
- package/src/agent-tools/tools/enterprise-http.ts +0 -485
- package/src/agent-tools/tools/enterprise-security-scan.ts +0 -528
- package/src/agent-tools/tools/enterprise-spreadsheet.ts +0 -825
- package/src/agent-tools/tools/glob.ts +0 -129
- package/src/agent-tools/tools/google/calendar.ts +0 -230
- package/src/agent-tools/tools/google/chat.ts +0 -725
- package/src/agent-tools/tools/google/contacts.ts +0 -209
- package/src/agent-tools/tools/google/docs.ts +0 -162
- package/src/agent-tools/tools/google/drive.ts +0 -392
- package/src/agent-tools/tools/google/forms.ts +0 -367
- package/src/agent-tools/tools/google/gmail.ts +0 -897
- package/src/agent-tools/tools/google/index.ts +0 -86
- package/src/agent-tools/tools/google/maps.ts +0 -543
- package/src/agent-tools/tools/google/meeting-voice.ts +0 -885
- package/src/agent-tools/tools/google/meetings.ts +0 -1094
- package/src/agent-tools/tools/google/sheets.ts +0 -215
- package/src/agent-tools/tools/google/slides.ts +0 -559
- package/src/agent-tools/tools/google/tasks.ts +0 -200
- package/src/agent-tools/tools/grep.ts +0 -178
- package/src/agent-tools/tools/integrations/_factory.ts +0 -102
- package/src/agent-tools/tools/integrations/activecampaign.ts +0 -14
- package/src/agent-tools/tools/integrations/adobe-sign.ts +0 -14
- package/src/agent-tools/tools/integrations/adp.ts +0 -14
- package/src/agent-tools/tools/integrations/airtable.ts +0 -14
- package/src/agent-tools/tools/integrations/apollo.ts +0 -14
- package/src/agent-tools/tools/integrations/asana.ts +0 -14
- package/src/agent-tools/tools/integrations/auth0.ts +0 -14
- package/src/agent-tools/tools/integrations/aws.ts +0 -14
- package/src/agent-tools/tools/integrations/azure-devops.ts +0 -14
- package/src/agent-tools/tools/integrations/bamboohr.ts +0 -14
- package/src/agent-tools/tools/integrations/basecamp.ts +0 -14
- package/src/agent-tools/tools/integrations/bigcommerce.ts +0 -14
- package/src/agent-tools/tools/integrations/bitbucket.ts +0 -14
- package/src/agent-tools/tools/integrations/box.ts +0 -14
- package/src/agent-tools/tools/integrations/brex.ts +0 -14
- package/src/agent-tools/tools/integrations/buffer.ts +0 -14
- package/src/agent-tools/tools/integrations/calendly.ts +0 -14
- package/src/agent-tools/tools/integrations/canva.ts +0 -14
- package/src/agent-tools/tools/integrations/chargebee.ts +0 -14
- package/src/agent-tools/tools/integrations/circleci.ts +0 -14
- package/src/agent-tools/tools/integrations/clickup.ts +0 -14
- package/src/agent-tools/tools/integrations/close.ts +0 -14
- package/src/agent-tools/tools/integrations/cloudflare.ts +0 -14
- package/src/agent-tools/tools/integrations/confluence.ts +0 -14
- package/src/agent-tools/tools/integrations/contentful.ts +0 -14
- package/src/agent-tools/tools/integrations/copper.ts +0 -14
- package/src/agent-tools/tools/integrations/crisp.ts +0 -14
- package/src/agent-tools/tools/integrations/crowdstrike.ts +0 -14
- package/src/agent-tools/tools/integrations/datadog.ts +0 -14
- package/src/agent-tools/tools/integrations/digitalocean.ts +0 -14
- package/src/agent-tools/tools/integrations/discord.ts +0 -14
- package/src/agent-tools/tools/integrations/docker.ts +0 -14
- package/src/agent-tools/tools/integrations/docusign.ts +0 -14
- package/src/agent-tools/tools/integrations/drift.ts +0 -14
- package/src/agent-tools/tools/integrations/dropbox.ts +0 -14
- package/src/agent-tools/tools/integrations/figma.ts +0 -14
- package/src/agent-tools/tools/integrations/firebase.ts +0 -14
- package/src/agent-tools/tools/integrations/flyio.ts +0 -14
- package/src/agent-tools/tools/integrations/freshbooks.ts +0 -14
- package/src/agent-tools/tools/integrations/freshdesk.ts +0 -14
- package/src/agent-tools/tools/integrations/freshsales.ts +0 -14
- package/src/agent-tools/tools/integrations/freshservice.ts +0 -14
- package/src/agent-tools/tools/integrations/front.ts +0 -14
- package/src/agent-tools/tools/integrations/github-actions.ts +0 -14
- package/src/agent-tools/tools/integrations/github.ts +0 -14
- package/src/agent-tools/tools/integrations/gitlab.ts +0 -14
- package/src/agent-tools/tools/integrations/gong.ts +0 -14
- package/src/agent-tools/tools/integrations/google-ads.ts +0 -14
- package/src/agent-tools/tools/integrations/google-analytics.ts +0 -14
- package/src/agent-tools/tools/integrations/google-cloud.ts +0 -14
- package/src/agent-tools/tools/integrations/gotomeeting.ts +0 -14
- package/src/agent-tools/tools/integrations/grafana.ts +0 -14
- package/src/agent-tools/tools/integrations/greenhouse.ts +0 -14
- package/src/agent-tools/tools/integrations/gusto.ts +0 -14
- package/src/agent-tools/tools/integrations/hashicorp-vault.ts +0 -14
- package/src/agent-tools/tools/integrations/heroku.ts +0 -14
- package/src/agent-tools/tools/integrations/hibob.ts +0 -14
- package/src/agent-tools/tools/integrations/hootsuite.ts +0 -14
- package/src/agent-tools/tools/integrations/hubspot.ts +0 -14
- package/src/agent-tools/tools/integrations/huggingface.ts +0 -14
- package/src/agent-tools/tools/integrations/index.ts +0 -474
- package/src/agent-tools/tools/integrations/intercom.ts +0 -14
- package/src/agent-tools/tools/integrations/jira.ts +0 -14
- package/src/agent-tools/tools/integrations/klaviyo.ts +0 -14
- package/src/agent-tools/tools/integrations/kubernetes.ts +0 -14
- package/src/agent-tools/tools/integrations/lattice.ts +0 -14
- package/src/agent-tools/tools/integrations/launchdarkly.ts +0 -14
- package/src/agent-tools/tools/integrations/lever.ts +0 -14
- package/src/agent-tools/tools/integrations/linear.ts +0 -14
- package/src/agent-tools/tools/integrations/linkedin.ts +0 -14
- package/src/agent-tools/tools/integrations/livechat.ts +0 -14
- package/src/agent-tools/tools/integrations/loom.ts +0 -14
- package/src/agent-tools/tools/integrations/mailchimp.ts +0 -14
- package/src/agent-tools/tools/integrations/mailgun.ts +0 -14
- package/src/agent-tools/tools/integrations/miro.ts +0 -14
- package/src/agent-tools/tools/integrations/mixpanel.ts +0 -14
- package/src/agent-tools/tools/integrations/monday.ts +0 -14
- package/src/agent-tools/tools/integrations/mongodb-atlas.ts +0 -14
- package/src/agent-tools/tools/integrations/neon.ts +0 -14
- package/src/agent-tools/tools/integrations/netlify.ts +0 -14
- package/src/agent-tools/tools/integrations/netsuite.ts +0 -14
- package/src/agent-tools/tools/integrations/newrelic.ts +0 -14
- package/src/agent-tools/tools/integrations/notion.ts +0 -14
- package/src/agent-tools/tools/integrations/okta.ts +0 -14
- package/src/agent-tools/tools/integrations/openai.ts +0 -14
- package/src/agent-tools/tools/integrations/opsgenie.ts +0 -14
- package/src/agent-tools/tools/integrations/outreach.ts +0 -14
- package/src/agent-tools/tools/integrations/paddle.ts +0 -14
- package/src/agent-tools/tools/integrations/pagerduty.ts +0 -14
- package/src/agent-tools/tools/integrations/pandadoc.ts +0 -14
- package/src/agent-tools/tools/integrations/paypal.ts +0 -14
- package/src/agent-tools/tools/integrations/personio.ts +0 -14
- package/src/agent-tools/tools/integrations/pinecone.ts +0 -14
- package/src/agent-tools/tools/integrations/pipedrive.ts +0 -14
- package/src/agent-tools/tools/integrations/plaid.ts +0 -14
- package/src/agent-tools/tools/integrations/postmark.ts +0 -14
- package/src/agent-tools/tools/integrations/power-automate.ts +0 -14
- package/src/agent-tools/tools/integrations/quickbooks.ts +0 -14
- package/src/agent-tools/tools/integrations/recurly.ts +0 -14
- package/src/agent-tools/tools/integrations/reddit.ts +0 -14
- package/src/agent-tools/tools/integrations/render.ts +0 -14
- package/src/agent-tools/tools/integrations/ringcentral.ts +0 -14
- package/src/agent-tools/tools/integrations/rippling.ts +0 -14
- package/src/agent-tools/tools/integrations/salesforce.ts +0 -14
- package/src/agent-tools/tools/integrations/salesloft.ts +0 -14
- package/src/agent-tools/tools/integrations/sanity.ts +0 -14
- package/src/agent-tools/tools/integrations/sap.ts +0 -14
- package/src/agent-tools/tools/integrations/segment.ts +0 -14
- package/src/agent-tools/tools/integrations/sendgrid.ts +0 -14
- package/src/agent-tools/tools/integrations/sentry.ts +0 -14
- package/src/agent-tools/tools/integrations/servicenow.ts +0 -14
- package/src/agent-tools/tools/integrations/shopify.ts +0 -14
- package/src/agent-tools/tools/integrations/shortcut.ts +0 -14
- package/src/agent-tools/tools/integrations/slack.ts +0 -14
- package/src/agent-tools/tools/integrations/smartsheet.ts +0 -14
- package/src/agent-tools/tools/integrations/snowflake.ts +0 -14
- package/src/agent-tools/tools/integrations/snyk.ts +0 -14
- package/src/agent-tools/tools/integrations/splunk.ts +0 -14
- package/src/agent-tools/tools/integrations/square.ts +0 -14
- package/src/agent-tools/tools/integrations/statuspage.ts +0 -14
- package/src/agent-tools/tools/integrations/stripe.ts +0 -14
- package/src/agent-tools/tools/integrations/supabase.ts +0 -14
- package/src/agent-tools/tools/integrations/teamwork.ts +0 -14
- package/src/agent-tools/tools/integrations/telegram.ts +0 -14
- package/src/agent-tools/tools/integrations/terraform.ts +0 -14
- package/src/agent-tools/tools/integrations/todoist.ts +0 -14
- package/src/agent-tools/tools/integrations/trello.ts +0 -14
- package/src/agent-tools/tools/integrations/twilio.ts +0 -14
- package/src/agent-tools/tools/integrations/twitter.ts +0 -14
- package/src/agent-tools/tools/integrations/vercel.ts +0 -14
- package/src/agent-tools/tools/integrations/weaviate.ts +0 -14
- package/src/agent-tools/tools/integrations/webex.ts +0 -14
- package/src/agent-tools/tools/integrations/webflow.ts +0 -14
- package/src/agent-tools/tools/integrations/whatsapp.ts +0 -14
- package/src/agent-tools/tools/integrations/whereby.ts +0 -14
- package/src/agent-tools/tools/integrations/woocommerce.ts +0 -14
- package/src/agent-tools/tools/integrations/wordpress.ts +0 -14
- package/src/agent-tools/tools/integrations/workday.ts +0 -14
- package/src/agent-tools/tools/integrations/wrike.ts +0 -14
- package/src/agent-tools/tools/integrations/xero.ts +0 -14
- package/src/agent-tools/tools/integrations/youtube.ts +0 -14
- package/src/agent-tools/tools/integrations/zendesk.ts +0 -14
- package/src/agent-tools/tools/integrations/zoho-crm.ts +0 -14
- package/src/agent-tools/tools/integrations/zoom.ts +0 -14
- package/src/agent-tools/tools/integrations/zuora.ts +0 -14
- package/src/agent-tools/tools/knowledge-search.ts +0 -318
- package/src/agent-tools/tools/local/coding.ts +0 -626
- package/src/agent-tools/tools/local/dependency-manager.ts +0 -647
- package/src/agent-tools/tools/local/file-edit.ts +0 -31
- package/src/agent-tools/tools/local/file-list.ts +0 -39
- package/src/agent-tools/tools/local/file-ops.ts +0 -48
- package/src/agent-tools/tools/local/file-read.ts +0 -39
- package/src/agent-tools/tools/local/file-search.ts +0 -46
- package/src/agent-tools/tools/local/file-write.ts +0 -28
- package/src/agent-tools/tools/local/filesystem.ts +0 -5
- package/src/agent-tools/tools/local/index.ts +0 -55
- package/src/agent-tools/tools/local/resolve-path.ts +0 -18
- package/src/agent-tools/tools/local/shell.ts +0 -277
- package/src/agent-tools/tools/local/system-info.ts +0 -29
- package/src/agent-tools/tools/management.ts +0 -425
- package/src/agent-tools/tools/mcp-bridge.ts +0 -142
- package/src/agent-tools/tools/mcp-server-tools.ts +0 -91
- package/src/agent-tools/tools/meeting-lifecycle.ts +0 -438
- package/src/agent-tools/tools/memory.ts +0 -509
- package/src/agent-tools/tools/messaging/index.ts +0 -6
- package/src/agent-tools/tools/messaging/telegram.ts +0 -167
- package/src/agent-tools/tools/messaging/whatsapp.ts +0 -651
- package/src/agent-tools/tools/microsoft/contacts.ts +0 -176
- package/src/agent-tools/tools/microsoft/excel-vba.ts +0 -331
- package/src/agent-tools/tools/microsoft/excel.ts +0 -261
- package/src/agent-tools/tools/microsoft/graph-api.ts +0 -161
- package/src/agent-tools/tools/microsoft/index.ts +0 -95
- package/src/agent-tools/tools/microsoft/onedrive.ts +0 -429
- package/src/agent-tools/tools/microsoft/onenote.ts +0 -186
- package/src/agent-tools/tools/microsoft/outlook-calendar.ts +0 -286
- package/src/agent-tools/tools/microsoft/outlook-mail.ts +0 -723
- package/src/agent-tools/tools/microsoft/planner.ts +0 -200
- package/src/agent-tools/tools/microsoft/powerbi.ts +0 -266
- package/src/agent-tools/tools/microsoft/powerpoint.ts +0 -186
- package/src/agent-tools/tools/microsoft/sharepoint.ts +0 -328
- package/src/agent-tools/tools/microsoft/teams.ts +0 -463
- package/src/agent-tools/tools/microsoft/todo.ts +0 -181
- package/src/agent-tools/tools/oauth-token-provider.ts +0 -101
- package/src/agent-tools/tools/read.ts +0 -160
- package/src/agent-tools/tools/visual-memory/capture.ts +0 -217
- package/src/agent-tools/tools/visual-memory/diff.ts +0 -283
- package/src/agent-tools/tools/visual-memory/index.ts +0 -698
- package/src/agent-tools/tools/visual-memory/phash.ts +0 -120
- package/src/agent-tools/tools/visual-memory/similarity.ts +0 -354
- package/src/agent-tools/tools/visual-memory/storage.ts +0 -534
- package/src/agent-tools/tools/visual-memory/types.ts +0 -100
- package/src/agent-tools/tools/web-fetch-utils.ts +0 -202
- package/src/agent-tools/tools/web-fetch.ts +0 -464
- package/src/agent-tools/tools/web-search.ts +0 -480
- package/src/agent-tools/tools/web-shared.ts +0 -232
- package/src/agent-tools/tools/write.ts +0 -68
- package/src/agent-tools/types.ts +0 -214
- package/src/agenticmail/index.ts +0 -34
- package/src/agenticmail/manager.ts +0 -253
- package/src/agenticmail/providers/google.ts +0 -391
- package/src/agenticmail/providers/imap.ts +0 -454
- package/src/agenticmail/providers/index.ts +0 -28
- package/src/agenticmail/providers/microsoft.ts +0 -260
- package/src/agenticmail/types.ts +0 -173
- package/src/auth/routes.ts +0 -1589
- package/src/browser/bridge-auth-registry.ts +0 -34
- package/src/browser/bridge-server.ts +0 -93
- package/src/browser/cdp.helpers.ts +0 -180
- package/src/browser/cdp.ts +0 -466
- package/src/browser/chrome.executables.ts +0 -625
- package/src/browser/chrome.profile-decoration.ts +0 -198
- package/src/browser/chrome.ts +0 -349
- package/src/browser/client-actions-core.ts +0 -259
- package/src/browser/client-actions-observe.ts +0 -184
- package/src/browser/client-actions-state.ts +0 -284
- package/src/browser/client-actions-types.ts +0 -16
- package/src/browser/client-actions-url.ts +0 -11
- package/src/browser/client-actions.ts +0 -4
- package/src/browser/client-fetch.ts +0 -253
- package/src/browser/client.ts +0 -337
- package/src/browser/config.ts +0 -301
- package/src/browser/constants.ts +0 -8
- package/src/browser/control-auth.ts +0 -94
- package/src/browser/control-service.ts +0 -81
- package/src/browser/csrf.ts +0 -87
- package/src/browser/enterprise-compat.ts +0 -562
- package/src/browser/extension-relay.ts +0 -834
- package/src/browser/http-auth.ts +0 -63
- package/src/browser/navigation-guard.ts +0 -50
- package/src/browser/paths.ts +0 -49
- package/src/browser/playwright.d.ts +0 -12
- package/src/browser/profiles-service.ts +0 -187
- package/src/browser/profiles.ts +0 -114
- package/src/browser/proxy-files.ts +0 -41
- package/src/browser/pw-ai-module.ts +0 -52
- package/src/browser/pw-ai-state.ts +0 -9
- package/src/browser/pw-ai.ts +0 -65
- package/src/browser/pw-role-snapshot.ts +0 -434
- package/src/browser/pw-session.ts +0 -810
- package/src/browser/pw-tools-core.activity.ts +0 -68
- package/src/browser/pw-tools-core.downloads.ts +0 -281
- package/src/browser/pw-tools-core.interactions.ts +0 -646
- package/src/browser/pw-tools-core.responses.ts +0 -124
- package/src/browser/pw-tools-core.shared.ts +0 -70
- package/src/browser/pw-tools-core.snapshot.ts +0 -213
- package/src/browser/pw-tools-core.state.ts +0 -209
- package/src/browser/pw-tools-core.storage.ts +0 -128
- package/src/browser/pw-tools-core.trace.ts +0 -37
- package/src/browser/pw-tools-core.ts +0 -8
- package/src/browser/resolved-config-refresh.ts +0 -59
- package/src/browser/routes/agent.act.shared.ts +0 -52
- package/src/browser/routes/agent.act.ts +0 -575
- package/src/browser/routes/agent.debug.ts +0 -149
- package/src/browser/routes/agent.shared.ts +0 -143
- package/src/browser/routes/agent.snapshot.ts +0 -333
- package/src/browser/routes/agent.storage.ts +0 -451
- package/src/browser/routes/agent.ts +0 -13
- package/src/browser/routes/basic.ts +0 -202
- package/src/browser/routes/dispatcher.ts +0 -126
- package/src/browser/routes/index.ts +0 -11
- package/src/browser/routes/path-output.ts +0 -1
- package/src/browser/routes/tabs.ts +0 -217
- package/src/browser/routes/types.ts +0 -26
- package/src/browser/routes/utils.ts +0 -73
- package/src/browser/screenshot.ts +0 -54
- package/src/browser/server-context.ts +0 -688
- package/src/browser/server-context.types.ts +0 -65
- package/src/browser/server-lifecycle.ts +0 -48
- package/src/browser/server-middleware.ts +0 -37
- package/src/browser/server.ts +0 -110
- package/src/browser/target-id.ts +0 -30
- package/src/browser/trash.ts +0 -21
- package/src/cli-agent.ts +0 -2452
- package/src/cli-reset-password.ts +0 -138
- package/src/cli-serve.ts +0 -314
- package/src/cli.ts +0 -103
- package/src/dashboard/HELP-TOOLTIPS-GUIDE.md +0 -45
- package/src/dashboard/app.js +0 -579
- package/src/dashboard/assets/brand-logos.js +0 -350
- package/src/dashboard/assets/icons/emoji-icons.js +0 -893
- package/src/dashboard/assets/logo.png +0 -0
- package/src/dashboard/assets/provider-logos.js +0 -139
- package/src/dashboard/components/error-boundary.js +0 -21
- package/src/dashboard/components/help-button.js +0 -65
- package/src/dashboard/components/icons.js +0 -64
- package/src/dashboard/components/knowledge-link.js +0 -79
- package/src/dashboard/components/modal.js +0 -125
- package/src/dashboard/components/org-switcher.js +0 -156
- package/src/dashboard/components/persona-fields.js +0 -460
- package/src/dashboard/components/settings-help.js +0 -193
- package/src/dashboard/components/tag-input.js +0 -96
- package/src/dashboard/components/timezones.js +0 -352
- package/src/dashboard/components/transport-encryption.js +0 -288
- package/src/dashboard/components/utils.js +0 -205
- package/src/dashboard/data/countries.js +0 -255
- package/src/dashboard/docs/activity.html +0 -253
- package/src/dashboard/docs/agent-activity.html +0 -199
- package/src/dashboard/docs/agent-autonomy.html +0 -161
- package/src/dashboard/docs/agent-budget.html +0 -190
- package/src/dashboard/docs/agent-channels.html +0 -189
- package/src/dashboard/docs/agent-communication.html +0 -171
- package/src/dashboard/docs/agent-configuration.html +0 -194
- package/src/dashboard/docs/agent-deployment.html +0 -323
- package/src/dashboard/docs/agent-email.html +0 -184
- package/src/dashboard/docs/agent-guardrails.html +0 -206
- package/src/dashboard/docs/agent-manager.html +0 -226
- package/src/dashboard/docs/agent-memory.html +0 -215
- package/src/dashboard/docs/agent-overview.html +0 -226
- package/src/dashboard/docs/agent-permissions.html +0 -305
- package/src/dashboard/docs/agent-personal.html +0 -155
- package/src/dashboard/docs/agent-security.html +0 -188
- package/src/dashboard/docs/agent-skills.html +0 -224
- package/src/dashboard/docs/agent-tool-security.html +0 -205
- package/src/dashboard/docs/agent-tools.html +0 -238
- package/src/dashboard/docs/agent-whatsapp.html +0 -210
- package/src/dashboard/docs/agent-workforce.html +0 -199
- package/src/dashboard/docs/agents.html +0 -258
- package/src/dashboard/docs/approvals.html +0 -200
- package/src/dashboard/docs/audit.html +0 -206
- package/src/dashboard/docs/browser-providers.html +0 -313
- package/src/dashboard/docs/cluster.html +0 -285
- package/src/dashboard/docs/community-skills.html +0 -253
- package/src/dashboard/docs/compliance.html +0 -221
- package/src/dashboard/docs/dashboard.html +0 -84
- package/src/dashboard/docs/database-access.html +0 -322
- package/src/dashboard/docs/dlp.html +0 -268
- package/src/dashboard/docs/docs-style.css +0 -26
- package/src/dashboard/docs/domain-status.html +0 -294
- package/src/dashboard/docs/guardrails.html +0 -265
- package/src/dashboard/docs/journal.html +0 -197
- package/src/dashboard/docs/knowledge-contributions.html +0 -286
- package/src/dashboard/docs/knowledge.html +0 -268
- package/src/dashboard/docs/memory-transfer.html +0 -311
- package/src/dashboard/docs/messages.html +0 -217
- package/src/dashboard/docs/multi-tenant.html +0 -311
- package/src/dashboard/docs/org-chart.html +0 -239
- package/src/dashboard/docs/organizations.html +0 -182
- package/src/dashboard/docs/roles.html +0 -195
- package/src/dashboard/docs/settings-network.html +0 -321
- package/src/dashboard/docs/settings-security.html +0 -347
- package/src/dashboard/docs/settings-tool-security.html +0 -176
- package/src/dashboard/docs/settings.html +0 -280
- package/src/dashboard/docs/skill-connections.html +0 -270
- package/src/dashboard/docs/skills.html +0 -206
- package/src/dashboard/docs/task-pipeline.html +0 -261
- package/src/dashboard/docs/transport-encryption.html +0 -359
- package/src/dashboard/docs/users.html +0 -225
- package/src/dashboard/docs/vault.html +0 -260
- package/src/dashboard/docs/workforce.html +0 -245
- package/src/dashboard/index.html +0 -444
- package/src/dashboard/pages/activity.js +0 -379
- package/src/dashboard/pages/agent-detail/activity.js +0 -277
- package/src/dashboard/pages/agent-detail/autonomy.js +0 -244
- package/src/dashboard/pages/agent-detail/budget.js +0 -269
- package/src/dashboard/pages/agent-detail/channels.js +0 -494
- package/src/dashboard/pages/agent-detail/communication.js +0 -296
- package/src/dashboard/pages/agent-detail/configuration.js +0 -882
- package/src/dashboard/pages/agent-detail/deployment.js +0 -958
- package/src/dashboard/pages/agent-detail/email.js +0 -674
- package/src/dashboard/pages/agent-detail/guardrails.js +0 -521
- package/src/dashboard/pages/agent-detail/index.js +0 -261
- package/src/dashboard/pages/agent-detail/manager.js +0 -357
- package/src/dashboard/pages/agent-detail/meeting-browser.js +0 -933
- package/src/dashboard/pages/agent-detail/memory.js +0 -368
- package/src/dashboard/pages/agent-detail/overview.js +0 -844
- package/src/dashboard/pages/agent-detail/permissions.js +0 -1163
- package/src/dashboard/pages/agent-detail/personal-details.js +0 -404
- package/src/dashboard/pages/agent-detail/security.js +0 -409
- package/src/dashboard/pages/agent-detail/shared.js +0 -85
- package/src/dashboard/pages/agent-detail/skills-section.js +0 -183
- package/src/dashboard/pages/agent-detail/tool-security.js +0 -380
- package/src/dashboard/pages/agent-detail/tools.js +0 -322
- package/src/dashboard/pages/agent-detail/whatsapp.js +0 -824
- package/src/dashboard/pages/agent-detail/workforce.js +0 -683
- package/src/dashboard/pages/agents.js +0 -1242
- package/src/dashboard/pages/approvals.js +0 -100
- package/src/dashboard/pages/audit.js +0 -198
- package/src/dashboard/pages/cluster.js +0 -512
- package/src/dashboard/pages/community-skills.js +0 -1219
- package/src/dashboard/pages/compliance.js +0 -475
- package/src/dashboard/pages/dashboard.js +0 -180
- package/src/dashboard/pages/database-access.js +0 -812
- package/src/dashboard/pages/dlp.js +0 -293
- package/src/dashboard/pages/domain-status.js +0 -951
- package/src/dashboard/pages/guardrails.js +0 -1035
- package/src/dashboard/pages/journal.js +0 -172
- package/src/dashboard/pages/knowledge-contributions.js +0 -1682
- package/src/dashboard/pages/knowledge-import.js +0 -455
- package/src/dashboard/pages/knowledge.js +0 -582
- package/src/dashboard/pages/login.js +0 -1056
- package/src/dashboard/pages/memory-transfer.js +0 -631
- package/src/dashboard/pages/messages.js +0 -303
- package/src/dashboard/pages/org-chart.js +0 -349
- package/src/dashboard/pages/organizations.js +0 -1081
- package/src/dashboard/pages/roles.js +0 -780
- package/src/dashboard/pages/settings.js +0 -3790
- package/src/dashboard/pages/skill-connections.js +0 -982
- package/src/dashboard/pages/skills.js +0 -879
- package/src/dashboard/pages/task-pipeline.js +0 -684
- package/src/dashboard/pages/users.js +0 -867
- package/src/dashboard/pages/vault.js +0 -791
- package/src/dashboard/pages/workforce.js +0 -851
- package/src/dashboard/vendor/react-dom.development.js +0 -29924
- package/src/dashboard/vendor/react-dom.production.min.js +0 -267
- package/src/dashboard/vendor/react.development.js +0 -3343
- package/src/dashboard/vendor/react.production.min.js +0 -31
- package/src/database-access/agent-tools.ts +0 -193
- package/src/database-access/connection-manager.ts +0 -1341
- package/src/database-access/index.ts +0 -21
- package/src/database-access/query-sanitizer.ts +0 -220
- package/src/database-access/routes.ts +0 -226
- package/src/database-access/types.ts +0 -226
- package/src/db/adapter.ts +0 -510
- package/src/db/dynamodb.ts +0 -454
- package/src/db/factory.ts +0 -129
- package/src/db/mongodb.ts +0 -360
- package/src/db/mysql.ts +0 -531
- package/src/db/postgres.ts +0 -863
- package/src/db/proxy.ts +0 -39
- package/src/db/resolve-driver.ts +0 -29
- package/src/db/sql-schema.ts +0 -124
- package/src/db/sqlite.ts +0 -493
- package/src/db/turso.ts +0 -470
- package/src/deploy/fly.ts +0 -368
- package/src/deploy/managed.ts +0 -235
- package/src/domain-lock/cli-recover.ts +0 -591
- package/src/domain-lock/cli-verify.ts +0 -190
- package/src/domain-lock/index.ts +0 -220
- package/src/engine/activity-routes.ts +0 -154
- package/src/engine/activity.ts +0 -568
- package/src/engine/agent-autonomy.ts +0 -974
- package/src/engine/agent-config.ts +0 -646
- package/src/engine/agent-heartbeat.ts +0 -720
- package/src/engine/agent-hierarchy.ts +0 -1064
- package/src/engine/agent-memory.ts +0 -806
- package/src/engine/agent-notify.ts +0 -50
- package/src/engine/agent-routes.ts +0 -2583
- package/src/engine/agent-status.ts +0 -311
- package/src/engine/ambient-memory.ts +0 -401
- package/src/engine/approvals.ts +0 -615
- package/src/engine/assets/thinking-hum.mp3 +0 -0
- package/src/engine/catalog-routes.ts +0 -232
- package/src/engine/chat-poller.ts +0 -913
- package/src/engine/chat-webhook-routes.ts +0 -304
- package/src/engine/cli-build-skill.ts +0 -285
- package/src/engine/cli-submit-skill.ts +0 -200
- package/src/engine/cli-validate.ts +0 -188
- package/src/engine/cluster.ts +0 -278
- package/src/engine/communication-routes.ts +0 -139
- package/src/engine/communication.ts +0 -765
- package/src/engine/community-registry.ts +0 -1529
- package/src/engine/community-routes.ts +0 -260
- package/src/engine/compliance-routes.ts +0 -133
- package/src/engine/compliance.ts +0 -1679
- package/src/engine/config-bus.ts +0 -103
- package/src/engine/db-adapter.ts +0 -1156
- package/src/engine/db-schema.ts +0 -1945
- package/src/engine/deploy-schema-routes.ts +0 -176
- package/src/engine/deployer.ts +0 -957
- package/src/engine/dlp-routes.ts +0 -101
- package/src/engine/dlp.ts +0 -410
- package/src/engine/email-poller.ts +0 -855
- package/src/engine/emoji.ts +0 -106
- package/src/engine/guardrail-routes.ts +0 -125
- package/src/engine/guardrails.ts +0 -465
- package/src/engine/index.ts +0 -255
- package/src/engine/journal-routes.ts +0 -56
- package/src/engine/journal.ts +0 -249
- package/src/engine/knowledge-contribution-routes.ts +0 -633
- package/src/engine/knowledge-contribution.ts +0 -1386
- package/src/engine/knowledge-import/chunker.ts +0 -241
- package/src/engine/knowledge-import/import-manager.ts +0 -416
- package/src/engine/knowledge-import/index.ts +0 -27
- package/src/engine/knowledge-import/processors/clean.ts +0 -149
- package/src/engine/knowledge-import/processors/extract-gdrive.ts +0 -102
- package/src/engine/knowledge-import/processors/extract-github.ts +0 -74
- package/src/engine/knowledge-import/processors/extract-sharepoint.ts +0 -69
- package/src/engine/knowledge-import/processors/extract-web.ts +0 -275
- package/src/engine/knowledge-import/processors/index.ts +0 -18
- package/src/engine/knowledge-import/processors/pipeline.ts +0 -171
- package/src/engine/knowledge-import/processors/types.ts +0 -78
- package/src/engine/knowledge-import/processors/validate.ts +0 -150
- package/src/engine/knowledge-import/provider-file-upload.ts +0 -95
- package/src/engine/knowledge-import/provider-github.ts +0 -144
- package/src/engine/knowledge-import/provider-google-sites.ts +0 -323
- package/src/engine/knowledge-import/provider-sharepoint.ts +0 -276
- package/src/engine/knowledge-import/provider-url.ts +0 -218
- package/src/engine/knowledge-import/routes.ts +0 -94
- package/src/engine/knowledge-import/types.ts +0 -92
- package/src/engine/knowledge-routes.ts +0 -231
- package/src/engine/knowledge.ts +0 -587
- package/src/engine/lifecycle.ts +0 -1420
- package/src/engine/mcp-process-manager.ts +0 -573
- package/src/engine/meeting-monitor.ts +0 -483
- package/src/engine/meeting-voice-intelligence.ts +0 -340
- package/src/engine/memory-routes.ts +0 -142
- package/src/engine/memory-transfer-routes.ts +0 -339
- package/src/engine/messaging-history.ts +0 -177
- package/src/engine/messaging-poller.ts +0 -786
- package/src/engine/model-fallback.ts +0 -141
- package/src/engine/oauth-connect-routes.ts +0 -603
- package/src/engine/oauth-connect.ts +0 -304
- package/src/engine/onboarding-routes.ts +0 -148
- package/src/engine/onboarding.ts +0 -574
- package/src/engine/org-approval-routes.ts +0 -146
- package/src/engine/org-integration-routes.ts +0 -399
- package/src/engine/org-integrations.ts +0 -608
- package/src/engine/org-policies.ts +0 -502
- package/src/engine/policy-import-routes.ts +0 -125
- package/src/engine/policy-import.ts +0 -1186
- package/src/engine/policy-routes.ts +0 -163
- package/src/engine/routes.ts +0 -1236
- package/src/engine/screen-unlock.ts +0 -136
- package/src/engine/session-router.ts +0 -212
- package/src/engine/skill-updater-routes.ts +0 -132
- package/src/engine/skill-updater.ts +0 -480
- package/src/engine/skill-validator.ts +0 -331
- package/src/engine/skills/agent-management.ts +0 -119
- package/src/engine/skills/agent-memory.ts +0 -19
- package/src/engine/skills/agenticmail.ts +0 -116
- package/src/engine/skills/core-tools.ts +0 -25
- package/src/engine/skills/database-access.ts +0 -78
- package/src/engine/skills/enterprise-code-sandbox.ts +0 -113
- package/src/engine/skills/enterprise-database.ts +0 -123
- package/src/engine/skills/enterprise-diff.ts +0 -95
- package/src/engine/skills/enterprise-documents.ts +0 -162
- package/src/engine/skills/enterprise-http.ts +0 -99
- package/src/engine/skills/enterprise-security-scan.ts +0 -125
- package/src/engine/skills/enterprise-spreadsheet.ts +0 -171
- package/src/engine/skills/gws-admin.ts +0 -18
- package/src/engine/skills/gws-calendar.ts +0 -21
- package/src/engine/skills/gws-chat.ts +0 -29
- package/src/engine/skills/gws-contacts.ts +0 -20
- package/src/engine/skills/gws-docs.ts +0 -18
- package/src/engine/skills/gws-drive.ts +0 -23
- package/src/engine/skills/gws-forms.ts +0 -23
- package/src/engine/skills/gws-gmail.ts +0 -30
- package/src/engine/skills/gws-groups.ts +0 -17
- package/src/engine/skills/gws-keep.ts +0 -17
- package/src/engine/skills/gws-maps.ts +0 -25
- package/src/engine/skills/gws-meet.ts +0 -23
- package/src/engine/skills/gws-sheets.ts +0 -22
- package/src/engine/skills/gws-sites.ts +0 -16
- package/src/engine/skills/gws-slides.ts +0 -27
- package/src/engine/skills/gws-tasks.ts +0 -22
- package/src/engine/skills/gws-vault.ts +0 -17
- package/src/engine/skills/index.ts +0 -159
- package/src/engine/skills/knowledge-search.ts +0 -18
- package/src/engine/skills/local-system.ts +0 -61
- package/src/engine/skills/m365-admin.ts +0 -18
- package/src/engine/skills/m365-bookings.ts +0 -17
- package/src/engine/skills/m365-copilot.ts +0 -17
- package/src/engine/skills/m365-excel.ts +0 -60
- package/src/engine/skills/m365-forms.ts +0 -17
- package/src/engine/skills/m365-onedrive.ts +0 -60
- package/src/engine/skills/m365-onenote.ts +0 -17
- package/src/engine/skills/m365-outlook.ts +0 -27
- package/src/engine/skills/m365-planner.ts +0 -18
- package/src/engine/skills/m365-power-automate.ts +0 -18
- package/src/engine/skills/m365-power-bi.ts +0 -19
- package/src/engine/skills/m365-powerpoint.ts +0 -33
- package/src/engine/skills/m365-sharepoint.ts +0 -20
- package/src/engine/skills/m365-teams.ts +0 -21
- package/src/engine/skills/m365-todo.ts +0 -17
- package/src/engine/skills/m365-whiteboard.ts +0 -16
- package/src/engine/skills/m365-word.ts +0 -42
- package/src/engine/skills/mcp-bridge.ts +0 -45
- package/src/engine/skills/meeting-lifecycle.ts +0 -20
- package/src/engine/skills/messaging.ts +0 -46
- package/src/engine/skills/visual-memory.ts +0 -25
- package/src/engine/skills.ts +0 -688
- package/src/engine/soul-library.ts +0 -142
- package/src/engine/soul-templates.json +0 -1525
- package/src/engine/storage-manager.ts +0 -252
- package/src/engine/storage-routes.ts +0 -113
- package/src/engine/storage.ts +0 -528
- package/src/engine/task-poller.ts +0 -394
- package/src/engine/task-queue-after-spawn.ts +0 -66
- package/src/engine/task-queue-before-spawn.ts +0 -113
- package/src/engine/task-queue-routes.ts +0 -161
- package/src/engine/task-queue.ts +0 -664
- package/src/engine/tenant.ts +0 -409
- package/src/engine/tool-catalog.ts +0 -354
- package/src/engine/vault-routes.ts +0 -134
- package/src/engine/vault.ts +0 -601
- package/src/engine/workforce-routes.ts +0 -331
- package/src/engine/workforce.ts +0 -1161
- package/src/index.ts +0 -77
- package/src/lib/cidr.ts +0 -122
- package/src/lib/config-store.ts +0 -86
- package/src/lib/resilience.ts +0 -326
- package/src/lib/text-search.ts +0 -358
- package/src/mcp/adapters/activecampaign.adapter.ts +0 -391
- package/src/mcp/adapters/adobe-sign.adapter.ts +0 -469
- package/src/mcp/adapters/adp.adapter.ts +0 -358
- package/src/mcp/adapters/airtable.adapter.ts +0 -273
- package/src/mcp/adapters/apollo.adapter.ts +0 -420
- package/src/mcp/adapters/asana.adapter.ts +0 -315
- package/src/mcp/adapters/auth0.adapter.ts +0 -386
- package/src/mcp/adapters/aws.adapter.ts +0 -345
- package/src/mcp/adapters/azure-devops.adapter.ts +0 -389
- package/src/mcp/adapters/bamboohr.adapter.ts +0 -376
- package/src/mcp/adapters/basecamp.adapter.ts +0 -366
- package/src/mcp/adapters/bigcommerce.adapter.ts +0 -429
- package/src/mcp/adapters/bitbucket.adapter.ts +0 -260
- package/src/mcp/adapters/box.adapter.ts +0 -350
- package/src/mcp/adapters/brex.adapter.ts +0 -367
- package/src/mcp/adapters/buffer.adapter.ts +0 -303
- package/src/mcp/adapters/calendly.adapter.ts +0 -262
- package/src/mcp/adapters/canva.adapter.ts +0 -256
- package/src/mcp/adapters/chargebee.adapter.ts +0 -448
- package/src/mcp/adapters/circleci.adapter.ts +0 -216
- package/src/mcp/adapters/clickup.adapter.ts +0 -335
- package/src/mcp/adapters/close.adapter.ts +0 -390
- package/src/mcp/adapters/cloudflare.adapter.ts +0 -378
- package/src/mcp/adapters/confluence.adapter.ts +0 -301
- package/src/mcp/adapters/contentful.adapter.ts +0 -355
- package/src/mcp/adapters/copper.adapter.ts +0 -468
- package/src/mcp/adapters/crisp.adapter.ts +0 -415
- package/src/mcp/adapters/crowdstrike.adapter.ts +0 -413
- package/src/mcp/adapters/datadog.adapter.ts +0 -373
- package/src/mcp/adapters/digitalocean.adapter.ts +0 -336
- package/src/mcp/adapters/discord.adapter.ts +0 -248
- package/src/mcp/adapters/docker.adapter.ts +0 -238
- package/src/mcp/adapters/docusign.adapter.ts +0 -431
- package/src/mcp/adapters/drift.adapter.ts +0 -386
- package/src/mcp/adapters/dropbox.adapter.ts +0 -315
- package/src/mcp/adapters/figma.adapter.ts +0 -302
- package/src/mcp/adapters/firebase.adapter.ts +0 -446
- package/src/mcp/adapters/flyio.adapter.ts +0 -302
- package/src/mcp/adapters/freshbooks.adapter.ts +0 -474
- package/src/mcp/adapters/freshdesk.adapter.ts +0 -441
- package/src/mcp/adapters/freshsales.adapter.ts +0 -457
- package/src/mcp/adapters/freshservice.adapter.ts +0 -481
- package/src/mcp/adapters/front.adapter.ts +0 -357
- package/src/mcp/adapters/github-actions.adapter.ts +0 -329
- package/src/mcp/adapters/github.adapter.ts +0 -387
- package/src/mcp/adapters/gitlab.adapter.ts +0 -368
- package/src/mcp/adapters/gong.adapter.ts +0 -386
- package/src/mcp/adapters/google-ads.adapter.ts +0 -363
- package/src/mcp/adapters/google-analytics.adapter.ts +0 -316
- package/src/mcp/adapters/google-cloud.adapter.ts +0 -312
- package/src/mcp/adapters/gotomeeting.adapter.ts +0 -255
- package/src/mcp/adapters/grafana.adapter.ts +0 -361
- package/src/mcp/adapters/greenhouse.adapter.ts +0 -354
- package/src/mcp/adapters/gusto.adapter.ts +0 -329
- package/src/mcp/adapters/hashicorp-vault.adapter.ts +0 -355
- package/src/mcp/adapters/heroku.adapter.ts +0 -291
- package/src/mcp/adapters/hibob.adapter.ts +0 -334
- package/src/mcp/adapters/hootsuite.adapter.ts +0 -322
- package/src/mcp/adapters/hubspot.adapter.ts +0 -400
- package/src/mcp/adapters/huggingface.adapter.ts +0 -349
- package/src/mcp/adapters/index.ts +0 -524
- package/src/mcp/adapters/intercom.adapter.ts +0 -269
- package/src/mcp/adapters/jira.adapter.ts +0 -482
- package/src/mcp/adapters/klaviyo.adapter.ts +0 -353
- package/src/mcp/adapters/kubernetes.adapter.ts +0 -431
- package/src/mcp/adapters/lattice.adapter.ts +0 -339
- package/src/mcp/adapters/launchdarkly.adapter.ts +0 -368
- package/src/mcp/adapters/lever.adapter.ts +0 -347
- package/src/mcp/adapters/linear.adapter.ts +0 -300
- package/src/mcp/adapters/linkedin.adapter.ts +0 -331
- package/src/mcp/adapters/livechat.adapter.ts +0 -259
- package/src/mcp/adapters/loom.adapter.ts +0 -230
- package/src/mcp/adapters/mailchimp.adapter.ts +0 -394
- package/src/mcp/adapters/mailgun.adapter.ts +0 -425
- package/src/mcp/adapters/miro.adapter.ts +0 -274
- package/src/mcp/adapters/mixpanel.adapter.ts +0 -324
- package/src/mcp/adapters/monday.adapter.ts +0 -308
- package/src/mcp/adapters/mongodb-atlas.adapter.ts +0 -345
- package/src/mcp/adapters/neon.adapter.ts +0 -312
- package/src/mcp/adapters/netlify.adapter.ts +0 -324
- package/src/mcp/adapters/netsuite.adapter.ts +0 -411
- package/src/mcp/adapters/newrelic.adapter.ts +0 -339
- package/src/mcp/adapters/notion.adapter.ts +0 -338
- package/src/mcp/adapters/okta.adapter.ts +0 -394
- package/src/mcp/adapters/openai.adapter.ts +0 -315
- package/src/mcp/adapters/opsgenie.adapter.ts +0 -375
- package/src/mcp/adapters/outreach.adapter.ts +0 -372
- package/src/mcp/adapters/paddle.adapter.ts +0 -467
- package/src/mcp/adapters/pagerduty.adapter.ts +0 -412
- package/src/mcp/adapters/pandadoc.adapter.ts +0 -389
- package/src/mcp/adapters/paypal.adapter.ts +0 -465
- package/src/mcp/adapters/personio.adapter.ts +0 -401
- package/src/mcp/adapters/pinecone.adapter.ts +0 -340
- package/src/mcp/adapters/pipedrive.adapter.ts +0 -324
- package/src/mcp/adapters/plaid.adapter.ts +0 -444
- package/src/mcp/adapters/postmark.adapter.ts +0 -387
- package/src/mcp/adapters/power-automate.adapter.ts +0 -388
- package/src/mcp/adapters/quickbooks.adapter.ts +0 -431
- package/src/mcp/adapters/recurly.adapter.ts +0 -433
- package/src/mcp/adapters/reddit.adapter.ts +0 -371
- package/src/mcp/adapters/render.adapter.ts +0 -332
- package/src/mcp/adapters/ringcentral.adapter.ts +0 -281
- package/src/mcp/adapters/rippling.adapter.ts +0 -287
- package/src/mcp/adapters/salesforce.adapter.ts +0 -321
- package/src/mcp/adapters/salesloft.adapter.ts +0 -413
- package/src/mcp/adapters/sanity.adapter.ts +0 -363
- package/src/mcp/adapters/sap.adapter.ts +0 -483
- package/src/mcp/adapters/segment.adapter.ts +0 -260
- package/src/mcp/adapters/sendgrid.adapter.ts +0 -265
- package/src/mcp/adapters/sentry.adapter.ts +0 -331
- package/src/mcp/adapters/servicenow.adapter.ts +0 -468
- package/src/mcp/adapters/shopify.adapter.ts +0 -451
- package/src/mcp/adapters/shortcut.adapter.ts +0 -290
- package/src/mcp/adapters/slack.adapter.ts +0 -380
- package/src/mcp/adapters/smartsheet.adapter.ts +0 -326
- package/src/mcp/adapters/snowflake.adapter.ts +0 -347
- package/src/mcp/adapters/snyk.adapter.ts +0 -394
- package/src/mcp/adapters/splunk.adapter.ts +0 -403
- package/src/mcp/adapters/square.adapter.ts +0 -467
- package/src/mcp/adapters/statuspage.adapter.ts +0 -401
- package/src/mcp/adapters/stripe.adapter.ts +0 -380
- package/src/mcp/adapters/supabase.adapter.ts +0 -334
- package/src/mcp/adapters/teamwork.adapter.ts +0 -404
- package/src/mcp/adapters/telegram.adapter.ts +0 -299
- package/src/mcp/adapters/terraform.adapter.ts +0 -300
- package/src/mcp/adapters/todoist.adapter.ts +0 -239
- package/src/mcp/adapters/trello.adapter.ts +0 -316
- package/src/mcp/adapters/twilio.adapter.ts +0 -233
- package/src/mcp/adapters/twitter.adapter.ts +0 -348
- package/src/mcp/adapters/vercel.adapter.ts +0 -219
- package/src/mcp/adapters/weaviate.adapter.ts +0 -371
- package/src/mcp/adapters/webex.adapter.ts +0 -237
- package/src/mcp/adapters/webflow.adapter.ts +0 -287
- package/src/mcp/adapters/whatsapp.adapter.ts +0 -273
- package/src/mcp/adapters/whereby.adapter.ts +0 -240
- package/src/mcp/adapters/woocommerce.adapter.ts +0 -454
- package/src/mcp/adapters/wordpress.adapter.ts +0 -455
- package/src/mcp/adapters/workday.adapter.ts +0 -354
- package/src/mcp/adapters/wrike.adapter.ts +0 -349
- package/src/mcp/adapters/xero.adapter.ts +0 -472
- package/src/mcp/adapters/youtube.adapter.ts +0 -401
- package/src/mcp/adapters/zendesk.adapter.ts +0 -399
- package/src/mcp/adapters/zoho-crm.adapter.ts +0 -410
- package/src/mcp/adapters/zoom.adapter.ts +0 -241
- package/src/mcp/adapters/zuora.adapter.ts +0 -476
- package/src/mcp/framework/api-executor.ts +0 -192
- package/src/mcp/framework/aws-sigv4.ts +0 -216
- package/src/mcp/framework/credential-resolver.ts +0 -128
- package/src/mcp/framework/oauth-token-manager.ts +0 -22
- package/src/mcp/framework/skill-mcp-framework.ts +0 -226
- package/src/mcp/framework/types.ts +0 -130
- package/src/mcp/index.ts +0 -124
- package/src/mcp/integration-catalog.ts +0 -178
- package/src/middleware/dns-rebinding.ts +0 -44
- package/src/middleware/egress-filter.ts +0 -104
- package/src/middleware/firewall.ts +0 -192
- package/src/middleware/geo-ip.ts +0 -156
- package/src/middleware/index.ts +0 -390
- package/src/middleware/network-config.ts +0 -90
- package/src/middleware/proxy-config.ts +0 -71
- package/src/middleware/request-limits.ts +0 -59
- package/src/middleware/transport-encryption.ts +0 -398
- package/src/registry/cli.ts +0 -63
- package/src/registry/server.ts +0 -504
- package/src/runtime/agent-loop.ts +0 -779
- package/src/runtime/compaction.ts +0 -638
- package/src/runtime/email-channel.ts +0 -120
- package/src/runtime/environment.ts +0 -300
- package/src/runtime/followup.ts +0 -211
- package/src/runtime/gateway.ts +0 -260
- package/src/runtime/hooks.ts +0 -564
- package/src/runtime/index.ts +0 -1110
- package/src/runtime/llm-client.ts +0 -1056
- package/src/runtime/model-router.ts +0 -97
- package/src/runtime/providers.ts +0 -228
- package/src/runtime/session-manager.ts +0 -345
- package/src/runtime/subagent.ts +0 -153
- package/src/runtime/tool-executor.ts +0 -208
- package/src/runtime/types.ts +0 -255
- package/src/security/brute-force.ts +0 -423
- package/src/security/config.ts +0 -159
- package/src/security/csp.ts +0 -407
- package/src/security/external-content.ts +0 -299
- package/src/security/index.ts +0 -557
- package/src/security/input-sanitizer.ts +0 -452
- package/src/security/output-filter.ts +0 -575
- package/src/security/port-scanner.ts +0 -342
- package/src/security/prompt-guard.ts +0 -387
- package/src/security/sql-guard.ts +0 -338
- package/src/security/threat-logger.ts +0 -484
- package/src/server.ts +0 -828
- package/src/setup/company.ts +0 -183
- package/src/setup/database.ts +0 -153
- package/src/setup/deployment.ts +0 -561
- package/src/setup/domain.ts +0 -112
- package/src/setup/index.ts +0 -171
- package/src/setup/provision.ts +0 -532
- package/src/setup/registration.ts +0 -302
- package/src/system-prompts/catchup.ts +0 -48
- package/src/system-prompts/google/calendar.ts +0 -37
- package/src/system-prompts/google/chat.ts +0 -92
- package/src/system-prompts/google/contacts.ts +0 -25
- package/src/system-prompts/google/docs.ts +0 -29
- package/src/system-prompts/google/drive.ts +0 -34
- package/src/system-prompts/google/forms.ts +0 -25
- package/src/system-prompts/google/gmail.ts +0 -50
- package/src/system-prompts/google/index.ts +0 -23
- package/src/system-prompts/google/maps.ts +0 -20
- package/src/system-prompts/google/meet.ts +0 -130
- package/src/system-prompts/google/sheets.ts +0 -32
- package/src/system-prompts/google/slides.ts +0 -26
- package/src/system-prompts/google/tasks.ts +0 -27
- package/src/system-prompts/index.ts +0 -88
- package/src/system-prompts/microsoft/contacts.ts +0 -34
- package/src/system-prompts/microsoft/excel.ts +0 -52
- package/src/system-prompts/microsoft/index.ts +0 -31
- package/src/system-prompts/microsoft/onedrive.ts +0 -41
- package/src/system-prompts/microsoft/onenote.ts +0 -36
- package/src/system-prompts/microsoft/outlook-calendar.ts +0 -37
- package/src/system-prompts/microsoft/outlook-mail.ts +0 -46
- package/src/system-prompts/microsoft/planner.ts +0 -37
- package/src/system-prompts/microsoft/powerbi.ts +0 -38
- package/src/system-prompts/microsoft/powerpoint.ts +0 -35
- package/src/system-prompts/microsoft/sharepoint.ts +0 -44
- package/src/system-prompts/microsoft/teams.ts +0 -49
- package/src/system-prompts/microsoft/todo.ts +0 -37
- package/src/system-prompts/shared-blocks.ts +0 -87
- package/src/system-prompts/task.ts +0 -21
- package/src/system-prompts/triage.ts +0 -34
- package/src/types/hono-env.ts +0 -18
- package/src/types/optional-deps.d.ts +0 -10
|
@@ -1,1682 +0,0 @@
|
|
|
1
|
-
import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, buildAgentDataMap, renderAgentBadge, getOrgId } from '../components/utils.js';
|
|
2
|
-
import { I } from '../components/icons.js';
|
|
3
|
-
import { Modal } from '../components/modal.js';
|
|
4
|
-
import { HelpButton } from '../components/help-button.js';
|
|
5
|
-
import { useOrgContext } from '../components/org-switcher.js';
|
|
6
|
-
import { KnowledgeLink } from '../components/knowledge-link.js';
|
|
7
|
-
|
|
8
|
-
export function KnowledgeContributionsPage() {
|
|
9
|
-
var { toast } = useApp();
|
|
10
|
-
var orgCtx = useOrgContext();
|
|
11
|
-
var [tab, setTab] = useState('bases');
|
|
12
|
-
var [bases, setBases] = useState([]);
|
|
13
|
-
var [roles, setRoles] = useState([]);
|
|
14
|
-
var [stats, setStats] = useState({});
|
|
15
|
-
var [contributions, setContributions] = useState([]);
|
|
16
|
-
var [schedules, setSchedules] = useState([]);
|
|
17
|
-
var [selectedBase, setSelectedBase] = useState(null);
|
|
18
|
-
var [baseEntries, setBaseEntries] = useState([]);
|
|
19
|
-
var [entryFilters, setEntryFilters] = useState({ category: '', status: '', minQuality: '' });
|
|
20
|
-
|
|
21
|
-
// Modals
|
|
22
|
-
var [showCreateBase, setShowCreateBase] = useState(false);
|
|
23
|
-
var [baseForm, setBaseForm] = useState({ name: '', description: '', role: '' });
|
|
24
|
-
var [showTrigger, setShowTrigger] = useState(false);
|
|
25
|
-
var [triggerAgent, setTriggerAgent] = useState('');
|
|
26
|
-
var [triggerBase, setTriggerBase] = useState('');
|
|
27
|
-
var [showCreateSchedule, setShowCreateSchedule] = useState(false);
|
|
28
|
-
var [scheduleForm, setScheduleForm] = useState({ agentId: '', targetBaseId: '', frequency: 'weekly', dayOfWeek: 'monday', minConfidence: 0.7 });
|
|
29
|
-
var [editSchedule, setEditSchedule] = useState(null);
|
|
30
|
-
|
|
31
|
-
// Agents for badges + filters
|
|
32
|
-
var [agents, setAgents] = useState([]);
|
|
33
|
-
// Contributions pagination/filter
|
|
34
|
-
var [contribPage, setContribPage] = useState(0);
|
|
35
|
-
var [contribSearch, setContribSearch] = useState('');
|
|
36
|
-
var [contribAgent, setContribAgent] = useState('');
|
|
37
|
-
var [selectedContrib, setSelectedContrib] = useState(null);
|
|
38
|
-
var CONTRIB_PAGE_SIZE = 20;
|
|
39
|
-
|
|
40
|
-
// Search metrics state
|
|
41
|
-
var [searchMetrics, setSearchMetrics] = useState(null);
|
|
42
|
-
var [searchDays, setSearchDays] = useState(7);
|
|
43
|
-
var [searchAgentFilter, setSearchAgentFilter] = useState('');
|
|
44
|
-
|
|
45
|
-
// Effective org ID: uses client org if selected, else default
|
|
46
|
-
var effectiveOrgId = orgCtx.selectedOrgId || getOrgId();
|
|
47
|
-
|
|
48
|
-
var loadBases = useCallback(function() {
|
|
49
|
-
Promise.all([
|
|
50
|
-
engineCall('/knowledge-contribution/bases?orgId=' + effectiveOrgId).catch(function() { return { bases: [] }; }),
|
|
51
|
-
engineCall('/knowledge-bases').catch(function() { return { knowledgeBases: [] }; })
|
|
52
|
-
]).then(function(results) {
|
|
53
|
-
var contribBases = results[0].bases || [];
|
|
54
|
-
var mainBases = (results[1].knowledgeBases || []).map(function(kb) {
|
|
55
|
-
return { id: kb.id, orgId: effectiveOrgId, name: kb.name, description: kb.description, role: 'general', categories: [], contributorCount: 0, entryCount: kb.stats ? kb.stats.documentCount || 0 : 0, createdAt: kb.createdAt, updatedAt: kb.updatedAt, _source: 'main' };
|
|
56
|
-
});
|
|
57
|
-
// Merge: contribution bases first, then main bases not already in contribution
|
|
58
|
-
var ids = {};
|
|
59
|
-
contribBases.forEach(function(b) { ids[b.id] = true; });
|
|
60
|
-
var merged = contribBases.concat(mainBases.filter(function(b) { return !ids[b.id]; }));
|
|
61
|
-
setBases(merged);
|
|
62
|
-
});
|
|
63
|
-
}, []);
|
|
64
|
-
|
|
65
|
-
var loadRoles = useCallback(function() {
|
|
66
|
-
engineCall('/knowledge-contribution/roles')
|
|
67
|
-
.then(function(d) { setRoles(d.roles || []); })
|
|
68
|
-
.catch(function() {});
|
|
69
|
-
}, []);
|
|
70
|
-
|
|
71
|
-
var loadStats = useCallback(function() {
|
|
72
|
-
engineCall('/knowledge-contribution/stats?orgId=' + effectiveOrgId)
|
|
73
|
-
.then(function(d) { setStats(d || {}); })
|
|
74
|
-
.catch(function() {});
|
|
75
|
-
}, []);
|
|
76
|
-
|
|
77
|
-
var loadContributions = useCallback(function() {
|
|
78
|
-
engineCall('/knowledge-contribution/contributions?orgId=' + effectiveOrgId)
|
|
79
|
-
.then(function(d) { setContributions(d.contributions || d.cycles || []); })
|
|
80
|
-
.catch(function() {});
|
|
81
|
-
}, []);
|
|
82
|
-
|
|
83
|
-
var loadSchedules = useCallback(function() {
|
|
84
|
-
engineCall('/knowledge-contribution/schedules?orgId=' + effectiveOrgId)
|
|
85
|
-
.then(function(d) { setSchedules(d.schedules || []); })
|
|
86
|
-
.catch(function() {});
|
|
87
|
-
}, []);
|
|
88
|
-
|
|
89
|
-
var load = useCallback(function() {
|
|
90
|
-
loadBases();
|
|
91
|
-
loadRoles();
|
|
92
|
-
loadStats();
|
|
93
|
-
loadContributions();
|
|
94
|
-
loadSchedules();
|
|
95
|
-
engineCall('/agents?orgId=' + effectiveOrgId).then(function(d) { setAgents(d.agents || []); }).catch(function() {});
|
|
96
|
-
}, [loadBases, loadRoles, loadStats, loadContributions, loadSchedules]);
|
|
97
|
-
|
|
98
|
-
useEffect(function() { load(); }, [load, effectiveOrgId]);
|
|
99
|
-
|
|
100
|
-
var loadBaseEntries = useCallback(function(baseId) {
|
|
101
|
-
var params = new URLSearchParams();
|
|
102
|
-
if (entryFilters.category) params.set('category', entryFilters.category);
|
|
103
|
-
if (entryFilters.status) params.set('status', entryFilters.status);
|
|
104
|
-
if (entryFilters.minQuality) params.set('minQuality', entryFilters.minQuality);
|
|
105
|
-
engineCall('/knowledge-contribution/bases/' + baseId + '/entries?' + params.toString())
|
|
106
|
-
.then(function(d) { setBaseEntries(Array.isArray(d.entries) ? d.entries : []); })
|
|
107
|
-
.catch(function() { setBaseEntries([]); });
|
|
108
|
-
}, [entryFilters]);
|
|
109
|
-
|
|
110
|
-
useEffect(function() {
|
|
111
|
-
if (selectedBase) loadBaseEntries(selectedBase.id);
|
|
112
|
-
}, [selectedBase, loadBaseEntries]);
|
|
113
|
-
|
|
114
|
-
// Actions
|
|
115
|
-
var createBase = async function() {
|
|
116
|
-
try {
|
|
117
|
-
await engineCall('/knowledge-contribution/bases', {
|
|
118
|
-
method: 'POST',
|
|
119
|
-
body: JSON.stringify({ name: baseForm.name, description: baseForm.description, role: baseForm.role, orgId: effectiveOrgId })
|
|
120
|
-
});
|
|
121
|
-
toast('Knowledge base created', 'success');
|
|
122
|
-
setShowCreateBase(false);
|
|
123
|
-
setBaseForm({ name: '', description: '', role: '' });
|
|
124
|
-
loadBases();
|
|
125
|
-
loadStats();
|
|
126
|
-
} catch (e) { toast(e.message || 'Failed to create base', 'error'); }
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
var approveEntry = async function(entryId) {
|
|
130
|
-
try {
|
|
131
|
-
await engineCall('/knowledge-contribution/entries/' + entryId + '/approve', { method: 'PUT' });
|
|
132
|
-
toast('Entry approved', 'success');
|
|
133
|
-
if (selectedBase) loadBaseEntries(selectedBase.id);
|
|
134
|
-
loadStats();
|
|
135
|
-
} catch (e) { toast(e.message || 'Approve failed', 'error'); }
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
var rejectEntry = async function(entryId) {
|
|
139
|
-
try {
|
|
140
|
-
await engineCall('/knowledge-contribution/entries/' + entryId + '/reject', { method: 'PUT' });
|
|
141
|
-
toast('Entry rejected', 'success');
|
|
142
|
-
if (selectedBase) loadBaseEntries(selectedBase.id);
|
|
143
|
-
} catch (e) { toast(e.message || 'Reject failed', 'error'); }
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
var archiveEntry = async function(entryId) {
|
|
147
|
-
try {
|
|
148
|
-
await engineCall('/knowledge-contribution/entries/' + entryId + '/archive', { method: 'PUT' });
|
|
149
|
-
toast('Entry archived', 'success');
|
|
150
|
-
if (selectedBase) loadBaseEntries(selectedBase.id);
|
|
151
|
-
} catch (e) { toast(e.message || 'Archive failed', 'error'); }
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
var voteEntry = async function(entryId, direction) {
|
|
155
|
-
try {
|
|
156
|
-
await engineCall('/knowledge-contribution/entries/' + entryId + '/vote', {
|
|
157
|
-
method: 'POST',
|
|
158
|
-
body: JSON.stringify({ direction: direction })
|
|
159
|
-
});
|
|
160
|
-
toast('Vote recorded', 'success');
|
|
161
|
-
if (selectedBase) loadBaseEntries(selectedBase.id);
|
|
162
|
-
} catch (e) { toast(e.message || 'Vote failed', 'error'); }
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
var triggerContribution = async function() {
|
|
166
|
-
if (!triggerAgent) return;
|
|
167
|
-
try {
|
|
168
|
-
await engineCall('/knowledge-contribution/contribute/' + triggerAgent, {
|
|
169
|
-
method: 'POST',
|
|
170
|
-
body: JSON.stringify({ targetBaseId: triggerBase || undefined, orgId: effectiveOrgId })
|
|
171
|
-
});
|
|
172
|
-
toast('Contribution triggered', 'success');
|
|
173
|
-
setShowTrigger(false);
|
|
174
|
-
setTriggerAgent('');
|
|
175
|
-
setTriggerBase('');
|
|
176
|
-
loadContributions();
|
|
177
|
-
loadStats();
|
|
178
|
-
} catch (e) { toast(e.message || 'Trigger failed', 'error'); }
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
var createSchedule = async function() {
|
|
182
|
-
try {
|
|
183
|
-
await engineCall('/knowledge-contribution/schedules', {
|
|
184
|
-
method: 'POST',
|
|
185
|
-
body: JSON.stringify({
|
|
186
|
-
agentId: scheduleForm.agentId,
|
|
187
|
-
targetBaseId: scheduleForm.targetBaseId,
|
|
188
|
-
frequency: scheduleForm.frequency,
|
|
189
|
-
dayOfWeek: scheduleForm.dayOfWeek,
|
|
190
|
-
minConfidence: parseFloat(scheduleForm.minConfidence) || 0.7,
|
|
191
|
-
orgId: effectiveOrgId
|
|
192
|
-
})
|
|
193
|
-
});
|
|
194
|
-
toast('Schedule created', 'success');
|
|
195
|
-
setShowCreateSchedule(false);
|
|
196
|
-
setScheduleForm({ agentId: '', targetBaseId: '', frequency: 'weekly', dayOfWeek: 'monday', minConfidence: 0.7 });
|
|
197
|
-
loadSchedules();
|
|
198
|
-
loadStats();
|
|
199
|
-
} catch (e) { toast(e.message || 'Create schedule failed', 'error'); }
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
var updateSchedule = async function() {
|
|
203
|
-
if (!editSchedule) return;
|
|
204
|
-
try {
|
|
205
|
-
await engineCall('/knowledge-contribution/schedules/' + editSchedule.id, {
|
|
206
|
-
method: 'PUT',
|
|
207
|
-
body: JSON.stringify({
|
|
208
|
-
frequency: scheduleForm.frequency,
|
|
209
|
-
dayOfWeek: scheduleForm.dayOfWeek,
|
|
210
|
-
minConfidence: parseFloat(scheduleForm.minConfidence) || 0.7,
|
|
211
|
-
enabled: editSchedule.enabled
|
|
212
|
-
})
|
|
213
|
-
});
|
|
214
|
-
toast('Schedule updated', 'success');
|
|
215
|
-
setEditSchedule(null);
|
|
216
|
-
setScheduleForm({ agentId: '', targetBaseId: '', frequency: 'weekly', dayOfWeek: 'monday', minConfidence: 0.7 });
|
|
217
|
-
loadSchedules();
|
|
218
|
-
} catch (e) { toast(e.message || 'Update schedule failed', 'error'); }
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
var toggleSchedule = async function(sched) {
|
|
222
|
-
try {
|
|
223
|
-
await engineCall('/knowledge-contribution/schedules/' + sched.id, {
|
|
224
|
-
method: 'PUT',
|
|
225
|
-
body: JSON.stringify({ enabled: !sched.enabled })
|
|
226
|
-
});
|
|
227
|
-
toast('Schedule ' + (sched.enabled ? 'disabled' : 'enabled'), 'success');
|
|
228
|
-
loadSchedules();
|
|
229
|
-
} catch (e) { toast(e.message || 'Toggle failed', 'error'); }
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
var deleteSchedule = async function(schedId) {
|
|
233
|
-
try {
|
|
234
|
-
await engineCall('/knowledge-contribution/schedules/' + schedId, { method: 'DELETE' });
|
|
235
|
-
toast('Schedule deleted', 'success');
|
|
236
|
-
loadSchedules();
|
|
237
|
-
loadStats();
|
|
238
|
-
} catch (e) { toast(e.message || 'Delete failed', 'error'); }
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
// Helpers
|
|
242
|
-
var statusColor = function(s) {
|
|
243
|
-
if (s === 'approved' || s === 'completed' || s === 'active') return 'var(--success)';
|
|
244
|
-
if (s === 'pending' || s === 'running' || s === 'in_progress') return 'var(--warning)';
|
|
245
|
-
if (s === 'rejected' || s === 'failed') return 'var(--danger)';
|
|
246
|
-
if (s === 'archived') return 'var(--text-muted)';
|
|
247
|
-
return 'var(--info)';
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
var qualityBar = function(score) {
|
|
251
|
-
var pct = Math.round((score || 0) * 100);
|
|
252
|
-
var color = pct >= 80 ? 'var(--success)' : pct >= 50 ? 'var(--warning)' : 'var(--danger)';
|
|
253
|
-
return h('div', { style: { display: 'flex', alignItems: 'center', gap: 6 } },
|
|
254
|
-
h('div', { style: { flex: 1, height: 6, background: 'var(--bg-tertiary)', borderRadius: 3, overflow: 'hidden', maxWidth: 80 } },
|
|
255
|
-
h('div', { style: { width: pct + '%', height: '100%', background: color, borderRadius: 3 } })
|
|
256
|
-
),
|
|
257
|
-
h('span', { style: { fontSize: 11, color: 'var(--text-muted)', minWidth: 30 } }, pct + '%')
|
|
258
|
-
);
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
var roleColor = function(role) {
|
|
262
|
-
if (role === 'support') return 'var(--info)';
|
|
263
|
-
if (role === 'sales') return 'var(--success)';
|
|
264
|
-
if (role === 'engineering') return 'var(--warning)';
|
|
265
|
-
if (role === 'hr') return '#a855f7';
|
|
266
|
-
if (role === 'ops') return '#f97316';
|
|
267
|
-
return 'var(--brand-color)';
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
// ── Knowledge Bases Tab ──────────────────────────────
|
|
271
|
-
var renderBases = function() {
|
|
272
|
-
if (selectedBase) return renderBaseDetail();
|
|
273
|
-
|
|
274
|
-
return h(Fragment, null,
|
|
275
|
-
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
|
|
276
|
-
h('span', { style: { fontSize: 13, color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, bases.length + ' knowledge base' + (bases.length !== 1 ? 's' : ''),
|
|
277
|
-
h(HelpButton, { label: 'Knowledge Bases' },
|
|
278
|
-
h('p', null, 'Each knowledge base is a searchable collection of documents. Agents use these to answer questions with real organizational data instead of guessing.'),
|
|
279
|
-
h('h4', { style: _h4 }, 'How It Works'),
|
|
280
|
-
h('ul', { style: _ul },
|
|
281
|
-
h('li', null, h('strong', null, 'Create'), ' a knowledge base and give it a descriptive name (e.g., "HR Policies", "Product Docs").'),
|
|
282
|
-
h('li', null, h('strong', null, 'Import'), ' documents via the Knowledge Import page — upload files, crawl URLs, or paste text.'),
|
|
283
|
-
h('li', null, h('strong', null, 'Assign'), ' the knowledge base to agents in their Deployment tab.'),
|
|
284
|
-
h('li', null, h('strong', null, 'Search'), ' happens automatically when agents use the knowledge_base_search tool.')
|
|
285
|
-
),
|
|
286
|
-
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Click on a knowledge base to see its documents and chunks. Chunks are the small pieces of text that get matched during search — smaller chunks give more precise results.')
|
|
287
|
-
)
|
|
288
|
-
),
|
|
289
|
-
h('button', { className: 'btn btn-primary', onClick: function() { setShowCreateBase(true); } }, I.plus(), ' Create Knowledge Base')
|
|
290
|
-
),
|
|
291
|
-
bases.length === 0
|
|
292
|
-
? h('div', { style: { textAlign: 'center', padding: 60, color: 'var(--text-muted)' } }, 'No knowledge bases yet. Create one to get started.')
|
|
293
|
-
: h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))', gap: 16 } },
|
|
294
|
-
bases.map(function(base) {
|
|
295
|
-
return h('div', {
|
|
296
|
-
key: base.id,
|
|
297
|
-
className: 'card',
|
|
298
|
-
style: { cursor: 'pointer', transition: 'border-color 0.15s' },
|
|
299
|
-
onClick: function() { setSelectedBase(base); }
|
|
300
|
-
},
|
|
301
|
-
h('div', { className: 'card-body' },
|
|
302
|
-
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 8 } },
|
|
303
|
-
h('h3', { style: { fontSize: 15, fontWeight: 600 } }, base.name),
|
|
304
|
-
base.role && h('span', {
|
|
305
|
-
className: 'badge',
|
|
306
|
-
style: { background: roleColor(base.role), color: '#fff', fontSize: 10, textTransform: 'uppercase' }
|
|
307
|
-
}, base.role)
|
|
308
|
-
),
|
|
309
|
-
h('p', { style: { fontSize: 12, color: 'var(--text-muted)', marginBottom: 12, lineHeight: 1.5 } },
|
|
310
|
-
base.description || 'No description'
|
|
311
|
-
),
|
|
312
|
-
h('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap', alignItems: 'center' } },
|
|
313
|
-
h('span', { className: 'badge badge-info' }, (base.entryCount || 0) + ' entries'),
|
|
314
|
-
h('span', { className: 'badge badge-neutral' }, (base.contributorCount || 0) + ' contributors'),
|
|
315
|
-
base.lastContribution && h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } },
|
|
316
|
-
'Last: ' + new Date(base.lastContribution).toLocaleDateString()
|
|
317
|
-
)
|
|
318
|
-
)
|
|
319
|
-
)
|
|
320
|
-
);
|
|
321
|
-
})
|
|
322
|
-
)
|
|
323
|
-
);
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
// ── Base Detail View ──────────────────────────────
|
|
327
|
-
var renderBaseDetail = function() {
|
|
328
|
-
var categories = [];
|
|
329
|
-
var catSet = {};
|
|
330
|
-
(Array.isArray(baseEntries) ? baseEntries : []).forEach(function(e) {
|
|
331
|
-
if (e.category && !catSet[e.category]) {
|
|
332
|
-
catSet[e.category] = true;
|
|
333
|
-
categories.push(e.category);
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
return h(Fragment, null,
|
|
338
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 12, marginBottom: 16 } },
|
|
339
|
-
h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { setSelectedBase(null); setBaseEntries([]); setEntryFilters({ category: '', status: '', minQuality: '' }); } }, '\u2190 Back'),
|
|
340
|
-
h('div', null,
|
|
341
|
-
h('h2', { style: { fontSize: 16, fontWeight: 600 } }, selectedBase.name),
|
|
342
|
-
h('p', { style: { fontSize: 12, color: 'var(--text-muted)' } }, selectedBase.description || '')
|
|
343
|
-
),
|
|
344
|
-
selectedBase.role && h('span', {
|
|
345
|
-
className: 'badge',
|
|
346
|
-
style: { background: roleColor(selectedBase.role), color: '#fff', fontSize: 10, textTransform: 'uppercase', marginLeft: 'auto' }
|
|
347
|
-
}, selectedBase.role)
|
|
348
|
-
),
|
|
349
|
-
|
|
350
|
-
// Filters
|
|
351
|
-
h('div', { style: { display: 'flex', gap: 10, marginBottom: 16, flexWrap: 'wrap' } },
|
|
352
|
-
h('select', {
|
|
353
|
-
className: 'input', style: { width: 160 },
|
|
354
|
-
value: entryFilters.category,
|
|
355
|
-
onChange: function(e) { setEntryFilters(function(f) { return Object.assign({}, f, { category: e.target.value }); }); }
|
|
356
|
-
},
|
|
357
|
-
h('option', { value: '' }, 'All Categories'),
|
|
358
|
-
categories.map(function(c) { return h('option', { key: c, value: c }, c); })
|
|
359
|
-
),
|
|
360
|
-
h('select', {
|
|
361
|
-
className: 'input', style: { width: 140 },
|
|
362
|
-
value: entryFilters.status,
|
|
363
|
-
onChange: function(e) { setEntryFilters(function(f) { return Object.assign({}, f, { status: e.target.value }); }); }
|
|
364
|
-
},
|
|
365
|
-
h('option', { value: '' }, 'All Statuses'),
|
|
366
|
-
['pending', 'approved', 'rejected', 'archived'].map(function(s) { return h('option', { key: s, value: s }, s.charAt(0).toUpperCase() + s.slice(1)); })
|
|
367
|
-
),
|
|
368
|
-
h('select', {
|
|
369
|
-
className: 'input', style: { width: 150 },
|
|
370
|
-
value: entryFilters.minQuality,
|
|
371
|
-
onChange: function(e) { setEntryFilters(function(f) { return Object.assign({}, f, { minQuality: e.target.value }); }); }
|
|
372
|
-
},
|
|
373
|
-
h('option', { value: '' }, 'Any Quality'),
|
|
374
|
-
h('option', { value: '0.8' }, '80%+ Quality'),
|
|
375
|
-
h('option', { value: '0.6' }, '60%+ Quality'),
|
|
376
|
-
h('option', { value: '0.4' }, '40%+ Quality')
|
|
377
|
-
),
|
|
378
|
-
h('span', { style: { fontSize: 12, color: 'var(--text-muted)', alignSelf: 'center' } }, baseEntries.length + ' entries')
|
|
379
|
-
),
|
|
380
|
-
|
|
381
|
-
// Entries
|
|
382
|
-
baseEntries.length === 0
|
|
383
|
-
? h('div', { style: { textAlign: 'center', padding: 40, color: 'var(--text-muted)' } }, 'No entries in this knowledge base yet.')
|
|
384
|
-
: h('div', { style: { display: 'grid', gap: 10 } },
|
|
385
|
-
baseEntries.map(function(entry) {
|
|
386
|
-
return h('div', { key: entry.id, className: 'card', style: { padding: 14 } },
|
|
387
|
-
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 6 } },
|
|
388
|
-
h('div', { style: { flex: 1 } },
|
|
389
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4 } },
|
|
390
|
-
h('span', { style: { fontWeight: 600, fontSize: 14 } }, entry.title || 'Untitled'),
|
|
391
|
-
entry.category && h('span', { className: 'badge badge-info', style: { fontSize: 10 } }, entry.category),
|
|
392
|
-
h('span', {
|
|
393
|
-
className: 'badge',
|
|
394
|
-
style: { background: statusColor(entry.status), color: '#fff', fontSize: 10 }
|
|
395
|
-
}, entry.status || 'pending')
|
|
396
|
-
),
|
|
397
|
-
entry.summary && h('p', { style: { fontSize: 12, color: 'var(--text-muted)', marginBottom: 6, lineHeight: 1.5 } }, entry.summary)
|
|
398
|
-
)
|
|
399
|
-
),
|
|
400
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' } },
|
|
401
|
-
// Quality bar
|
|
402
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 4 } },
|
|
403
|
-
h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } }, 'Quality:'),
|
|
404
|
-
qualityBar(entry.qualityScore || entry.quality)
|
|
405
|
-
),
|
|
406
|
-
// Confidence
|
|
407
|
-
entry.confidence != null && h('div', { style: { fontSize: 11, color: 'var(--text-muted)' } },
|
|
408
|
-
'Confidence: ' + Math.round((entry.confidence || 0) * 100) + '%'
|
|
409
|
-
),
|
|
410
|
-
// Tags
|
|
411
|
-
(entry.tags || []).length > 0 && h('div', { style: { display: 'flex', gap: 4, flexWrap: 'wrap' } },
|
|
412
|
-
entry.tags.map(function(t) { return h('span', { key: t, className: 'badge badge-neutral', style: { fontSize: 10 } }, t); })
|
|
413
|
-
),
|
|
414
|
-
// Vote buttons
|
|
415
|
-
h('div', { style: { display: 'flex', gap: 4, marginLeft: 'auto' } },
|
|
416
|
-
h('button', {
|
|
417
|
-
className: 'btn btn-ghost btn-sm',
|
|
418
|
-
style: { fontSize: 14, padding: '2px 6px' },
|
|
419
|
-
onClick: function() { voteEntry(entry.id, 'up'); },
|
|
420
|
-
title: 'Vote up'
|
|
421
|
-
}, '\u25B2', entry.upvotes != null ? h('span', { style: { fontSize: 10, marginLeft: 2 } }, entry.upvotes) : null),
|
|
422
|
-
h('button', {
|
|
423
|
-
className: 'btn btn-ghost btn-sm',
|
|
424
|
-
style: { fontSize: 14, padding: '2px 6px' },
|
|
425
|
-
onClick: function() { voteEntry(entry.id, 'down'); },
|
|
426
|
-
title: 'Vote down'
|
|
427
|
-
}, '\u25BC', entry.downvotes != null ? h('span', { style: { fontSize: 10, marginLeft: 2 } }, entry.downvotes) : null)
|
|
428
|
-
),
|
|
429
|
-
// Action buttons
|
|
430
|
-
h('div', { style: { display: 'flex', gap: 4 } },
|
|
431
|
-
entry.status !== 'approved' && h('button', { className: 'btn btn-primary btn-sm', onClick: function() { approveEntry(entry.id); } }, 'Approve'),
|
|
432
|
-
entry.status !== 'rejected' && h('button', { className: 'btn btn-ghost btn-sm', style: { color: 'var(--danger)' }, onClick: function() { rejectEntry(entry.id); } }, 'Reject'),
|
|
433
|
-
entry.status !== 'archived' && h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { archiveEntry(entry.id); } }, 'Archive')
|
|
434
|
-
)
|
|
435
|
-
)
|
|
436
|
-
);
|
|
437
|
-
})
|
|
438
|
-
)
|
|
439
|
-
);
|
|
440
|
-
};
|
|
441
|
-
|
|
442
|
-
// ── Contributions Tab ──────────────────────────────
|
|
443
|
-
var agentData = buildAgentDataMap(agents);
|
|
444
|
-
|
|
445
|
-
var renderContributions = function() {
|
|
446
|
-
// Header with help
|
|
447
|
-
var _contribHeader = h('div', { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 12 } },
|
|
448
|
-
h('span', { style: { fontSize: 14, fontWeight: 600 } }, 'Agent Contributions'),
|
|
449
|
-
h(HelpButton, { label: 'Agent Contributions' },
|
|
450
|
-
h('p', null, 'Every entry here is a piece of knowledge an agent contributed — a fact learned, a decision recorded, a process documented, or an insight captured during work.'),
|
|
451
|
-
h('h4', { style: _h4 }, 'Contribution Details'),
|
|
452
|
-
h('ul', { style: _ul },
|
|
453
|
-
h('li', null, h('strong', null, 'Confidence'), ' — How certain the agent is about this knowledge (0-100%). Higher confidence = more reliable. Contributions below your threshold are flagged for review.'),
|
|
454
|
-
h('li', null, h('strong', null, 'Category'), ' — The type of knowledge (fact, process, decision, preference, etc.). Helps organize and filter.'),
|
|
455
|
-
h('li', null, h('strong', null, 'Source'), ' — Where the agent learned this (conversation, email, document, etc.).')
|
|
456
|
-
),
|
|
457
|
-
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Review low-confidence contributions periodically. You can edit, approve, or delete them. High-quality contributions improve all agents that share this knowledge base.')
|
|
458
|
-
)
|
|
459
|
-
);
|
|
460
|
-
|
|
461
|
-
// Filter
|
|
462
|
-
var filtered = contributions;
|
|
463
|
-
if (contribAgent) filtered = filtered.filter(function(c) { return c.agentId === contribAgent; });
|
|
464
|
-
if (contribSearch) {
|
|
465
|
-
var s = contribSearch.toLowerCase();
|
|
466
|
-
filtered = filtered.filter(function(c) {
|
|
467
|
-
return (c.title || '').toLowerCase().includes(s) || (c.agentName || '').toLowerCase().includes(s)
|
|
468
|
-
|| (c.content || '').toLowerCase().includes(s) || (c.category || '').toLowerCase().includes(s);
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
var totalFiltered = filtered.length;
|
|
472
|
-
var totalPages = Math.ceil(totalFiltered / CONTRIB_PAGE_SIZE);
|
|
473
|
-
var paged = filtered.slice(contribPage * CONTRIB_PAGE_SIZE, (contribPage + 1) * CONTRIB_PAGE_SIZE);
|
|
474
|
-
|
|
475
|
-
return h(Fragment, null,
|
|
476
|
-
_contribHeader,
|
|
477
|
-
// Filter bar
|
|
478
|
-
h('div', { style: { display: 'flex', gap: 10, marginBottom: 14, flexWrap: 'wrap', alignItems: 'center' } },
|
|
479
|
-
h('input', {
|
|
480
|
-
type: 'text', placeholder: 'Search contributions...',
|
|
481
|
-
value: contribSearch,
|
|
482
|
-
onInput: function(e) { setContribSearch(e.target.value); setContribPage(0); },
|
|
483
|
-
style: { flex: '1 1 200px', padding: '8px 12px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 13, minWidth: 180, outline: 'none' },
|
|
484
|
-
}),
|
|
485
|
-
h('select', {
|
|
486
|
-
value: contribAgent,
|
|
487
|
-
onChange: function(e) { setContribAgent(e.target.value); setContribPage(0); },
|
|
488
|
-
style: { padding: '8px 12px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 13, cursor: 'pointer', outline: 'none' },
|
|
489
|
-
},
|
|
490
|
-
h('option', { value: '' }, 'All agents'),
|
|
491
|
-
agents.map(function(a) { return h('option', { key: a.id, value: a.id }, a.config && a.config.identity && a.config.identity.name || a.config && a.config.displayName || a.name || a.id); })
|
|
492
|
-
),
|
|
493
|
-
h('span', { style: { fontSize: 13, color: 'var(--text-muted)' } }, totalFiltered + ' contribution' + (totalFiltered !== 1 ? 's' : '')),
|
|
494
|
-
h('button', { className: 'btn btn-primary btn-sm', onClick: function() { setShowTrigger(true); } }, I.play(), ' Trigger')
|
|
495
|
-
),
|
|
496
|
-
|
|
497
|
-
paged.length === 0
|
|
498
|
-
? h('div', { style: { textAlign: 'center', padding: 60, color: 'var(--text-muted)' } }, contribSearch || contribAgent ? 'No matching contributions.' : 'No contributions yet.')
|
|
499
|
-
: h('table', { className: 'data-table' },
|
|
500
|
-
h('thead', null,
|
|
501
|
-
h('tr', null,
|
|
502
|
-
h('th', null, 'Agent'),
|
|
503
|
-
h('th', null, 'Title'),
|
|
504
|
-
h('th', null, 'Importance'),
|
|
505
|
-
h('th', null, 'Status'),
|
|
506
|
-
h('th', null, 'Date')
|
|
507
|
-
)
|
|
508
|
-
),
|
|
509
|
-
h('tbody', null,
|
|
510
|
-
paged.map(function(c) {
|
|
511
|
-
return h('tr', { key: c.id, onClick: function() { setSelectedContrib(c); }, style: { cursor: 'pointer' } },
|
|
512
|
-
h('td', null, renderAgentBadge(c.agentId, agentData)),
|
|
513
|
-
h('td', { style: { fontWeight: 500, fontSize: 13 } }, c.title || '-'),
|
|
514
|
-
h('td', null, c.importance ? h('span', { className: 'badge badge-' + (c.importance === 'high' ? 'danger' : c.importance === 'medium' ? 'warning' : 'info') }, c.importance) : '-'),
|
|
515
|
-
h('td', null, h('span', {
|
|
516
|
-
className: 'badge',
|
|
517
|
-
style: { background: statusColor(c.status), color: '#fff', fontSize: 10 }
|
|
518
|
-
}, c.status || 'unknown')),
|
|
519
|
-
h('td', { style: { fontSize: 12, color: 'var(--text-muted)', whiteSpace: 'nowrap' } }, c.createdAt || c.date ? new Date(c.createdAt || c.date).toLocaleString() : '-')
|
|
520
|
-
);
|
|
521
|
-
})
|
|
522
|
-
)
|
|
523
|
-
),
|
|
524
|
-
|
|
525
|
-
// Pagination
|
|
526
|
-
totalPages > 1 && h('div', {
|
|
527
|
-
style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13, color: 'var(--text-muted)' }
|
|
528
|
-
},
|
|
529
|
-
h('span', null, 'Showing ' + (contribPage * CONTRIB_PAGE_SIZE + 1) + '-' + Math.min((contribPage + 1) * CONTRIB_PAGE_SIZE, totalFiltered) + ' of ' + totalFiltered),
|
|
530
|
-
h('div', { style: { display: 'flex', gap: 4 } },
|
|
531
|
-
h('button', { onClick: function() { setContribPage(function(p) { return Math.max(0, p - 1); }); }, disabled: contribPage === 0, style: _pgBtn(false) }, '\u2039 Prev'),
|
|
532
|
-
h('span', { style: { padding: '4px 8px', fontSize: 12 } }, (contribPage + 1) + ' / ' + totalPages),
|
|
533
|
-
h('button', { onClick: function() { setContribPage(function(p) { return Math.min(totalPages - 1, p + 1); }); }, disabled: contribPage >= totalPages - 1, style: _pgBtn(false) }, 'Next \u203A')
|
|
534
|
-
)
|
|
535
|
-
)
|
|
536
|
-
);
|
|
537
|
-
};
|
|
538
|
-
|
|
539
|
-
// Schedules pagination/filter
|
|
540
|
-
var [schedPage, setSchedPage] = useState(0);
|
|
541
|
-
var [schedSearch, setSchedSearch] = useState('');
|
|
542
|
-
var [schedAgentFilter, setSchedAgentFilter] = useState('');
|
|
543
|
-
var [schedEnabledFilter, setSchedEnabledFilter] = useState('');
|
|
544
|
-
var SCHED_PAGE_SIZE = 20;
|
|
545
|
-
|
|
546
|
-
// ── Schedules Tab ──────────────────────────────
|
|
547
|
-
var renderSchedules = function() {
|
|
548
|
-
var filteredScheds = schedules;
|
|
549
|
-
if (schedSearch) { var s = schedSearch.toLowerCase(); filteredScheds = filteredScheds.filter(function(sc) { return (sc.baseName || sc.targetBaseId || '').toLowerCase().includes(s) || (sc.frequency || '').toLowerCase().includes(s); }); }
|
|
550
|
-
if (schedAgentFilter) filteredScheds = filteredScheds.filter(function(sc) { return sc.agentId === schedAgentFilter; });
|
|
551
|
-
if (schedEnabledFilter === 'on') filteredScheds = filteredScheds.filter(function(sc) { return sc.enabled; });
|
|
552
|
-
if (schedEnabledFilter === 'off') filteredScheds = filteredScheds.filter(function(sc) { return !sc.enabled; });
|
|
553
|
-
var totalSchedFiltered = filteredScheds.length;
|
|
554
|
-
var totalSchedPages = Math.ceil(totalSchedFiltered / SCHED_PAGE_SIZE);
|
|
555
|
-
var pagedScheds = filteredScheds.slice(schedPage * SCHED_PAGE_SIZE, (schedPage + 1) * SCHED_PAGE_SIZE);
|
|
556
|
-
|
|
557
|
-
return h(Fragment, null,
|
|
558
|
-
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
|
|
559
|
-
h('span', { style: { fontSize: 13, color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, totalSchedFiltered + ' schedule' + (totalSchedFiltered !== 1 ? 's' : ''),
|
|
560
|
-
h(HelpButton, { label: 'Contribution Schedules' },
|
|
561
|
-
h('p', null, 'Schedules automate knowledge contributions. Instead of relying on agents to contribute spontaneously, schedules trigger periodic knowledge synthesis.'),
|
|
562
|
-
h('h4', { style: _h4 }, 'How Schedules Work'),
|
|
563
|
-
h('ul', { style: _ul },
|
|
564
|
-
h('li', null, 'Pick an agent and a target knowledge base.'),
|
|
565
|
-
h('li', null, 'Set the frequency (hourly, daily, weekly, monthly) and a minimum confidence threshold.'),
|
|
566
|
-
h('li', null, 'At each interval, the agent reviews its recent memories and contributes relevant knowledge above the confidence threshold.')
|
|
567
|
-
),
|
|
568
|
-
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Weekly schedules with 60%+ confidence work well for most use cases. Daily schedules generate more granular but potentially noisier contributions.')
|
|
569
|
-
)
|
|
570
|
-
),
|
|
571
|
-
h('button', { className: 'btn btn-primary', onClick: function() { setShowCreateSchedule(true); } }, I.plus(), ' Create Schedule')
|
|
572
|
-
),
|
|
573
|
-
// Filter bar
|
|
574
|
-
h('div', { style: { display: 'flex', gap: 10, marginBottom: 14, flexWrap: 'wrap', alignItems: 'center' } },
|
|
575
|
-
h('input', {
|
|
576
|
-
type: 'text', placeholder: 'Search base name...',
|
|
577
|
-
value: schedSearch, onInput: function(e) { setSchedSearch(e.target.value); setSchedPage(0); },
|
|
578
|
-
style: { flex: '1 1 200px', padding: '8px 12px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 13, minWidth: 180, outline: 'none' }
|
|
579
|
-
}),
|
|
580
|
-
h('select', {
|
|
581
|
-
value: schedAgentFilter, onChange: function(e) { setSchedAgentFilter(e.target.value); setSchedPage(0); },
|
|
582
|
-
style: { padding: '8px 12px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 13, cursor: 'pointer', outline: 'none' }
|
|
583
|
-
},
|
|
584
|
-
h('option', { value: '' }, 'All Agents'),
|
|
585
|
-
agents.map(function(a) { return h('option', { key: a.id, value: a.id }, a.config && a.config.identity && a.config.identity.name || a.config && a.config.displayName || a.name || a.id); })
|
|
586
|
-
),
|
|
587
|
-
h('select', {
|
|
588
|
-
value: schedEnabledFilter, onChange: function(e) { setSchedEnabledFilter(e.target.value); setSchedPage(0); },
|
|
589
|
-
style: { padding: '8px 12px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 13, cursor: 'pointer', outline: 'none' }
|
|
590
|
-
},
|
|
591
|
-
h('option', { value: '' }, 'All'),
|
|
592
|
-
h('option', { value: 'on' }, 'Enabled'),
|
|
593
|
-
h('option', { value: 'off' }, 'Disabled')
|
|
594
|
-
)
|
|
595
|
-
),
|
|
596
|
-
pagedScheds.length === 0
|
|
597
|
-
? h('div', { style: { textAlign: 'center', padding: 60, color: 'var(--text-muted)' } }, schedSearch || schedAgentFilter || schedEnabledFilter ? 'No matching schedules.' : 'No contribution schedules configured.')
|
|
598
|
-
: h('table', { className: 'data-table' },
|
|
599
|
-
h('thead', null,
|
|
600
|
-
h('tr', null,
|
|
601
|
-
h('th', null, 'Agent'),
|
|
602
|
-
h('th', null, 'Target Base'),
|
|
603
|
-
h('th', null, 'Frequency'),
|
|
604
|
-
h('th', null, 'Next Run'),
|
|
605
|
-
h('th', null, 'Enabled'),
|
|
606
|
-
h('th', null, 'Actions')
|
|
607
|
-
)
|
|
608
|
-
),
|
|
609
|
-
h('tbody', null,
|
|
610
|
-
pagedScheds.map(function(sched) {
|
|
611
|
-
return h('tr', { key: sched.id },
|
|
612
|
-
h('td', null, renderAgentBadge(sched.agentId, agentData)),
|
|
613
|
-
h('td', null, sched.baseName || sched.targetBaseId || '-'),
|
|
614
|
-
h('td', null, h('span', { className: 'badge badge-neutral', style: { fontSize: 10 } }, sched.frequency || '-')),
|
|
615
|
-
h('td', null, sched.nextRun ? new Date(sched.nextRun).toLocaleString() : '-'),
|
|
616
|
-
h('td', null,
|
|
617
|
-
h('button', {
|
|
618
|
-
className: 'btn btn-ghost btn-sm',
|
|
619
|
-
style: { color: sched.enabled ? 'var(--success)' : 'var(--text-muted)', fontWeight: 600, fontSize: 12 },
|
|
620
|
-
onClick: function() { toggleSchedule(sched); }
|
|
621
|
-
}, sched.enabled ? 'ON' : 'OFF')
|
|
622
|
-
),
|
|
623
|
-
h('td', null,
|
|
624
|
-
h('div', { style: { display: 'flex', gap: 4 } },
|
|
625
|
-
h('button', {
|
|
626
|
-
className: 'btn btn-ghost btn-sm',
|
|
627
|
-
onClick: function() {
|
|
628
|
-
setEditSchedule(sched);
|
|
629
|
-
setScheduleForm({
|
|
630
|
-
agentId: sched.agentId || '',
|
|
631
|
-
targetBaseId: sched.targetBaseId || '',
|
|
632
|
-
frequency: sched.frequency || 'weekly',
|
|
633
|
-
dayOfWeek: sched.dayOfWeek || 'monday',
|
|
634
|
-
minConfidence: sched.minConfidence || 0.7
|
|
635
|
-
});
|
|
636
|
-
}
|
|
637
|
-
}, 'Edit'),
|
|
638
|
-
h('button', {
|
|
639
|
-
className: 'btn btn-ghost btn-sm',
|
|
640
|
-
style: { color: 'var(--danger)' },
|
|
641
|
-
onClick: function() { deleteSchedule(sched.id); }
|
|
642
|
-
}, 'Delete')
|
|
643
|
-
)
|
|
644
|
-
)
|
|
645
|
-
);
|
|
646
|
-
})
|
|
647
|
-
)
|
|
648
|
-
),
|
|
649
|
-
// Pagination
|
|
650
|
-
totalSchedPages > 1 && h('div', {
|
|
651
|
-
style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13, color: 'var(--text-muted)' }
|
|
652
|
-
},
|
|
653
|
-
h('span', null, 'Showing ' + (schedPage * SCHED_PAGE_SIZE + 1) + '-' + Math.min((schedPage + 1) * SCHED_PAGE_SIZE, totalSchedFiltered) + ' of ' + totalSchedFiltered),
|
|
654
|
-
h('div', { style: { display: 'flex', gap: 4 } },
|
|
655
|
-
h('button', { onClick: function() { setSchedPage(function(p) { return Math.max(0, p - 1); }); }, disabled: schedPage === 0, style: _pgBtn(false) }, '\u2039 Prev'),
|
|
656
|
-
h('span', { style: { padding: '4px 8px', fontSize: 12 } }, (schedPage + 1) + ' / ' + totalSchedPages),
|
|
657
|
-
h('button', { onClick: function() { setSchedPage(function(p) { return Math.min(totalSchedPages - 1, p + 1); }); }, disabled: schedPage >= totalSchedPages - 1, style: _pgBtn(false) }, 'Next \u203A')
|
|
658
|
-
)
|
|
659
|
-
)
|
|
660
|
-
);
|
|
661
|
-
};
|
|
662
|
-
|
|
663
|
-
// ── Stats Tab (Charts) ──────────────────────────────
|
|
664
|
-
var [timelineData, setTimelineData] = useState(null);
|
|
665
|
-
var [chartDays, setChartDays] = useState(30);
|
|
666
|
-
var [chartAgent, setChartAgent] = useState('');
|
|
667
|
-
|
|
668
|
-
var loadTimeline = useCallback(function() {
|
|
669
|
-
var url = '/knowledge-contribution/stats/timeline?days=' + chartDays;
|
|
670
|
-
if (chartAgent) url += '&agentId=' + chartAgent;
|
|
671
|
-
engineCall(url).then(function(d) { setTimelineData(d); }).catch(function() {});
|
|
672
|
-
}, [chartDays, chartAgent]);
|
|
673
|
-
|
|
674
|
-
useEffect(function() { if (tab === 'stats') loadTimeline(); }, [tab, loadTimeline]);
|
|
675
|
-
|
|
676
|
-
// SVG chart helpers — clean background, dark mode, hover tooltips
|
|
677
|
-
var CHART_COLORS = ['#6366f1', '#15803d', '#991b1b', '#ef4444', '#8b5cf6', '#06b6d4', '#9d174d', '#14b8a6'];
|
|
678
|
-
var [tooltip, setTooltip] = useState(null); // { x, y, lines: [] }
|
|
679
|
-
|
|
680
|
-
// Shared tooltip overlay (rendered once, positioned absolutely)
|
|
681
|
-
var renderTooltip = function() {
|
|
682
|
-
if (!tooltip) return null;
|
|
683
|
-
return h('div', {
|
|
684
|
-
style: {
|
|
685
|
-
position: 'fixed', left: tooltip.x + 12, top: tooltip.y - 10,
|
|
686
|
-
background: 'var(--bg-card)', border: '1px solid var(--border)',
|
|
687
|
-
borderRadius: 8, padding: '8px 12px', fontSize: 11, lineHeight: 1.6,
|
|
688
|
-
color: 'var(--text)', boxShadow: '0 4px 12px rgba(0,0,0,0.25)',
|
|
689
|
-
pointerEvents: 'none', zIndex: 9999, maxWidth: 220, whiteSpace: 'nowrap'
|
|
690
|
-
}
|
|
691
|
-
}, tooltip.lines.map(function(l, i) {
|
|
692
|
-
return h('div', { key: i, style: l.bold ? { fontWeight: 600, marginBottom: 2 } : l.color ? { color: l.color } : {} },
|
|
693
|
-
l.dot ? h('span', { style: { display: 'inline-block', width: 8, height: 8, borderRadius: '50%', background: l.dot, marginRight: 6 } }) : null,
|
|
694
|
-
l.text
|
|
695
|
-
);
|
|
696
|
-
}));
|
|
697
|
-
};
|
|
698
|
-
|
|
699
|
-
var _fmtDate = function(raw) {
|
|
700
|
-
if (!raw) return '';
|
|
701
|
-
var d = new Date(raw);
|
|
702
|
-
if (isNaN(d.getTime())) return raw;
|
|
703
|
-
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
|
|
704
|
-
var day = d.getDate(), mon = months[d.getMonth()], yr = d.getFullYear();
|
|
705
|
-
var h = d.getHours(), m = d.getMinutes();
|
|
706
|
-
var ampm = h >= 12 ? 'PM' : 'AM';
|
|
707
|
-
h = h % 12 || 12;
|
|
708
|
-
var mm = m < 10 ? '0' + m : m;
|
|
709
|
-
return (day < 10 ? '0' : '') + day + ' ' + mon + ' ' + yr + ' at ' + h + ':' + mm + ampm;
|
|
710
|
-
};
|
|
711
|
-
|
|
712
|
-
var showTip = function(e, lines) {
|
|
713
|
-
setTooltip({ x: e.clientX, y: e.clientY, lines: lines });
|
|
714
|
-
};
|
|
715
|
-
var hideTip = function() { setTooltip(null); };
|
|
716
|
-
|
|
717
|
-
var _noData = function(msg) {
|
|
718
|
-
return h('div', { style: { textAlign: 'center', padding: 40, color: 'var(--text-muted)', fontSize: 13 } }, msg || 'No data yet');
|
|
719
|
-
};
|
|
720
|
-
|
|
721
|
-
// Chart help content for HelpButton modals
|
|
722
|
-
var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
|
|
723
|
-
var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
|
|
724
|
-
var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
|
|
725
|
-
|
|
726
|
-
var renderLineChart = function(data, opts) {
|
|
727
|
-
if (!data || data.length === 0) return _noData();
|
|
728
|
-
// Single data point: expand into 3 so we get a visible line
|
|
729
|
-
if (data.length === 1) {
|
|
730
|
-
var _d0 = data[0];
|
|
731
|
-
data = [Object.assign({}, _d0, { _synth: true }), _d0, Object.assign({}, _d0, { _synth: true })];
|
|
732
|
-
}
|
|
733
|
-
var W = opts.width || 600, H = opts.height || 200, pad = { top: 16, right: 16, bottom: 32, left: 44 };
|
|
734
|
-
var cW = W - pad.left - pad.right, cH = H - pad.top - pad.bottom;
|
|
735
|
-
var vals = data.map(function(d) { return d[opts.valueKey] || 0; });
|
|
736
|
-
var maxV = Math.max.apply(null, vals.concat([1]));
|
|
737
|
-
var minV = opts.minVal != null ? opts.minVal : 0;
|
|
738
|
-
var range = maxV - minV || 1;
|
|
739
|
-
|
|
740
|
-
var points = data.map(function(d, i) {
|
|
741
|
-
var x = pad.left + (data.length === 1 ? cW / 2 : (i / (data.length - 1)) * cW);
|
|
742
|
-
var y = pad.top + cH - ((d[opts.valueKey] - minV) / range) * cH;
|
|
743
|
-
return { x: x, y: y, d: d };
|
|
744
|
-
});
|
|
745
|
-
|
|
746
|
-
// Smooth curve (catmull-rom → cubic bezier)
|
|
747
|
-
var smoothPath = function(pts) {
|
|
748
|
-
if (pts.length < 2) return 'M' + pts[0].x + ',' + pts[0].y;
|
|
749
|
-
if (pts.length === 2) return 'M' + pts[0].x + ',' + pts[0].y + ' L' + pts[1].x + ',' + pts[1].y;
|
|
750
|
-
var d = 'M' + pts[0].x.toFixed(1) + ',' + pts[0].y.toFixed(1);
|
|
751
|
-
for (var i = 0; i < pts.length - 1; i++) {
|
|
752
|
-
var p0 = pts[Math.max(0, i - 1)], p1 = pts[i], p2 = pts[i + 1], p3 = pts[Math.min(pts.length - 1, i + 2)];
|
|
753
|
-
var cp1x = p1.x + (p2.x - p0.x) / 6, cp1y = p1.y + (p2.y - p0.y) / 6;
|
|
754
|
-
var cp2x = p2.x - (p3.x - p1.x) / 6, cp2y = p2.y - (p3.y - p1.y) / 6;
|
|
755
|
-
d += ' C' + cp1x.toFixed(1) + ',' + cp1y.toFixed(1) + ' ' + cp2x.toFixed(1) + ',' + cp2y.toFixed(1) + ' ' + p2.x.toFixed(1) + ',' + p2.y.toFixed(1);
|
|
756
|
-
}
|
|
757
|
-
return d;
|
|
758
|
-
};
|
|
759
|
-
|
|
760
|
-
var linePath = smoothPath(points);
|
|
761
|
-
// Build area from smooth line — append bottom closure
|
|
762
|
-
var areaPath = linePath + ' L' + points[points.length - 1].x.toFixed(1) + ',' + (pad.top + cH) + ' L' + points[0].x.toFixed(1) + ',' + (pad.top + cH) + ' Z';
|
|
763
|
-
var color = opts.color || '#6366f1';
|
|
764
|
-
|
|
765
|
-
// Y-axis: just min and max labels, no grid lines
|
|
766
|
-
var yLabels = [
|
|
767
|
-
{ val: opts.formatY ? opts.formatY(minV) : Math.round(minV), y: pad.top + cH },
|
|
768
|
-
{ val: opts.formatY ? opts.formatY(maxV) : Math.round(maxV), y: pad.top }
|
|
769
|
-
];
|
|
770
|
-
|
|
771
|
-
// X-axis labels (max 6)
|
|
772
|
-
var xStep = Math.max(1, Math.ceil(data.length / 6));
|
|
773
|
-
var xLabels = [];
|
|
774
|
-
data.forEach(function(d, i) {
|
|
775
|
-
if (i % xStep === 0 || i === data.length - 1) {
|
|
776
|
-
var x = pad.left + (data.length === 1 ? cW / 2 : (i / (data.length - 1)) * cW);
|
|
777
|
-
var raw = d[opts.labelKey] || '';
|
|
778
|
-
var dateObj = new Date(raw);
|
|
779
|
-
var label = isNaN(dateObj.getTime()) ? raw : dateObj.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
|
|
780
|
-
xLabels.push({ x: x, label: label });
|
|
781
|
-
}
|
|
782
|
-
});
|
|
783
|
-
|
|
784
|
-
return h('div', { style: { position: 'relative' } },
|
|
785
|
-
h('svg', { viewBox: '0 0 ' + W + ' ' + H, style: { width: '100%', maxWidth: W, height: 'auto', display: 'block' } },
|
|
786
|
-
// Gradient fill
|
|
787
|
-
h('defs', null,
|
|
788
|
-
h('linearGradient', { id: 'lineGrad-' + (opts.id || 'default'), x1: 0, y1: 0, x2: 0, y2: 1 },
|
|
789
|
-
h('stop', { offset: '0%', stopColor: color, stopOpacity: 0.2 }),
|
|
790
|
-
h('stop', { offset: '100%', stopColor: color, stopOpacity: 0.02 })
|
|
791
|
-
)
|
|
792
|
-
),
|
|
793
|
-
// Y labels
|
|
794
|
-
yLabels.map(function(yl, i) {
|
|
795
|
-
return h('text', { key: 'yl' + i, x: pad.left - 8, y: yl.y + 4, textAnchor: 'end', fill: 'var(--text-muted)', fontSize: 10 }, yl.val);
|
|
796
|
-
}),
|
|
797
|
-
// X labels
|
|
798
|
-
xLabels.map(function(xl, i) {
|
|
799
|
-
return h('text', { key: 'xl' + i, x: xl.x, y: H - 6, textAnchor: 'middle', fill: 'var(--text-muted)', fontSize: 10 }, xl.label);
|
|
800
|
-
}),
|
|
801
|
-
// Area
|
|
802
|
-
h('path', { d: areaPath, fill: 'url(#lineGrad-' + (opts.id || 'default') + ')' }),
|
|
803
|
-
// Line
|
|
804
|
-
h('path', { d: linePath, fill: 'none', stroke: color, strokeWidth: 2.5, strokeLinecap: 'round', strokeLinejoin: 'round' }),
|
|
805
|
-
// Invisible hit areas for hover (wider than dots) — skip synthetic points
|
|
806
|
-
points.map(function(p, i) {
|
|
807
|
-
if (p.d._synth) return null;
|
|
808
|
-
var d = p.d;
|
|
809
|
-
var label = d[opts.labelKey] || '';
|
|
810
|
-
var val = d[opts.valueKey] || 0;
|
|
811
|
-
var extra = d.avgConfidence != null ? [{ text: 'Avg Confidence: ' + Math.round(d.avgConfidence * 100) + '%', color: 'var(--text-muted)' }] : [];
|
|
812
|
-
return h('circle', {
|
|
813
|
-
key: 'hit' + i, cx: p.x, cy: p.y, r: 14, fill: 'transparent', cursor: 'pointer',
|
|
814
|
-
onMouseEnter: function(e) { showTip(e, [{ text: _fmtDate(d[opts.labelKey]) || label, bold: true }].concat([{ text: (opts.valueLabel || 'Value') + ': ' + val }]).concat(extra)); },
|
|
815
|
-
onMouseMove: function(e) { showTip(e, [{ text: _fmtDate(d[opts.labelKey]) || label, bold: true }].concat([{ text: (opts.valueLabel || 'Value') + ': ' + val }]).concat(extra)); },
|
|
816
|
-
onMouseLeave: hideTip
|
|
817
|
-
});
|
|
818
|
-
}),
|
|
819
|
-
// Visible dots — skip synthetic points
|
|
820
|
-
points.map(function(p, i) {
|
|
821
|
-
if (p.d._synth) return null;
|
|
822
|
-
return h('circle', { key: 'dot' + i, cx: p.x, cy: p.y, r: 4, fill: color, stroke: 'var(--bg-card)', strokeWidth: 2, style: { pointerEvents: 'none' } });
|
|
823
|
-
})
|
|
824
|
-
)
|
|
825
|
-
);
|
|
826
|
-
};
|
|
827
|
-
|
|
828
|
-
var renderBarChart = function(data, opts) {
|
|
829
|
-
if (!data || data.length === 0) return _noData();
|
|
830
|
-
// Horizontal bar chart — better for agent names (no truncation, scales to any count)
|
|
831
|
-
var labelMaxLen = data.reduce(function(m, d) { return Math.max(m, (d[opts.labelKey] || '').length); }, 0);
|
|
832
|
-
var labelW = Math.max(80, Math.min(160, labelMaxLen * 7.5));
|
|
833
|
-
var barH = 28, rowGap = 8;
|
|
834
|
-
var W = opts.width || 560;
|
|
835
|
-
var H = data.length * (barH + rowGap) + 24;
|
|
836
|
-
var barAreaW = W - labelW - 60; // space for label + value text
|
|
837
|
-
|
|
838
|
-
var vals = data.map(function(d) { return d[opts.valueKey] || 0; });
|
|
839
|
-
var maxV = Math.max.apply(null, vals.concat([1]));
|
|
840
|
-
|
|
841
|
-
return h('div', { style: { position: 'relative' } },
|
|
842
|
-
data.map(function(d, i) {
|
|
843
|
-
var val = d[opts.valueKey] || 0;
|
|
844
|
-
var pct = (val / maxV) * 100;
|
|
845
|
-
var color = CHART_COLORS[i % CHART_COLORS.length];
|
|
846
|
-
var label = d[opts.labelKey] || '';
|
|
847
|
-
var extra = d.avgConfidence != null ? [{ text: 'Confidence: ' + Math.round(d.avgConfidence * 100) + '%', color: 'var(--text-muted)' }] : [];
|
|
848
|
-
return h('div', {
|
|
849
|
-
key: 'bar' + i,
|
|
850
|
-
style: { display: 'flex', alignItems: 'center', gap: 10, marginBottom: rowGap, cursor: 'pointer' },
|
|
851
|
-
onMouseEnter: function(e) { showTip(e, [{ text: label, bold: true }, { text: 'Contributions: ' + val, dot: color }].concat(extra)); },
|
|
852
|
-
onMouseMove: function(e) { showTip(e, [{ text: label, bold: true }, { text: 'Contributions: ' + val, dot: color }].concat(extra)); },
|
|
853
|
-
onMouseLeave: hideTip
|
|
854
|
-
},
|
|
855
|
-
// Agent name
|
|
856
|
-
h('span', { style: { fontSize: 13, fontWeight: 500, minWidth: labelW, maxWidth: labelW, color: 'var(--text)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, label),
|
|
857
|
-
// Bar
|
|
858
|
-
h('div', { style: { flex: 1, height: barH, background: 'var(--bg-tertiary)', borderRadius: 6, overflow: 'hidden', position: 'relative' } },
|
|
859
|
-
h('div', {
|
|
860
|
-
style: {
|
|
861
|
-
width: Math.max(pct, 2) + '%', height: '100%', borderRadius: 6,
|
|
862
|
-
background: 'linear-gradient(90deg, ' + color + ', ' + color + 'aa)',
|
|
863
|
-
transition: 'width 0.4s ease'
|
|
864
|
-
}
|
|
865
|
-
})
|
|
866
|
-
),
|
|
867
|
-
// Value
|
|
868
|
-
h('span', { style: { fontSize: 13, fontWeight: 700, minWidth: 36, textAlign: 'right', color: color } }, val)
|
|
869
|
-
);
|
|
870
|
-
})
|
|
871
|
-
);
|
|
872
|
-
};
|
|
873
|
-
|
|
874
|
-
var renderDonutChart = function(data, opts) {
|
|
875
|
-
if (!data || data.length === 0) return _noData();
|
|
876
|
-
var size = opts.size || 180, cx = size / 2, cy = size / 2, r = size * 0.38, inner = r * 0.58;
|
|
877
|
-
var total = data.reduce(function(s, d) { return s + (d[opts.valueKey] || 0); }, 0) || 1;
|
|
878
|
-
var slices = [];
|
|
879
|
-
var angle = -Math.PI / 2;
|
|
880
|
-
data.forEach(function(d, i) {
|
|
881
|
-
var pct = (d[opts.valueKey] || 0) / total;
|
|
882
|
-
var startAngle = angle;
|
|
883
|
-
var endAngle = angle + pct * Math.PI * 2;
|
|
884
|
-
var large = pct > 0.5 ? 1 : 0;
|
|
885
|
-
var x1 = cx + r * Math.cos(startAngle), y1 = cy + r * Math.sin(startAngle);
|
|
886
|
-
var x2 = cx + r * Math.cos(endAngle), y2 = cy + r * Math.sin(endAngle);
|
|
887
|
-
var ix1 = cx + inner * Math.cos(startAngle), iy1 = cy + inner * Math.sin(startAngle);
|
|
888
|
-
var ix2 = cx + inner * Math.cos(endAngle), iy2 = cy + inner * Math.sin(endAngle);
|
|
889
|
-
if (pct > 0.001) {
|
|
890
|
-
slices.push({
|
|
891
|
-
d: 'M' + x1.toFixed(2) + ',' + y1.toFixed(2) + ' A' + r + ',' + r + ' 0 ' + large + ' 1 ' + x2.toFixed(2) + ',' + y2.toFixed(2) + ' L' + ix2.toFixed(2) + ',' + iy2.toFixed(2) + ' A' + inner + ',' + inner + ' 0 ' + large + ' 0 ' + ix1.toFixed(2) + ',' + iy1.toFixed(2) + ' Z',
|
|
892
|
-
color: CHART_COLORS[i % CHART_COLORS.length],
|
|
893
|
-
label: d[opts.labelKey] || '',
|
|
894
|
-
count: d[opts.valueKey] || 0,
|
|
895
|
-
pct: Math.round(pct * 100)
|
|
896
|
-
});
|
|
897
|
-
}
|
|
898
|
-
angle = endAngle;
|
|
899
|
-
});
|
|
900
|
-
|
|
901
|
-
return h('div', { style: { display: 'flex', alignItems: 'center', gap: 24, flexWrap: 'wrap' } },
|
|
902
|
-
h('svg', { viewBox: '0 0 ' + size + ' ' + size, style: { width: size, height: size, flexShrink: 0 } },
|
|
903
|
-
slices.map(function(s, i) {
|
|
904
|
-
return h('path', {
|
|
905
|
-
key: i, d: s.d, fill: s.color, cursor: 'pointer',
|
|
906
|
-
style: { transition: 'opacity 0.15s' },
|
|
907
|
-
onMouseEnter: function(e) { showTip(e, [{ text: s.label, bold: true }, { text: s.count + ' contributions (' + s.pct + '%)', dot: s.color }]); e.target.style.opacity = '0.8'; },
|
|
908
|
-
onMouseMove: function(e) { showTip(e, [{ text: s.label, bold: true }, { text: s.count + ' contributions (' + s.pct + '%)', dot: s.color }]); },
|
|
909
|
-
onMouseLeave: function(e) { hideTip(); e.target.style.opacity = '1'; }
|
|
910
|
-
});
|
|
911
|
-
}),
|
|
912
|
-
h('text', { x: cx, y: cy - 6, textAnchor: 'middle', fill: 'var(--text)', fontSize: 20, fontWeight: 700 }, total),
|
|
913
|
-
h('text', { x: cx, y: cy + 12, textAnchor: 'middle', fill: 'var(--text-muted)', fontSize: 10 }, 'total')
|
|
914
|
-
),
|
|
915
|
-
h('div', { style: { display: 'flex', flexDirection: 'column', gap: 6 } },
|
|
916
|
-
slices.map(function(s, i) {
|
|
917
|
-
return h('div', { key: i, style: { display: 'flex', alignItems: 'center', gap: 8, fontSize: 12 } },
|
|
918
|
-
h('div', { style: { width: 10, height: 10, borderRadius: 2, background: s.color, flexShrink: 0 } }),
|
|
919
|
-
h('span', { style: { fontWeight: 500, color: 'var(--text)' } }, s.label),
|
|
920
|
-
h('span', { style: { color: 'var(--text-muted)' } }, s.count + ' (' + s.pct + '%)')
|
|
921
|
-
);
|
|
922
|
-
})
|
|
923
|
-
)
|
|
924
|
-
);
|
|
925
|
-
};
|
|
926
|
-
|
|
927
|
-
var renderConfidenceBand = function(data) {
|
|
928
|
-
if (!data || data.length === 0) return _noData();
|
|
929
|
-
var W = 560, H = 200, pad = { top: 16, right: 16, bottom: 32, left: 44 };
|
|
930
|
-
var cW = W - pad.left - pad.right, cH = H - pad.top - pad.bottom;
|
|
931
|
-
var color = '#8b5cf6';
|
|
932
|
-
|
|
933
|
-
// Single data point: expand into 3 so we get a visible line
|
|
934
|
-
if (data.length === 1) {
|
|
935
|
-
var d0 = data[0];
|
|
936
|
-
data = [
|
|
937
|
-
Object.assign({}, d0, { _synth: true }),
|
|
938
|
-
d0,
|
|
939
|
-
Object.assign({}, d0, { _synth: true })
|
|
940
|
-
];
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
// Map data to points — same structure as line chart
|
|
944
|
-
var points = data.map(function(d, i) {
|
|
945
|
-
var x = pad.left + (i / (data.length - 1)) * cW;
|
|
946
|
-
return { x: x, y: pad.top + cH - (d.avgConfidence || 0) * cH, d: d };
|
|
947
|
-
});
|
|
948
|
-
|
|
949
|
-
// Reuse line chart's smooth curve function (catmull-rom)
|
|
950
|
-
var smoothPath = function(pts) {
|
|
951
|
-
if (pts.length < 2) return 'M' + pts[0].x + ',' + pts[0].y;
|
|
952
|
-
if (pts.length === 2) return 'M' + pts[0].x + ',' + pts[0].y + ' L' + pts[1].x + ',' + pts[1].y;
|
|
953
|
-
var d = 'M' + pts[0].x.toFixed(1) + ',' + pts[0].y.toFixed(1);
|
|
954
|
-
for (var i = 0; i < pts.length - 1; i++) {
|
|
955
|
-
var p0 = pts[Math.max(0, i - 1)], p1 = pts[i], p2 = pts[i + 1], p3 = pts[Math.min(pts.length - 1, i + 2)];
|
|
956
|
-
var cp1x = p1.x + (p2.x - p0.x) / 6, cp1y = p1.y + (p2.y - p0.y) / 6;
|
|
957
|
-
var cp2x = p2.x - (p3.x - p1.x) / 6, cp2y = p2.y - (p3.y - p1.y) / 6;
|
|
958
|
-
d += ' C' + cp1x.toFixed(1) + ',' + cp1y.toFixed(1) + ' ' + cp2x.toFixed(1) + ',' + cp2y.toFixed(1) + ' ' + p2.x.toFixed(1) + ',' + p2.y.toFixed(1);
|
|
959
|
-
}
|
|
960
|
-
return d;
|
|
961
|
-
};
|
|
962
|
-
|
|
963
|
-
var linePath = smoothPath(points);
|
|
964
|
-
var areaPath = linePath + ' L' + points[points.length - 1].x.toFixed(1) + ',' + (pad.top + cH) + ' L' + points[0].x.toFixed(1) + ',' + (pad.top + cH) + ' Z';
|
|
965
|
-
|
|
966
|
-
// Y labels
|
|
967
|
-
var yLabels = [
|
|
968
|
-
{ val: '0%', y: pad.top + cH },
|
|
969
|
-
{ val: '50%', y: pad.top + cH / 2 },
|
|
970
|
-
{ val: '100%', y: pad.top }
|
|
971
|
-
];
|
|
972
|
-
|
|
973
|
-
// X labels
|
|
974
|
-
var xStep = Math.max(1, Math.ceil(data.length / 6));
|
|
975
|
-
var xLabels = [];
|
|
976
|
-
data.forEach(function(d, i) {
|
|
977
|
-
if (i % xStep === 0 || i === data.length - 1) {
|
|
978
|
-
var x = pad.left + (data.length === 1 ? cW / 2 : (i / (data.length - 1)) * cW);
|
|
979
|
-
var raw = d.week || '';
|
|
980
|
-
var label = raw ? new Date(raw).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) : '';
|
|
981
|
-
xLabels.push({ x: x, label: label });
|
|
982
|
-
}
|
|
983
|
-
});
|
|
984
|
-
|
|
985
|
-
var _confTip = function(d) {
|
|
986
|
-
return [
|
|
987
|
-
{ text: 'Week of ' + _fmtDate(d.week), bold: true },
|
|
988
|
-
{ text: 'Avg: ' + Math.round((d.avgConfidence || 0) * 100) + '%', dot: color },
|
|
989
|
-
{ text: 'Min: ' + Math.round((d.minConfidence || 0) * 100) + '%', color: 'var(--text-muted)' },
|
|
990
|
-
{ text: 'Max: ' + Math.round((d.maxConfidence || 0) * 100) + '%', color: 'var(--text-muted)' },
|
|
991
|
-
{ text: d.count + ' contributions' }
|
|
992
|
-
];
|
|
993
|
-
};
|
|
994
|
-
|
|
995
|
-
return h('div', { style: { position: 'relative' } },
|
|
996
|
-
h('svg', { viewBox: '0 0 ' + W + ' ' + H, style: { width: '100%', maxWidth: W, height: 'auto', display: 'block' } },
|
|
997
|
-
h('defs', null,
|
|
998
|
-
h('linearGradient', { id: 'confGrad', x1: 0, y1: 0, x2: 0, y2: 1 },
|
|
999
|
-
h('stop', { offset: '0%', stopColor: color, stopOpacity: 0.2 }),
|
|
1000
|
-
h('stop', { offset: '100%', stopColor: color, stopOpacity: 0.02 })
|
|
1001
|
-
)
|
|
1002
|
-
),
|
|
1003
|
-
// Y labels
|
|
1004
|
-
yLabels.map(function(yl, i) {
|
|
1005
|
-
return h('text', { key: 'yl' + i, x: pad.left - 8, y: yl.y + 4, textAnchor: 'end', fill: 'var(--text-muted)', fontSize: 10 }, yl.val);
|
|
1006
|
-
}),
|
|
1007
|
-
// X labels
|
|
1008
|
-
xLabels.map(function(xl, i) {
|
|
1009
|
-
return h('text', { key: 'xl' + i, x: xl.x, y: H - 6, textAnchor: 'middle', fill: 'var(--text-muted)', fontSize: 10 }, xl.label);
|
|
1010
|
-
}),
|
|
1011
|
-
// Area fill
|
|
1012
|
-
h('path', { d: areaPath, fill: 'url(#confGrad)' }),
|
|
1013
|
-
// Line
|
|
1014
|
-
h('path', { d: linePath, fill: 'none', stroke: color, strokeWidth: 2.5, strokeLinecap: 'round', strokeLinejoin: 'round' }),
|
|
1015
|
-
// Hit areas (invisible, wide) — skip synthetic
|
|
1016
|
-
points.map(function(p, i) {
|
|
1017
|
-
if (p.d._synth) return null;
|
|
1018
|
-
return h('circle', {
|
|
1019
|
-
key: 'hit' + i, cx: p.x, cy: p.y, r: 14, fill: 'transparent', cursor: 'pointer',
|
|
1020
|
-
onMouseEnter: function(e) { showTip(e, _confTip(p.d)); },
|
|
1021
|
-
onMouseMove: function(e) { showTip(e, _confTip(p.d)); },
|
|
1022
|
-
onMouseLeave: hideTip
|
|
1023
|
-
});
|
|
1024
|
-
}),
|
|
1025
|
-
// Visible dots — skip synthetic
|
|
1026
|
-
points.map(function(p, i) {
|
|
1027
|
-
if (p.d._synth) return null;
|
|
1028
|
-
return h('circle', { key: 'dot' + i, cx: p.x, cy: p.y, r: 4, fill: color, stroke: 'var(--bg-card)', strokeWidth: 2, style: { pointerEvents: 'none' } });
|
|
1029
|
-
})
|
|
1030
|
-
)
|
|
1031
|
-
);
|
|
1032
|
-
};
|
|
1033
|
-
|
|
1034
|
-
var renderStats = function() {
|
|
1035
|
-
var td = timelineData || {};
|
|
1036
|
-
var timeline = td.timeline || [];
|
|
1037
|
-
var byAgent = td.byAgent || [];
|
|
1038
|
-
var byCategory = td.byCategory || [];
|
|
1039
|
-
var confOverTime = td.confidenceOverTime || [];
|
|
1040
|
-
var agentDaily = td.agentDaily || [];
|
|
1041
|
-
|
|
1042
|
-
return h(Fragment, null,
|
|
1043
|
-
// Summary stat cards
|
|
1044
|
-
h('div', { className: 'stat-grid', style: { marginBottom: 24 } },
|
|
1045
|
-
h('div', { className: 'stat-card' },
|
|
1046
|
-
h('div', { className: 'stat-value' }, stats.totalBases != null ? stats.totalBases : bases.length),
|
|
1047
|
-
h('div', { className: 'stat-label' }, 'Knowledge Bases')
|
|
1048
|
-
),
|
|
1049
|
-
h('div', { className: 'stat-card' },
|
|
1050
|
-
h('div', { className: 'stat-value' }, stats.totalEntries != null ? stats.totalEntries : 0),
|
|
1051
|
-
h('div', { className: 'stat-label' }, 'Total Contributions')
|
|
1052
|
-
),
|
|
1053
|
-
h('div', { className: 'stat-card' },
|
|
1054
|
-
h('div', { className: 'stat-value' }, stats.totalContributors != null ? stats.totalContributors : 0),
|
|
1055
|
-
h('div', { className: 'stat-label' }, 'Active Contributors')
|
|
1056
|
-
),
|
|
1057
|
-
h('div', { className: 'stat-card' },
|
|
1058
|
-
h('div', { className: 'stat-value' },
|
|
1059
|
-
byAgent.length > 0 ? Math.round(byAgent.reduce(function(s, a) { return s + a.avgConfidence; }, 0) / byAgent.length * 100) + '%' : '-'
|
|
1060
|
-
),
|
|
1061
|
-
h('div', { className: 'stat-label' }, 'Avg Confidence')
|
|
1062
|
-
)
|
|
1063
|
-
),
|
|
1064
|
-
|
|
1065
|
-
// Filter bar
|
|
1066
|
-
h('div', { style: { display: 'flex', gap: 10, marginBottom: 20, flexWrap: 'wrap', alignItems: 'center' } },
|
|
1067
|
-
h('select', {
|
|
1068
|
-
value: chartDays,
|
|
1069
|
-
onChange: function(e) { setChartDays(parseInt(e.target.value)); },
|
|
1070
|
-
style: { padding: '6px 10px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 12 }
|
|
1071
|
-
},
|
|
1072
|
-
h('option', { value: 7 }, 'Last 7 days'),
|
|
1073
|
-
h('option', { value: 14 }, 'Last 14 days'),
|
|
1074
|
-
h('option', { value: 30 }, 'Last 30 days'),
|
|
1075
|
-
h('option', { value: 60 }, 'Last 60 days'),
|
|
1076
|
-
h('option', { value: 90 }, 'Last 90 days')
|
|
1077
|
-
),
|
|
1078
|
-
h('select', {
|
|
1079
|
-
value: chartAgent,
|
|
1080
|
-
onChange: function(e) { setChartAgent(e.target.value); },
|
|
1081
|
-
style: { padding: '6px 10px', borderRadius: 8, border: '1px solid var(--border)', background: 'var(--bg-card)', color: 'var(--text)', fontSize: 12 }
|
|
1082
|
-
},
|
|
1083
|
-
h('option', { value: '' }, 'All agents'),
|
|
1084
|
-
agents.map(function(a) { return h('option', { key: a.id, value: a.id }, a.config && a.config.identity && a.config.identity.name || a.name || a.id); })
|
|
1085
|
-
),
|
|
1086
|
-
h('button', { className: 'btn btn-ghost btn-sm', onClick: loadTimeline }, I.refresh(), ' Refresh')
|
|
1087
|
-
),
|
|
1088
|
-
|
|
1089
|
-
// Row 1: two charts side by side
|
|
1090
|
-
h('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 20, marginBottom: 20 } },
|
|
1091
|
-
h('div', { className: 'card' },
|
|
1092
|
-
h('div', { className: 'card-header' }, h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Contributions Over Time', h(HelpButton, { label: 'Contributions Over Time' },
|
|
1093
|
-
h('p', null, 'Shows how many knowledge entries agents contributed each day over the selected time period.'),
|
|
1094
|
-
h('h4', { style: _h4 }, 'What to look for'),
|
|
1095
|
-
h('ul', { style: _ul },
|
|
1096
|
-
h('li', null, h('strong', null, 'Rising trend'), ' \u2014 Your team is actively learning and sharing more knowledge over time.'),
|
|
1097
|
-
h('li', null, h('strong', null, 'Spikes'), ' \u2014 May indicate specific events (new product launch, incident resolution) that generated lots of insights.'),
|
|
1098
|
-
h('li', null, h('strong', null, 'Gaps'), ' \u2014 Days with zero contributions. Consider encouraging agents to share what they learn daily.')
|
|
1099
|
-
),
|
|
1100
|
-
h('div', { style: _tip }, 'Tip: Hover over any data point to see the exact date and contribution count.')
|
|
1101
|
-
))),
|
|
1102
|
-
h('div', { className: 'card-body', style: { padding: 16 } },
|
|
1103
|
-
renderLineChart(timeline, { valueKey: 'count', labelKey: 'day', color: '#6366f1', width: 560, height: 200, id: 'contribs', valueLabel: 'Contributions' })
|
|
1104
|
-
)
|
|
1105
|
-
),
|
|
1106
|
-
h('div', { className: 'card' },
|
|
1107
|
-
h('div', { className: 'card-header' },
|
|
1108
|
-
h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Confidence Level Over Time', h(HelpButton, { label: 'Confidence Level Over Time' },
|
|
1109
|
-
h('p', null, 'Tracks the average confidence level of agent contributions over time. Confidence is a 0\u2013100% score indicating how certain the agent is about the accuracy of the knowledge it shared.'),
|
|
1110
|
-
h('h4', { style: _h4 }, 'What to look for'),
|
|
1111
|
-
h('ul', { style: _ul },
|
|
1112
|
-
h('li', null, h('strong', null, 'High confidence (80%+)'), ' \u2014 Agents are sharing well-verified, reliable knowledge.'),
|
|
1113
|
-
h('li', null, h('strong', null, 'Low confidence (<50%)'), ' \u2014 Agents may be sharing uncertain or speculative information. Consider reviewing those entries.'),
|
|
1114
|
-
h('li', null, h('strong', null, 'Rising trend'), ' \u2014 Knowledge quality is improving as agents learn and refine what they share.')
|
|
1115
|
-
),
|
|
1116
|
-
h('div', { style: _tip }, 'Tip: Hover over data points to see the exact average, min, and max confidence for each week.')
|
|
1117
|
-
)),
|
|
1118
|
-
h('p', { style: { fontSize: 11, color: 'var(--text-muted)', marginTop: 2 } }, 'Average confidence across all contributions')
|
|
1119
|
-
),
|
|
1120
|
-
h('div', { className: 'card-body', style: { padding: 16 } },
|
|
1121
|
-
renderConfidenceBand(confOverTime)
|
|
1122
|
-
)
|
|
1123
|
-
)
|
|
1124
|
-
),
|
|
1125
|
-
|
|
1126
|
-
// Row 2: two charts side by side
|
|
1127
|
-
h('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 20, marginBottom: 20 } },
|
|
1128
|
-
h('div', { className: 'card' },
|
|
1129
|
-
h('div', { className: 'card-header' }, h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Contributions by Agent', h(HelpButton, { label: 'Contributions by Agent' },
|
|
1130
|
-
h('p', null, 'Compares how much each agent is contributing to the shared knowledge base over the selected time period.'),
|
|
1131
|
-
h('h4', { style: _h4 }, 'What to look for'),
|
|
1132
|
-
h('ul', { style: _ul },
|
|
1133
|
-
h('li', null, h('strong', null, 'Even distribution'), ' \u2014 All agents are actively contributing. Healthy knowledge-sharing culture.'),
|
|
1134
|
-
h('li', null, h('strong', null, 'One dominant agent'), ' \u2014 Knowledge may be siloed. Encourage other agents to share their learnings.'),
|
|
1135
|
-
h('li', null, h('strong', null, 'Agents with zero'), ' \u2014 May need a contribution schedule or prompting to capture what they learn.')
|
|
1136
|
-
),
|
|
1137
|
-
h('div', { style: _tip }, 'Tip: Hover over any bar to see the agent\'s total count and average confidence score.')
|
|
1138
|
-
))),
|
|
1139
|
-
h('div', { className: 'card-body', style: { padding: 16 } },
|
|
1140
|
-
renderBarChart(byAgent, { valueKey: 'count', labelKey: 'agentName', width: 560, height: 220 })
|
|
1141
|
-
)
|
|
1142
|
-
),
|
|
1143
|
-
h('div', { className: 'card' },
|
|
1144
|
-
h('div', { className: 'card-header' }, h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Category Distribution', h(HelpButton, { label: 'Category Distribution' },
|
|
1145
|
-
h('p', null, 'Breaks down contributions by their importance category. Shows what type of knowledge agents are capturing most frequently.'),
|
|
1146
|
-
h('h4', { style: _h4 }, 'What to look for'),
|
|
1147
|
-
h('ul', { style: _ul },
|
|
1148
|
-
h('li', null, h('strong', null, 'Mostly "high" importance'), ' \u2014 Agents are focused on capturing critical knowledge. Great for incident response and decision-making.'),
|
|
1149
|
-
h('li', null, h('strong', null, 'Mostly "low" importance'), ' \u2014 Consider guiding agents to prioritize more impactful insights.'),
|
|
1150
|
-
h('li', null, h('strong', null, 'Balanced mix'), ' \u2014 Healthy distribution across all knowledge types.')
|
|
1151
|
-
),
|
|
1152
|
-
h('div', { style: _tip }, 'Tip: Hover over any slice to see the exact count and percentage for that category.')
|
|
1153
|
-
))),
|
|
1154
|
-
h('div', { className: 'card-body', style: { padding: 16, display: 'flex', justifyContent: 'center' } },
|
|
1155
|
-
renderDonutChart(byCategory, { valueKey: 'count', labelKey: 'category', size: 180 })
|
|
1156
|
-
)
|
|
1157
|
-
)
|
|
1158
|
-
),
|
|
1159
|
-
|
|
1160
|
-
// 5. Agent Confidence Comparison (horizontal bars)
|
|
1161
|
-
byAgent.length > 0 && h('div', { className: 'card', style: { marginBottom: 20 } },
|
|
1162
|
-
h('div', { className: 'card-header' }, h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Agent Quality Comparison', h(HelpButton, { label: 'Agent Quality Comparison' },
|
|
1163
|
-
h('p', null, 'A side-by-side view of each agent\'s contribution volume and average confidence score. Helps assess both the quantity and quality of knowledge sharing.'),
|
|
1164
|
-
h('h4', { style: _h4 }, 'Reading the bars'),
|
|
1165
|
-
h('ul', { style: _ul },
|
|
1166
|
-
h('li', null, h('strong', null, 'Contributions bar'), ' \u2014 How many entries the agent contributed, relative to the top contributor.'),
|
|
1167
|
-
h('li', null, h('strong', null, 'Confidence bar'), ' \u2014 The agent\'s average confidence. Green (80%+) = high quality, yellow (50\u201380%) = moderate, red (<50%) = needs review.')
|
|
1168
|
-
),
|
|
1169
|
-
h('div', { style: _tip }, 'Tip: An agent with fewer contributions but high confidence may be more valuable than one with many low-confidence entries.')
|
|
1170
|
-
))),
|
|
1171
|
-
h('div', { className: 'card-body' },
|
|
1172
|
-
byAgent.map(function(agent, i) {
|
|
1173
|
-
var confPct = Math.round((agent.avgConfidence || 0) * 100);
|
|
1174
|
-
var confColor = confPct >= 80 ? 'var(--success)' : confPct >= 50 ? 'var(--warning)' : 'var(--danger)';
|
|
1175
|
-
return h('div', { key: agent.agentId, style: { display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 } },
|
|
1176
|
-
h('div', { style: { width: 10, height: 10, borderRadius: '50%', background: CHART_COLORS[i % CHART_COLORS.length], flexShrink: 0 } }),
|
|
1177
|
-
h('span', { style: { fontSize: 13, fontWeight: 500, minWidth: 100 } }, agent.agentName),
|
|
1178
|
-
h('div', { style: { flex: 1, display: 'flex', flexDirection: 'column', gap: 3 } },
|
|
1179
|
-
// Contribution count bar
|
|
1180
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 6 } },
|
|
1181
|
-
h('span', { style: { fontSize: 10, color: 'var(--text-muted)', minWidth: 70 } }, 'Contributions'),
|
|
1182
|
-
h('div', { style: { flex: 1, height: 8, background: 'var(--bg-tertiary)', borderRadius: 4, overflow: 'hidden' } },
|
|
1183
|
-
h('div', { style: { width: Math.round((agent.count / (byAgent[0].count || 1)) * 100) + '%', height: '100%', background: CHART_COLORS[i % CHART_COLORS.length], borderRadius: 4 } })
|
|
1184
|
-
),
|
|
1185
|
-
h('span', { style: { fontSize: 11, fontWeight: 600, minWidth: 30 } }, agent.count)
|
|
1186
|
-
),
|
|
1187
|
-
// Confidence bar
|
|
1188
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 6 } },
|
|
1189
|
-
h('span', { style: { fontSize: 10, color: 'var(--text-muted)', minWidth: 70 } }, 'Confidence'),
|
|
1190
|
-
h('div', { style: { flex: 1, height: 8, background: 'var(--bg-tertiary)', borderRadius: 4, overflow: 'hidden' } },
|
|
1191
|
-
h('div', { style: { width: confPct + '%', height: '100%', background: confColor, borderRadius: 4 } })
|
|
1192
|
-
),
|
|
1193
|
-
h('span', { style: { fontSize: 11, fontWeight: 600, minWidth: 30 } }, confPct + '%')
|
|
1194
|
-
)
|
|
1195
|
-
)
|
|
1196
|
-
);
|
|
1197
|
-
})
|
|
1198
|
-
)
|
|
1199
|
-
),
|
|
1200
|
-
|
|
1201
|
-
// 6. Daily heatmap-style table if multiple agents
|
|
1202
|
-
agentDaily.length > 0 && h('div', { className: 'card' },
|
|
1203
|
-
h('div', { className: 'card-header' }, h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Daily Activity Breakdown', h(HelpButton, { label: 'Daily Activity Breakdown' },
|
|
1204
|
-
h('p', null, 'A heatmap showing which agents contributed on which days. Each cell represents one agent\'s activity on one day.'),
|
|
1205
|
-
h('h4', { style: _h4 }, 'Reading the heatmap'),
|
|
1206
|
-
h('ul', { style: _ul },
|
|
1207
|
-
h('li', null, h('strong', null, 'Darker cells'), ' \u2014 More contributions on that day. The color intensity scales with the count.'),
|
|
1208
|
-
h('li', null, h('strong', null, 'Empty cells'), ' \u2014 No contributions from that agent on that day.'),
|
|
1209
|
-
h('li', null, h('strong', null, 'Patterns'), ' \u2014 Look for weekday vs weekend differences, or agents that contribute in bursts vs steadily.')
|
|
1210
|
-
),
|
|
1211
|
-
h('div', { style: _tip }, 'Tip: Each agent gets a unique color so you can quickly scan across rows to see activity patterns.')
|
|
1212
|
-
))),
|
|
1213
|
-
h('div', { className: 'card-body', style: { overflowX: 'auto' } },
|
|
1214
|
-
function() {
|
|
1215
|
-
// Build a grid: rows = agents, columns = days
|
|
1216
|
-
var agentNames = {};
|
|
1217
|
-
var daySet = {};
|
|
1218
|
-
agentDaily.forEach(function(r) {
|
|
1219
|
-
agentNames[r.agentId] = r.agentName;
|
|
1220
|
-
daySet[r.day] = true;
|
|
1221
|
-
});
|
|
1222
|
-
var uniqueAgents = Object.keys(agentNames);
|
|
1223
|
-
var days = Object.keys(daySet).sort();
|
|
1224
|
-
var maxCount = agentDaily.reduce(function(m, r) { return Math.max(m, r.count); }, 1);
|
|
1225
|
-
|
|
1226
|
-
return h('table', { style: { width: '100%', borderCollapse: 'collapse', fontSize: 12 } },
|
|
1227
|
-
h('thead', null,
|
|
1228
|
-
h('tr', null,
|
|
1229
|
-
h('th', { style: { textAlign: 'left', padding: '6px 8px', borderBottom: '1px solid var(--border)', fontSize: 11, color: 'var(--text-muted)' } }, 'Agent'),
|
|
1230
|
-
days.map(function(d) {
|
|
1231
|
-
return h('th', { key: d, style: { textAlign: 'center', padding: '6px 4px', borderBottom: '1px solid var(--border)', fontSize: 10, color: 'var(--text-muted)' } },
|
|
1232
|
-
new Date(d).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })
|
|
1233
|
-
);
|
|
1234
|
-
})
|
|
1235
|
-
)
|
|
1236
|
-
),
|
|
1237
|
-
h('tbody', null,
|
|
1238
|
-
uniqueAgents.map(function(agId, ai) {
|
|
1239
|
-
return h('tr', { key: agId },
|
|
1240
|
-
h('td', { style: { padding: '6px 8px', fontWeight: 500 } }, agentNames[agId]),
|
|
1241
|
-
days.map(function(d) {
|
|
1242
|
-
var match = agentDaily.find(function(r) { return r.agentId === agId && r.day === d; });
|
|
1243
|
-
var cnt = match ? match.count : 0;
|
|
1244
|
-
var opacity = cnt > 0 ? 0.2 + (cnt / maxCount) * 0.8 : 0;
|
|
1245
|
-
var bg = cnt > 0 ? CHART_COLORS[ai % CHART_COLORS.length] : 'transparent';
|
|
1246
|
-
return h('td', { key: d, style: { textAlign: 'center', padding: '4px' } },
|
|
1247
|
-
h('div', {
|
|
1248
|
-
style: {
|
|
1249
|
-
width: 28, height: 28, borderRadius: 4, display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
|
|
1250
|
-
background: bg, opacity: opacity > 0 ? opacity : undefined,
|
|
1251
|
-
color: opacity > 0.5 ? '#fff' : 'var(--text-muted)', fontSize: 10, fontWeight: 600
|
|
1252
|
-
}
|
|
1253
|
-
}, cnt > 0 ? cnt : '')
|
|
1254
|
-
);
|
|
1255
|
-
})
|
|
1256
|
-
);
|
|
1257
|
-
})
|
|
1258
|
-
)
|
|
1259
|
-
);
|
|
1260
|
-
}()
|
|
1261
|
-
)
|
|
1262
|
-
)
|
|
1263
|
-
);
|
|
1264
|
-
};
|
|
1265
|
-
|
|
1266
|
-
// ── Search Metrics Tab ─────────────────────────
|
|
1267
|
-
|
|
1268
|
-
var loadSearchMetrics = function() {
|
|
1269
|
-
var url = '/knowledge-contribution/search-metrics?days=' + searchDays;
|
|
1270
|
-
if (searchAgentFilter) url += '&agentId=' + searchAgentFilter;
|
|
1271
|
-
engineCall(url).then(function(d) { setSearchMetrics(d); }).catch(function() { setSearchMetrics(null); });
|
|
1272
|
-
};
|
|
1273
|
-
|
|
1274
|
-
var renderSearchMetrics = function() {
|
|
1275
|
-
if (!searchMetrics && tab === 'searchMetrics') {
|
|
1276
|
-
loadSearchMetrics();
|
|
1277
|
-
}
|
|
1278
|
-
var m = searchMetrics;
|
|
1279
|
-
|
|
1280
|
-
return h('div', null,
|
|
1281
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 16 } },
|
|
1282
|
-
h('span', { style: { fontSize: 14, fontWeight: 600 } }, 'Search Metrics'),
|
|
1283
|
-
h(HelpButton, { label: 'Search Metrics' },
|
|
1284
|
-
h('p', null, 'Track how agents are searching your knowledge bases. This helps you understand which bases are useful and where there are gaps.'),
|
|
1285
|
-
h('h4', { style: _h4 }, 'Key Metrics'),
|
|
1286
|
-
h('ul', { style: _ul },
|
|
1287
|
-
h('li', null, h('strong', null, 'Total Searches'), ' — How many times agents searched knowledge bases in the selected period.'),
|
|
1288
|
-
h('li', null, h('strong', null, 'KB vs Hub Searches'), ' — KB searches target a specific knowledge base; Hub searches query across all bases.'),
|
|
1289
|
-
h('li', null, h('strong', null, 'Hit Rate'), ' — Percentage of searches that returned useful results. Low hit rates mean agents are searching for things not in your knowledge bases.'),
|
|
1290
|
-
h('li', null, h('strong', null, 'Avg Results'), ' — Average number of results per search. Too few = gaps in content; too many = content may be too broad.')
|
|
1291
|
-
),
|
|
1292
|
-
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'If hit rate is low, check the "Top Queries with No Results" section to see what\'s missing from your knowledge bases, then import relevant content.')
|
|
1293
|
-
)
|
|
1294
|
-
),
|
|
1295
|
-
// Filters
|
|
1296
|
-
h('div', { style: { display: 'flex', gap: 12, marginBottom: 20 } },
|
|
1297
|
-
h('select', {
|
|
1298
|
-
className: 'input', style: { width: 140 },
|
|
1299
|
-
value: searchDays,
|
|
1300
|
-
onChange: function(e) { setSearchDays(parseInt(e.target.value)); setTimeout(loadSearchMetrics, 100); }
|
|
1301
|
-
},
|
|
1302
|
-
h('option', { value: 7 }, 'Last 7 days'),
|
|
1303
|
-
h('option', { value: 14 }, 'Last 14 days'),
|
|
1304
|
-
h('option', { value: 30 }, 'Last 30 days')
|
|
1305
|
-
),
|
|
1306
|
-
agents.length > 0 && h('select', {
|
|
1307
|
-
className: 'input', style: { width: 180 },
|
|
1308
|
-
value: searchAgentFilter,
|
|
1309
|
-
onChange: function(e) { setSearchAgentFilter(e.target.value); setTimeout(loadSearchMetrics, 100); }
|
|
1310
|
-
},
|
|
1311
|
-
h('option', { value: '' }, 'All Agents'),
|
|
1312
|
-
agents.map(function(a) { return h('option', { key: a.id, value: a.id }, a.name || a.id); })
|
|
1313
|
-
),
|
|
1314
|
-
h('button', { className: 'btn btn-ghost', onClick: loadSearchMetrics }, I.refresh(), ' Refresh')
|
|
1315
|
-
),
|
|
1316
|
-
|
|
1317
|
-
!m ? h('div', { style: { textAlign: 'center', padding: 40, color: 'var(--text-muted)' } }, 'Loading search metrics...') :
|
|
1318
|
-
m.totalSearches === 0 ? h('div', { style: { textAlign: 'center', padding: 40, color: 'var(--text-muted)' } },
|
|
1319
|
-
h('div', { style: { fontSize: 48, marginBottom: 12 } }, I.search()),
|
|
1320
|
-
h('div', { style: { fontSize: 18, fontWeight: 600, marginBottom: 8 } }, 'No searches yet'),
|
|
1321
|
-
h('div', null, 'Agents will show up here once they start using knowledge_base_search and knowledge_hub_search tools.')
|
|
1322
|
-
) :
|
|
1323
|
-
h(Fragment, null,
|
|
1324
|
-
// Summary cards
|
|
1325
|
-
h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 16, marginBottom: 24 } },
|
|
1326
|
-
_metricCard('Total Searches', m.totalSearches, I.search()),
|
|
1327
|
-
_metricCard('KB Searches', m.kbSearches, I.database()),
|
|
1328
|
-
_metricCard('Hub Searches', m.hubSearches, I.brain()),
|
|
1329
|
-
_metricCard('Hit Rate', m.hitRate + '%', I.check(), m.hitRate >= 50 ? 'var(--success)' : m.hitRate >= 25 ? 'var(--warning)' : 'var(--error)')
|
|
1330
|
-
),
|
|
1331
|
-
|
|
1332
|
-
// By agent breakdown
|
|
1333
|
-
Object.keys(m.byAgent || {}).length > 0 && h('div', { className: 'card', style: { marginBottom: 20, padding: 16 } },
|
|
1334
|
-
h('h3', { style: { marginBottom: 12 } }, 'Search Efficiency by Agent'),
|
|
1335
|
-
h('table', { className: 'table', style: { width: '100%' } },
|
|
1336
|
-
h('thead', null,
|
|
1337
|
-
h('tr', null,
|
|
1338
|
-
h('th', null, 'Agent'),
|
|
1339
|
-
h('th', { style: { textAlign: 'right' } }, 'Total'),
|
|
1340
|
-
h('th', { style: { textAlign: 'right' } }, 'Helpful'),
|
|
1341
|
-
h('th', { style: { textAlign: 'right' } }, 'Hit Rate')
|
|
1342
|
-
)
|
|
1343
|
-
),
|
|
1344
|
-
h('tbody', null,
|
|
1345
|
-
Object.entries(m.byAgent).map(function(entry) {
|
|
1346
|
-
var aid = entry[0], d = entry[1];
|
|
1347
|
-
var agentName = (agents.find(function(a) { return a.id === aid; }) || {}).name || aid;
|
|
1348
|
-
return h('tr', { key: aid },
|
|
1349
|
-
h('td', null, agentName),
|
|
1350
|
-
h('td', { style: { textAlign: 'right' } }, d.total),
|
|
1351
|
-
h('td', { style: { textAlign: 'right' } }, d.helpful),
|
|
1352
|
-
h('td', { style: { textAlign: 'right', color: d.hitRate >= 50 ? 'var(--success)' : d.hitRate >= 25 ? 'var(--warning)' : 'var(--error)' } },
|
|
1353
|
-
d.hitRate + '%')
|
|
1354
|
-
);
|
|
1355
|
-
})
|
|
1356
|
-
)
|
|
1357
|
-
)
|
|
1358
|
-
),
|
|
1359
|
-
|
|
1360
|
-
// Timeline
|
|
1361
|
-
(m.timeline || []).length > 0 && h('div', { className: 'card', style: { marginBottom: 20, padding: 16 } },
|
|
1362
|
-
h('h3', { style: { marginBottom: 12 } }, 'Search Activity Over Time'),
|
|
1363
|
-
h('div', { style: { display: 'flex', gap: 4, alignItems: 'flex-end', height: 120 } },
|
|
1364
|
-
m.timeline.map(function(day) {
|
|
1365
|
-
var maxVal = Math.max.apply(null, m.timeline.map(function(d) { return d.kb + d.hub; })) || 1;
|
|
1366
|
-
var total = day.kb + day.hub;
|
|
1367
|
-
var height = Math.max(4, (total / maxVal) * 100);
|
|
1368
|
-
var helpfulPct = total > 0 ? day.helpful / total : 0;
|
|
1369
|
-
return h('div', { key: day.date, style: { flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
1370
|
-
h('div', { style: { fontSize: 10, color: 'var(--text-muted)', marginBottom: 4 } }, total),
|
|
1371
|
-
h('div', {
|
|
1372
|
-
style: {
|
|
1373
|
-
width: '100%', maxWidth: 40, height: height + '%', minHeight: 4,
|
|
1374
|
-
background: helpfulPct >= 0.5 ? 'var(--success)' : helpfulPct >= 0.25 ? 'var(--warning)' : 'var(--primary)',
|
|
1375
|
-
borderRadius: 3, opacity: 0.8
|
|
1376
|
-
},
|
|
1377
|
-
title: day.date + ': ' + total + ' searches (' + day.helpful + ' helpful)'
|
|
1378
|
-
}),
|
|
1379
|
-
h('div', { style: { fontSize: 9, color: 'var(--text-muted)', marginTop: 4, transform: 'rotate(-45deg)', whiteSpace: 'nowrap' } },
|
|
1380
|
-
day.date.slice(5))
|
|
1381
|
-
);
|
|
1382
|
-
})
|
|
1383
|
-
)
|
|
1384
|
-
),
|
|
1385
|
-
|
|
1386
|
-
// Recent searches
|
|
1387
|
-
(m.recent || []).length > 0 && h('div', { className: 'card', style: { padding: 16 } },
|
|
1388
|
-
h('h3', { style: { marginBottom: 12 } }, 'Recent Searches'),
|
|
1389
|
-
h('table', { className: 'table', style: { width: '100%' } },
|
|
1390
|
-
h('thead', null,
|
|
1391
|
-
h('tr', null,
|
|
1392
|
-
h('th', null, 'Agent'),
|
|
1393
|
-
h('th', null, 'Type'),
|
|
1394
|
-
h('th', null, 'Query'),
|
|
1395
|
-
h('th', { style: { textAlign: 'right' } }, 'Results'),
|
|
1396
|
-
h('th', { style: { textAlign: 'right' } }, 'Score'),
|
|
1397
|
-
h('th', null, 'Helpful'),
|
|
1398
|
-
h('th', null, 'Time')
|
|
1399
|
-
)
|
|
1400
|
-
),
|
|
1401
|
-
h('tbody', null,
|
|
1402
|
-
m.recent.map(function(r) {
|
|
1403
|
-
var agentName = (agents.find(function(a) { return a.id === r.agentId; }) || {}).name || r.agentId;
|
|
1404
|
-
return h('tr', { key: r.id },
|
|
1405
|
-
h('td', null, agentName),
|
|
1406
|
-
h('td', null, h('span', {
|
|
1407
|
-
className: 'badge',
|
|
1408
|
-
style: { background: r.type === 'knowledge_base' ? 'var(--primary)' : 'var(--info)', color: 'white', fontSize: 11 }
|
|
1409
|
-
}, r.type === 'knowledge_base' ? 'KB' : 'Hub')),
|
|
1410
|
-
h('td', { style: { maxWidth: 200, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, r.query),
|
|
1411
|
-
h('td', { style: { textAlign: 'right' } }, r.results),
|
|
1412
|
-
h('td', { style: { textAlign: 'right' } }, r.topScore ? (r.topScore * 100).toFixed(0) + '%' : '-'),
|
|
1413
|
-
h('td', null, r.helpful ? h('span', { style: { color: 'var(--success)' } }, '\u2713') : h('span', { style: { color: 'var(--text-muted)' } }, '\u2717')),
|
|
1414
|
-
h('td', { style: { fontSize: 12, color: 'var(--text-muted)' } }, _fmtSearchTime(r.timestamp))
|
|
1415
|
-
);
|
|
1416
|
-
})
|
|
1417
|
-
)
|
|
1418
|
-
)
|
|
1419
|
-
)
|
|
1420
|
-
)
|
|
1421
|
-
);
|
|
1422
|
-
};
|
|
1423
|
-
|
|
1424
|
-
// ── Tab labels ──────────────────────────────
|
|
1425
|
-
var tabDefs = [
|
|
1426
|
-
{ key: 'bases', label: 'Knowledge Bases', icon: I.knowledge },
|
|
1427
|
-
{ key: 'contributions', label: 'Contributions', icon: I.edit },
|
|
1428
|
-
{ key: 'schedules', label: 'Schedules', icon: I.calendar },
|
|
1429
|
-
{ key: 'stats', label: 'Stats', icon: I.chart },
|
|
1430
|
-
{ key: 'searchMetrics', label: 'Search Metrics', icon: I.search }
|
|
1431
|
-
];
|
|
1432
|
-
|
|
1433
|
-
return h(Fragment, null,
|
|
1434
|
-
// Org context switcher
|
|
1435
|
-
h(orgCtx.Switcher),
|
|
1436
|
-
|
|
1437
|
-
// Header
|
|
1438
|
-
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
|
|
1439
|
-
h('div', null,
|
|
1440
|
-
h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Knowledge Contributions',
|
|
1441
|
-
h(KnowledgeLink, { page: 'knowledge-contributions' }),
|
|
1442
|
-
h(HelpButton, { label: 'Knowledge Contributions' },
|
|
1443
|
-
h('p', null, 'This is where your agents build shared organizational knowledge. Agents contribute what they learn from conversations, tasks, and research into knowledge bases that all agents can search.'),
|
|
1444
|
-
h('h4', { style: _h4 }, 'Tabs'),
|
|
1445
|
-
h('ul', { style: _ul },
|
|
1446
|
-
h('li', null, h('strong', null, 'Knowledge Bases'), ' — Create and manage knowledge bases. Each is a collection of documents that agents can search via RAG (Retrieval-Augmented Generation).'),
|
|
1447
|
-
h('li', null, h('strong', null, 'Contributions'), ' — Browse individual knowledge entries that agents have contributed. Filter by agent, search by content, and review quality.'),
|
|
1448
|
-
h('li', null, h('strong', null, 'Schedules'), ' — Automate knowledge contributions on a schedule (e.g., weekly synthesis of learnings).'),
|
|
1449
|
-
h('li', null, h('strong', null, 'Stats'), ' — Charts showing contribution volume, confidence levels, category distribution, and agent quality over time.'),
|
|
1450
|
-
h('li', null, h('strong', null, 'Search Metrics'), ' — How agents are using knowledge search — query volume, hit rates, and which bases are most useful.')
|
|
1451
|
-
),
|
|
1452
|
-
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Start by creating a knowledge base, then enable knowledge contributions in each agent\'s Autonomy settings. Agents will automatically contribute what they learn.')
|
|
1453
|
-
)
|
|
1454
|
-
),
|
|
1455
|
-
h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } },
|
|
1456
|
-
'Collaborative knowledge building from agent memories and experiences'
|
|
1457
|
-
)
|
|
1458
|
-
),
|
|
1459
|
-
h('button', { className: 'btn btn-ghost', onClick: load }, I.refresh(), ' Refresh')
|
|
1460
|
-
),
|
|
1461
|
-
|
|
1462
|
-
// Tabs
|
|
1463
|
-
h('div', { className: 'tabs', style: { marginBottom: 16 } },
|
|
1464
|
-
tabDefs.map(function(td) {
|
|
1465
|
-
return h('button', {
|
|
1466
|
-
key: td.key,
|
|
1467
|
-
className: 'tab' + (tab === td.key ? ' active' : ''),
|
|
1468
|
-
onClick: function() { setTab(td.key); },
|
|
1469
|
-
style: { display: 'flex', alignItems: 'center', gap: 6 }
|
|
1470
|
-
}, td.icon(), td.label);
|
|
1471
|
-
})
|
|
1472
|
-
),
|
|
1473
|
-
|
|
1474
|
-
// Tab content
|
|
1475
|
-
tab === 'bases' && renderBases(),
|
|
1476
|
-
tab === 'contributions' && renderContributions(),
|
|
1477
|
-
tab === 'schedules' && renderSchedules(),
|
|
1478
|
-
tab === 'stats' && renderStats(),
|
|
1479
|
-
tab === 'searchMetrics' && renderSearchMetrics(),
|
|
1480
|
-
|
|
1481
|
-
// Tooltip overlay
|
|
1482
|
-
renderTooltip(),
|
|
1483
|
-
|
|
1484
|
-
// ── Contribution Detail Modal ────────────────────────
|
|
1485
|
-
selectedContrib && h(Modal, {
|
|
1486
|
-
title: selectedContrib.title || 'Contribution Detail',
|
|
1487
|
-
onClose: function() { setSelectedContrib(null); },
|
|
1488
|
-
footer: h('button', { className: 'btn btn-secondary', onClick: function() { setSelectedContrib(null); } }, 'Close')
|
|
1489
|
-
},
|
|
1490
|
-
h('div', { style: { display: 'flex', flexDirection: 'column', gap: 14 } },
|
|
1491
|
-
h('div', { style: { display: 'flex', gap: 20, flexWrap: 'wrap' } },
|
|
1492
|
-
h('div', null, h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Agent'), h('div', null, renderAgentBadge(selectedContrib.agentId, agentData))),
|
|
1493
|
-
h('div', null, h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Category'), h('div', null, selectedContrib.category || '-')),
|
|
1494
|
-
h('div', null, h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Importance'), h('div', null, selectedContrib.importance || '-')),
|
|
1495
|
-
h('div', null, h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Confidence'), h('div', null, selectedContrib.confidence != null ? (selectedContrib.confidence * 100).toFixed(0) + '%' : '-')),
|
|
1496
|
-
h('div', null, h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Source'), h('div', null, selectedContrib.source || '-')),
|
|
1497
|
-
h('div', null, h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Date'), h('div', null, selectedContrib.createdAt || selectedContrib.date ? new Date(selectedContrib.createdAt || selectedContrib.date).toLocaleString() : '-'))
|
|
1498
|
-
),
|
|
1499
|
-
selectedContrib.tags && h('div', null,
|
|
1500
|
-
h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Tags'),
|
|
1501
|
-
h('div', { style: { display: 'flex', gap: 4, flexWrap: 'wrap', marginTop: 4 } },
|
|
1502
|
-
(Array.isArray(selectedContrib.tags) ? selectedContrib.tags : (selectedContrib.tags || '').split(',')).filter(Boolean).map(function(t) {
|
|
1503
|
-
return h('span', { key: t, className: 'badge', style: { fontSize: 11 } }, t.trim());
|
|
1504
|
-
})
|
|
1505
|
-
)
|
|
1506
|
-
),
|
|
1507
|
-
h('div', null,
|
|
1508
|
-
h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Content'),
|
|
1509
|
-
h('div', {
|
|
1510
|
-
style: { marginTop: 6, padding: 12, background: 'var(--bg)', borderRadius: 8, border: '1px solid var(--border)', whiteSpace: 'pre-wrap', fontSize: 13, lineHeight: 1.6, maxHeight: 400, overflowY: 'auto' }
|
|
1511
|
-
}, selectedContrib.content || 'No content')
|
|
1512
|
-
)
|
|
1513
|
-
)
|
|
1514
|
-
),
|
|
1515
|
-
|
|
1516
|
-
// ── Create Base Modal ──────────────────────────────
|
|
1517
|
-
showCreateBase && h(Modal, {
|
|
1518
|
-
title: 'Create Knowledge Base',
|
|
1519
|
-
onClose: function() { setShowCreateBase(false); },
|
|
1520
|
-
footer: h(Fragment, null,
|
|
1521
|
-
h('button', { className: 'btn btn-secondary', onClick: function() { setShowCreateBase(false); } }, 'Cancel'),
|
|
1522
|
-
h('button', { className: 'btn btn-primary', onClick: createBase, disabled: !baseForm.name }, 'Create')
|
|
1523
|
-
)
|
|
1524
|
-
},
|
|
1525
|
-
h('div', { className: 'form-group' },
|
|
1526
|
-
h('label', { className: 'form-label' }, 'Name'),
|
|
1527
|
-
h('input', {
|
|
1528
|
-
className: 'input', style: { width: '100%' },
|
|
1529
|
-
value: baseForm.name,
|
|
1530
|
-
onChange: function(e) { setBaseForm(function(f) { return Object.assign({}, f, { name: e.target.value }); }); },
|
|
1531
|
-
placeholder: 'e.g. Customer Support Knowledge'
|
|
1532
|
-
})
|
|
1533
|
-
),
|
|
1534
|
-
h('div', { className: 'form-group' },
|
|
1535
|
-
h('label', { className: 'form-label' }, 'Description'),
|
|
1536
|
-
h('textarea', {
|
|
1537
|
-
className: 'input', style: { width: '100%', minHeight: 80 },
|
|
1538
|
-
value: baseForm.description,
|
|
1539
|
-
onChange: function(e) { setBaseForm(function(f) { return Object.assign({}, f, { description: e.target.value }); }); },
|
|
1540
|
-
placeholder: 'Describe what this knowledge base is for...'
|
|
1541
|
-
})
|
|
1542
|
-
),
|
|
1543
|
-
h('div', { className: 'form-group' },
|
|
1544
|
-
h('label', { className: 'form-label' }, 'Role'),
|
|
1545
|
-
h('select', {
|
|
1546
|
-
className: 'input', style: { width: '100%' },
|
|
1547
|
-
value: baseForm.role,
|
|
1548
|
-
onChange: function(e) { setBaseForm(function(f) { return Object.assign({}, f, { role: e.target.value }); }); }
|
|
1549
|
-
},
|
|
1550
|
-
h('option', { value: '' }, 'Select a role...'),
|
|
1551
|
-
roles.map(function(r) { return h('option', { key: r.id || r.name || r, value: r.id || r.name || r }, r.label || r.name || r); })
|
|
1552
|
-
)
|
|
1553
|
-
)
|
|
1554
|
-
),
|
|
1555
|
-
|
|
1556
|
-
// ── Trigger Contribution Modal ──────────────────────────────
|
|
1557
|
-
showTrigger && h(Modal, {
|
|
1558
|
-
title: 'Trigger Contribution',
|
|
1559
|
-
onClose: function() { setShowTrigger(false); },
|
|
1560
|
-
footer: h(Fragment, null,
|
|
1561
|
-
h('button', { className: 'btn btn-secondary', onClick: function() { setShowTrigger(false); } }, 'Cancel'),
|
|
1562
|
-
h('button', { className: 'btn btn-primary', onClick: triggerContribution, disabled: !triggerAgent }, 'Trigger')
|
|
1563
|
-
)
|
|
1564
|
-
},
|
|
1565
|
-
h('div', { className: 'form-group' },
|
|
1566
|
-
h('label', { className: 'form-label' }, 'Agent ID'),
|
|
1567
|
-
h('input', {
|
|
1568
|
-
className: 'input', style: { width: '100%' },
|
|
1569
|
-
value: triggerAgent,
|
|
1570
|
-
onChange: function(e) { setTriggerAgent(e.target.value); },
|
|
1571
|
-
placeholder: 'Enter agent ID...'
|
|
1572
|
-
})
|
|
1573
|
-
),
|
|
1574
|
-
h('div', { className: 'form-group' },
|
|
1575
|
-
h('label', { className: 'form-label' }, 'Target Knowledge Base (optional)'),
|
|
1576
|
-
h('select', {
|
|
1577
|
-
className: 'input', style: { width: '100%' },
|
|
1578
|
-
value: triggerBase,
|
|
1579
|
-
onChange: function(e) { setTriggerBase(e.target.value); }
|
|
1580
|
-
},
|
|
1581
|
-
h('option', { value: '' }, 'All eligible bases'),
|
|
1582
|
-
bases.map(function(b) { return h('option', { key: b.id, value: b.id }, b.name); })
|
|
1583
|
-
)
|
|
1584
|
-
),
|
|
1585
|
-
h('p', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'This will scan the agent\'s recent memories and contribute qualifying entries to the selected knowledge base.')
|
|
1586
|
-
),
|
|
1587
|
-
|
|
1588
|
-
// ── Create/Edit Schedule Modal ──────────────────────────────
|
|
1589
|
-
(showCreateSchedule || editSchedule) && h(Modal, {
|
|
1590
|
-
title: editSchedule ? 'Edit Schedule' : 'Create Schedule',
|
|
1591
|
-
onClose: function() { setShowCreateSchedule(false); setEditSchedule(null); setScheduleForm({ agentId: '', targetBaseId: '', frequency: 'weekly', dayOfWeek: 'monday', minConfidence: 0.7 }); },
|
|
1592
|
-
footer: h(Fragment, null,
|
|
1593
|
-
h('button', { className: 'btn btn-secondary', onClick: function() { setShowCreateSchedule(false); setEditSchedule(null); } }, 'Cancel'),
|
|
1594
|
-
editSchedule
|
|
1595
|
-
? h('button', { className: 'btn btn-primary', onClick: updateSchedule }, 'Update')
|
|
1596
|
-
: h('button', { className: 'btn btn-primary', onClick: createSchedule, disabled: !scheduleForm.agentId || !scheduleForm.targetBaseId }, 'Create')
|
|
1597
|
-
)
|
|
1598
|
-
},
|
|
1599
|
-
!editSchedule && h('div', { className: 'form-group' },
|
|
1600
|
-
h('label', { className: 'form-label' }, 'Agent ID'),
|
|
1601
|
-
h('input', {
|
|
1602
|
-
className: 'input', style: { width: '100%' },
|
|
1603
|
-
value: scheduleForm.agentId,
|
|
1604
|
-
onChange: function(e) { setScheduleForm(function(f) { return Object.assign({}, f, { agentId: e.target.value }); }); },
|
|
1605
|
-
placeholder: 'Enter agent ID...'
|
|
1606
|
-
})
|
|
1607
|
-
),
|
|
1608
|
-
!editSchedule && h('div', { className: 'form-group' },
|
|
1609
|
-
h('label', { className: 'form-label' }, 'Target Knowledge Base'),
|
|
1610
|
-
h('select', {
|
|
1611
|
-
className: 'input', style: { width: '100%' },
|
|
1612
|
-
value: scheduleForm.targetBaseId,
|
|
1613
|
-
onChange: function(e) { setScheduleForm(function(f) { return Object.assign({}, f, { targetBaseId: e.target.value }); }); }
|
|
1614
|
-
},
|
|
1615
|
-
h('option', { value: '' }, 'Select a base...'),
|
|
1616
|
-
bases.map(function(b) { return h('option', { key: b.id, value: b.id }, b.name); })
|
|
1617
|
-
)
|
|
1618
|
-
),
|
|
1619
|
-
h('div', { className: 'form-group' },
|
|
1620
|
-
h('label', { className: 'form-label' }, 'Frequency'),
|
|
1621
|
-
h('select', {
|
|
1622
|
-
className: 'input', style: { width: '100%' },
|
|
1623
|
-
value: scheduleForm.frequency,
|
|
1624
|
-
onChange: function(e) { setScheduleForm(function(f) { return Object.assign({}, f, { frequency: e.target.value }); }); }
|
|
1625
|
-
},
|
|
1626
|
-
h('option', { value: 'hourly' }, 'Hourly'),
|
|
1627
|
-
h('option', { value: 'daily' }, 'Daily'),
|
|
1628
|
-
h('option', { value: 'weekly' }, 'Weekly'),
|
|
1629
|
-
h('option', { value: 'monthly' }, 'Monthly')
|
|
1630
|
-
)
|
|
1631
|
-
),
|
|
1632
|
-
scheduleForm.frequency === 'weekly' && h('div', { className: 'form-group' },
|
|
1633
|
-
h('label', { className: 'form-label' }, 'Day of Week'),
|
|
1634
|
-
h('select', {
|
|
1635
|
-
className: 'input', style: { width: '100%' },
|
|
1636
|
-
value: scheduleForm.dayOfWeek,
|
|
1637
|
-
onChange: function(e) { setScheduleForm(function(f) { return Object.assign({}, f, { dayOfWeek: e.target.value }); }); }
|
|
1638
|
-
},
|
|
1639
|
-
['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'].map(function(d) {
|
|
1640
|
-
return h('option', { key: d, value: d }, d.charAt(0).toUpperCase() + d.slice(1));
|
|
1641
|
-
})
|
|
1642
|
-
)
|
|
1643
|
-
),
|
|
1644
|
-
h('div', { className: 'form-group' },
|
|
1645
|
-
h('label', { className: 'form-label' }, 'Minimum Confidence Filter'),
|
|
1646
|
-
h('div', { style: { display: 'flex', alignItems: 'center', gap: 10 } },
|
|
1647
|
-
h('input', {
|
|
1648
|
-
type: 'range', min: 0, max: 1, step: 0.05,
|
|
1649
|
-
style: { flex: 1 },
|
|
1650
|
-
value: scheduleForm.minConfidence,
|
|
1651
|
-
onChange: function(e) { setScheduleForm(function(f) { return Object.assign({}, f, { minConfidence: parseFloat(e.target.value) }); }); }
|
|
1652
|
-
}),
|
|
1653
|
-
h('span', { style: { fontSize: 13, fontWeight: 600, minWidth: 40 } }, Math.round(scheduleForm.minConfidence * 100) + '%')
|
|
1654
|
-
)
|
|
1655
|
-
)
|
|
1656
|
-
)
|
|
1657
|
-
);
|
|
1658
|
-
}
|
|
1659
|
-
|
|
1660
|
-
function _pgBtn(active) {
|
|
1661
|
-
return {
|
|
1662
|
-
padding: '4px 10px', borderRadius: 6, border: '1px solid var(--border)',
|
|
1663
|
-
background: active ? 'var(--accent)' : 'var(--bg-card)', color: active ? '#fff' : 'var(--text)',
|
|
1664
|
-
cursor: 'pointer', fontSize: 12,
|
|
1665
|
-
};
|
|
1666
|
-
}
|
|
1667
|
-
|
|
1668
|
-
function _metricCard(label, value, icon, color) {
|
|
1669
|
-
return h('div', { className: 'card', style: { padding: 16, textAlign: 'center' } },
|
|
1670
|
-
h('div', { style: { fontSize: 14, color: 'var(--text-muted)', marginBottom: 4 } }, icon, ' ', label),
|
|
1671
|
-
h('div', { style: { fontSize: 28, fontWeight: 700, color: color || 'var(--text)' } }, value)
|
|
1672
|
-
);
|
|
1673
|
-
}
|
|
1674
|
-
|
|
1675
|
-
function _fmtSearchTime(ts) {
|
|
1676
|
-
if (!ts) return '-';
|
|
1677
|
-
var d = new Date(ts);
|
|
1678
|
-
var now = new Date();
|
|
1679
|
-
var isToday = d.toDateString() === now.toDateString();
|
|
1680
|
-
if (isToday) return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });
|
|
1681
|
-
return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) + ' ' + d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });
|
|
1682
|
-
}
|