@agent-native/core 0.120.2 → 0.120.4
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/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +28 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/context-xray-local.ts +1 -1
- package/corpus/core/src/cli/index.ts +63 -18
- package/corpus/core/src/cli/skills.ts +5 -0
- package/corpus/core/src/cli/telemetry.ts +118 -1
- package/corpus/core/src/client/AgentPanel.tsx +10 -0
- package/corpus/core/src/client/CommandMenu.tsx +13 -1
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +39 -4
- package/corpus/core/src/client/analytics.ts +13 -0
- package/corpus/core/src/client/error-capture.ts +6 -1
- package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +12 -5
- package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
- package/corpus/core/src/client/navigation/index.ts +2 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +14 -32
- package/corpus/core/src/client/settings/ExtensionsSettingsContent.tsx +1 -1
- package/corpus/core/src/extensions/theme.ts +1 -1
- package/corpus/core/src/localization/default-messages.ts +2 -0
- package/corpus/core/src/server/core-routes-plugin.ts +10 -1
- package/corpus/core/src/server/framework-request-handler.ts +17 -26
- package/corpus/core/src/styles/agent-native.css +13 -0
- package/corpus/core/src/templates/chat/app/components/layout/Layout.tsx +3 -0
- package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +78 -45
- package/corpus/core/src/templates/chat/app/global.css +1 -1
- package/corpus/core/src/templates/default/app/global.css +1 -1
- package/corpus/core/src/tracking/error-capture.ts +151 -0
- package/corpus/core/src/tracking/index.ts +5 -0
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +1 -4
- package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +2 -2
- package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +41 -9
- package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -1
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +1 -1
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +28 -14
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +152 -124
- package/corpus/templates/analytics/app/global.css +5 -5
- package/corpus/templates/analytics/app/lib/dashboard-report-capture.ts +42 -0
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +2 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +2 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +162 -51
- package/corpus/templates/analytics/app/root.tsx +28 -0
- package/corpus/templates/analytics/changelog/2026-07-24-analytics-charts-now-explain-slow-loads-and-offer-a-direct-r.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-24-daily-dashboard-emails-now-load-signed-reports-more-reliably.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-24-manage-agent-is-clearly-marked-as-a-link-to-its-dedicated-pa.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +1 -1
- package/corpus/templates/analytics/server/db/schema.ts +5 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -0
- package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +11 -0
- package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +54 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +235 -26
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +4 -1
- package/corpus/templates/analytics/server/plugins/db.ts +9 -0
- package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +1 -1
- package/corpus/templates/assets/app/components/asset/AssetPreviewDialog.tsx +376 -0
- package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +14 -4
- package/corpus/templates/assets/app/components/layout/Layout.tsx +5 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +118 -74
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/assets/app/i18n-data.ts +10 -0
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +99 -10
- package/corpus/templates/assets/app/routes/library.tsx +21 -198
- package/corpus/templates/assets/changelog/2026-07-21-unified-asset-preview-click-any-asset-to-open-one-preview-wi.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -0
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +76 -43
- package/corpus/templates/brain/app/global.css +1 -1
- package/corpus/templates/brain/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +67 -52
- package/corpus/templates/calendar/app/global.css +1 -1
- package/corpus/templates/calendar/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +3 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +78 -45
- package/corpus/templates/chat/app/global.css +1 -1
- package/corpus/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +65 -31
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
- package/corpus/templates/clips/app/components/player/video-player.tsx +16 -1
- package/corpus/templates/clips/app/global.css +1 -1
- package/corpus/templates/clips/app/hooks/use-view-tracking.ts +55 -12
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +6 -5
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +7 -7
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -5
- package/corpus/templates/clips/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/clips/server/plugins/db.ts +113 -68
- package/corpus/templates/content/actions/update-document.ts +145 -91
- package/corpus/templates/content/app/components/editor/CommentComposer.tsx +4 -1
- package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +366 -164
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +51 -28
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +19 -8
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +66 -42
- package/corpus/templates/content/app/global.css +1 -1
- package/corpus/templates/content/app/i18n-data.ts +15 -0
- package/corpus/templates/content/changelog/2026-07-23-shared-pages-now-keep-durable-content-visible-and-comment-th.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-comment-drafts-now-stay-open-when-saving-fails-and-long-live.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/design/actions/update-file.ts +85 -18
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +65 -30
- package/corpus/templates/design/app/entry.client.tsx +14 -1
- package/corpus/templates/design/app/global.css +1 -1
- package/corpus/templates/design/app/lib/design-save-outbox.ts +39 -0
- package/corpus/templates/design/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/design/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/dispatch/app/global.css +1 -1
- package/corpus/templates/dispatch/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +3 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +72 -37
- package/corpus/templates/forms/app/global.css +1 -1
- package/corpus/templates/forms/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-24-forms-sidebar-actions-now-keep-search-language-feedback-and-.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/macros/app/components/DailyProgress.tsx +5 -5
- package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
- package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
- package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +56 -29
- package/corpus/templates/macros/app/components/ui/button.tsx +1 -2
- package/corpus/templates/macros/app/components/ui/card.tsx +1 -1
- package/corpus/templates/macros/app/global.css +1 -1
- package/corpus/templates/macros/app/routes/_index.tsx +1 -1
- package/corpus/templates/macros/app/routes/analytics.tsx +4 -7
- package/corpus/templates/macros/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/macros/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +125 -37
- package/corpus/templates/mail/app/global.css +1 -1
- package/corpus/templates/mail/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +90 -60
- package/corpus/templates/plan/app/global.css +1 -1
- package/corpus/templates/plan/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +69 -32
- package/corpus/templates/slides/app/global.css +1 -1
- package/corpus/templates/slides/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/tasks/app/global.css +1 -1
- package/corpus/templates/tasks/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +14 -0
- package/corpus/toolkit/README.md +8 -1
- package/corpus/toolkit/agent-native.eject.json +1 -1
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/app-shell/index.ts +1 -0
- package/corpus/toolkit/src/app-shell/sidebar-footer-actions.tsx +48 -0
- package/corpus/toolkit/src/chat-history.css +52 -1
- package/corpus/toolkit/src/design-system/default-adapter.tsx +1 -1
- package/corpus/toolkit/src/editor/useCollabReconcile.ts +83 -15
- package/corpus/toolkit/src/ui/button.tsx +1 -2
- package/corpus/toolkit/src/ui/card.tsx +1 -1
- package/corpus/toolkit/src/ui/table.tsx +4 -11
- package/dist/cli/context-xray-local.js +1 -1
- package/dist/cli/context-xray-local.js.map +1 -1
- package/dist/cli/index.js +56 -17
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +5 -0
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/telemetry.d.ts +7 -0
- package/dist/cli/telemetry.d.ts.map +1 -1
- package/dist/cli/telemetry.js +91 -1
- package/dist/cli/telemetry.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +7 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +2 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/CommandMenu.d.ts +2 -0
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +12 -1
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts +4 -0
- package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +8 -4
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +7 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +8 -1
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +2 -2
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
- package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
- package/dist/client/navigation/index.d.ts +1 -1
- package/dist/client/navigation/index.d.ts.map +1 -1
- package/dist/client/navigation/index.js +1 -1
- package/dist/client/navigation/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +9 -13
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
- package/dist/client/settings/ExtensionsSettingsContent.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/extensions/theme.js +1 -1
- package/dist/extensions/theme.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/localization/default-messages.d.ts +2 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +2 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/provider-api/actions/provider-api.d.ts +2 -2
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +8 -1
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +17 -27
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/styles/agent-native.css +13 -0
- package/dist/templates/chat/app/components/layout/Layout.tsx +3 -0
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +78 -45
- package/dist/templates/chat/app/global.css +1 -1
- package/dist/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/dist/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/dist/templates/default/app/global.css +1 -1
- package/dist/tracking/error-capture.d.ts +14 -0
- package/dist/tracking/error-capture.d.ts.map +1 -0
- package/dist/tracking/error-capture.js +113 -0
- package/dist/tracking/error-capture.js.map +1 -0
- package/dist/tracking/index.d.ts +1 -0
- package/dist/tracking/index.d.ts.map +1 -1
- package/dist/tracking/index.js +1 -0
- package/dist/tracking/index.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/context-xray-local.ts +1 -1
- package/src/cli/index.ts +63 -18
- package/src/cli/skills.ts +5 -0
- package/src/cli/telemetry.ts +118 -1
- package/src/client/AgentPanel.tsx +10 -0
- package/src/client/CommandMenu.tsx +13 -1
- package/src/client/agent-page/AgentTabsPage.tsx +39 -4
- package/src/client/analytics.ts +13 -0
- package/src/client/error-capture.ts +6 -1
- package/src/client/extensions/ExtensionsListPage.tsx +12 -5
- package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
- package/src/client/navigation/index.ts +2 -0
- package/src/client/org/OrgSwitcher.tsx +14 -32
- package/src/client/settings/ExtensionsSettingsContent.tsx +1 -1
- package/src/extensions/theme.ts +1 -1
- package/src/localization/default-messages.ts +2 -0
- package/src/server/core-routes-plugin.ts +10 -1
- package/src/server/framework-request-handler.ts +17 -26
- package/src/styles/agent-native.css +13 -0
- package/src/templates/chat/app/components/layout/Layout.tsx +3 -0
- package/src/templates/chat/app/components/layout/Sidebar.tsx +78 -45
- package/src/templates/chat/app/global.css +1 -1
- package/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/src/templates/default/app/global.css +1 -1
- package/src/tracking/error-capture.ts +151 -0
- package/src/tracking/index.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-capture.js","sourceRoot":"","sources":["../../src/client/error-capture.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party, Sentry-style browser error capture for the Agent Native\n * analytics SDK.\n *\n * Two responsibilities:\n * 1. Automatic capture of uncaught exceptions (`window.onerror`) and\n * unhandled promise rejections (`unhandledrejection`).\n * 2. A documented manual API — `captureException(error, context?)` and\n * `captureMessage(message, level?)` — mirroring Sentry's ergonomics.\n *\n * Captured exceptions are handed to a `send` callback (wired by\n * `configureTracking` to the first-party analytics `/track` ingest as a\n * dedicated `$exception` event) and are tagged with the current analytics\n * session id + session replay id so each error links back to the recording it\n * happened in. Everything here is defensive: capture must never throw back into\n * the host app, so every path is wrapped and failures are swallowed.\n *\n * Stack parsing and fingerprinting are intentionally done authoritatively on\n * the server (see the analytics template's `server/lib/error-capture.ts`); the\n * client sends a compact, bounded payload (type/message/raw stack/context) and\n * the server normalizes + groups it. That keeps one tested source of truth for\n * grouping instead of duplicating parser logic across the wire.\n */\nimport { isDynamicImportFailureMessage } from \"./route-chunk-recovery.js\";\nimport { scrubUrl } from \"./url-scrub.js\";\n\nexport type ExceptionLevel = \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n/** Extra Sentry-style context accepted by `captureException`. */\nexport interface CaptureExceptionContext {\n /** Low-cardinality searchable tags. Values are coerced to strings. */\n tags?: Record<string, string | number | boolean | null | undefined>;\n /** Structured, higher-cardinality detail shown on the event. */\n extra?: Record<string, unknown>;\n /** Severity; defaults to \"error\". */\n level?: ExceptionLevel;\n}\n\nexport interface ExceptionBreadcrumb {\n timestamp: string;\n category: string;\n message: string;\n level?: ExceptionLevel;\n}\n\n/**\n * Compact exception payload emitted to transport. Field names are the wire\n * contract the analytics server ingest reads — keep them stable.\n */\nexport interface CapturedExceptionEvent {\n /** Error class/name, e.g. \"TypeError\". \"Message\" for `captureMessage`. */\n type: string;\n message: string;\n /** Raw (bounded, redacted) stack string; server parses it into frames. */\n stack?: string;\n /** False for uncaught/global errors, true for manually handled ones. */\n handled: boolean;\n level: ExceptionLevel;\n /** ISO timestamp of the occurrence. */\n occurredAt: string;\n url?: string;\n release?: string;\n environment?: string;\n sessionId?: string;\n /** Client session replay id (localStorage) for replay linkage. */\n sessionReplayId?: string;\n anonymousId?: string;\n breadcrumbs: ExceptionBreadcrumb[];\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface InstallErrorCaptureOptions {\n /** Transport for a captured exception. Must not throw. */\n send: (event: CapturedExceptionEvent) => void;\n /** Resolve current analytics/session-replay identifiers at capture time. */\n getSessionContext?: () => {\n sessionId?: string;\n anonymousId?: string;\n replayId?: string;\n };\n /**\n * Optional hook to also surface a manual capture on the session replay\n * timeline. Only invoked for manual `captureException`/`captureMessage`;\n * auto-captured global errors are already recorded by the replay recorder.\n */\n emitReplayEvent?: (event: CapturedExceptionEvent) => void;\n release?: string;\n environment?: string;\n /** Auto-capture `window.onerror`. Defaults to true. */\n captureGlobalErrors?: boolean;\n /** Auto-capture `unhandledrejection`. Defaults to true. */\n captureUnhandledRejections?: boolean;\n /** Breadcrumb ring buffer size. Defaults to 20. */\n maxBreadcrumbs?: number;\n /** Dedupe window (ms) for identical signatures. Defaults to 3000. */\n dedupeWindowMs?: number;\n}\n\ninterface ErrorCaptureRuntime {\n installed: boolean;\n config: Required<\n Pick<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >\n > &\n Omit<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >;\n breadcrumbs: ExceptionBreadcrumb[];\n recentSignatures: Map<string, number>;\n removeHandlers: (() => void) | null;\n navigationInstalled: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 1000;\nconst MAX_STACK_LENGTH = 8000;\nconst MAX_TAGS = 30;\nconst MAX_EXTRA_KEYS = 50;\nconst MAX_EXTRA_DEPTH = 4;\nconst MAX_EXTRA_OBJECT_KEYS = 20;\nconst MAX_EXTRA_ARRAY_ITEMS = 20;\nconst MAX_EXTRA_STRING_LENGTH = 2000;\n\nconst ERROR_CAPTURE_STATE_KEY = Symbol.for(\"agent-native.client.errorCapture\");\n\n// Reuse the same credential-looking redaction the replay capture uses so a\n// stack/message that echoes a token never leaves the browser in the clear.\nconst SECRET_KEY_FRAGMENT =\n \"(?:authorization|cookie|set[-_]?cookie|token|secret|password|passwd|pwd|api[-_]?key|apikey|session|credential)\";\nconst BEARER_RE = /\\b(bearer|basic)\\s+[a-z0-9._~+/-]+=*/gi;\nconst UNQUOTED_SECRET_RE = new RegExp(\n `([\"']?)([A-Za-z0-9_$.-]*${SECRET_KEY_FRAGMENT}[A-Za-z0-9_$.-]*)\\\\1(\\\\s*[:=]\\\\s*)([^\"',\\\\s;}\\\\]]+)`,\n \"gi\",\n);\nconst SECRET_KEY_RE = new RegExp(SECRET_KEY_FRAGMENT, \"i\");\n\nfunction redactSecrets(value: string): string {\n return value\n .replace(BEARER_RE, \"$1 <redacted>\")\n .replace(UNQUOTED_SECRET_RE, \"$1$2$1$3<redacted>\");\n}\n\nfunction getRuntime(): ErrorCaptureRuntime {\n const g = globalThis as typeof globalThis & {\n [ERROR_CAPTURE_STATE_KEY]?: ErrorCaptureRuntime;\n };\n if (!g[ERROR_CAPTURE_STATE_KEY]) {\n g[ERROR_CAPTURE_STATE_KEY] = {\n installed: false,\n config: {\n send: () => {},\n captureGlobalErrors: true,\n captureUnhandledRejections: true,\n maxBreadcrumbs: 20,\n dedupeWindowMs: 3000,\n },\n breadcrumbs: [],\n recentSignatures: new Map(),\n removeHandlers: null,\n navigationInstalled: false,\n };\n }\n return g[ERROR_CAPTURE_STATE_KEY]!;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max) : value;\n}\n\nfunction currentUrl(): string | undefined {\n try {\n return scrubUrl(window.location.href);\n } catch {\n return undefined;\n }\n}\n\n/** Normalize any thrown value into a stable `{ type, message, stack }`. */\nexport function normalizeCapturedError(error: unknown): {\n type: string;\n message: string;\n stack?: string;\n} {\n if (error instanceof Error) {\n return {\n type: error.name || \"Error\",\n message: error.message || String(error),\n stack: typeof error.stack === \"string\" ? error.stack : undefined,\n };\n }\n if (typeof error === \"string\") {\n return { type: \"Error\", message: error };\n }\n if (error && typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : undefined;\n const message =\n typeof record.message === \"string\" ? record.message : undefined;\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n if (name || message || stack) {\n return {\n type: name || \"Error\",\n message: message || safeStringify(error),\n stack,\n };\n }\n return { type: \"Error\", message: safeStringify(error) };\n }\n return { type: \"Error\", message: String(error) };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction coerceTags(\n tags: CaptureExceptionContext[\"tags\"],\n): Record<string, string> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string> = {};\n let count = 0;\n for (const [key, value] of Object.entries(tags)) {\n if (count >= MAX_TAGS) break;\n if (value === undefined || value === null) continue;\n out[key] = truncate(redactSecrets(String(value)), 200);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtra(\n extra: CaptureExceptionContext[\"extra\"],\n): Record<string, unknown> | undefined {\n if (!extra || typeof extra !== \"object\") return undefined;\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [key, value] of Object.entries(extra)) {\n if (count >= MAX_EXTRA_KEYS) break;\n const safeKey = truncate(redactSecrets(key), 100);\n out[safeKey] = SECRET_KEY_RE.test(safeKey)\n ? \"<redacted>\"\n : coerceExtraValue(value, MAX_EXTRA_DEPTH);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtraValue(value: unknown, depth: number): unknown {\n if (\n value == null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n return value;\n }\n if (typeof value === \"string\") {\n return truncate(redactSecrets(value), MAX_EXTRA_STRING_LENGTH);\n }\n if (typeof value === \"bigint\") {\n return truncate(redactSecrets(value.toString()), MAX_EXTRA_STRING_LENGTH);\n }\n if (depth <= 0) {\n return truncate(\n redactSecrets(safeStringify(value)),\n MAX_EXTRA_STRING_LENGTH,\n );\n }\n if (Array.isArray(value)) {\n return value\n .slice(0, MAX_EXTRA_ARRAY_ITEMS)\n .map((item) => coerceExtraValue(item, depth - 1));\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [rawKey, child] of Object.entries(value)) {\n if (count >= MAX_EXTRA_OBJECT_KEYS) break;\n const key = truncate(redactSecrets(rawKey), 100);\n out[key] = SECRET_KEY_RE.test(key)\n ? \"<redacted>\"\n : coerceExtraValue(child, depth - 1);\n count += 1;\n }\n return out;\n }\n return truncate(redactSecrets(String(value)), MAX_EXTRA_STRING_LENGTH);\n}\n\nfunction firstStackLine(stack: string | undefined): string {\n if (!stack) return \"\";\n const lines = stack.split(\"\\n\").map((line) => line.trim());\n return (\n lines.find((line) => line.startsWith(\"at \") || /:\\d+:\\d+/.test(line)) ??\n lines[1] ??\n \"\"\n );\n}\n\n/** Cheap client-side signature used only for local dedupe. */\nfunction signatureOf(type: string, message: string, stack?: string): string {\n return `${type}|${message}|${firstStackLine(stack)}`;\n}\n\nfunction normalizeGlobalErrorEvent(event: ErrorEvent): {\n type: string;\n message: string;\n stack?: string;\n} {\n const error = event?.error;\n const normalized = error\n ? normalizeCapturedError(error)\n : {\n type: \"Error\",\n message: String(event?.message ?? \"Uncaught error\"),\n };\n\n if (!normalized.stack && event?.filename) {\n const line = event.lineno ?? 0;\n const col = event.colno ?? 0;\n normalized.stack = `at ${event.filename}:${line}:${col}`;\n }\n\n return normalized;\n}\n\nfunction shouldIgnoreAutoCapturedError(normalized: {\n type: string;\n message: string;\n stack?: string;\n}): boolean {\n const message = (normalized.message || \"\").trim();\n const stack = normalized.stack || \"\";\n\n if (\n /^ResizeObserver loop (?:limit exceeded|completed with undelivered notifications\\.?)$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n // Route-chunk recovery reloads the current page after stale lazy chunks or\n // module scripts fail. Browser-level failures have no useful stack, so do\n // not retain the transient loader noise as an application issue.\n if (!stack && isDynamicImportFailureMessage(message)) {\n return true;\n }\n\n if (\n normalized.type === \"InvalidStateError\" &&\n /^Transition was aborted because of invalid state$/i.test(message)\n ) {\n return true;\n }\n\n if (\n /^This script should only be loaded in a browser extension\\.?$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n const hasExtensionFrame =\n /\\b(?:chrome|moz|safari|webkit)-extension:\\/\\//i.test(stack) ||\n /\\binjectScriptAdjust\\.js\\b/i.test(stack);\n if (\n hasExtensionFrame &&\n /^(?:TypeError:\\s*)?Failed to fetch$/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction shouldDedupe(\n runtime: ErrorCaptureRuntime,\n signature: string,\n): boolean {\n const now = Date.now();\n const windowMs = runtime.config.dedupeWindowMs;\n // Opportunistic cleanup so the map can't grow without bound.\n if (runtime.recentSignatures.size > 200) {\n for (const [key, ts] of runtime.recentSignatures) {\n if (now - ts > windowMs) runtime.recentSignatures.delete(key);\n }\n }\n const last = runtime.recentSignatures.get(signature);\n runtime.recentSignatures.set(signature, now);\n return last !== undefined && now - last < windowMs;\n}\n\n/** Append a privacy-safe breadcrumb to the bounded ring buffer. */\nexport function addErrorBreadcrumb(breadcrumb: {\n category: string;\n message: string;\n level?: ExceptionLevel;\n}): void {\n try {\n const runtime = getRuntime();\n runtime.breadcrumbs.push({\n timestamp: nowIso(),\n category: truncate(breadcrumb.category, 60),\n message: truncate(redactSecrets(breadcrumb.message), 300),\n ...(breadcrumb.level ? { level: breadcrumb.level } : {}),\n });\n const max = runtime.config.maxBreadcrumbs;\n if (runtime.breadcrumbs.length > max) {\n runtime.breadcrumbs.splice(0, runtime.breadcrumbs.length - max);\n }\n } catch {\n // breadcrumbs are best-effort\n }\n}\n\nfunction snapshotBreadcrumbs(\n runtime: ErrorCaptureRuntime,\n): ExceptionBreadcrumb[] {\n return runtime.breadcrumbs.slice(-runtime.config.maxBreadcrumbs);\n}\n\nfunction installNavigationBreadcrumbs(runtime: ErrorCaptureRuntime): void {\n if (runtime.navigationInstalled || typeof window === \"undefined\") return;\n runtime.navigationInstalled = true;\n const record = (navType: string) => {\n try {\n addErrorBreadcrumb({\n category: \"navigation\",\n message: `${navType} ${scrubUrl(window.location.href) ?? window.location.pathname}`,\n });\n } catch {\n // ignore\n }\n };\n try {\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPush.apply(this, args);\n record(\"navigate\");\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplace.apply(this, args);\n record(\"replace\");\n return result;\n };\n window.addEventListener(\"popstate\", () => record(\"popstate\"));\n // Seed the trail with the initial location.\n record(\"load\");\n } catch {\n // navigation breadcrumbs are best-effort\n }\n}\n\nfunction buildEvent(\n runtime: ErrorCaptureRuntime,\n normalized: { type: string; message: string; stack?: string },\n options: {\n handled: boolean;\n level: ExceptionLevel;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n },\n): CapturedExceptionEvent {\n const context = runtime.config.getSessionContext?.() ?? {};\n const stack = normalized.stack\n ? truncate(redactSecrets(normalized.stack), MAX_STACK_LENGTH)\n : undefined;\n return {\n type: truncate(normalized.type || \"Error\", 200),\n message: truncate(\n redactSecrets(normalized.message || \"\"),\n MAX_MESSAGE_LENGTH,\n ),\n ...(stack ? { stack } : {}),\n handled: options.handled,\n level: options.level,\n occurredAt: nowIso(),\n ...(currentUrl() ? { url: currentUrl() } : {}),\n ...(runtime.config.release ? { release: runtime.config.release } : {}),\n ...(runtime.config.environment\n ? { environment: runtime.config.environment }\n : {}),\n ...(context.sessionId ? { sessionId: context.sessionId } : {}),\n ...(context.replayId ? { sessionReplayId: context.replayId } : {}),\n ...(context.anonymousId ? { anonymousId: context.anonymousId } : {}),\n breadcrumbs: snapshotBreadcrumbs(runtime),\n ...(options.tags ? { tags: options.tags } : {}),\n ...(options.extra ? { extra: options.extra } : {}),\n };\n}\n\nfunction dispatch(\n runtime: ErrorCaptureRuntime,\n event: CapturedExceptionEvent,\n emitToReplay: boolean,\n): void {\n const signature = signatureOf(event.type, event.message, event.stack);\n if (shouldDedupe(runtime, signature)) return;\n try {\n runtime.config.send(event);\n } catch {\n // transport must never throw into the host app\n }\n if (emitToReplay) {\n try {\n runtime.config.emitReplayEvent?.(event);\n } catch {\n // replay timeline emission is best-effort\n }\n }\n // Record the exception itself as a breadcrumb so a following error carries\n // the prior failure in its trail.\n addErrorBreadcrumb({\n category: \"exception\",\n message: `${event.type}: ${event.message}`,\n level: event.level,\n });\n}\n\n/**\n * Capture a handled exception. Mirrors Sentry's `captureException(err, ctx)`.\n * Safe to call before `configureTracking` has run — it simply no-ops if no\n * transport is installed yet.\n */\nexport function captureException(\n error: unknown,\n context: CaptureExceptionContext = {},\n): void {\n try {\n const runtime = getRuntime();\n const normalized = normalizeCapturedError(error);\n const event = buildEvent(runtime, normalized, {\n handled: true,\n level: context.level ?? \"error\",\n tags: coerceTags(context.tags),\n extra: coerceExtra(context.extra),\n });\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Capture a message string as an exception-like event. Mirrors Sentry's\n * `captureMessage(message, level?)`.\n */\nexport function captureMessage(\n message: string,\n level: ExceptionLevel = \"info\",\n): void {\n try {\n const runtime = getRuntime();\n const event = buildEvent(\n runtime,\n { type: \"Message\", message: String(message ?? \"\") },\n { handled: true, level },\n );\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Install auto-capture + wire the transport. Idempotent: re-invoking updates\n * the config (and (re)installs global handlers) without duplicating listeners.\n * Returns a disposer that removes the global handlers.\n */\nexport function installErrorCapture(\n options: InstallErrorCaptureOptions,\n): () => void {\n const runtime = getRuntime();\n runtime.config = {\n ...runtime.config,\n ...options,\n captureGlobalErrors: options.captureGlobalErrors ?? true,\n captureUnhandledRejections: options.captureUnhandledRejections ?? true,\n maxBreadcrumbs: options.maxBreadcrumbs ?? runtime.config.maxBreadcrumbs,\n dedupeWindowMs: options.dedupeWindowMs ?? runtime.config.dedupeWindowMs,\n };\n\n if (typeof window === \"undefined\") return () => {};\n\n installNavigationBreadcrumbs(runtime);\n\n // Tear down any previously-installed handlers before reinstalling so a second\n // configureTracking call doesn't double-report.\n runtime.removeHandlers?.();\n runtime.removeHandlers = null;\n\n const removers: Array<() => void> = [];\n\n if (runtime.config.captureGlobalErrors) {\n const onError = (event: ErrorEvent) => {\n try {\n const normalized = normalizeGlobalErrorEvent(event);\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n // Global errors are already logged by the session replay recorder, so\n // don't re-emit them onto the replay timeline (avoid double-counting).\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"error\", onError as EventListener);\n removers.push(() =>\n window.removeEventListener(\"error\", onError as EventListener),\n );\n }\n\n if (runtime.config.captureUnhandledRejections) {\n const onRejection = (event: PromiseRejectionEvent) => {\n try {\n const reason = event?.reason;\n const normalized = normalizeCapturedError(reason);\n if (!normalized.type || normalized.type === \"Error\") {\n normalized.type = \"UnhandledRejection\";\n }\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"unhandledrejection\", onRejection as EventListener);\n removers.push(() =>\n window.removeEventListener(\n \"unhandledrejection\",\n onRejection as EventListener,\n ),\n );\n }\n\n runtime.installed = true;\n runtime.removeHandlers = () => {\n for (const remove of removers) {\n try {\n remove();\n } catch {\n // best-effort teardown\n }\n }\n runtime.removeHandlers = null;\n runtime.installed = false;\n };\n return runtime.removeHandlers;\n}\n\nexport function isErrorCaptureInstalled(): boolean {\n return getRuntime().installed;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"error-capture.js","sourceRoot":"","sources":["../../src/client/error-capture.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party, Sentry-style browser error capture for the Agent Native\n * analytics SDK.\n *\n * Two responsibilities:\n * 1. Automatic capture of uncaught exceptions (`window.onerror`) and\n * unhandled promise rejections (`unhandledrejection`).\n * 2. A documented manual API — `captureException(error, context?)` and\n * `captureMessage(message, level?)` — mirroring Sentry's ergonomics.\n *\n * Captured exceptions are handed to a `send` callback (wired by\n * `configureTracking` to the first-party analytics `/track` ingest as a\n * dedicated `$exception` event) and are tagged with the current analytics\n * session id + session replay id so each error links back to the recording it\n * happened in. Everything here is defensive: capture must never throw back into\n * the host app, so every path is wrapped and failures are swallowed.\n *\n * Stack parsing and fingerprinting are intentionally done authoritatively on\n * the server (see the analytics template's `server/lib/error-capture.ts`); the\n * client sends a compact, bounded payload (type/message/raw stack/context) and\n * the server normalizes + groups it. That keeps one tested source of truth for\n * grouping instead of duplicating parser logic across the wire.\n */\nimport { isDynamicImportFailureMessage } from \"./route-chunk-recovery.js\";\nimport { scrubUrl } from \"./url-scrub.js\";\n\nexport type ExceptionLevel = \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n/** Extra Sentry-style context accepted by `captureException`. */\nexport interface CaptureExceptionContext {\n /** Low-cardinality searchable tags. Values are coerced to strings. */\n tags?: Record<string, string | number | boolean | null | undefined>;\n /** Structured, higher-cardinality detail shown on the event. */\n extra?: Record<string, unknown>;\n /** Severity; defaults to \"error\". */\n level?: ExceptionLevel;\n}\n\nexport interface ExceptionBreadcrumb {\n timestamp: string;\n category: string;\n message: string;\n level?: ExceptionLevel;\n}\n\n/**\n * Compact exception payload emitted to transport. Field names are the wire\n * contract the analytics server ingest reads — keep them stable.\n */\nexport interface CapturedExceptionEvent {\n /** Error class/name, e.g. \"TypeError\". \"Message\" for `captureMessage`. */\n type: string;\n message: string;\n /** Raw (bounded, redacted) stack string; server parses it into frames. */\n stack?: string;\n /** False for uncaught/global errors, true for manually handled ones. */\n handled: boolean;\n level: ExceptionLevel;\n /** ISO timestamp of the occurrence. */\n occurredAt: string;\n url?: string;\n release?: string;\n environment?: string;\n sessionId?: string;\n /** Client session replay id (localStorage) for replay linkage. */\n sessionReplayId?: string;\n anonymousId?: string;\n breadcrumbs: ExceptionBreadcrumb[];\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface InstallErrorCaptureOptions {\n /** Transport for a captured exception. Must not throw. */\n send: (event: CapturedExceptionEvent) => void;\n /** Resolve current analytics/session-replay identifiers at capture time. */\n getSessionContext?: () => {\n sessionId?: string;\n anonymousId?: string;\n replayId?: string;\n };\n /**\n * Optional hook to also surface a manual capture on the session replay\n * timeline. Only invoked for manual `captureException`/`captureMessage`;\n * auto-captured global errors are already recorded by the replay recorder.\n */\n emitReplayEvent?: (event: CapturedExceptionEvent) => void;\n release?: string;\n environment?: string;\n /** Auto-capture `window.onerror`. Defaults to true. */\n captureGlobalErrors?: boolean;\n /** Auto-capture `unhandledrejection`. Defaults to true. */\n captureUnhandledRejections?: boolean;\n /** Breadcrumb ring buffer size. Defaults to 20. */\n maxBreadcrumbs?: number;\n /** Dedupe window (ms) for identical signatures. Defaults to 3000. */\n dedupeWindowMs?: number;\n}\n\ninterface ErrorCaptureRuntime {\n installed: boolean;\n config: Required<\n Pick<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >\n > &\n Omit<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >;\n breadcrumbs: ExceptionBreadcrumb[];\n recentSignatures: Map<string, number>;\n removeHandlers: (() => void) | null;\n navigationInstalled: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 1000;\nconst MAX_STACK_LENGTH = 8000;\nconst MAX_TAGS = 30;\nconst MAX_EXTRA_KEYS = 50;\nconst MAX_EXTRA_DEPTH = 4;\nconst MAX_EXTRA_OBJECT_KEYS = 20;\nconst MAX_EXTRA_ARRAY_ITEMS = 20;\nconst MAX_EXTRA_STRING_LENGTH = 2000;\n\nconst ERROR_CAPTURE_STATE_KEY = Symbol.for(\"agent-native.client.errorCapture\");\n\n// Reuse the same credential-looking redaction the replay capture uses so a\n// stack/message that echoes a token never leaves the browser in the clear.\nconst SECRET_KEY_FRAGMENT =\n \"(?:authorization|cookie|set[-_]?cookie|token|secret|password|passwd|pwd|api[-_]?key|apikey|session|credential)\";\nconst BEARER_RE = /\\b(bearer|basic)\\s+[a-z0-9._~+/-]+=*/gi;\nconst UNQUOTED_SECRET_RE = new RegExp(\n `([\"']?)([A-Za-z0-9_$.-]*${SECRET_KEY_FRAGMENT}[A-Za-z0-9_$.-]*)\\\\1(\\\\s*[:=]\\\\s*)([^\"',\\\\s;}\\\\]]+)`,\n \"gi\",\n);\nconst SECRET_KEY_RE = new RegExp(SECRET_KEY_FRAGMENT, \"i\");\n\nfunction redactSecrets(value: string): string {\n return value\n .replace(BEARER_RE, \"$1 <redacted>\")\n .replace(UNQUOTED_SECRET_RE, \"$1$2$1$3<redacted>\");\n}\n\nfunction getRuntime(): ErrorCaptureRuntime {\n const g = globalThis as typeof globalThis & {\n [ERROR_CAPTURE_STATE_KEY]?: ErrorCaptureRuntime;\n };\n if (!g[ERROR_CAPTURE_STATE_KEY]) {\n g[ERROR_CAPTURE_STATE_KEY] = {\n installed: false,\n config: {\n send: () => {},\n captureGlobalErrors: true,\n captureUnhandledRejections: true,\n maxBreadcrumbs: 20,\n dedupeWindowMs: 3000,\n },\n breadcrumbs: [],\n recentSignatures: new Map(),\n removeHandlers: null,\n navigationInstalled: false,\n };\n }\n return g[ERROR_CAPTURE_STATE_KEY]!;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max) : value;\n}\n\nfunction currentUrl(): string | undefined {\n try {\n return scrubUrl(window.location.href);\n } catch {\n return undefined;\n }\n}\n\n/** Normalize any thrown value into a stable `{ type, message, stack }`. */\nexport function normalizeCapturedError(error: unknown): {\n type: string;\n message: string;\n stack?: string;\n} {\n if (error instanceof Error) {\n return {\n type: error.name || \"Error\",\n message: error.message || String(error),\n stack: typeof error.stack === \"string\" ? error.stack : undefined,\n };\n }\n if (typeof error === \"string\") {\n return { type: \"Error\", message: error };\n }\n if (error && typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : undefined;\n const message =\n typeof record.message === \"string\" ? record.message : undefined;\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n if (name || message || stack) {\n return {\n type: name || \"Error\",\n message: message || safeStringify(error),\n stack,\n };\n }\n return { type: \"Error\", message: safeStringify(error) };\n }\n return { type: \"Error\", message: String(error) };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction coerceTags(\n tags: CaptureExceptionContext[\"tags\"],\n): Record<string, string> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string> = {};\n let count = 0;\n for (const [key, value] of Object.entries(tags)) {\n if (count >= MAX_TAGS) break;\n if (value === undefined || value === null) continue;\n out[key] = truncate(redactSecrets(String(value)), 200);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtra(\n extra: CaptureExceptionContext[\"extra\"],\n): Record<string, unknown> | undefined {\n if (!extra || typeof extra !== \"object\") return undefined;\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [key, value] of Object.entries(extra)) {\n if (count >= MAX_EXTRA_KEYS) break;\n const safeKey = truncate(redactSecrets(key), 100);\n out[safeKey] = SECRET_KEY_RE.test(safeKey)\n ? \"<redacted>\"\n : coerceExtraValue(value, MAX_EXTRA_DEPTH);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtraValue(value: unknown, depth: number): unknown {\n if (\n value == null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n return value;\n }\n if (typeof value === \"string\") {\n return truncate(redactSecrets(value), MAX_EXTRA_STRING_LENGTH);\n }\n if (typeof value === \"bigint\") {\n return truncate(redactSecrets(value.toString()), MAX_EXTRA_STRING_LENGTH);\n }\n if (depth <= 0) {\n return truncate(\n redactSecrets(safeStringify(value)),\n MAX_EXTRA_STRING_LENGTH,\n );\n }\n if (Array.isArray(value)) {\n return value\n .slice(0, MAX_EXTRA_ARRAY_ITEMS)\n .map((item) => coerceExtraValue(item, depth - 1));\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [rawKey, child] of Object.entries(value)) {\n if (count >= MAX_EXTRA_OBJECT_KEYS) break;\n const key = truncate(redactSecrets(rawKey), 100);\n out[key] = SECRET_KEY_RE.test(key)\n ? \"<redacted>\"\n : coerceExtraValue(child, depth - 1);\n count += 1;\n }\n return out;\n }\n return truncate(redactSecrets(String(value)), MAX_EXTRA_STRING_LENGTH);\n}\n\nfunction firstStackLine(stack: string | undefined): string {\n if (!stack) return \"\";\n const lines = stack.split(\"\\n\").map((line) => line.trim());\n return (\n lines.find((line) => line.startsWith(\"at \") || /:\\d+:\\d+/.test(line)) ??\n lines[1] ??\n \"\"\n );\n}\n\n/** Cheap client-side signature used only for local dedupe. */\nfunction signatureOf(type: string, message: string, stack?: string): string {\n return `${type}|${message}|${firstStackLine(stack)}`;\n}\n\nfunction normalizeGlobalErrorEvent(event: ErrorEvent): {\n type: string;\n message: string;\n stack?: string;\n} {\n const error = event?.error;\n const normalized = error\n ? normalizeCapturedError(error)\n : {\n type: \"Error\",\n message: String(event?.message ?? \"Uncaught error\"),\n };\n\n if (!normalized.stack && event?.filename) {\n const line = event.lineno ?? 0;\n const col = event.colno ?? 0;\n normalized.stack = `at ${event.filename}:${line}:${col}`;\n }\n\n return normalized;\n}\n\nfunction shouldIgnoreAutoCapturedError(normalized: {\n type: string;\n message: string;\n stack?: string;\n}): boolean {\n const message = (normalized.message || \"\").trim();\n const stack = normalized.stack || \"\";\n\n if (\n /^ResizeObserver loop (?:limit exceeded|completed with undelivered notifications\\.?)$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n // Route-chunk recovery reloads the current page after stale lazy chunks or\n // module scripts fail. Browser-level failures have no useful stack, so do\n // not retain the transient loader noise as an application issue.\n if (!stack && isDynamicImportFailureMessage(message)) {\n return true;\n }\n\n if (\n normalized.type === \"InvalidStateError\" &&\n /^Transition was aborted because of invalid state$/i.test(message)\n ) {\n return true;\n }\n\n if (\n /^This script should only be loaded in a browser extension\\.?$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n const hasExtensionFrame =\n /\\b(?:chrome|moz|safari|webkit)-extension:\\/\\//i.test(stack) ||\n /\\binjectScriptAdjust\\.js\\b/i.test(stack);\n if (\n hasExtensionFrame &&\n /^(?:TypeError:\\s*)?Failed to fetch(?:\\s*\\([^)]*\\))?$/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction shouldDedupe(\n runtime: ErrorCaptureRuntime,\n signature: string,\n): boolean {\n const now = Date.now();\n const windowMs = runtime.config.dedupeWindowMs;\n // Opportunistic cleanup so the map can't grow without bound.\n if (runtime.recentSignatures.size > 200) {\n for (const [key, ts] of runtime.recentSignatures) {\n if (now - ts > windowMs) runtime.recentSignatures.delete(key);\n }\n }\n const last = runtime.recentSignatures.get(signature);\n runtime.recentSignatures.set(signature, now);\n return last !== undefined && now - last < windowMs;\n}\n\n/** Append a privacy-safe breadcrumb to the bounded ring buffer. */\nexport function addErrorBreadcrumb(breadcrumb: {\n category: string;\n message: string;\n level?: ExceptionLevel;\n}): void {\n try {\n const runtime = getRuntime();\n runtime.breadcrumbs.push({\n timestamp: nowIso(),\n category: truncate(breadcrumb.category, 60),\n message: truncate(redactSecrets(breadcrumb.message), 300),\n ...(breadcrumb.level ? { level: breadcrumb.level } : {}),\n });\n const max = runtime.config.maxBreadcrumbs;\n if (runtime.breadcrumbs.length > max) {\n runtime.breadcrumbs.splice(0, runtime.breadcrumbs.length - max);\n }\n } catch {\n // breadcrumbs are best-effort\n }\n}\n\nfunction snapshotBreadcrumbs(\n runtime: ErrorCaptureRuntime,\n): ExceptionBreadcrumb[] {\n return runtime.breadcrumbs.slice(-runtime.config.maxBreadcrumbs);\n}\n\nfunction installNavigationBreadcrumbs(runtime: ErrorCaptureRuntime): void {\n if (runtime.navigationInstalled || typeof window === \"undefined\") return;\n runtime.navigationInstalled = true;\n const record = (navType: string) => {\n try {\n addErrorBreadcrumb({\n category: \"navigation\",\n message: `${navType} ${scrubUrl(window.location.href) ?? window.location.pathname}`,\n });\n } catch {\n // ignore\n }\n };\n try {\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPush.apply(this, args);\n record(\"navigate\");\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplace.apply(this, args);\n record(\"replace\");\n return result;\n };\n window.addEventListener(\"popstate\", () => record(\"popstate\"));\n // Seed the trail with the initial location.\n record(\"load\");\n } catch {\n // navigation breadcrumbs are best-effort\n }\n}\n\nfunction buildEvent(\n runtime: ErrorCaptureRuntime,\n normalized: { type: string; message: string; stack?: string },\n options: {\n handled: boolean;\n level: ExceptionLevel;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n },\n): CapturedExceptionEvent {\n const context = runtime.config.getSessionContext?.() ?? {};\n const stack = normalized.stack\n ? truncate(redactSecrets(normalized.stack), MAX_STACK_LENGTH)\n : undefined;\n return {\n type: truncate(normalized.type || \"Error\", 200),\n message: truncate(\n redactSecrets(normalized.message || \"\"),\n MAX_MESSAGE_LENGTH,\n ),\n ...(stack ? { stack } : {}),\n handled: options.handled,\n level: options.level,\n occurredAt: nowIso(),\n ...(currentUrl() ? { url: currentUrl() } : {}),\n ...(runtime.config.release ? { release: runtime.config.release } : {}),\n ...(runtime.config.environment\n ? { environment: runtime.config.environment }\n : {}),\n ...(context.sessionId ? { sessionId: context.sessionId } : {}),\n ...(context.replayId ? { sessionReplayId: context.replayId } : {}),\n ...(context.anonymousId ? { anonymousId: context.anonymousId } : {}),\n breadcrumbs: snapshotBreadcrumbs(runtime),\n ...(options.tags ? { tags: options.tags } : {}),\n ...(options.extra ? { extra: options.extra } : {}),\n };\n}\n\nfunction dispatch(\n runtime: ErrorCaptureRuntime,\n event: CapturedExceptionEvent,\n emitToReplay: boolean,\n): void {\n const signature = signatureOf(event.type, event.message, event.stack);\n if (shouldDedupe(runtime, signature)) return;\n try {\n runtime.config.send(event);\n } catch {\n // transport must never throw into the host app\n }\n if (emitToReplay) {\n try {\n runtime.config.emitReplayEvent?.(event);\n } catch {\n // replay timeline emission is best-effort\n }\n }\n // Record the exception itself as a breadcrumb so a following error carries\n // the prior failure in its trail.\n addErrorBreadcrumb({\n category: \"exception\",\n message: `${event.type}: ${event.message}`,\n level: event.level,\n });\n}\n\n/**\n * Capture a handled exception. Mirrors Sentry's `captureException(err, ctx)`.\n * Safe to call before `configureTracking` has run — it simply no-ops if no\n * transport is installed yet.\n */\nexport function captureException(\n error: unknown,\n context: CaptureExceptionContext = {},\n): void {\n try {\n const runtime = getRuntime();\n const normalized = normalizeCapturedError(error);\n const event = buildEvent(runtime, normalized, {\n handled: true,\n level: context.level ?? \"error\",\n tags: coerceTags(context.tags),\n extra: coerceExtra(context.extra),\n });\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Capture a message string as an exception-like event. Mirrors Sentry's\n * `captureMessage(message, level?)`.\n */\nexport function captureMessage(\n message: string,\n level: ExceptionLevel = \"info\",\n): void {\n try {\n const runtime = getRuntime();\n const event = buildEvent(\n runtime,\n { type: \"Message\", message: String(message ?? \"\") },\n { handled: true, level },\n );\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Install auto-capture + wire the transport. Idempotent: re-invoking updates\n * the config (and (re)installs global handlers) without duplicating listeners.\n * Returns a disposer that removes the global handlers.\n */\nexport function installErrorCapture(\n options: InstallErrorCaptureOptions,\n): () => void {\n const runtime = getRuntime();\n runtime.config = {\n ...runtime.config,\n ...options,\n captureGlobalErrors: options.captureGlobalErrors ?? true,\n captureUnhandledRejections: options.captureUnhandledRejections ?? true,\n maxBreadcrumbs: options.maxBreadcrumbs ?? runtime.config.maxBreadcrumbs,\n dedupeWindowMs: options.dedupeWindowMs ?? runtime.config.dedupeWindowMs,\n };\n\n if (typeof window === \"undefined\") return () => {};\n\n installNavigationBreadcrumbs(runtime);\n\n // Tear down any previously-installed handlers before reinstalling so a second\n // configureTracking call doesn't double-report.\n runtime.removeHandlers?.();\n runtime.removeHandlers = null;\n\n const removers: Array<() => void> = [];\n\n if (runtime.config.captureGlobalErrors) {\n const onError = (event: ErrorEvent) => {\n try {\n // Route-chunk recovery and other host listeners may intentionally\n // prevent a browser error after handling it. Respect that decision so\n // the same transient failure is not stored as an application issue.\n if (event.defaultPrevented) return;\n const normalized = normalizeGlobalErrorEvent(event);\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n // Global errors are already logged by the session replay recorder, so\n // don't re-emit them onto the replay timeline (avoid double-counting).\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"error\", onError as EventListener);\n removers.push(() =>\n window.removeEventListener(\"error\", onError as EventListener),\n );\n }\n\n if (runtime.config.captureUnhandledRejections) {\n const onRejection = (event: PromiseRejectionEvent) => {\n try {\n if (event.defaultPrevented) return;\n const reason = event?.reason;\n const normalized = normalizeCapturedError(reason);\n if (!normalized.type || normalized.type === \"Error\") {\n normalized.type = \"UnhandledRejection\";\n }\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"unhandledrejection\", onRejection as EventListener);\n removers.push(() =>\n window.removeEventListener(\n \"unhandledrejection\",\n onRejection as EventListener,\n ),\n );\n }\n\n runtime.installed = true;\n runtime.removeHandlers = () => {\n for (const remove of removers) {\n try {\n remove();\n } catch {\n // best-effort teardown\n }\n }\n runtime.removeHandlers = null;\n runtime.installed = false;\n };\n return runtime.removeHandlers;\n}\n\nexport function isErrorCaptureInstalled(): boolean {\n return getRuntime().installed;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionsListPage.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"AAqGA,MAAM,WAAW,uBAAuB;IACtC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAgB,GACjB,GAAE,uBAA4B,+
|
|
1
|
+
{"version":3,"file":"ExtensionsListPage.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"AAqGA,MAAM,WAAW,uBAAuB;IACtC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAgB,GACjB,GAAE,uBAA4B,+BAuV9B"}
|
|
@@ -113,9 +113,9 @@ export function ExtensionsListPage({ embedded = false, } = {}) {
|
|
|
113
113
|
queryClient.invalidateQueries({ queryKey: ["extensions"] });
|
|
114
114
|
}
|
|
115
115
|
};
|
|
116
|
-
return (_jsxs("div", { className: cn("flex w-full flex-col", embedded ? "min-h-[28rem]" : "h-full"), children: [_jsxs("header", { className: "flex h-12 items-center justify-between
|
|
116
|
+
return (_jsxs("div", { className: cn("flex w-full flex-col", embedded ? "min-h-[28rem]" : "h-full"), children: [_jsxs("header", { className: cn("flex h-12 items-center justify-between px-4 shrink-0", !embedded && "border-b"), children: [!embedded ? (_jsx("div", { className: "flex items-center gap-2", children: _jsx("h1", { className: "text-sm font-semibold", children: t("extensions.title") }) })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), t("extensions.newExtension")] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: t("extensions.newExtensionTitle") }), _jsx(PromptComposer, { autoFocus: true, placeholder: t("extensions.buildPlaceholder"), draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "aria-label": t("extensions.optionsFor", {
|
|
117
117
|
name: t("extensions.title"),
|
|
118
|
-
}), children: _jsx(IconDotsVertical, { className: "h-4 w-4" }) }) }), _jsx(DropdownMenuContent, { align: "end", className: "w-44", children: _jsx(DropdownMenuCheckboxItem, { checked: showGloballyHidden, onCheckedChange: (checked) => setShowGloballyHidden(Boolean(checked)), children: t("extensions.showHidden") }) })] }), _jsx(AgentToggleButton, {})] })] }), _jsx("div", { className: "flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10", children: extensionsQuery.isLoading ? (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => (_jsxs("div", { className: "rounded-lg border border-border bg-card p-5", children: [_jsx("div", { className: "mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 h-4 w-2/3 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 w-4/5 rounded bg-muted animate-pulse" })] }, i))) })) : extensionsQuery.isError ? (_jsx(ExtensionQueryErrorState, { className: "min-h-[calc(100vh-9rem)]", message: t("extensions.loadError"), onRetry: () => void extensionsQuery.refetch(), retrying: extensionsQuery.isFetching })) : toolList.length === 0 ? (_jsx("div", { className: "flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16", children: _jsxs("div", { className: "mx-auto flex w-full max-w-[34rem] flex-col gap-7", children: [_jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [_jsx(IconTool, { className: "h-10 w-10 text-muted-foreground/40" }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-base font-semibold text-foreground", children: t("extensions.emptyTitle") }), _jsx("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: t("extensions.emptyDescription") })] })] }), _jsx(CreateToolInput, { className: "w-full" })] }) })) : (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: toolList.map((extension) => {
|
|
118
|
+
}), children: _jsx(IconDotsVertical, { className: "h-4 w-4" }) }) }), _jsx(DropdownMenuContent, { align: "end", className: "w-44", children: _jsx(DropdownMenuCheckboxItem, { checked: showGloballyHidden, onCheckedChange: (checked) => setShowGloballyHidden(Boolean(checked)), children: t("extensions.showHidden") }) })] }), !embedded ? _jsx(AgentToggleButton, {}) : null] })] }), _jsx("div", { className: "flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10", children: extensionsQuery.isLoading ? (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => (_jsxs("div", { className: "rounded-lg border border-border bg-card p-5", children: [_jsx("div", { className: "mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 h-4 w-2/3 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 w-4/5 rounded bg-muted animate-pulse" })] }, i))) })) : extensionsQuery.isError ? (_jsx(ExtensionQueryErrorState, { className: "min-h-[calc(100vh-9rem)]", message: t("extensions.loadError"), onRetry: () => void extensionsQuery.refetch(), retrying: extensionsQuery.isFetching })) : toolList.length === 0 ? (_jsx("div", { className: "flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16", children: _jsxs("div", { className: "mx-auto flex w-full max-w-[34rem] flex-col gap-7", children: [_jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [_jsx(IconTool, { className: "h-10 w-10 text-muted-foreground/40" }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-base font-semibold text-foreground", children: t("extensions.emptyTitle") }), _jsx("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: t("extensions.emptyDescription") })] })] }), _jsx(CreateToolInput, { className: "w-full" })] }) })) : (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: toolList.map((extension) => {
|
|
119
119
|
const isLocalExtension = extension.source?.mode === "local-files";
|
|
120
120
|
return (_jsxs("div", { className: cn("group relative rounded-lg border border-border bg-card", "hover:border-primary/30 hover:shadow-sm", extension.globallyHidden && "opacity-60"), children: [_jsxs(Link, { to: extensionPath(extension.id, extension.name), className: "block p-5 pr-12", children: [_jsx("div", { className: "mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary", children: _jsx(IconTool, { className: "h-5 w-5" }) }), _jsxs("h3", { className: "mb-1 flex items-center gap-1.5 text-sm font-semibold text-foreground", children: [extension.globallyHidden && (_jsx(IconEyeOff, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground", "aria-label": t("extensions.hiddenFromEveryone") })), _jsx("span", { className: "truncate", children: extension.name })] }), extension.description && (_jsx("p", { className: "line-clamp-2 text-xs text-muted-foreground", children: extension.description })), isLocalExtension && (_jsx("p", { className: "mt-3 inline-flex rounded-md border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground", children: t("extensions.localFile") }))] }), _jsxs(Popover, { open: confirmDeleteId === extension.id, onOpenChange: (open) => setConfirmDeleteId(open ? extension.id : null), children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100", "aria-label": t("extensions.optionsFor", {
|
|
121
121
|
name: extension.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconDotsVertical,\n IconEye,\n IconEyeOff,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect } from \"react\";\nimport { Link } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { PromptComposer } from \"../composer/index.js\";\nimport { useT } from \"../i18n.js\";\nimport { cn } from \"../utils.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\nimport { ExtensionQueryErrorState } from \"./ExtensionQueryErrorState.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n canDelete?: boolean;\n globallyHidden?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n entryPath?: string;\n };\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(\n prompt: string,\n messageForPrompt: (prompt: string) => string,\n) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: messageForPrompt(trimmed),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n const t = useT();\n return (\n <div className={cn(\"flex flex-col gap-2 text-left\", className)}>\n <p className=\"px-1 text-sm font-medium text-foreground\">\n {t(\"extensions.whatShouldItDo\")}\n </p>\n <PromptComposer\n autoFocus\n className=\"text-left\"\n placeholder={t(\"extensions.createPlaceholder\")}\n draftScope=\"extensions:create\"\n onSubmit={(text) =>\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n )\n }\n />\n </div>\n );\n}\n\nexport interface ExtensionsListPageProps {\n /** Skip the standalone extensions navigation state when embedded in Settings. */\n embedded?: boolean;\n}\n\nexport function ExtensionsListPage({\n embedded = false,\n}: ExtensionsListPageProps = {}) {\n const t = useT();\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [showGloballyHidden, setShowGloballyHidden] = useState(false);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n if (embedded) return;\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, [embedded]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\n\n const extensionsQuery = useQuery<Extension[]>({\n queryKey: [\"extensions\", { includeGloballyHidden: showGloballyHidden }],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n showGloballyHidden\n ? \"/_agent-native/extensions?includeGloballyHidden=true\"\n : \"/_agent-native/extensions\",\n ),\n );\n if (!res.ok) throw new Error(`Failed to load extensions (${res.status})`);\n return res.json();\n },\n });\n const extensions = extensionsQuery.data;\n\n const toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n );\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n await deleteOrHideExtension(extension);\n invalidateExtensionRemoval(queryClient, extension.id);\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n const handleGlobalHideToggle = async (extension: Extension) => {\n setConfirmDeleteId(null);\n const action = extension.globallyHidden ? \"global-unhide\" : \"global-hide\";\n try {\n await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}/${action}`),\n { method: \"POST\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div\n className={cn(\n \"flex w-full flex-col\",\n embedded ? \"min-h-[28rem]\" : \"h-full\",\n )}\n >\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-sm font-semibold\">{t(\"extensions.title\")}</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n {t(\"extensions.newExtension\")}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n {t(\"extensions.newExtensionTitle\")}\n </p>\n <PromptComposer\n autoFocus\n placeholder={t(\"extensions.buildPlaceholder\")}\n draftScope=\"extensions:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={t(\"extensions.optionsFor\", {\n name: t(\"extensions.title\"),\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuCheckboxItem\n checked={showGloballyHidden}\n onCheckedChange={(checked) =>\n setShowGloballyHidden(Boolean(checked))\n }\n >\n {t(\"extensions.showHidden\")}\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <AgentToggleButton />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10\">\n {extensionsQuery.isLoading ? (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : extensionsQuery.isError ? (\n <ExtensionQueryErrorState\n className=\"min-h-[calc(100vh-9rem)]\"\n message={t(\"extensions.loadError\")}\n onRetry={() => void extensionsQuery.refetch()}\n retrying={extensionsQuery.isFetching}\n />\n ) : toolList.length === 0 ? (\n <div className=\"flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16\">\n <div className=\"mx-auto flex w-full max-w-[34rem] flex-col gap-7\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div className=\"space-y-1.5\">\n <p className=\"text-base font-semibold text-foreground\">\n {t(\"extensions.emptyTitle\")}\n </p>\n <p className=\"mx-auto max-w-sm text-sm text-muted-foreground\">\n {t(\"extensions.emptyDescription\")}\n </p>\n </div>\n </div>\n <CreateToolInput className=\"w-full\" />\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => {\n const isLocalExtension = extension.source?.mode === \"local-files\";\n return (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n extension.globallyHidden && \"opacity-60\",\n )}\n >\n <Link\n to={extensionPath(extension.id, extension.name)}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n {extension.globallyHidden && (\n <IconEyeOff\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n aria-label={t(\"extensions.hiddenFromEveryone\")}\n />\n )}\n <span className=\"truncate\">{extension.name}</span>\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n {isLocalExtension && (\n <p className=\"mt-3 inline-flex rounded-md border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t(\"extensions.localFile\")}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={t(\"extensions.optionsFor\", {\n name: extension.name,\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n {!isLocalExtension && extension.canDelete !== false && (\n <div className=\"border-b p-1\">\n <button\n type=\"button\"\n onClick={() => handleGlobalHideToggle(extension)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-[12px] hover:bg-accent\"\n >\n {extension.globallyHidden ? (\n <>\n <IconEye className=\"h-3.5 w-3.5\" />\n {t(\"extensions.unhideEveryone\")}\n </>\n ) : (\n <>\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n {t(\"extensions.hideEveryone\")}\n </>\n )}\n </button>\n </div>\n )}\n {isLocalExtension ? (\n <div className=\"p-3 text-[12px] text-muted-foreground\">\n {t(\"extensions.localFileDescription\", {\n entryPath:\n extension.source?.entryPath ?? \"local files\",\n })}\n </div>\n ) : (\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n {extension.canDelete === false\n ? t(\"extensions.removeQuestion\", {\n name: extension.name,\n })\n : t(\"extensions.deleteQuestion\", {\n name: extension.name,\n })}{\" \"}\n {extension.canDelete === false\n ? t(\"extensions.hideForYouDescription\")\n : t(\"extensions.removeEverywhereDescription\")}\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? extension.canDelete === false\n ? t(\"extensions.removing\")\n : t(\"extensions.deleting\")\n : extension.canDelete === false\n ? t(\"extensions.remove\")\n : t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconDotsVertical,\n IconEye,\n IconEyeOff,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect } from \"react\";\nimport { Link } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { PromptComposer } from \"../composer/index.js\";\nimport { useT } from \"../i18n.js\";\nimport { cn } from \"../utils.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\nimport { ExtensionQueryErrorState } from \"./ExtensionQueryErrorState.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n canDelete?: boolean;\n globallyHidden?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n entryPath?: string;\n };\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(\n prompt: string,\n messageForPrompt: (prompt: string) => string,\n) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: messageForPrompt(trimmed),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n const t = useT();\n return (\n <div className={cn(\"flex flex-col gap-2 text-left\", className)}>\n <p className=\"px-1 text-sm font-medium text-foreground\">\n {t(\"extensions.whatShouldItDo\")}\n </p>\n <PromptComposer\n autoFocus\n className=\"text-left\"\n placeholder={t(\"extensions.createPlaceholder\")}\n draftScope=\"extensions:create\"\n onSubmit={(text) =>\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n )\n }\n />\n </div>\n );\n}\n\nexport interface ExtensionsListPageProps {\n /** Skip the standalone extensions navigation state when embedded in Settings. */\n embedded?: boolean;\n}\n\nexport function ExtensionsListPage({\n embedded = false,\n}: ExtensionsListPageProps = {}) {\n const t = useT();\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [showGloballyHidden, setShowGloballyHidden] = useState(false);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n if (embedded) return;\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, [embedded]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\n\n const extensionsQuery = useQuery<Extension[]>({\n queryKey: [\"extensions\", { includeGloballyHidden: showGloballyHidden }],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n showGloballyHidden\n ? \"/_agent-native/extensions?includeGloballyHidden=true\"\n : \"/_agent-native/extensions\",\n ),\n );\n if (!res.ok) throw new Error(`Failed to load extensions (${res.status})`);\n return res.json();\n },\n });\n const extensions = extensionsQuery.data;\n\n const toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n );\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n await deleteOrHideExtension(extension);\n invalidateExtensionRemoval(queryClient, extension.id);\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n const handleGlobalHideToggle = async (extension: Extension) => {\n setConfirmDeleteId(null);\n const action = extension.globallyHidden ? \"global-unhide\" : \"global-hide\";\n try {\n await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}/${action}`),\n { method: \"POST\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div\n className={cn(\n \"flex w-full flex-col\",\n embedded ? \"min-h-[28rem]\" : \"h-full\",\n )}\n >\n <header\n className={cn(\n \"flex h-12 items-center justify-between px-4 shrink-0\",\n !embedded && \"border-b\",\n )}\n >\n {!embedded ? (\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-sm font-semibold\">{t(\"extensions.title\")}</h1>\n </div>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n {t(\"extensions.newExtension\")}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n {t(\"extensions.newExtensionTitle\")}\n </p>\n <PromptComposer\n autoFocus\n placeholder={t(\"extensions.buildPlaceholder\")}\n draftScope=\"extensions:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={t(\"extensions.optionsFor\", {\n name: t(\"extensions.title\"),\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuCheckboxItem\n checked={showGloballyHidden}\n onCheckedChange={(checked) =>\n setShowGloballyHidden(Boolean(checked))\n }\n >\n {t(\"extensions.showHidden\")}\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {!embedded ? <AgentToggleButton /> : null}\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10\">\n {extensionsQuery.isLoading ? (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : extensionsQuery.isError ? (\n <ExtensionQueryErrorState\n className=\"min-h-[calc(100vh-9rem)]\"\n message={t(\"extensions.loadError\")}\n onRetry={() => void extensionsQuery.refetch()}\n retrying={extensionsQuery.isFetching}\n />\n ) : toolList.length === 0 ? (\n <div className=\"flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16\">\n <div className=\"mx-auto flex w-full max-w-[34rem] flex-col gap-7\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div className=\"space-y-1.5\">\n <p className=\"text-base font-semibold text-foreground\">\n {t(\"extensions.emptyTitle\")}\n </p>\n <p className=\"mx-auto max-w-sm text-sm text-muted-foreground\">\n {t(\"extensions.emptyDescription\")}\n </p>\n </div>\n </div>\n <CreateToolInput className=\"w-full\" />\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => {\n const isLocalExtension = extension.source?.mode === \"local-files\";\n return (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n extension.globallyHidden && \"opacity-60\",\n )}\n >\n <Link\n to={extensionPath(extension.id, extension.name)}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n {extension.globallyHidden && (\n <IconEyeOff\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n aria-label={t(\"extensions.hiddenFromEveryone\")}\n />\n )}\n <span className=\"truncate\">{extension.name}</span>\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n {isLocalExtension && (\n <p className=\"mt-3 inline-flex rounded-md border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t(\"extensions.localFile\")}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={t(\"extensions.optionsFor\", {\n name: extension.name,\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n {!isLocalExtension && extension.canDelete !== false && (\n <div className=\"border-b p-1\">\n <button\n type=\"button\"\n onClick={() => handleGlobalHideToggle(extension)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-[12px] hover:bg-accent\"\n >\n {extension.globallyHidden ? (\n <>\n <IconEye className=\"h-3.5 w-3.5\" />\n {t(\"extensions.unhideEveryone\")}\n </>\n ) : (\n <>\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n {t(\"extensions.hideEveryone\")}\n </>\n )}\n </button>\n </div>\n )}\n {isLocalExtension ? (\n <div className=\"p-3 text-[12px] text-muted-foreground\">\n {t(\"extensions.localFileDescription\", {\n entryPath:\n extension.source?.entryPath ?? \"local files\",\n })}\n </div>\n ) : (\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n {extension.canDelete === false\n ? t(\"extensions.removeQuestion\", {\n name: extension.name,\n })\n : t(\"extensions.deleteQuestion\", {\n name: extension.name,\n })}{\" \"}\n {extension.canDelete === false\n ? t(\"extensions.hideForYouDescription\")\n : t(\"extensions.removeEverywhereDescription\")}\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? extension.canDelete === false\n ? t(\"extensions.removing\")\n : t(\"extensions.deleting\")\n : extension.canDelete === false\n ? t(\"extensions.remove\")\n : t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-native-extension-runtime.js","sourceRoot":"","sources":["../../../src/client/extensions/agent-native-extension-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\n\nexport const AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES = {\n REQUEST: \"agentNative.extension.storage\",\n RESPONSE: \"agentNative.extension.storageResult\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n RESIZE: \"agentNative.extension.resize\",\n} as const;\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\";\n\nexport type AgentNativeExtensionStorageOperation =\n | \"list\"\n | \"get\"\n | \"set\"\n | \"remove\";\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content: string;\n updatedAt?: string;\n}\n\nexport interface AgentNativeExtensionStorageRequest {\n operation: AgentNativeExtensionStorageOperation;\n extensionId: string;\n collection: string;\n id?: string;\n data?: unknown;\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n}\n\nexport interface AgentNativeExtensionDataRow {\n id: string;\n extensionId: string;\n collection: string;\n data: unknown;\n scope: AgentNativeExtensionStorageScope;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: {\n scope?: AgentNativeExtensionStorageScope | \"all\";\n limit?: number;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow[]>;\n get(\n collection: string,\n id: string,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow>;\n remove(\n collection: string,\n id: string,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<{ ok: true }>;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n dark?: boolean;\n themeCss?: string;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\nfunction safeJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nconst defaultThemeCss = `\n:root {\n color-scheme: light;\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --border: 214.3 31.8% 91.4%;\n --primary: 221.2 83.2% 53.3%;\n --primary-foreground: 210 40% 98%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n}\n.dark {\n color-scheme: dark;\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --border: 217.2 32.6% 17.5%;\n --primary: 217.2 91.2% 59.8%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84% 60%;\n --destructive-foreground: 210 40% 98%;\n}\nhtml, body {\n margin: 0;\n min-height: 100%;\n background: transparent;\n color: hsl(var(--foreground));\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\nbody {\n padding: 0;\n}\n`;\n\nexport function buildAgentNativeExtensionHtml(\n options: BuildAgentNativeExtensionHtmlOptions,\n): string {\n const extensionId = safeJson(options.extensionId);\n const storageRequestType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.REQUEST,\n );\n const storageResponseType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESPONSE,\n );\n const slotContextType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.SLOT_CONTEXT,\n );\n const resizeType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESIZE,\n );\n const themeCss = `${defaultThemeCss}\\n${options.themeCss ?? \"\"}`;\n\n return `<!doctype html>\n<html lang=\"en\"${options.dark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${EXTENSION_IFRAME_META_CSP}\" />\n <title>${escapeHtml(options.title ?? \"Agent Native extension\")}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-background: hsl(var(--background));\n --color-foreground: hsl(var(--foreground));\n --color-muted: hsl(var(--muted));\n --color-muted-foreground: hsl(var(--muted-foreground));\n --color-border: hsl(var(--border));\n --color-primary: hsl(var(--primary));\n --color-primary-foreground: hsl(var(--primary-foreground));\n --color-destructive: hsl(var(--destructive));\n --color-destructive-foreground: hsl(var(--destructive-foreground));\n }\n </style>\n <script>\n (function() {\n var extensionId = ${extensionId};\n var pending = {};\n var seq = 0;\n var slotContext = {};\n var HOST = {\n READY: \"agentNative.host.ready\",\n GET_CONTEXT: \"agentNative.host.getContext\",\n CONTEXT: \"agentNative.host.context\",\n LIST_ACTIONS: \"agentNative.host.listActions\",\n ACTIONS: \"agentNative.host.actions\",\n RUN_ACTION: \"agentNative.host.runAction\",\n ACTION_RESULT: \"agentNative.host.actionResult\",\n COMMAND: \"agentNative.host.command\",\n COMMAND_RESULT: \"agentNative.host.commandResult\"\n };\n var STORAGE_REQUEST = ${storageRequestType};\n var STORAGE_RESPONSE = ${storageResponseType};\n var SLOT_CONTEXT = ${slotContextType};\n var RESIZE = ${resizeType};\n\n function nextId(prefix) {\n seq += 1;\n return prefix + \"-\" + Date.now() + \"-\" + seq;\n }\n\n function request(type, responseType, payload, timeoutMs) {\n return new Promise(function(resolve, reject) {\n var requestId = nextId(\"extension\");\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error(\"Extension host request timed out\"));\n }, timeoutMs || 30000);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer\n };\n window.parent.postMessage(Object.assign({ type: type, requestId: requestId }, payload || {}), \"*\");\n });\n }\n\n window.addEventListener(\"message\", function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n if (message.type === SLOT_CONTEXT) {\n slotContext = message.context || {};\n window.slotContext = slotContext;\n window.agentNative.slotContext = slotContext;\n return;\n }\n var item = pending[message.requestId];\n if (!item || message.type !== item.responseType) return;\n clearTimeout(item.timer);\n delete pending[message.requestId];\n if (message.ok === false || message.error) {\n item.reject(new Error(message.error || \"Extension host request failed\"));\n return;\n }\n item.resolve(message);\n });\n\n function storage(operation, payload) {\n return request(STORAGE_REQUEST, STORAGE_RESPONSE, Object.assign({\n operation: operation,\n extensionId: extensionId\n }, payload || {})).then(function(message) {\n return message.result;\n });\n }\n\n var api = {\n extensionId: extensionId,\n slotContext: slotContext,\n context: function() {\n return request(HOST.GET_CONTEXT, HOST.CONTEXT).then(function(message) {\n return message.context || {};\n });\n },\n listActions: function() {\n return request(HOST.LIST_ACTIONS, HOST.ACTIONS).then(function(message) {\n return message.actions || [];\n });\n },\n action: function(name, args) {\n return request(HOST.RUN_ACTION, HOST.ACTION_RESULT, {\n name: name,\n args: args || {}\n }).then(function(message) {\n return message.result;\n });\n },\n command: function(command, payload) {\n return request(HOST.COMMAND, HOST.COMMAND_RESULT, {\n command: command,\n payload: payload\n }).then(function(message) {\n return message.result;\n });\n },\n refresh: function(payload) {\n return api.command(\"refreshData\", payload);\n },\n data: {\n list: function(collection, opts) {\n opts = opts || {};\n return storage(\"list\", {\n collection: collection,\n scope: opts.scope,\n limit: opts.limit\n });\n },\n get: function(collection, id, opts) {\n opts = opts || {};\n return storage(\"get\", {\n collection: collection,\n id: id,\n scope: opts.scope\n });\n },\n set: function(collection, id, data, opts) {\n opts = opts || {};\n return storage(\"set\", {\n collection: collection,\n id: id,\n data: data,\n scope: opts.scope\n });\n },\n remove: function(collection, id, opts) {\n opts = opts || {};\n return storage(\"remove\", {\n collection: collection,\n id: id,\n scope: opts.scope\n });\n }\n }\n };\n\n window.agentNative = api;\n window.appAction = api.action;\n window.extensionData = api.data;\n window.extensionId = extensionId;\n window.slotContext = slotContext;\n window.toolData = api.data;\n window.toolId = extensionId;\n\n function reportSize() {\n var height = Math.max(\n document.documentElement ? document.documentElement.scrollHeight : 0,\n document.body ? document.body.scrollHeight : 0\n );\n window.parent.postMessage({ type: RESIZE, height: height }, \"*\");\n }\n if (typeof ResizeObserver !== \"undefined\") {\n window.addEventListener(\"DOMContentLoaded\", function() {\n var observer = new ResizeObserver(reportSize);\n observer.observe(document.body);\n reportSize();\n });\n } else {\n window.addEventListener(\"load\", reportSize);\n setInterval(reportSize, 1000);\n }\n\n window.parent.postMessage({ type: HOST.READY, requestId: nextId(\"ready\") }, \"*\");\n })();\n </script>\n</head>\n<body>\n${options.content}\n</body>\n</html>`;\n}\n\nfunction storageKey(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n): string {\n return [\n \"agent-native-extension-data\",\n namespace,\n context.extensionId,\n scope,\n collection,\n ]\n .map(encodeURIComponent)\n .join(\":\");\n}\n\nfunction readCollection(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n): Record<string, AgentNativeExtensionDataRow> {\n if (typeof localStorage === \"undefined\") return {};\n const raw = localStorage.getItem(\n storageKey(namespace, context, collection, scope),\n );\n if (!raw) return {};\n try {\n return JSON.parse(raw) as Record<string, AgentNativeExtensionDataRow>;\n } catch {\n return {};\n }\n}\n\nfunction writeCollection(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n rows: Record<string, AgentNativeExtensionDataRow>,\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n storageKey(namespace, context, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction normalizeScope(\n scope: AgentNativeExtensionStorageScope | undefined,\n): AgentNativeExtensionStorageScope {\n return scope === \"org\" ? \"org\" : \"user\";\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n async list(collection, options) {\n const scopes =\n options.scope === \"all\"\n ? ([\"user\", \"org\"] as const)\n : ([normalizeScope(options.scope)] as const);\n const rows = scopes.flatMap((scope) =>\n Object.values(\n readCollection(namespace, options.context, collection, scope),\n ),\n );\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, options.limit ?? 100);\n },\n async get(collection, id, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n return rows[id] ?? null;\n },\n async set(collection, id, data, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n const now = new Date().toISOString();\n const row: AgentNativeExtensionDataRow = {\n id,\n extensionId: options.context.extensionId,\n collection,\n data,\n scope,\n createdAt: rows[id]?.createdAt ?? now,\n updatedAt: now,\n };\n rows[id] = row;\n writeCollection(namespace, options.context, collection, scope, rows);\n return row;\n },\n async remove(collection, id, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n delete rows[id];\n writeCollection(namespace, options.context, collection, scope, rows);\n return { ok: true };\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-native-extension-runtime.js","sourceRoot":"","sources":["../../../src/client/extensions/agent-native-extension-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,4CAA4C,GAAG;IAC1D,OAAO,EAAE,+BAA+B;IACxC,QAAQ,EAAE,qCAAqC;IAC/C,YAAY,EAAE,mCAAmC;IACjD,MAAM,EAAE,8BAA8B;CAC9B,CAAC;AAwFX,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCvB,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAC3C,OAA6C;IAE7C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,kBAAkB,GAAG,QAAQ,CACjC,4CAA4C,CAAC,OAAO,CACrD,CAAC;IACF,MAAM,mBAAmB,GAAG,QAAQ,CAClC,4CAA4C,CAAC,QAAQ,CACtD,CAAC;IACF,MAAM,eAAe,GAAG,QAAQ,CAC9B,4CAA4C,CAAC,YAAY,CAC1D,CAAC;IACF,MAAM,UAAU,GAAG,QAAQ,CACzB,4CAA4C,CAAC,MAAM,CACpD,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,eAAe,KAAK,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;IAEjE,OAAO;iBACQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;;;;wDAII,yBAAyB;WACtE,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI,wBAAwB,CAAC;;;;;;;;;;;;;;;WAerD,QAAQ;;;;;;;;;;;;;;;;;0BAiBO,WAAW;;;;;;;;;;;;;;;8BAeP,kBAAkB;+BACjB,mBAAmB;2BACvB,eAAe;qBACrB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyJ7B,OAAO,CAAC,OAAO;;QAET,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CACjB,SAAiB,EACjB,OAA2C,EAC3C,UAAkB,EAClB,KAAuC;IAEvC,OAAO;QACL,6BAA6B;QAC7B,SAAS;QACT,OAAO,CAAC,WAAW;QACnB,KAAK;QACL,UAAU;KACX;SACE,GAAG,CAAC,kBAAkB,CAAC;SACvB,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,SAAiB,EACjB,OAA2C,EAC3C,UAAkB,EAClB,KAAuC;IAEvC,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAC9B,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAClD,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgD,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,SAAiB,EACjB,OAA2C,EAC3C,UAAkB,EAClB,KAAuC,EACvC,IAAiD;IAEjD,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO;IAChD,YAAY,CAAC,OAAO,CAClB,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,EACjD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAmD;IAEnD,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,6CAA6C,CAC3D,SAAS,GAAG,SAAS;IAErB,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO;YAC5B,MAAM,MAAM,GACV,OAAO,CAAC,KAAK,KAAK,KAAK;gBACrB,CAAC,CAAE,CAAC,MAAM,EAAE,KAAK,CAAW;gBAC5B,CAAC,CAAE,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAW,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACpC,MAAM,CAAC,MAAM,CACX,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAC9D,CACF,CAAC;YACF,OAAO,IAAI;iBACR,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iBACtD,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO;YAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,cAAc,CACzB,SAAS,EACT,OAAO,CAAC,OAAO,EACf,UAAU,EACV,KAAK,CACN,CAAC;YACF,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO;YACrC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,cAAc,CACzB,SAAS,EACT,OAAO,CAAC,OAAO,EACf,UAAU,EACV,KAAK,CACN,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAgC;gBACvC,EAAE;gBACF,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;gBACxC,UAAU;gBACV,IAAI;gBACJ,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,GAAG;gBACrC,SAAS,EAAE,GAAG;aACf,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACf,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO;YAClC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,cAAc,CACzB,SAAS,EACT,OAAO,CAAC,OAAO,EACf,UAAU,EACV,KAAK,CACN,CAAC;YACF,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACrE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\n\nexport const AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES = {\n REQUEST: \"agentNative.extension.storage\",\n RESPONSE: \"agentNative.extension.storageResult\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n RESIZE: \"agentNative.extension.resize\",\n} as const;\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\";\n\nexport type AgentNativeExtensionStorageOperation =\n | \"list\"\n | \"get\"\n | \"set\"\n | \"remove\";\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content: string;\n updatedAt?: string;\n}\n\nexport interface AgentNativeExtensionStorageRequest {\n operation: AgentNativeExtensionStorageOperation;\n extensionId: string;\n collection: string;\n id?: string;\n data?: unknown;\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n}\n\nexport interface AgentNativeExtensionDataRow {\n id: string;\n extensionId: string;\n collection: string;\n data: unknown;\n scope: AgentNativeExtensionStorageScope;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: {\n scope?: AgentNativeExtensionStorageScope | \"all\";\n limit?: number;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow[]>;\n get(\n collection: string,\n id: string,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow>;\n remove(\n collection: string,\n id: string,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<{ ok: true }>;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n dark?: boolean;\n themeCss?: string;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\nfunction safeJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nconst defaultThemeCss = `\n:root {\n color-scheme: light;\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --border: 214.3 31.8% 91.4%;\n --primary: 221.2 83.2% 53.3%;\n --primary-foreground: 210 40% 98%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n}\n.dark {\n color-scheme: dark;\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --border: 217.2 32.6% 17.5%;\n --primary: 217.2 91.2% 59.8%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 91% 71%;\n --destructive-foreground: 210 40% 98%;\n}\nhtml, body {\n margin: 0;\n min-height: 100%;\n background: transparent;\n color: hsl(var(--foreground));\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\nbody {\n padding: 0;\n}\n`;\n\nexport function buildAgentNativeExtensionHtml(\n options: BuildAgentNativeExtensionHtmlOptions,\n): string {\n const extensionId = safeJson(options.extensionId);\n const storageRequestType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.REQUEST,\n );\n const storageResponseType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESPONSE,\n );\n const slotContextType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.SLOT_CONTEXT,\n );\n const resizeType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESIZE,\n );\n const themeCss = `${defaultThemeCss}\\n${options.themeCss ?? \"\"}`;\n\n return `<!doctype html>\n<html lang=\"en\"${options.dark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${EXTENSION_IFRAME_META_CSP}\" />\n <title>${escapeHtml(options.title ?? \"Agent Native extension\")}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-background: hsl(var(--background));\n --color-foreground: hsl(var(--foreground));\n --color-muted: hsl(var(--muted));\n --color-muted-foreground: hsl(var(--muted-foreground));\n --color-border: hsl(var(--border));\n --color-primary: hsl(var(--primary));\n --color-primary-foreground: hsl(var(--primary-foreground));\n --color-destructive: hsl(var(--destructive));\n --color-destructive-foreground: hsl(var(--destructive-foreground));\n }\n </style>\n <script>\n (function() {\n var extensionId = ${extensionId};\n var pending = {};\n var seq = 0;\n var slotContext = {};\n var HOST = {\n READY: \"agentNative.host.ready\",\n GET_CONTEXT: \"agentNative.host.getContext\",\n CONTEXT: \"agentNative.host.context\",\n LIST_ACTIONS: \"agentNative.host.listActions\",\n ACTIONS: \"agentNative.host.actions\",\n RUN_ACTION: \"agentNative.host.runAction\",\n ACTION_RESULT: \"agentNative.host.actionResult\",\n COMMAND: \"agentNative.host.command\",\n COMMAND_RESULT: \"agentNative.host.commandResult\"\n };\n var STORAGE_REQUEST = ${storageRequestType};\n var STORAGE_RESPONSE = ${storageResponseType};\n var SLOT_CONTEXT = ${slotContextType};\n var RESIZE = ${resizeType};\n\n function nextId(prefix) {\n seq += 1;\n return prefix + \"-\" + Date.now() + \"-\" + seq;\n }\n\n function request(type, responseType, payload, timeoutMs) {\n return new Promise(function(resolve, reject) {\n var requestId = nextId(\"extension\");\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error(\"Extension host request timed out\"));\n }, timeoutMs || 30000);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer\n };\n window.parent.postMessage(Object.assign({ type: type, requestId: requestId }, payload || {}), \"*\");\n });\n }\n\n window.addEventListener(\"message\", function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n if (message.type === SLOT_CONTEXT) {\n slotContext = message.context || {};\n window.slotContext = slotContext;\n window.agentNative.slotContext = slotContext;\n return;\n }\n var item = pending[message.requestId];\n if (!item || message.type !== item.responseType) return;\n clearTimeout(item.timer);\n delete pending[message.requestId];\n if (message.ok === false || message.error) {\n item.reject(new Error(message.error || \"Extension host request failed\"));\n return;\n }\n item.resolve(message);\n });\n\n function storage(operation, payload) {\n return request(STORAGE_REQUEST, STORAGE_RESPONSE, Object.assign({\n operation: operation,\n extensionId: extensionId\n }, payload || {})).then(function(message) {\n return message.result;\n });\n }\n\n var api = {\n extensionId: extensionId,\n slotContext: slotContext,\n context: function() {\n return request(HOST.GET_CONTEXT, HOST.CONTEXT).then(function(message) {\n return message.context || {};\n });\n },\n listActions: function() {\n return request(HOST.LIST_ACTIONS, HOST.ACTIONS).then(function(message) {\n return message.actions || [];\n });\n },\n action: function(name, args) {\n return request(HOST.RUN_ACTION, HOST.ACTION_RESULT, {\n name: name,\n args: args || {}\n }).then(function(message) {\n return message.result;\n });\n },\n command: function(command, payload) {\n return request(HOST.COMMAND, HOST.COMMAND_RESULT, {\n command: command,\n payload: payload\n }).then(function(message) {\n return message.result;\n });\n },\n refresh: function(payload) {\n return api.command(\"refreshData\", payload);\n },\n data: {\n list: function(collection, opts) {\n opts = opts || {};\n return storage(\"list\", {\n collection: collection,\n scope: opts.scope,\n limit: opts.limit\n });\n },\n get: function(collection, id, opts) {\n opts = opts || {};\n return storage(\"get\", {\n collection: collection,\n id: id,\n scope: opts.scope\n });\n },\n set: function(collection, id, data, opts) {\n opts = opts || {};\n return storage(\"set\", {\n collection: collection,\n id: id,\n data: data,\n scope: opts.scope\n });\n },\n remove: function(collection, id, opts) {\n opts = opts || {};\n return storage(\"remove\", {\n collection: collection,\n id: id,\n scope: opts.scope\n });\n }\n }\n };\n\n window.agentNative = api;\n window.appAction = api.action;\n window.extensionData = api.data;\n window.extensionId = extensionId;\n window.slotContext = slotContext;\n window.toolData = api.data;\n window.toolId = extensionId;\n\n function reportSize() {\n var height = Math.max(\n document.documentElement ? document.documentElement.scrollHeight : 0,\n document.body ? document.body.scrollHeight : 0\n );\n window.parent.postMessage({ type: RESIZE, height: height }, \"*\");\n }\n if (typeof ResizeObserver !== \"undefined\") {\n window.addEventListener(\"DOMContentLoaded\", function() {\n var observer = new ResizeObserver(reportSize);\n observer.observe(document.body);\n reportSize();\n });\n } else {\n window.addEventListener(\"load\", reportSize);\n setInterval(reportSize, 1000);\n }\n\n window.parent.postMessage({ type: HOST.READY, requestId: nextId(\"ready\") }, \"*\");\n })();\n </script>\n</head>\n<body>\n${options.content}\n</body>\n</html>`;\n}\n\nfunction storageKey(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n): string {\n return [\n \"agent-native-extension-data\",\n namespace,\n context.extensionId,\n scope,\n collection,\n ]\n .map(encodeURIComponent)\n .join(\":\");\n}\n\nfunction readCollection(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n): Record<string, AgentNativeExtensionDataRow> {\n if (typeof localStorage === \"undefined\") return {};\n const raw = localStorage.getItem(\n storageKey(namespace, context, collection, scope),\n );\n if (!raw) return {};\n try {\n return JSON.parse(raw) as Record<string, AgentNativeExtensionDataRow>;\n } catch {\n return {};\n }\n}\n\nfunction writeCollection(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n rows: Record<string, AgentNativeExtensionDataRow>,\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n storageKey(namespace, context, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction normalizeScope(\n scope: AgentNativeExtensionStorageScope | undefined,\n): AgentNativeExtensionStorageScope {\n return scope === \"org\" ? \"org\" : \"user\";\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n async list(collection, options) {\n const scopes =\n options.scope === \"all\"\n ? ([\"user\", \"org\"] as const)\n : ([normalizeScope(options.scope)] as const);\n const rows = scopes.flatMap((scope) =>\n Object.values(\n readCollection(namespace, options.context, collection, scope),\n ),\n );\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, options.limit ?? 100);\n },\n async get(collection, id, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n return rows[id] ?? null;\n },\n async set(collection, id, data, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n const now = new Date().toISOString();\n const row: AgentNativeExtensionDataRow = {\n id,\n extensionId: options.context.extensionId,\n collection,\n data,\n scope,\n createdAt: rows[id]?.createdAt ?? now,\n updatedAt: now,\n };\n rows[id] = row;\n writeCollection(namespace, options.context, collection, scope, rows);\n return row;\n },\n async remove(collection, id, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n delete rows[id];\n writeCollection(namespace, options.context, collection, scope, rows);\n return { ok: true };\n },\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { agentNativePath, appApiPath, appBasePath, appPath, } from "../api-path.js";
|
|
2
2
|
export { useAgentRouteState, useSemanticNavigationState, type AgentRouteLocation, type SemanticNavigationCommandEnvelope, type UseAgentRouteStateOptions, type UseAgentRouteStateResult, type UseSemanticNavigationStateOptions, type UseSemanticNavigationStateResult, } from "../route-state.js";
|
|
3
|
-
export { CommandMenu, openAgentSidebar, openAgentSettings, submitToAgent, useCommandMenuShortcut, type CommandMenuProps, type CommandMenuDoc, type CommandDocsGroupProps, type CommandGroupProps, type CommandItemProps, type CommandShortcutProps, } from "../CommandMenu.js";
|
|
3
|
+
export { COMMAND_MENU_OPEN_EVENT, CommandMenu, openAgentSidebar, openAgentSettings, openCommandMenu, submitToAgent, useCommandMenuShortcut, type CommandMenuProps, type CommandMenuDoc, type CommandDocsGroupProps, type CommandGroupProps, type CommandItemProps, type CommandShortcutProps, } from "../CommandMenu.js";
|
|
4
4
|
export { buildOpenRouteLink, buildOpenRoutePath, buildResourceRoute, buildSettingsRoute, buildStandardAppRoute, buildTeamRoute, createStandardOpenPathResolver, STANDARD_APP_ROUTES, STANDARD_SETTINGS_TABS, type BuildResourceRouteOptions, type BuildStandardAppRouteOptions, type NavigationLink, type NavigationTarget, type StandardAppRouteId, type StandardOpenPathResolverOptions, type StandardOpenPathRoute, type StandardSettingsTabId, } from "../../navigation/index.js";
|
|
5
5
|
export { postNavigate, isInAgentEmbed, AGENT_NAVIGATE_MESSAGE_TYPE, type AgentNavigateMessage, } from "../embed.js";
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,kBAAkB,EACvB,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,GACtC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,+BAA+B,EACpC,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,2BAA2B,EAC3B,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,kBAAkB,EACvB,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,GACtC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,+BAA+B,EACpC,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,2BAA2B,EAC3B,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { agentNativePath, appApiPath, appBasePath, appPath, } from "../api-path.js";
|
|
2
2
|
export { useAgentRouteState, useSemanticNavigationState, } from "../route-state.js";
|
|
3
|
-
export { CommandMenu, openAgentSidebar, openAgentSettings, submitToAgent, useCommandMenuShortcut, } from "../CommandMenu.js";
|
|
3
|
+
export { COMMAND_MENU_OPEN_EVENT, CommandMenu, openAgentSidebar, openAgentSettings, openCommandMenu, submitToAgent, useCommandMenuShortcut, } from "../CommandMenu.js";
|
|
4
4
|
export { buildOpenRouteLink, buildOpenRoutePath, buildResourceRoute, buildSettingsRoute, buildStandardAppRoute, buildTeamRoute, createStandardOpenPathResolver, STANDARD_APP_ROUTES, STANDARD_SETTINGS_TABS, } from "../../navigation/index.js";
|
|
5
5
|
export { postNavigate, isInAgentEmbed, AGENT_NAVIGATE_MESSAGE_TYPE, } from "../embed.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAO3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,sBAAsB,GAOvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,mBAAmB,EACnB,sBAAsB,GASvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,2BAA2B,GAE5B,MAAM,aAAa,CAAC","sourcesContent":["export {\n agentNativePath,\n appApiPath,\n appBasePath,\n appPath,\n} from \"../api-path.js\";\nexport {\n useAgentRouteState,\n useSemanticNavigationState,\n type AgentRouteLocation,\n type SemanticNavigationCommandEnvelope,\n type UseAgentRouteStateOptions,\n type UseAgentRouteStateResult,\n type UseSemanticNavigationStateOptions,\n type UseSemanticNavigationStateResult,\n} from \"../route-state.js\";\nexport {\n CommandMenu,\n openAgentSidebar,\n openAgentSettings,\n submitToAgent,\n useCommandMenuShortcut,\n type CommandMenuProps,\n type CommandMenuDoc,\n type CommandDocsGroupProps,\n type CommandGroupProps,\n type CommandItemProps,\n type CommandShortcutProps,\n} from \"../CommandMenu.js\";\nexport {\n buildOpenRouteLink,\n buildOpenRoutePath,\n buildResourceRoute,\n buildSettingsRoute,\n buildStandardAppRoute,\n buildTeamRoute,\n createStandardOpenPathResolver,\n STANDARD_APP_ROUTES,\n STANDARD_SETTINGS_TABS,\n type BuildResourceRouteOptions,\n type BuildStandardAppRouteOptions,\n type NavigationLink,\n type NavigationTarget,\n type StandardAppRouteId,\n type StandardOpenPathResolverOptions,\n type StandardOpenPathRoute,\n type StandardSettingsTabId,\n} from \"../../navigation/index.js\";\nexport {\n postNavigate,\n isInAgentEmbed,\n AGENT_NAVIGATE_MESSAGE_TYPE,\n type AgentNavigateMessage,\n} from \"../embed.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAO3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,sBAAsB,GAOvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,mBAAmB,EACnB,sBAAsB,GASvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,2BAA2B,GAE5B,MAAM,aAAa,CAAC","sourcesContent":["export {\n agentNativePath,\n appApiPath,\n appBasePath,\n appPath,\n} from \"../api-path.js\";\nexport {\n useAgentRouteState,\n useSemanticNavigationState,\n type AgentRouteLocation,\n type SemanticNavigationCommandEnvelope,\n type UseAgentRouteStateOptions,\n type UseAgentRouteStateResult,\n type UseSemanticNavigationStateOptions,\n type UseSemanticNavigationStateResult,\n} from \"../route-state.js\";\nexport {\n COMMAND_MENU_OPEN_EVENT,\n CommandMenu,\n openAgentSidebar,\n openAgentSettings,\n openCommandMenu,\n submitToAgent,\n useCommandMenuShortcut,\n type CommandMenuProps,\n type CommandMenuDoc,\n type CommandDocsGroupProps,\n type CommandGroupProps,\n type CommandItemProps,\n type CommandShortcutProps,\n} from \"../CommandMenu.js\";\nexport {\n buildOpenRouteLink,\n buildOpenRoutePath,\n buildResourceRoute,\n buildSettingsRoute,\n buildStandardAppRoute,\n buildTeamRoute,\n createStandardOpenPathResolver,\n STANDARD_APP_ROUTES,\n STANDARD_SETTINGS_TABS,\n type BuildResourceRouteOptions,\n type BuildStandardAppRouteOptions,\n type NavigationLink,\n type NavigationTarget,\n type StandardAppRouteId,\n type StandardOpenPathResolverOptions,\n type StandardOpenPathRoute,\n type StandardSettingsTabId,\n} from \"../../navigation/index.js\";\nexport {\n postNavigate,\n isInAgentEmbed,\n AGENT_NAVIGATE_MESSAGE_TYPE,\n type AgentNavigateMessage,\n} from \"../embed.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AA4DA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AA4DA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAoND;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAiD,EACjD,WAAkC,GACnC,EAAE,gBAAgB,sCA4clB"}
|