@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
|
@@ -40,6 +40,9 @@ import type {
|
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
41
41
|
|
|
42
42
|
const IDENT_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
43
|
+
const LARGE_CELL_PREVIEW_CHARS = 16 * 1024;
|
|
44
|
+
const LARGE_CELL_SUFFIX =
|
|
45
|
+
"\n...[db-admin truncated large cell; request includeLargeCells=true for the full value]";
|
|
43
46
|
|
|
44
47
|
export interface DbAdminRuntime {
|
|
45
48
|
db?: DbExec;
|
|
@@ -72,6 +75,103 @@ function isPostgresRuntime(runtime?: DbAdminRuntime): boolean {
|
|
|
72
75
|
return dialect(runtime) === "postgres";
|
|
73
76
|
}
|
|
74
77
|
|
|
78
|
+
function isPreviewableLargeColumn(column: DbAdminColumn): boolean {
|
|
79
|
+
const type = column.type.toLowerCase();
|
|
80
|
+
return /\b(text|char|varchar|character|jsonb?|xml|clob)\b/.test(type);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function markLargeValuePreviewColumns(
|
|
84
|
+
columns: DbAdminColumn[],
|
|
85
|
+
includeLargeCells: boolean,
|
|
86
|
+
): DbAdminColumn[] {
|
|
87
|
+
if (includeLargeCells) return columns;
|
|
88
|
+
return columns.map((column) =>
|
|
89
|
+
isPreviewableLargeColumn(column)
|
|
90
|
+
? { ...column, largeValuePreview: true }
|
|
91
|
+
: column,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function buildRowsSelectList(
|
|
96
|
+
columns: DbAdminColumn[],
|
|
97
|
+
includeLargeCells: boolean,
|
|
98
|
+
): string {
|
|
99
|
+
if (includeLargeCells) {
|
|
100
|
+
return columns.map((column) => quoteIdent(column.name)).join(", ");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return columns
|
|
104
|
+
.map((column) => {
|
|
105
|
+
const quoted = quoteIdent(column.name);
|
|
106
|
+
if (!isPreviewableLargeColumn(column)) return quoted;
|
|
107
|
+
const textValue = `CAST(${quoted} AS TEXT)`;
|
|
108
|
+
return `CASE WHEN length(${textValue}) > ${LARGE_CELL_PREVIEW_CHARS} THEN substr(${textValue}, 1, ${LARGE_CELL_PREVIEW_CHARS}) || '${LARGE_CELL_SUFFIX.replace(/'/g, "''")}' ELSE ${textValue} END AS ${quoted}`;
|
|
109
|
+
})
|
|
110
|
+
.join(", ");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function truncateLargeResultCells(rows: Record<string, unknown>[]): {
|
|
114
|
+
rows: Record<string, unknown>[];
|
|
115
|
+
truncatedCells: number;
|
|
116
|
+
} {
|
|
117
|
+
let truncatedCells = 0;
|
|
118
|
+
const mapped = rows.map((row) => {
|
|
119
|
+
let changed = false;
|
|
120
|
+
const next: Record<string, unknown> = {};
|
|
121
|
+
for (const [key, value] of Object.entries(row)) {
|
|
122
|
+
if (
|
|
123
|
+
typeof value === "string" &&
|
|
124
|
+
value.length > LARGE_CELL_PREVIEW_CHARS
|
|
125
|
+
) {
|
|
126
|
+
next[key] =
|
|
127
|
+
`${value.slice(0, LARGE_CELL_PREVIEW_CHARS)}${LARGE_CELL_SUFFIX}`;
|
|
128
|
+
truncatedCells += 1;
|
|
129
|
+
changed = true;
|
|
130
|
+
} else {
|
|
131
|
+
next[key] = value;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return changed ? next : row;
|
|
135
|
+
});
|
|
136
|
+
return { rows: mapped, truncatedCells };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function countTruncatedResultCells(rows: Record<string, unknown>[]): number {
|
|
140
|
+
let truncatedCells = 0;
|
|
141
|
+
for (const row of rows) {
|
|
142
|
+
for (const value of Object.values(row)) {
|
|
143
|
+
if (typeof value === "string" && value.endsWith(LARGE_CELL_SUFFIX)) {
|
|
144
|
+
truncatedCells += 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return truncatedCells;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function containsLargeCellPreview(value: unknown): boolean {
|
|
152
|
+
if (typeof value === "string") return value.endsWith(LARGE_CELL_SUFFIX);
|
|
153
|
+
if (Array.isArray(value)) return value.some(containsLargeCellPreview);
|
|
154
|
+
if (value && typeof value === "object") {
|
|
155
|
+
return Object.values(value as Record<string, unknown>).some(
|
|
156
|
+
containsLargeCellPreview,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function assertNoLargeCellPreviewMutation(
|
|
163
|
+
row: Record<string, unknown>,
|
|
164
|
+
context: string,
|
|
165
|
+
): void {
|
|
166
|
+
for (const [column, value] of Object.entries(row)) {
|
|
167
|
+
if (containsLargeCellPreview(value)) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`Refusing to ${context} with previewed large-cell value in column "${column}". Reload the row with includeLargeCells=true before saving.`,
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
75
175
|
// ---------------------------------------------------------------------------
|
|
76
176
|
// Notify the UI after a real mutation so polling refetches.
|
|
77
177
|
// ---------------------------------------------------------------------------
|
|
@@ -469,6 +569,8 @@ export async function getRows(
|
|
|
469
569
|
const where = buildWhere(req.filters, runtime);
|
|
470
570
|
const orderBy = buildOrderBy(req.sort);
|
|
471
571
|
const quoted = quoteIdent(table);
|
|
572
|
+
const includeLargeCells = req.includeLargeCells === true;
|
|
573
|
+
const selectList = buildRowsSelectList(schema.columns, includeLargeCells);
|
|
472
574
|
|
|
473
575
|
const countRes = await client.execute({
|
|
474
576
|
sql: `SELECT COUNT(*) AS c FROM ${quoted}${where.clause}`,
|
|
@@ -477,16 +579,18 @@ export async function getRows(
|
|
|
477
579
|
const total = Number((countRes.rows[0] as any)?.c ?? 0) || 0;
|
|
478
580
|
|
|
479
581
|
const rowsRes = await client.execute({
|
|
480
|
-
sql: `SELECT
|
|
582
|
+
sql: `SELECT ${selectList} FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,
|
|
481
583
|
args: [...where.args, pageSize, offset],
|
|
482
584
|
});
|
|
585
|
+
const rows = rowsRes.rows as Record<string, unknown>[];
|
|
483
586
|
|
|
484
587
|
return {
|
|
485
|
-
columns: schema.columns,
|
|
486
|
-
rows
|
|
588
|
+
columns: markLargeValuePreviewColumns(schema.columns, includeLargeCells),
|
|
589
|
+
rows,
|
|
487
590
|
total,
|
|
488
591
|
page,
|
|
489
592
|
pageSize,
|
|
593
|
+
truncatedCells: includeLargeCells ? 0 : countTruncatedResultCells(rows),
|
|
490
594
|
};
|
|
491
595
|
}
|
|
492
596
|
|
|
@@ -502,6 +606,7 @@ function buildInsert(
|
|
|
502
606
|
if (cols.length === 0) {
|
|
503
607
|
throw new Error("Cannot insert an empty row");
|
|
504
608
|
}
|
|
609
|
+
assertNoLargeCellPreviewMutation(row, "insert");
|
|
505
610
|
cols.forEach((c) => assertIdent(c, "column name"));
|
|
506
611
|
const sql = `INSERT INTO ${quoteIdent(table)} (${cols
|
|
507
612
|
.map(quoteIdent)
|
|
@@ -520,6 +625,8 @@ function buildUpdate(
|
|
|
520
625
|
if (whereCols.length === 0) {
|
|
521
626
|
throw new Error("Update requires a non-empty where clause");
|
|
522
627
|
}
|
|
628
|
+
assertNoLargeCellPreviewMutation(set, "update");
|
|
629
|
+
assertNoLargeCellPreviewMutation(where, "match rows");
|
|
523
630
|
setCols.forEach((c) => assertIdent(c, "column name"));
|
|
524
631
|
whereCols.forEach((c) => assertIdent(c, "column name"));
|
|
525
632
|
const setSql = setCols.map((c) => `${quoteIdent(c)} = ?`).join(", ");
|
|
@@ -539,6 +646,7 @@ function buildDelete(
|
|
|
539
646
|
if (whereCols.length === 0) {
|
|
540
647
|
throw new Error("Delete requires a non-empty where clause");
|
|
541
648
|
}
|
|
649
|
+
assertNoLargeCellPreviewMutation(where, "delete");
|
|
542
650
|
whereCols.forEach((c) => assertIdent(c, "column name"));
|
|
543
651
|
const whereSql = whereCols.map((c) => `${quoteIdent(c)} = ?`).join(" AND ");
|
|
544
652
|
const sql = `DELETE FROM ${quoteIdent(table)} WHERE ${whereSql}`;
|
|
@@ -674,7 +782,10 @@ export async function runSql(
|
|
|
674
782
|
);
|
|
675
783
|
const durationMs = Date.now() - started;
|
|
676
784
|
|
|
677
|
-
const
|
|
785
|
+
const truncation = truncateLargeResultCells(
|
|
786
|
+
(res.rows ?? []) as Record<string, unknown>[],
|
|
787
|
+
);
|
|
788
|
+
const rows = truncation.rows;
|
|
678
789
|
const columns =
|
|
679
790
|
rows.length > 0 && rows[0] && typeof rows[0] === "object"
|
|
680
791
|
? Object.keys(rows[0])
|
|
@@ -687,5 +798,6 @@ export async function runSql(
|
|
|
687
798
|
rows,
|
|
688
799
|
rowsAffected: res.rowsAffected ?? 0,
|
|
689
800
|
durationMs,
|
|
801
|
+
truncatedCells: truncation.truncatedCells,
|
|
690
802
|
};
|
|
691
803
|
}
|
|
@@ -15,6 +15,7 @@ export interface DbAdminColumn {
|
|
|
15
15
|
pk: boolean;
|
|
16
16
|
defaultValue: string | null;
|
|
17
17
|
autoIncrement?: boolean;
|
|
18
|
+
largeValuePreview?: boolean;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
export interface DbAdminForeignKey {
|
|
@@ -74,6 +75,7 @@ export interface DbAdminRowsRequest {
|
|
|
74
75
|
pageSize: number;
|
|
75
76
|
sort?: DbAdminSort[];
|
|
76
77
|
filters?: DbAdminFilter[];
|
|
78
|
+
includeLargeCells?: boolean;
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
export interface DbAdminRowsResult {
|
|
@@ -82,6 +84,7 @@ export interface DbAdminRowsResult {
|
|
|
82
84
|
total: number;
|
|
83
85
|
page: number;
|
|
84
86
|
pageSize: number;
|
|
87
|
+
truncatedCells?: number;
|
|
85
88
|
}
|
|
86
89
|
|
|
87
90
|
export interface DbAdminMutation {
|
|
@@ -103,4 +106,5 @@ export interface DbAdminQueryResult {
|
|
|
103
106
|
rows: Record<string, unknown>[];
|
|
104
107
|
rowsAffected: number;
|
|
105
108
|
durationMs: number;
|
|
109
|
+
truncatedCells?: number;
|
|
106
110
|
}
|
|
@@ -24,10 +24,11 @@ export const EXTENSION_IFRAME_META_CSP = EXTENSION_IFRAME_CSP_BASE;
|
|
|
24
24
|
*
|
|
25
25
|
* 1. The iframe MUST be rendered with a `sandbox` attribute that does NOT
|
|
26
26
|
* include `allow-same-origin`. The viewer (`ExtensionViewer.tsx`,
|
|
27
|
-
* `EmbeddedExtension.tsx`)
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
* `EmbeddedExtension.tsx`) normalizes the sandbox through
|
|
28
|
+
* `normalizeAgentNativeExtensionSandbox()`, which permits scripts, forms,
|
|
29
|
+
* popups, and downloads but strips `allow-same-origin`. Adding
|
|
30
|
+
* `allow-same-origin` would give the extension full DOM access to the
|
|
31
|
+
* parent window via cross-frame script.
|
|
31
32
|
*
|
|
32
33
|
* 2. Every reachable parent action must treat the postMessage payload as
|
|
33
34
|
* hostile. The bridge in `iframe-bridge.ts` enforces a path allowlist,
|
|
@@ -107,6 +107,8 @@ export function createExtensionsHandler() {
|
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
const MAX_EXTENSION_DATA_BYTES = 1024 * 1024;
|
|
111
|
+
|
|
110
112
|
function normalizeExtensionUserEmail(email: string): string {
|
|
111
113
|
return email.trim().toLowerCase();
|
|
112
114
|
}
|
|
@@ -544,6 +546,14 @@ async function handleExtensionDataUpsert(
|
|
|
544
546
|
const itemId = String(body.id || randomUUID());
|
|
545
547
|
const data =
|
|
546
548
|
typeof body.data === "string" ? body.data : JSON.stringify(body.data);
|
|
549
|
+
if (Buffer.byteLength(data, "utf8") > MAX_EXTENSION_DATA_BYTES) {
|
|
550
|
+
setResponseStatus(event, 413);
|
|
551
|
+
return {
|
|
552
|
+
error:
|
|
553
|
+
"Extension data is too large for SQL storage. Store large files, base64, or blobs in file storage and save only a URL or handle.",
|
|
554
|
+
maxBytes: MAX_EXTENSION_DATA_BYTES,
|
|
555
|
+
};
|
|
556
|
+
}
|
|
547
557
|
const now = new Date().toISOString();
|
|
548
558
|
const scope = body.scope === "org" ? "org" : "user";
|
|
549
559
|
const orgId = getRequestOrgId();
|
|
@@ -607,10 +607,9 @@ export async function handleUploadResource(event: any) {
|
|
|
607
607
|
}
|
|
608
608
|
const owner = await resolveOwner(event, shared);
|
|
609
609
|
|
|
610
|
-
//
|
|
611
|
-
//
|
|
612
|
-
//
|
|
613
|
-
// from the resource store's metadata/search features.
|
|
610
|
+
// Binary assets must live in file storage so resource rows do not become
|
|
611
|
+
// base64 blobs in SQL. Text resources still live in SQL because they are
|
|
612
|
+
// edited inline and benefit from the resource store's metadata/search.
|
|
614
613
|
const isText =
|
|
615
614
|
mimeType.startsWith("text/") || mimeType === "application/json";
|
|
616
615
|
|
|
@@ -638,12 +637,15 @@ export async function handleUploadResource(event: any) {
|
|
|
638
637
|
setResponseStatus(event, 201);
|
|
639
638
|
return { ...resource, url: uploaded.url, provider: uploaded.provider };
|
|
640
639
|
}
|
|
640
|
+
setResponseStatus(event, 503);
|
|
641
|
+
return {
|
|
642
|
+
error:
|
|
643
|
+
"File storage is not configured. Connect Builder.io or register an S3/R2/GCS file upload provider before uploading binary resources.",
|
|
644
|
+
storageSetupRequired: true,
|
|
645
|
+
};
|
|
641
646
|
}
|
|
642
647
|
|
|
643
|
-
|
|
644
|
-
const content = isText
|
|
645
|
-
? Buffer.from(filePart.data).toString("utf-8")
|
|
646
|
-
: Buffer.from(filePart.data).toString("base64");
|
|
648
|
+
const content = Buffer.from(filePart.data).toString("utf-8");
|
|
647
649
|
|
|
648
650
|
const resource = await resourcePut(owner, path, content, mimeType);
|
|
649
651
|
|