@agent-native/core 0.92.0 → 0.92.1
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 +1 -1
- package/corpus/core/CHANGELOG.md +14 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/application-state/store.ts +12 -1
- package/corpus/core/src/client/AssistantChat.tsx +27 -14
- package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
- package/corpus/core/src/client/agent-chat-adapter.ts +37 -10
- package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
- package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
- package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
- package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
- package/corpus/core/src/client/error-capture.ts +69 -7
- package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
- package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
- package/corpus/core/src/client/org/TeamPage.tsx +77 -71
- package/corpus/core/src/client/settings/SettingsPanel.tsx +205 -52
- package/corpus/core/src/client/settings/SettingsSection.tsx +8 -1
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
- package/corpus/core/src/db-admin/agent-tools.ts +8 -2
- package/corpus/core/src/db-admin/operations.ts +116 -4
- package/corpus/core/src/db-admin/routes.ts +1 -0
- package/corpus/core/src/db-admin/types.ts +4 -0
- package/corpus/core/src/extensions/html-shell.ts +5 -4
- package/corpus/core/src/extensions/routes.ts +10 -0
- package/corpus/core/src/navigation/index.ts +1 -1
- package/corpus/core/src/resources/handlers.ts +10 -8
- package/corpus/core/src/server/poll.ts +293 -8
- package/corpus/core/src/styles/agent-native.css +27 -0
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/core/src/templates/default/AGENTS.md +4 -2
- package/corpus/core/src/templates/headless/AGENTS.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
- package/corpus/core/src/templates/workspace-root/AGENTS.md +7 -1
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/analytics/AGENTS.md +33 -14
- package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
- package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
- package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
- package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
- package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
- package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
- package/corpus/templates/analytics/actions/navigate.ts +4 -2
- package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
- package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
- package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +1 -1
- package/corpus/templates/analytics/actions/view-screen.ts +24 -0
- package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
- package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
- package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
- package/corpus/templates/analytics/app/i18n-data.ts +783 -3
- package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
- package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
- package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
- package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +6 -3
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +26 -30
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
- package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
- package/corpus/templates/analytics/app/routes/team.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
- package/corpus/templates/analytics/server/db/schema-monitoring.ts +1 -1
- package/corpus/templates/analytics/server/db/schema.ts +56 -0
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
- package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
- package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
- package/corpus/templates/analytics/server/lib/uptime-monitors.ts +5 -4
- package/corpus/templates/analytics/server/plugins/db.ts +112 -2
- package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/assets/AGENTS.md +4 -0
- package/corpus/templates/assets/app/routes/settings.tsx +1 -1
- package/corpus/templates/assets/app/routes/team.tsx +1 -1
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/brain/AGENTS.md +4 -0
- package/corpus/templates/brain/app/routes/team.tsx +1 -1
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/calendar/AGENTS.md +4 -0
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
- package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
- package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
- package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
- package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/chat/AGENTS.md +4 -0
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/chat/app/routes/settings.tsx +2 -2
- package/corpus/templates/chat/app/routes/team.tsx +1 -1
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
- package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
- package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
- package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
- package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
- package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
- package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
- package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
- package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
- package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
- package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
- package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
- package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
- package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
- package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/content/AGENTS.md +4 -0
- package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/design/AGENTS.md +4 -0
- package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
- package/corpus/templates/design/app/routes/team.tsx +1 -1
- package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/dispatch/AGENTS.md +4 -0
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
- package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/forms/shared/navigation.ts +1 -1
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/macros/AGENTS.md +4 -0
- package/corpus/templates/macros/app/routes/settings.tsx +2 -2
- package/corpus/templates/macros/app/routes/team.tsx +1 -1
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/mail/AGENTS.md +4 -0
- package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
- package/corpus/templates/mail/server/handlers/media.ts +26 -1
- package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
- package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/plan/AGENTS.md +4 -0
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/plan/app/routes/settings.tsx +2 -2
- package/corpus/templates/plan/app/routes/team.tsx +1 -1
- package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
- package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
- package/corpus/templates/slides/app/routes/settings.tsx +2 -2
- package/corpus/templates/slides/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
- package/corpus/templates/slides/shared/api.ts +1 -1
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +8 -2
- package/dist/application-state/store.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +24 -13
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/PoweredByBadge.d.ts +1 -1
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/PoweredByBadge.js +3 -9
- package/dist/client/PoweredByBadge.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +28 -9
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.js +19 -2
- package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
- package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
- package/dist/client/db-admin/TableEditor.js +19 -2
- package/dist/client/db-admin/TableEditor.js.map +1 -1
- package/dist/client/db-admin/export-utils.d.ts +2 -0
- package/dist/client/db-admin/export-utils.d.ts.map +1 -1
- package/dist/client/db-admin/export-utils.js +11 -3
- package/dist/client/db-admin/export-utils.js.map +1 -1
- package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
- package/dist/client/db-admin/useAgentSync.js +63 -0
- package/dist/client/db-admin/useAgentSync.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +41 -7
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +3 -1
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +32 -5
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.js +3 -1
- package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js +1 -0
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +11 -6
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +5 -5
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +37 -14
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsSection.js +1 -1
- package/dist/client/settings/SettingsSection.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +21 -10
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db-admin/agent-tools.d.ts.map +1 -1
- package/dist/db-admin/agent-tools.js +7 -2
- package/dist/db-admin/agent-tools.js.map +1 -1
- package/dist/db-admin/operations.d.ts.map +1 -1
- package/dist/db-admin/operations.js +90 -4
- package/dist/db-admin/operations.js.map +1 -1
- package/dist/db-admin/routes.d.ts.map +1 -1
- package/dist/db-admin/routes.js +1 -0
- package/dist/db-admin/routes.js.map +1 -1
- package/dist/db-admin/types.d.ts +4 -0
- package/dist/db-admin/types.d.ts.map +1 -1
- package/dist/db-admin/types.js.map +1 -1
- package/dist/extensions/html-shell.d.ts +5 -4
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +8 -0
- package/dist/extensions/routes.js.map +1 -1
- package/dist/navigation/index.d.ts +1 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +1 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +6 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +9 -8
- package/dist/resources/handlers.js.map +1 -1
- package/dist/server/poll.d.ts +12 -4
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +236 -9
- package/dist/server/poll.js.map +1 -1
- package/dist/styles/agent-native.css +27 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/dist/templates/default/AGENTS.md +4 -2
- package/dist/templates/headless/AGENTS.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/dist/templates/workspace-core/AGENTS.md +7 -1
- package/dist/templates/workspace-root/AGENTS.md +7 -1
- package/package.json +1 -1
- package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/src/templates/default/AGENTS.md +4 -2
- package/src/templates/headless/AGENTS.md +4 -0
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/src/templates/workspace-core/AGENTS.md +7 -1
- package/src/templates/workspace-root/AGENTS.md +7 -1
|
@@ -16,6 +16,13 @@ export interface ParsedStackFrame {
|
|
|
16
16
|
colno: number | null;
|
|
17
17
|
inApp: boolean;
|
|
18
18
|
raw: string;
|
|
19
|
+
sourceContext?: SourceContextLine[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface SourceContextLine {
|
|
23
|
+
line: number;
|
|
24
|
+
text: string;
|
|
25
|
+
highlight: boolean;
|
|
19
26
|
}
|
|
20
27
|
|
|
21
28
|
export interface ErrorIssueSummary {
|
|
@@ -45,6 +52,7 @@ export interface ErrorEventDetail {
|
|
|
45
52
|
culprit: string | null;
|
|
46
53
|
level: ExceptionLevel;
|
|
47
54
|
stack: ParsedStackFrame[];
|
|
55
|
+
rawStack: string | null;
|
|
48
56
|
handled: boolean;
|
|
49
57
|
url: string | null;
|
|
50
58
|
userId: string | null;
|
|
@@ -57,7 +65,7 @@ export interface ErrorEventDetail {
|
|
|
57
65
|
environment: string | null;
|
|
58
66
|
tags: Record<string, unknown>;
|
|
59
67
|
extra: Record<string, unknown>;
|
|
60
|
-
breadcrumbs:
|
|
68
|
+
breadcrumbs: unknown[];
|
|
61
69
|
occurredAt: string;
|
|
62
70
|
}
|
|
63
71
|
|
|
@@ -71,6 +71,7 @@ const INTERVAL_OPTIONS = [
|
|
|
71
71
|
|
|
72
72
|
const STATUS_CLASSES = ["2xx", "3xx", "4xx", "5xx"] as const;
|
|
73
73
|
const KNOWN_CHANNELS = ["inbox", "email", "slack", "webhook"] as const;
|
|
74
|
+
const DEFAULT_TIMEOUT_SECONDS = 10;
|
|
74
75
|
const ASSERTION_TYPES: AssertionType[] = [
|
|
75
76
|
"body_contains",
|
|
76
77
|
"body_absent",
|
|
@@ -142,7 +143,9 @@ function defaultValues(monitor: MonitorSummary | null): MonitorFormValues {
|
|
|
142
143
|
url: monitor?.url ?? "",
|
|
143
144
|
method: monitor?.method ?? "GET",
|
|
144
145
|
intervalSeconds: monitor?.intervalSeconds ?? 300,
|
|
145
|
-
timeoutSeconds: Math.round(
|
|
146
|
+
timeoutSeconds: Math.round(
|
|
147
|
+
(monitor?.timeoutMs ?? DEFAULT_TIMEOUT_SECONDS * 1000) / 1000,
|
|
148
|
+
),
|
|
146
149
|
matcherMode: matcher.mode,
|
|
147
150
|
classes: classFlags,
|
|
148
151
|
codes: matcher.mode === "list" ? matcher.codes.join(", ") : "200",
|
|
@@ -215,7 +218,7 @@ function initialSections(monitor: MonitorSummary | null): SectionState {
|
|
|
215
218
|
monitor.severity !== "critical",
|
|
216
219
|
advanced:
|
|
217
220
|
monitor.method !== "GET" ||
|
|
218
|
-
monitor.timeoutMs !==
|
|
221
|
+
monitor.timeoutMs !== DEFAULT_TIMEOUT_SECONDS * 1000 ||
|
|
219
222
|
monitor.cooldownMinutes !== 15 ||
|
|
220
223
|
!monitor.followRedirects ||
|
|
221
224
|
!monitor.enabled,
|
|
@@ -336,7 +339,7 @@ export function MonitorFormPage({
|
|
|
336
339
|
const advancedSummary = useMemo(() => {
|
|
337
340
|
const parts = [
|
|
338
341
|
values.method,
|
|
339
|
-
`${values.timeoutSeconds ||
|
|
342
|
+
`${values.timeoutSeconds || DEFAULT_TIMEOUT_SECONDS}s`,
|
|
340
343
|
`${values.cooldownMinutes ?? 15}m`,
|
|
341
344
|
];
|
|
342
345
|
if (!values.enabled) parts.push(t.pausedBadge);
|
|
@@ -450,6 +450,7 @@ function ReplayWorkbench({
|
|
|
450
450
|
/>
|
|
451
451
|
<ReplayTimeline
|
|
452
452
|
markers={markers}
|
|
453
|
+
isLoading={!response.isComplete}
|
|
453
454
|
activeMarkerId={activeMarkerId}
|
|
454
455
|
onSeek={(ms) => seekRef.current(ms, true)}
|
|
455
456
|
/>
|
|
@@ -1226,10 +1227,12 @@ function ReplayIconButton({
|
|
|
1226
1227
|
|
|
1227
1228
|
function ReplayTimeline({
|
|
1228
1229
|
markers,
|
|
1230
|
+
isLoading,
|
|
1229
1231
|
activeMarkerId,
|
|
1230
1232
|
onSeek,
|
|
1231
1233
|
}: {
|
|
1232
1234
|
markers: ReplayMarker[];
|
|
1235
|
+
isLoading: boolean;
|
|
1233
1236
|
activeMarkerId: string | null;
|
|
1234
1237
|
onSeek: (ms: number) => void;
|
|
1235
1238
|
}) {
|
|
@@ -1268,35 +1271,28 @@ function ReplayTimeline({
|
|
|
1268
1271
|
}, [activeMarkerId, filteredMarkers]);
|
|
1269
1272
|
|
|
1270
1273
|
return (
|
|
1271
|
-
<Card className="analytics-session-detail-timeline min-h-0 overflow-hidden">
|
|
1272
|
-
<CardContent className="flex min-h-0 flex-1 flex-col p-0">
|
|
1273
|
-
<div className="shrink-0 space-y-2 border-b px-3 py-2">
|
|
1274
|
-
<div className="
|
|
1275
|
-
<IconTimelineEvent className="h-4 w-4" />
|
|
1274
|
+
<Card className="analytics-session-detail-timeline min-h-0 min-w-0 overflow-hidden">
|
|
1275
|
+
<CardContent className="flex min-h-0 min-w-0 flex-1 flex-col p-0">
|
|
1276
|
+
<div className="min-w-0 shrink-0 space-y-2 border-b px-3 py-2">
|
|
1277
|
+
<div className="truncate text-sm font-semibold">
|
|
1276
1278
|
{t("sessions.timeline")}
|
|
1277
1279
|
</div>
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
className="h-7 ps-7 text-xs"
|
|
1291
|
-
value={query}
|
|
1292
|
-
placeholder={t("sessions.timelineSearch")}
|
|
1293
|
-
onChange={(event) => setQuery(event.target.value)}
|
|
1294
|
-
/>
|
|
1295
|
-
</div>
|
|
1280
|
+
{!isLoading || markers.length ? (
|
|
1281
|
+
<div className="relative">
|
|
1282
|
+
<IconSearch className="pointer-events-none absolute start-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" />
|
|
1283
|
+
<Input
|
|
1284
|
+
type="search"
|
|
1285
|
+
className="h-7 ps-7 text-xs"
|
|
1286
|
+
value={query}
|
|
1287
|
+
placeholder={t("sessions.timelineSearch")}
|
|
1288
|
+
onChange={(event) => setQuery(event.target.value)}
|
|
1289
|
+
/>
|
|
1290
|
+
</div>
|
|
1291
|
+
) : null}
|
|
1296
1292
|
</div>
|
|
1297
1293
|
<div
|
|
1298
1294
|
ref={listRef}
|
|
1299
|
-
className="min-h-0 flex-1 overflow-auto"
|
|
1295
|
+
className="min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden"
|
|
1300
1296
|
onWheel={() => {
|
|
1301
1297
|
lastManualScrollAtRef.current = Date.now();
|
|
1302
1298
|
}}
|
|
@@ -1305,7 +1301,7 @@ function ReplayTimeline({
|
|
|
1305
1301
|
}}
|
|
1306
1302
|
>
|
|
1307
1303
|
{filteredMarkers.length ? (
|
|
1308
|
-
<div className="divide-y">
|
|
1304
|
+
<div className="min-w-0 divide-y">
|
|
1309
1305
|
{filteredMarkers.map((marker) => {
|
|
1310
1306
|
const expanded = marker.id === expandedMarkerId;
|
|
1311
1307
|
const active = marker.id === activeMarkerId;
|
|
@@ -1320,7 +1316,7 @@ function ReplayTimeline({
|
|
|
1320
1316
|
>
|
|
1321
1317
|
<button
|
|
1322
1318
|
type="button"
|
|
1323
|
-
className="flex w-full gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-muted/50"
|
|
1319
|
+
className="flex w-full min-w-0 gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-muted/50"
|
|
1324
1320
|
aria-expanded={expanded}
|
|
1325
1321
|
aria-current={active ? "true" : undefined}
|
|
1326
1322
|
onClick={() => {
|
|
@@ -1351,12 +1347,12 @@ function ReplayTimeline({
|
|
|
1351
1347
|
>
|
|
1352
1348
|
<MarkerIcon kind={marker.kind} />
|
|
1353
1349
|
</span>
|
|
1354
|
-
<span className="min-w-0 flex-1">
|
|
1355
|
-
<span className="flex items-center justify-between gap-3">
|
|
1350
|
+
<span className="min-w-0 flex-1 overflow-hidden">
|
|
1351
|
+
<span className="flex min-w-0 items-center justify-between gap-3">
|
|
1356
1352
|
<span className="truncate text-sm font-medium">
|
|
1357
1353
|
{marker.label}
|
|
1358
1354
|
</span>
|
|
1359
|
-
<span className="font-mono text-xs text-muted-foreground">
|
|
1355
|
+
<span className="shrink-0 font-mono text-xs text-muted-foreground">
|
|
1360
1356
|
{formatClock(marker.offsetMs)}
|
|
1361
1357
|
</span>
|
|
1362
1358
|
</span>
|
|
@@ -1378,7 +1374,7 @@ function ReplayTimeline({
|
|
|
1378
1374
|
);
|
|
1379
1375
|
})}
|
|
1380
1376
|
</div>
|
|
1381
|
-
) : (
|
|
1377
|
+
) : isLoading ? null : (
|
|
1382
1378
|
<div className="p-4 text-sm text-muted-foreground">
|
|
1383
1379
|
{query.trim()
|
|
1384
1380
|
? t("sessions.timelineNoMatches")
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CodeSurface } from "@agent-native/core/blocks";
|
|
2
2
|
import {
|
|
3
|
-
agentNativePath,
|
|
4
3
|
useActionQuery,
|
|
5
4
|
useBuilderConnectFlow,
|
|
6
5
|
useBuilderStatus,
|
|
@@ -80,13 +79,7 @@ type SessionRecordingIdentity = Pick<
|
|
|
80
79
|
|
|
81
80
|
type SessionRecordingDevice = Pick<SessionRecordingSummary, "metadata">;
|
|
82
81
|
|
|
83
|
-
type DemoStatus = {
|
|
84
|
-
enabled?: boolean;
|
|
85
|
-
forced?: boolean;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
82
|
const RANGE_OPTIONS: ReplayRange[] = ["24h", "7d", "30d", "90d", "all"];
|
|
89
|
-
const DEMO_STATUS_URL = agentNativePath("/_agent-native/demo/status");
|
|
90
83
|
|
|
91
84
|
export default function SessionsPage() {
|
|
92
85
|
const t = useT();
|
|
@@ -111,7 +104,6 @@ export default function SessionsPage() {
|
|
|
111
104
|
{ staleTime: 30_000 },
|
|
112
105
|
);
|
|
113
106
|
|
|
114
|
-
const demoModeEnabled = useDemoModeEnabled();
|
|
115
107
|
const recordings = data ?? [];
|
|
116
108
|
|
|
117
109
|
function updateFilter(key: string, value: string) {
|
|
@@ -256,7 +248,7 @@ export default function SessionsPage() {
|
|
|
256
248
|
</span>
|
|
257
249
|
<span className="min-w-0">
|
|
258
250
|
<span className="block truncate text-sm font-medium text-foreground">
|
|
259
|
-
{visitorLabel(recording, t
|
|
251
|
+
{visitorLabel(recording, t)}
|
|
260
252
|
</span>
|
|
261
253
|
<span className="mt-0.5 block truncate text-xs text-muted-foreground">
|
|
262
254
|
{formatDateTime(lastSeen)} ·{" "}
|
|
@@ -278,11 +270,7 @@ export default function SessionsPage() {
|
|
|
278
270
|
</span>
|
|
279
271
|
<span className="analytics-session-app-meta min-w-0 text-left">
|
|
280
272
|
<span className="analytics-session-badges flex flex-wrap gap-1.5 text-xs text-muted-foreground">
|
|
281
|
-
<span>
|
|
282
|
-
{t("sessions.pageCountCompact", {
|
|
283
|
-
count: formatNumber(recording.pageCount),
|
|
284
|
-
})}
|
|
285
|
-
</span>
|
|
273
|
+
<span>{formatPageCount(recording.pageCount, t)}</span>
|
|
286
274
|
{recording.errorCount > 0 ? (
|
|
287
275
|
<span className="font-medium text-destructive">
|
|
288
276
|
{t("sessions.errorCount", {
|
|
@@ -316,22 +304,6 @@ export default function SessionsPage() {
|
|
|
316
304
|
);
|
|
317
305
|
}
|
|
318
306
|
|
|
319
|
-
function useDemoModeEnabled(): boolean {
|
|
320
|
-
const { data } = useQuery({
|
|
321
|
-
queryKey: ["agent-native", "demo-mode"],
|
|
322
|
-
queryFn: async () => {
|
|
323
|
-
const res = await fetch(DEMO_STATUS_URL, {
|
|
324
|
-
credentials: "same-origin",
|
|
325
|
-
});
|
|
326
|
-
if (!res.ok) return null;
|
|
327
|
-
return (await res.json()) as DemoStatus | null;
|
|
328
|
-
},
|
|
329
|
-
refetchInterval: 4_000,
|
|
330
|
-
staleTime: 2_000,
|
|
331
|
-
});
|
|
332
|
-
return data?.enabled === true || data?.forced === true;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
307
|
function EmptySessionsState() {
|
|
336
308
|
const t = useT();
|
|
337
309
|
const storageStatus = useReplayStorageStatus();
|
|
@@ -504,9 +476,7 @@ function rangeLabel(value: ReplayRange, t: ReturnType<typeof useT>): string {
|
|
|
504
476
|
function visitorLabel(
|
|
505
477
|
recording: SessionRecordingIdentity,
|
|
506
478
|
t: ReturnType<typeof useT>,
|
|
507
|
-
demoModeEnabled: boolean,
|
|
508
479
|
): string {
|
|
509
|
-
if (demoModeEnabled) return demoVisitorLabel(recording);
|
|
510
480
|
const email = emailLike(recording.userId) || emailLike(recording.userKey);
|
|
511
481
|
if (email) return email;
|
|
512
482
|
return (
|
|
@@ -517,29 +487,6 @@ function visitorLabel(
|
|
|
517
487
|
);
|
|
518
488
|
}
|
|
519
489
|
|
|
520
|
-
export function demoVisitorLabel(recording: SessionRecordingIdentity): string {
|
|
521
|
-
const source =
|
|
522
|
-
emailLike(recording.userId) ||
|
|
523
|
-
emailLike(recording.userKey) ||
|
|
524
|
-
recording.userId ||
|
|
525
|
-
recording.userKey ||
|
|
526
|
-
recording.anonymousId ||
|
|
527
|
-
recording.sessionId ||
|
|
528
|
-
recording.id;
|
|
529
|
-
const hash = stableHash(source);
|
|
530
|
-
const first = DEMO_FIRST_NAMES[hash % DEMO_FIRST_NAMES.length];
|
|
531
|
-
const last =
|
|
532
|
-
DEMO_LAST_NAMES[
|
|
533
|
-
Math.floor(hash / DEMO_FIRST_NAMES.length) % DEMO_LAST_NAMES.length
|
|
534
|
-
];
|
|
535
|
-
const domain =
|
|
536
|
-
DEMO_DOMAINS[
|
|
537
|
-
Math.floor(hash / (DEMO_FIRST_NAMES.length * DEMO_LAST_NAMES.length)) %
|
|
538
|
-
DEMO_DOMAINS.length
|
|
539
|
-
];
|
|
540
|
-
return `${first}.${last}@${domain}`.toLowerCase();
|
|
541
|
-
}
|
|
542
|
-
|
|
543
490
|
function emailLike(value: string | null): string | null {
|
|
544
491
|
if (!value?.includes("@")) return null;
|
|
545
492
|
return value;
|
|
@@ -667,53 +614,16 @@ function formatNumber(value: number): string {
|
|
|
667
614
|
return new Intl.NumberFormat().format(value);
|
|
668
615
|
}
|
|
669
616
|
|
|
670
|
-
function
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
617
|
+
function formatPageCount(value: number, t: ReturnType<typeof useT>): string {
|
|
618
|
+
const count = Math.max(0, Math.round(value || 0));
|
|
619
|
+
if (count === 1) {
|
|
620
|
+
return t("sessions.pageCountCompactSingular", {
|
|
621
|
+
count: formatNumber(count),
|
|
622
|
+
});
|
|
675
623
|
}
|
|
676
|
-
return
|
|
624
|
+
return t("sessions.pageCountCompact", { count: formatNumber(count) });
|
|
677
625
|
}
|
|
678
626
|
|
|
679
|
-
const DEMO_FIRST_NAMES = [
|
|
680
|
-
"Avery",
|
|
681
|
-
"Blake",
|
|
682
|
-
"Cameron",
|
|
683
|
-
"Devon",
|
|
684
|
-
"Emerson",
|
|
685
|
-
"Finley",
|
|
686
|
-
"Harper",
|
|
687
|
-
"Jordan",
|
|
688
|
-
"Morgan",
|
|
689
|
-
"Quinn",
|
|
690
|
-
"Riley",
|
|
691
|
-
"Taylor",
|
|
692
|
-
];
|
|
693
|
-
|
|
694
|
-
const DEMO_LAST_NAMES = [
|
|
695
|
-
"Bennett",
|
|
696
|
-
"Carter",
|
|
697
|
-
"Ellis",
|
|
698
|
-
"Hayes",
|
|
699
|
-
"Keller",
|
|
700
|
-
"Monroe",
|
|
701
|
-
"Parker",
|
|
702
|
-
"Reed",
|
|
703
|
-
"Sullivan",
|
|
704
|
-
"Walker",
|
|
705
|
-
"Young",
|
|
706
|
-
"Zimmer",
|
|
707
|
-
];
|
|
708
|
-
|
|
709
|
-
const DEMO_DOMAINS = [
|
|
710
|
-
"acme.test",
|
|
711
|
-
"northstar.test",
|
|
712
|
-
"orbit.test",
|
|
713
|
-
"riverbank.test",
|
|
714
|
-
"summit.test",
|
|
715
|
-
];
|
|
716
|
-
|
|
717
627
|
const SESSION_REPLAY_SNIPPET = `// Agent Native templates already call configureTracking().
|
|
718
628
|
import { configureTracking } from "@agent-native/core/client";
|
|
719
629
|
|