@agent-native/core 0.103.1 → 0.104.0
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 +2 -2
- package/corpus/core/CHANGELOG.md +30 -0
- package/corpus/core/package.json +9 -2
- package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
- package/corpus/core/src/agent/production-agent.ts +30 -0
- package/corpus/core/src/agent/run-store.ts +12 -2
- package/corpus/core/src/cli/create.ts +1 -0
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
- package/corpus/core/src/cli/templates-meta.ts +4 -3
- package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
- package/corpus/core/src/client/AgentChatHome.tsx +4 -0
- package/corpus/core/src/client/AgentPanel.tsx +321 -223
- package/corpus/core/src/client/AssistantChat.tsx +6 -10
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
- package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
- package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
- package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
- package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
- package/corpus/core/src/client/agent-page/types.ts +1 -1
- package/corpus/core/src/client/analytics.ts +51 -5
- package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
- package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
- package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
- package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
- package/corpus/core/src/client/index.ts +16 -1
- package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
- package/corpus/core/src/client/session-replay.ts +158 -5
- package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
- package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
- package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
- package/corpus/core/src/client/use-chat-threads.ts +2 -0
- package/corpus/core/src/connections/catalog.ts +49 -7
- package/corpus/core/src/db/index.ts +6 -1
- package/corpus/core/src/extensions/actions.ts +106 -16
- package/corpus/core/src/extensions/content-patch.ts +22 -0
- package/corpus/core/src/extensions/routes.ts +18 -0
- package/corpus/core/src/extensions/store.ts +8 -0
- package/corpus/core/src/index.ts +3 -0
- package/corpus/core/src/ingestion/docx.ts +158 -0
- package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
- package/corpus/core/src/ingestion/figma.ts +548 -0
- package/corpus/core/src/ingestion/index.ts +107 -0
- package/corpus/core/src/ingestion/media.ts +264 -0
- package/corpus/core/src/ingestion/notion.ts +121 -0
- package/corpus/core/src/ingestion/office.ts +214 -0
- package/corpus/core/src/ingestion/orchestration.ts +160 -0
- package/corpus/core/src/ingestion/pptx.ts +333 -0
- package/corpus/core/src/ingestion/selection.ts +81 -0
- package/corpus/core/src/ingestion/website.ts +151 -0
- package/corpus/core/src/integrations/plugin.ts +45 -37
- package/corpus/core/src/localization/default-messages.ts +35 -12
- package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
- package/corpus/core/src/observability/traces.ts +5 -3
- package/corpus/core/src/provider-api/index.ts +452 -8
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
- package/corpus/core/src/search-utils/index.ts +112 -0
- package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
- package/corpus/core/src/server/action-discovery.ts +33 -8
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
- package/corpus/core/src/server/core-routes-plugin.ts +12 -0
- package/corpus/core/src/server/index.ts +30 -0
- package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
- package/corpus/core/src/styles/agent-native.css +9 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/corpus/core/src/templates/workspace-root/.env.example +12 -0
- package/corpus/core/src/workspace-connections/index.ts +6 -0
- package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
- package/corpus/core/src/workspace-connections/store.ts +16 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
- package/corpus/templates/analytics/AGENTS.md +9 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
- package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
- package/corpus/templates/analytics/app/i18n-data.ts +3 -3
- package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
- package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
- package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
- package/corpus/templates/assets/AGENTS.md +10 -0
- package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
- package/corpus/templates/assets/actions/edit-image.ts +2 -0
- package/corpus/templates/assets/actions/generate-asset.ts +52 -0
- package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
- package/corpus/templates/assets/actions/generate-image.ts +219 -1
- package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
- package/corpus/templates/assets/actions/refine-image.ts +3 -0
- package/corpus/templates/assets/actions/restyle-image.ts +2 -0
- package/corpus/templates/assets/agent-native.app-skill.json +4 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/assets/app/i18n-data.ts +29 -13
- package/corpus/templates/assets/app/routes/agent.tsx +7 -1
- package/corpus/templates/assets/app/routes/library.tsx +9 -0
- package/corpus/templates/assets/app/routes/settings.tsx +3 -0
- package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/assets/package.json +1 -0
- package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
- package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -3
- package/corpus/templates/brain/app/lib/brain.ts +1 -1
- package/corpus/templates/brain/server/lib/search.ts +17 -67
- package/corpus/templates/calendar/app/i18n-data.ts +3 -3
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
- package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
- package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
- package/corpus/templates/clips/actions/create-meeting.ts +6 -2
- package/corpus/templates/clips/actions/create-organization.ts +3 -2
- package/corpus/templates/clips/actions/create-recording.ts +4 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
- package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
- package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
- package/corpus/templates/clips/actions/list-meetings.ts +23 -5
- package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
- package/corpus/templates/clips/actions/remove-silences.ts +10 -1
- package/corpus/templates/clips/actions/request-transcript.ts +53 -11
- package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
- package/corpus/templates/clips/actions/search-recordings.ts +5 -8
- package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
- package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
- package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
- package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
- package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
- package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
- package/corpus/templates/clips/app/routes/record.tsx +23 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
- package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
- package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
- package/corpus/templates/clips/desktop/src/app.tsx +66 -28
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
- package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
- package/corpus/templates/clips/desktop/src/styles.css +13 -11
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
- package/corpus/templates/clips/server/db/schema.ts +2 -2
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
- package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
- package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
- package/corpus/templates/clips/server/lib/recordings.ts +40 -1
- package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/clips/server/plugins/db.ts +2 -2
- package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
- package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
- package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
- package/corpus/templates/content/AGENTS.md +9 -0
- package/corpus/templates/content/actions/create-document.ts +94 -0
- package/corpus/templates/content/actions/edit-document.ts +144 -4
- package/corpus/templates/content/actions/update-document.ts +138 -0
- package/corpus/templates/content/agent-native.app-skill.json +4 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/content/app/i18n-data.ts +13 -4
- package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
- package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
- package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/content/package.json +1 -0
- package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
- package/corpus/templates/design/AGENTS.md +6 -0
- package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
- package/corpus/templates/design/actions/edit-design.ts +128 -0
- package/corpus/templates/design/actions/generate-design.ts +278 -14
- package/corpus/templates/design/actions/generate-screens.ts +42 -1
- package/corpus/templates/design/agent-native.app-skill.json +4 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +10 -4
- package/corpus/templates/design/app/routes/agent.tsx +2 -1
- package/corpus/templates/design/app/routes/settings.tsx +3 -0
- package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
- package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
- package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/shared/generation-session.ts +7 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
- package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
- package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
- package/corpus/templates/plan/AGENTS.md +21 -1
- package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
- package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
- package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
- package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
- package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
- package/corpus/templates/plan/server/plan-mdx.ts +75 -2
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
- package/corpus/templates/slides/AGENTS.md +6 -0
- package/corpus/templates/slides/actions/add-slide.ts +230 -14
- package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
- package/corpus/templates/slides/actions/create-deck.ts +130 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
- package/corpus/templates/slides/actions/import-file.ts +5 -4
- package/corpus/templates/slides/actions/patch-deck.ts +200 -10
- package/corpus/templates/slides/actions/update-slide.ts +208 -15
- package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
- package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
- package/corpus/templates/slides/app/routes/agent.tsx +7 -1
- package/corpus/templates/slides/app/routes/settings.tsx +3 -0
- package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
- package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
- package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
- package/dist/agent/engine/credential-errors.d.ts +1 -1
- package/dist/agent/engine/credential-errors.d.ts.map +1 -1
- package/dist/agent/engine/credential-errors.js +2 -2
- package/dist/agent/engine/credential-errors.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +25 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +12 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +1 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +30 -11
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +4 -3
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentAskPopover.d.ts +11 -0
- package/dist/client/AgentAskPopover.d.ts.map +1 -0
- package/dist/client/AgentAskPopover.js +30 -0
- package/dist/client/AgentAskPopover.js.map +1 -0
- package/dist/client/AgentChatHome.d.ts +1 -1
- package/dist/client/AgentChatHome.d.ts.map +1 -1
- package/dist/client/AgentChatHome.js +2 -2
- package/dist/client/AgentChatHome.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +9 -19
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +119 -80
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +4 -4
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +3 -9
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +49 -189
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +12 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentContextTab.js +26 -28
- package/dist/client/agent-page/AgentContextTab.js.map +1 -1
- package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
- package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
- package/dist/client/agent-page/AgentEmptyState.js +6 -0
- package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
- package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +90 -58
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
- package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
- package/dist/client/agent-page/AgentTabFrame.js +7 -0
- package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
- package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +135 -99
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/agent-page/types.d.ts +1 -1
- package/dist/client/agent-page/types.d.ts.map +1 -1
- package/dist/client/agent-page/types.js.map +1 -1
- package/dist/client/analytics.d.ts +10 -3
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +37 -2
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +10 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +2 -2
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +15 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/dynamic-suggestions.js +3 -3
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts +5 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +74 -5
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts +11 -2
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +105 -31
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/session-replay.d.ts +28 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +122 -8
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts +3 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +16 -6
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +3 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/agent-settings-search.js +2 -2
- package/dist/client/settings/agent-settings-search.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +2 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +41 -7
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +40 -7
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -2
- package/dist/db/index.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +85 -15
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/content-patch.d.ts +4 -0
- package/dist/extensions/content-patch.d.ts.map +1 -1
- package/dist/extensions/content-patch.js +18 -0
- package/dist/extensions/content-patch.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +14 -0
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/store.d.ts +1 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +4 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingestion/docx.d.ts +16 -0
- package/dist/ingestion/docx.d.ts.map +1 -0
- package/dist/ingestion/docx.js +129 -0
- package/dist/ingestion/docx.js.map +1 -0
- package/dist/ingestion/figma-node-to-html.d.ts +304 -0
- package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
- package/dist/ingestion/figma-node-to-html.js +1292 -0
- package/dist/ingestion/figma-node-to-html.js.map +1 -0
- package/dist/ingestion/figma.d.ts +115 -0
- package/dist/ingestion/figma.d.ts.map +1 -0
- package/dist/ingestion/figma.js +399 -0
- package/dist/ingestion/figma.js.map +1 -0
- package/dist/ingestion/index.d.ts +11 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +11 -0
- package/dist/ingestion/index.js.map +1 -0
- package/dist/ingestion/media.d.ts +36 -0
- package/dist/ingestion/media.d.ts.map +1 -0
- package/dist/ingestion/media.js +178 -0
- package/dist/ingestion/media.js.map +1 -0
- package/dist/ingestion/notion.d.ts +12 -0
- package/dist/ingestion/notion.d.ts.map +1 -0
- package/dist/ingestion/notion.js +104 -0
- package/dist/ingestion/notion.js.map +1 -0
- package/dist/ingestion/office.d.ts +45 -0
- package/dist/ingestion/office.d.ts.map +1 -0
- package/dist/ingestion/office.js +141 -0
- package/dist/ingestion/office.js.map +1 -0
- package/dist/ingestion/orchestration.d.ts +52 -0
- package/dist/ingestion/orchestration.d.ts.map +1 -0
- package/dist/ingestion/orchestration.js +89 -0
- package/dist/ingestion/orchestration.js.map +1 -0
- package/dist/ingestion/pptx.d.ts +28 -0
- package/dist/ingestion/pptx.d.ts.map +1 -0
- package/dist/ingestion/pptx.js +255 -0
- package/dist/ingestion/pptx.js.map +1 -0
- package/dist/ingestion/selection.d.ts +20 -0
- package/dist/ingestion/selection.d.ts.map +1 -0
- package/dist/ingestion/selection.js +52 -0
- package/dist/ingestion/selection.js.map +1 -0
- package/dist/ingestion/website.d.ts +27 -0
- package/dist/ingestion/website.d.ts.map +1 -0
- package/dist/ingestion/website.js +100 -0
- package/dist/ingestion/website.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +32 -27
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/localization/default-messages.d.ts +22 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +31 -9
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/hosted-model-experiment.d.ts +39 -0
- package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
- package/dist/observability/hosted-model-experiment.js +90 -0
- package/dist/observability/hosted-model-experiment.js.map +1 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +5 -3
- package/dist/observability/traces.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/index.d.ts +35 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +339 -8
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/search-utils/index.d.ts +12 -0
- package/dist/search-utils/index.d.ts.map +1 -0
- package/dist/search-utils/index.js +95 -0
- package/dist/search-utils/index.js.map +1 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +57 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/server/action-discovery.d.ts +8 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +26 -9
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +95 -0
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +7 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +5 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +5 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +48 -0
- package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
- package/dist/server/workspace-provider-oauth.js +415 -0
- package/dist/server/workspace-provider-oauth.js.map +1 -0
- package/dist/styles/agent-native.css +9 -0
- package/dist/templates/chat/app/i18n/en-US.ts +3 -3
- package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
- package/dist/templates/default/app/i18n/en-US.ts +3 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/dist/templates/workspace-root/.env.example +12 -0
- package/dist/workspace-connections/index.d.ts +1 -0
- package/dist/workspace-connections/index.d.ts.map +1 -1
- package/dist/workspace-connections/index.js +1 -0
- package/dist/workspace-connections/index.js.map +1 -1
- package/dist/workspace-connections/lifecycle.d.ts +16 -0
- package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
- package/dist/workspace-connections/lifecycle.js +14 -0
- package/dist/workspace-connections/lifecycle.js.map +1 -0
- package/dist/workspace-connections/store.d.ts.map +1 -1
- package/dist/workspace-connections/store.js +16 -0
- package/dist/workspace-connections/store.js.map +1 -1
- package/package.json +10 -3
- package/src/templates/chat/app/i18n/en-US.ts +3 -3
- package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
- package/src/templates/chat/app/lib/agent-page.tsx +10 -1
- package/src/templates/default/app/i18n/en-US.ts +3 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/src/templates/workspace-root/.env.example +12 -0
|
@@ -40,6 +40,7 @@ export interface SaveImportedDesignFilesInput {
|
|
|
40
40
|
files: ImportedDesignFile[];
|
|
41
41
|
sourceType: string;
|
|
42
42
|
warnings?: string[];
|
|
43
|
+
preserveExactContent?: boolean;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
export interface SavedImportedDesignFile {
|
|
@@ -231,14 +232,11 @@ export async function saveImportedDesignFiles(
|
|
|
231
232
|
usedFilenames,
|
|
232
233
|
);
|
|
233
234
|
const fileId = nanoid();
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
file.content,
|
|
240
|
-
file.fileType,
|
|
241
|
-
);
|
|
235
|
+
// Exact native clones are immutable source evidence. Other imports are
|
|
236
|
+
// annotated before persistence so editor operations can address nodes.
|
|
237
|
+
const annotatedContent = input.preserveExactContent
|
|
238
|
+
? file.content
|
|
239
|
+
: annotateScreenHtmlForPersist(file.content, file.fileType);
|
|
242
240
|
await tx.insert(schema.designFiles).values({
|
|
243
241
|
id: fileId,
|
|
244
242
|
designId,
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { registerOnboardingStep } from "@agent-native/core/onboarding";
|
|
2
|
+
import { setupCreativeContext } from "@agent-native/creative-context/server";
|
|
3
|
+
import { listContextSources } from "@agent-native/creative-context/store";
|
|
4
|
+
|
|
5
|
+
registerOnboardingStep({
|
|
6
|
+
id: "creative-context-library",
|
|
7
|
+
order: 18,
|
|
8
|
+
required: false,
|
|
9
|
+
title: "Connect your creative library",
|
|
10
|
+
description:
|
|
11
|
+
"Connect prior work and reference sources so agents can reuse approved creative context.",
|
|
12
|
+
methods: [
|
|
13
|
+
{
|
|
14
|
+
id: "library",
|
|
15
|
+
kind: "link",
|
|
16
|
+
primary: true,
|
|
17
|
+
label: "Open Library",
|
|
18
|
+
payload: { url: "/agent#library", external: false },
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
isComplete: async () => {
|
|
22
|
+
try {
|
|
23
|
+
const result = await listContextSources({ limit: 1 });
|
|
24
|
+
return result.sources.length > 0;
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default setupCreativeContext({ appId: "design" });
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { CreativeContextReuseLabel } from "@agent-native/creative-context";
|
|
2
|
+
|
|
1
3
|
import type { AssignedCanvasRegion } from "./canvas-math";
|
|
2
4
|
|
|
3
5
|
export type DesignGenerationSessionStatus =
|
|
@@ -37,6 +39,11 @@ export interface DesignGenerationSession {
|
|
|
37
39
|
designSystemId?: string;
|
|
38
40
|
prompt: string;
|
|
39
41
|
contextRefs: string[];
|
|
42
|
+
creativeContext?: {
|
|
43
|
+
contextMode: "off" | "auto" | "pinned";
|
|
44
|
+
contextPackId: string | null;
|
|
45
|
+
reuseLabels: CreativeContextReuseLabel[];
|
|
46
|
+
};
|
|
40
47
|
frames: DesignGenerationFrame[];
|
|
41
48
|
startedAt: string;
|
|
42
49
|
}
|
|
@@ -37,10 +37,10 @@ const enUS = {
|
|
|
37
37
|
deliveryDescription:
|
|
38
38
|
"Manage message destinations and check the outbound delivery queue.",
|
|
39
39
|
openDelivery: "Open delivery",
|
|
40
|
-
agentTitle: "Agent
|
|
40
|
+
agentTitle: "Agent workspace",
|
|
41
41
|
agentDescription:
|
|
42
|
-
"Open the agent
|
|
43
|
-
openAgentSettings: "Open agent
|
|
42
|
+
"Open the agent workspace for model, API keys, voice, and other agent controls. Use the Automations page for scheduled and event-triggered jobs.",
|
|
43
|
+
openAgentSettings: "Open agent workspace",
|
|
44
44
|
},
|
|
45
45
|
integrations: {
|
|
46
46
|
title: "Integrations",
|
|
@@ -34,10 +34,10 @@ const messages = {
|
|
|
34
34
|
"Manage team members, organization access, and shared workspace preferences.",
|
|
35
35
|
openTeamSettings: "Open team settings",
|
|
36
36
|
openResourceSettings: "Open resource settings",
|
|
37
|
-
agentTitle: "Agent
|
|
37
|
+
agentTitle: "Agent workspace",
|
|
38
38
|
agentDescription:
|
|
39
|
-
"Open the agent
|
|
40
|
-
openAgentSettings: "Open agent
|
|
39
|
+
"Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
|
|
40
|
+
openAgentSettings: "Open agent workspace",
|
|
41
41
|
},
|
|
42
42
|
agent: {
|
|
43
43
|
emptyState: "Ask me anything about your forms",
|
|
@@ -30,10 +30,10 @@ const messages = {
|
|
|
30
30
|
"Manage team members, organization access, and shared workspace preferences.",
|
|
31
31
|
openTeamSettings: "Open team settings",
|
|
32
32
|
openResourceSettings: "Open resource settings",
|
|
33
|
-
agentTitle: "Agent
|
|
33
|
+
agentTitle: "Agent workspace",
|
|
34
34
|
agentDescription:
|
|
35
|
-
"Open the agent
|
|
36
|
-
openAgentSettings: "Open agent
|
|
35
|
+
"Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
|
|
36
|
+
openAgentSettings: "Open agent workspace",
|
|
37
37
|
},
|
|
38
38
|
agent: {
|
|
39
39
|
emptyState: "Just tell me what you ate — I'll estimate the macros",
|
|
@@ -2544,6 +2544,29 @@ function sanitizeEmailHtml(html: string): SanitizedEmailHtml {
|
|
|
2544
2544
|
};
|
|
2545
2545
|
}
|
|
2546
2546
|
|
|
2547
|
+
function measureEmailDocumentHeight(doc: Document): number {
|
|
2548
|
+
const body = doc.body;
|
|
2549
|
+
const root = doc.documentElement;
|
|
2550
|
+
if (!body || !root) return 0;
|
|
2551
|
+
|
|
2552
|
+
const bodyTop = body.getBoundingClientRect().top;
|
|
2553
|
+
let contentBottom = body.getBoundingClientRect().bottom - bodyTop;
|
|
2554
|
+
for (const element of body.querySelectorAll<HTMLElement>("*")) {
|
|
2555
|
+
const rect = element.getBoundingClientRect();
|
|
2556
|
+
contentBottom = Math.max(contentBottom, rect.bottom - bodyTop);
|
|
2557
|
+
}
|
|
2558
|
+
|
|
2559
|
+
return Math.ceil(
|
|
2560
|
+
Math.max(
|
|
2561
|
+
body.scrollHeight,
|
|
2562
|
+
body.offsetHeight,
|
|
2563
|
+
root.scrollHeight,
|
|
2564
|
+
root.offsetHeight,
|
|
2565
|
+
contentBottom,
|
|
2566
|
+
),
|
|
2567
|
+
);
|
|
2568
|
+
}
|
|
2569
|
+
|
|
2547
2570
|
function HtmlEmailBody({
|
|
2548
2571
|
html,
|
|
2549
2572
|
senderEmail,
|
|
@@ -2709,10 +2732,8 @@ function HtmlEmailBody({
|
|
|
2709
2732
|
doc.head.appendChild(themeStyle);
|
|
2710
2733
|
|
|
2711
2734
|
const resize = () => {
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
if (h > 0) setHeight(h);
|
|
2715
|
-
}
|
|
2735
|
+
const h = measureEmailDocumentHeight(doc);
|
|
2736
|
+
if (h > 0) setHeight((current) => (current === h ? current : h));
|
|
2716
2737
|
};
|
|
2717
2738
|
|
|
2718
2739
|
const normalizeText = (value: string | null | undefined) =>
|
|
@@ -3187,6 +3208,12 @@ function HtmlEmailBody({
|
|
|
3187
3208
|
const images = doc.querySelectorAll("img");
|
|
3188
3209
|
images.forEach((img) => img.addEventListener("load", resize));
|
|
3189
3210
|
|
|
3211
|
+
const resizeObserver =
|
|
3212
|
+
typeof ResizeObserver !== "undefined" ? new ResizeObserver(resize) : null;
|
|
3213
|
+
resizeObserver?.observe(doc.documentElement);
|
|
3214
|
+
if (doc.body) resizeObserver?.observe(doc.body);
|
|
3215
|
+
window.addEventListener("resize", resize);
|
|
3216
|
+
|
|
3190
3217
|
resize();
|
|
3191
3218
|
const timer = setTimeout(resize, 100);
|
|
3192
3219
|
const timer2 = setTimeout(resize, 500);
|
|
@@ -3198,6 +3225,8 @@ function HtmlEmailBody({
|
|
|
3198
3225
|
clearTimeout(timer);
|
|
3199
3226
|
clearTimeout(timer2);
|
|
3200
3227
|
images.forEach((img) => img.removeEventListener("load", resize));
|
|
3228
|
+
resizeObserver?.disconnect();
|
|
3229
|
+
window.removeEventListener("resize", resize);
|
|
3201
3230
|
themeStyle.remove();
|
|
3202
3231
|
};
|
|
3203
3232
|
}, [
|
|
@@ -3266,7 +3295,7 @@ function HtmlEmailBody({
|
|
|
3266
3295
|
}
|
|
3267
3296
|
|
|
3268
3297
|
// Recalculate height after injecting marks
|
|
3269
|
-
const h = doc
|
|
3298
|
+
const h = measureEmailDocumentHeight(doc);
|
|
3270
3299
|
if (h > 0) setHeight(h);
|
|
3271
3300
|
};
|
|
3272
3301
|
|
|
@@ -3338,6 +3367,7 @@ function HtmlEmailBody({
|
|
|
3338
3367
|
data-agent-native-session-replay=""
|
|
3339
3368
|
srcDoc={iframeDocument}
|
|
3340
3369
|
sandbox="allow-same-origin allow-popups allow-popups-to-escape-sandbox"
|
|
3370
|
+
scrolling="no"
|
|
3341
3371
|
style={{
|
|
3342
3372
|
width: "100%",
|
|
3343
3373
|
height: `${height}px`,
|
|
@@ -438,10 +438,10 @@ const messages = {
|
|
|
438
438
|
suggestionWidget: "Build me a custom widget for my inbox",
|
|
439
439
|
},
|
|
440
440
|
settings: {
|
|
441
|
-
openAgentSettings: "Open agent
|
|
441
|
+
openAgentSettings: "Open agent workspace",
|
|
442
442
|
agentDescription:
|
|
443
|
-
"Open the agent
|
|
444
|
-
agentTitle: "Agent
|
|
443
|
+
"Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
|
|
444
|
+
agentTitle: "Agent workspace",
|
|
445
445
|
aliasName: "Alias name",
|
|
446
446
|
aliasNamePlaceholder: "e.g. Design team",
|
|
447
447
|
recipientsOnePerLine: "Recipients (one email per line)",
|
|
@@ -191,12 +191,22 @@ forward only the code-research and plan-composition guidance here.
|
|
|
191
191
|
targeted `contentPatches`.
|
|
192
192
|
Treat the top-level `content` payload as a full replacement, not a merge; do
|
|
193
193
|
not send a partial `content` object to add a canvas or one block. If a full
|
|
194
|
-
replacement is unavoidable,
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
194
|
+
replacement or `replace-blocks` is unavoidable, call `get-visual-plan`
|
|
195
|
+
immediately before the write, pass its `plan.updatedAt` as
|
|
196
|
+
`expectedUpdatedAt`, and carry forward every existing block and visual
|
|
197
|
+
surface. Never reuse a revision from an earlier read or feedback payload.
|
|
198
|
+
For source-control friendly edits, use granular `patch-visual-plan-source`
|
|
199
|
+
operations against the MDX files instead of regenerating the plan;
|
|
200
|
+
`replace-file` is also destructive and requires the same fresh
|
|
201
|
+
`expectedUpdatedAt` fence.
|
|
202
|
+
7. After every hosted-plan write, call `get-visual-plan` again and compare the
|
|
203
|
+
persisted text, block IDs/counts, canvas frames, and prototype with the
|
|
204
|
+
intended result. A successful mutation response is not proof that unrelated
|
|
205
|
+
content survived. If the edit addressed agent-targeted feedback, only after
|
|
206
|
+
this verification call `resolve-plan-comment` for the thread and
|
|
207
|
+
`consume-plan-feedback` for its comments; do both so addressed feedback is
|
|
208
|
+
neither visibly open nor returned as pending work.
|
|
209
|
+
8. For hosted plans, export with `export-visual-plan` only when the user wants a
|
|
200
210
|
shareable receipt or repo-check-in artifacts.
|
|
201
211
|
|
|
202
212
|
## Self-Review Before Handoff
|
|
@@ -345,14 +355,20 @@ directory before authoring a plan.
|
|
|
345
355
|
- `create-visual-questions`: use only when the user explicitly asks for a visual
|
|
346
356
|
intake questionnaire, not as `/visual-plan` preflight.
|
|
347
357
|
- `update-visual-plan`: revise content, status, or comments with targeted
|
|
348
|
-
`contentPatches` (see Core Workflow
|
|
358
|
+
`contentPatches` (see Core Workflow steps 6-7). `replace-blocks` and full
|
|
359
|
+
`content` replacement require `expectedUpdatedAt` from a fresh
|
|
360
|
+
`get-visual-plan` call.
|
|
349
361
|
- `read-visual-plan-source`: read the normalized plan as `plan.mdx`,
|
|
350
362
|
optional `canvas.mdx`, optional `.plan-state.json`, and JSON.
|
|
351
363
|
- `patch-visual-plan-source`: apply granular MDX AST patches by stable block,
|
|
352
|
-
artboard, annotation, component, or wireframe-node id.
|
|
364
|
+
artboard, annotation, component, or wireframe-node id. Prefer those targeted
|
|
365
|
+
operations; `replace-file` requires `expectedUpdatedAt` from a fresh
|
|
366
|
+
`get-visual-plan` call.
|
|
353
367
|
- `import-visual-plan-source`: create or replace a plan from an MDX folder.
|
|
354
|
-
- `get-visual-plan`: read the current structured plan, exported HTML,
|
|
355
|
-
annotations
|
|
368
|
+
- `get-visual-plan`: read the current structured plan, exported HTML,
|
|
369
|
+
annotations, and `plan.updatedAt`; it also returns the MDX folder for source
|
|
370
|
+
workflows. Re-read immediately before a destructive write for its concurrency
|
|
371
|
+
fence and again after every write to verify persisted state.
|
|
356
372
|
- `get-plan-feedback`: read unconsumed human feedback. Use it frequently; it
|
|
357
373
|
returns grouped threads, exact anchor details, expected resolver, and recent
|
|
358
374
|
review-event payloads so agents can act only on the comments meant for them.
|
|
@@ -411,7 +427,10 @@ local bridge check/serve/verify command, and report the new local URL.
|
|
|
411
427
|
- **Two-axis state.** Mark every ingested comment as consumed
|
|
412
428
|
(`consumedCommentIds` on `update-visual-plan`). Set `status=resolved` only on
|
|
413
429
|
agent-targeted comments you actually addressed; leave human-targeted comments
|
|
414
|
-
open.
|
|
430
|
+
open. When an edit addresses feedback, first re-read the persisted plan and
|
|
431
|
+
verify the requested change. Only then call `resolve-plan-comment` for the
|
|
432
|
+
addressed thread and `consume-plan-feedback` for its comments; never mark
|
|
433
|
+
addressed feedback along only one axis.
|
|
415
434
|
|
|
416
435
|
## Visibility & Sharing
|
|
417
436
|
|
|
@@ -40,6 +40,17 @@ review before code changes happen.
|
|
|
40
40
|
- Surface material assumptions only when they change behavior, data, security,
|
|
41
41
|
tests, deployment, or definition of done.
|
|
42
42
|
- Before edits, read pending feedback with `get-plan-feedback`.
|
|
43
|
+
- Before any destructive hosted-plan write (`replace-blocks`, a top-level
|
|
44
|
+
`content` replacement, or a source `replace-file`), call `get-visual-plan`
|
|
45
|
+
immediately before the write and pass its `plan.updatedAt` as
|
|
46
|
+
`expectedUpdatedAt`. Never reuse a revision from an earlier read. Prefer
|
|
47
|
+
targeted content or source patches whenever they can express the edit.
|
|
48
|
+
- After every hosted-plan write, call `get-visual-plan` again and verify the
|
|
49
|
+
persisted text, blocks, canvas, and prototype before claiming success. If the
|
|
50
|
+
write addressed agent-targeted feedback, call `resolve-plan-comment` and
|
|
51
|
+
`consume-plan-feedback` only after this verification; addressed feedback must
|
|
52
|
+
be both resolved and consumed so it neither remains visibly open nor returns
|
|
53
|
+
as pending work.
|
|
43
54
|
|
|
44
55
|
## Application State
|
|
45
56
|
|
|
@@ -185,6 +196,11 @@ sync-guarded skills (not just one stored plan) so the improvement sticks.
|
|
|
185
196
|
persists the runtime model. Prefer this over regenerating a whole plan when the
|
|
186
197
|
requested change is a few lines, one annotation, one artboard, or one
|
|
187
198
|
wireframe node.
|
|
199
|
+
- `replace-file` is a destructive source operation. Use it only when targeted
|
|
200
|
+
source patches cannot express the edit, after a fresh `get-visual-plan`, and
|
|
201
|
+
pass that read's `plan.updatedAt` as `expectedUpdatedAt`. Re-read the plan
|
|
202
|
+
after the patch and verify that unrelated MDX files and visual surfaces were
|
|
203
|
+
preserved.
|
|
188
204
|
- In Agent Native Desktop, the Plan menu can link a user-chosen local folder for
|
|
189
205
|
the current plan, write the exported MDX files to it, import local edits back
|
|
190
206
|
through `import-visual-plan-source`, and optionally auto-export whenever the
|
|
@@ -263,7 +279,11 @@ elementId, styles }]`. Elements must have `data-design-id` or
|
|
|
263
279
|
reconcile, never drop. Act on `resolutionTarget=agent`; treat `human` as
|
|
264
280
|
context only; `@mentions` are notification signals, not routing. Mark ingested
|
|
265
281
|
comments consumed (`consumedCommentIds`); set `status=resolved` only on
|
|
266
|
-
agent-targeted comments you actually addressed.
|
|
282
|
+
agent-targeted comments you actually addressed. When a plan write addresses
|
|
283
|
+
feedback, do not resolve or consume it until a post-write `get-visual-plan`
|
|
284
|
+
confirms the requested change persisted. Then do both: call
|
|
285
|
+
`resolve-plan-comment` for the addressed thread and `consume-plan-feedback`
|
|
286
|
+
for its comments.
|
|
267
287
|
- New human comments send best-effort transactional email when email is
|
|
268
288
|
configured: root comments and replies notify the plan owner, @mentioned
|
|
269
289
|
members, and replies also notify prior human participants in that thread.
|
|
@@ -20,7 +20,7 @@ const queryBooleanSchema = z.preprocess((value) => {
|
|
|
20
20
|
|
|
21
21
|
export default defineAction({
|
|
22
22
|
description:
|
|
23
|
-
"Get an Agent-Native Plan bundle, including structured editable content with stable block IDs, source-control friendly MDX, exported HTML, sections, comments, and recent activity. Call this before targeted contentPatches, source patches, or resolving feedback on a specific plan.",
|
|
23
|
+
"Get an Agent-Native Plan bundle, including structured editable content with stable block IDs, source-control friendly MDX, exported HTML, sections, comments, and recent activity. Call this before targeted contentPatches, source patches, or resolving feedback on a specific plan. For full content replacement, replace-blocks, or replace-file, pass the returned plan.updatedAt exactly as expectedUpdatedAt and reread after the write.",
|
|
24
24
|
schema: z.object({
|
|
25
25
|
id: z.string().describe("Plan ID"),
|
|
26
26
|
includeMdx: queryBooleanSchema
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
1
3
|
import { defineAction } from "@agent-native/core";
|
|
2
4
|
import { agentTouchDocument } from "@agent-native/core/collab";
|
|
3
5
|
import { and, eq } from "drizzle-orm";
|
|
@@ -24,12 +26,137 @@ import {
|
|
|
24
26
|
planPath,
|
|
25
27
|
writeEvent,
|
|
26
28
|
} from "../server/plans.js";
|
|
29
|
+
import type { PlanContent } from "../shared/plan-content.js";
|
|
30
|
+
|
|
31
|
+
type PlanSurfaceCounts = {
|
|
32
|
+
blocks: number;
|
|
33
|
+
canvasFrames: number;
|
|
34
|
+
prototypeScreens: number;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function planSurfaceCounts(content: PlanContent | null | undefined) {
|
|
38
|
+
return {
|
|
39
|
+
blocks: content?.blocks.length ?? 0,
|
|
40
|
+
canvasFrames: content?.canvas?.frames.length ?? 0,
|
|
41
|
+
prototypeScreens: content?.prototype?.screens.length ?? 0,
|
|
42
|
+
} satisfies PlanSurfaceCounts;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function stableJson(value: unknown): string {
|
|
46
|
+
if (value === null) return "null";
|
|
47
|
+
if (value === undefined) return "undefined";
|
|
48
|
+
if (Array.isArray(value)) {
|
|
49
|
+
return `[${value
|
|
50
|
+
.map((item) => (item === undefined ? "null" : stableJson(item)))
|
|
51
|
+
.join(",")}]`;
|
|
52
|
+
}
|
|
53
|
+
if (typeof value === "object") {
|
|
54
|
+
const record = value as Record<string, unknown>;
|
|
55
|
+
const pairs = Object.keys(record)
|
|
56
|
+
.filter((key) => record[key] !== undefined)
|
|
57
|
+
.sort()
|
|
58
|
+
.map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`);
|
|
59
|
+
return `{${pairs.join(",")}}`;
|
|
60
|
+
}
|
|
61
|
+
return JSON.stringify(value) ?? "null";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function stableContentHash(content: PlanContent | null | undefined) {
|
|
65
|
+
return `sha256:${createHash("sha256")
|
|
66
|
+
.update(stableJson(content ?? null))
|
|
67
|
+
.digest("hex")}`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function sanitizeAuditIdentifier(value: string) {
|
|
71
|
+
return (
|
|
72
|
+
value
|
|
73
|
+
.trim()
|
|
74
|
+
.replace(/[^a-zA-Z0-9._:-]+/g, "_")
|
|
75
|
+
.slice(0, 120) || "unknown"
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function sourcePatchAuditTarget(
|
|
80
|
+
patch: z.infer<typeof planMdxSourcePatchesSchema>[number],
|
|
81
|
+
) {
|
|
82
|
+
switch (patch.op) {
|
|
83
|
+
case "replace-file":
|
|
84
|
+
return { op: patch.op, file: patch.file };
|
|
85
|
+
case "replace-markdown-block":
|
|
86
|
+
return {
|
|
87
|
+
op: patch.op,
|
|
88
|
+
target: sanitizeAuditIdentifier(patch.blockId),
|
|
89
|
+
};
|
|
90
|
+
case "update-component-prop":
|
|
91
|
+
return {
|
|
92
|
+
op: patch.op,
|
|
93
|
+
file: patch.file,
|
|
94
|
+
target: sanitizeAuditIdentifier(patch.componentId),
|
|
95
|
+
prop: sanitizeAuditIdentifier(patch.prop),
|
|
96
|
+
};
|
|
97
|
+
case "update-wireframe-node":
|
|
98
|
+
return {
|
|
99
|
+
op: patch.op,
|
|
100
|
+
target: sanitizeAuditIdentifier(patch.nodeId),
|
|
101
|
+
};
|
|
102
|
+
case "update-annotation":
|
|
103
|
+
return {
|
|
104
|
+
op: patch.op,
|
|
105
|
+
target: sanitizeAuditIdentifier(patch.annotationId),
|
|
106
|
+
};
|
|
107
|
+
case "replace-artboard":
|
|
108
|
+
return {
|
|
109
|
+
op: patch.op,
|
|
110
|
+
target: sanitizeAuditIdentifier(patch.artboardId),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function assertNoUnexpectedSurfaceCollapse(
|
|
116
|
+
before: PlanSurfaceCounts,
|
|
117
|
+
after: PlanSurfaceCounts,
|
|
118
|
+
allowDestructive: boolean,
|
|
119
|
+
) {
|
|
120
|
+
if (allowDestructive) return;
|
|
121
|
+
|
|
122
|
+
const candidates: Array<[label: string, before: number, after: number]> = [
|
|
123
|
+
["blocks", before.blocks, after.blocks],
|
|
124
|
+
["canvas frames", before.canvasFrames, after.canvasFrames],
|
|
125
|
+
["prototype screens", before.prototypeScreens, after.prototypeScreens],
|
|
126
|
+
];
|
|
127
|
+
const collapsed = candidates
|
|
128
|
+
.filter(
|
|
129
|
+
([, beforeCount, afterCount]) => beforeCount > 0 && afterCount === 0,
|
|
130
|
+
)
|
|
131
|
+
.map(([label, beforeCount]) => `${label} (${beforeCount} to 0)`);
|
|
132
|
+
|
|
133
|
+
if (collapsed.length === 0) return;
|
|
134
|
+
throw new Error(
|
|
135
|
+
`Source patch blocked because it would unexpectedly remove all ${collapsed.join(
|
|
136
|
+
", ",
|
|
137
|
+
)}. Reload the plan and use granular patches, or retry with allowDestructive: true if clearing those surfaces is intentional.`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
27
140
|
|
|
28
141
|
export default defineAction({
|
|
29
142
|
description:
|
|
30
143
|
"Patch the MDX source for an Agent-Native Plan by stable semantic IDs, then normalize it back into runtime JSON. Use ONLY when working with exported MDX source files (repo check-in workflows); for live plans prefer update-visual-plan with contentPatches. Suitable for tiny source-control friendly diffs: one markdown block, one artboard, one annotation, or one wireframe node.",
|
|
31
144
|
schema: z.object({
|
|
32
145
|
planId: z.string().describe("Plan ID"),
|
|
146
|
+
expectedUpdatedAt: z
|
|
147
|
+
.string()
|
|
148
|
+
.min(1)
|
|
149
|
+
.optional()
|
|
150
|
+
.describe(
|
|
151
|
+
"Revision from the latest plan read. Required for replace-file and checked before source patching so stale full-file replacements cannot overwrite newer work.",
|
|
152
|
+
),
|
|
153
|
+
allowDestructive: z
|
|
154
|
+
.boolean()
|
|
155
|
+
.optional()
|
|
156
|
+
.default(false)
|
|
157
|
+
.describe(
|
|
158
|
+
"Allow an intentional nonempty-to-empty collapse of plan blocks, canvas frames, or prototype screens. Defaults to false.",
|
|
159
|
+
),
|
|
33
160
|
patches: planMdxSourcePatchesSchema.describe(
|
|
34
161
|
"AST-backed MDX source patches. Prefer targeted ops over replace-file whenever possible so diffs stay small.",
|
|
35
162
|
),
|
|
@@ -52,6 +179,22 @@ export default defineAction({
|
|
|
52
179
|
await assertPlanEditor(args.planId);
|
|
53
180
|
const bundle = await loadPlanBundle(args.planId);
|
|
54
181
|
const versionAtLoad = bundle.plan.updatedAt;
|
|
182
|
+
const hasReplaceFile = args.patches.some(
|
|
183
|
+
(patch) => patch.op === "replace-file",
|
|
184
|
+
);
|
|
185
|
+
if (hasReplaceFile && !args.expectedUpdatedAt) {
|
|
186
|
+
throw new Error(
|
|
187
|
+
"replace-file requires expectedUpdatedAt from the latest plan read. Reload the plan and retry with its current updatedAt value.",
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
if (
|
|
191
|
+
args.expectedUpdatedAt &&
|
|
192
|
+
args.expectedUpdatedAt !== bundle.plan.updatedAt
|
|
193
|
+
) {
|
|
194
|
+
throw new Error(
|
|
195
|
+
"Plan changed since the source was read. Reload the plan and retry against its current updatedAt value.",
|
|
196
|
+
);
|
|
197
|
+
}
|
|
55
198
|
const referencedBlockIds = referencedBlockIdsForPlanComments(
|
|
56
199
|
bundle.comments,
|
|
57
200
|
);
|
|
@@ -70,6 +213,15 @@ export default defineAction({
|
|
|
70
213
|
});
|
|
71
214
|
const nextMdx = await applyPlanMdxSourcePatches(currentMdx, args.patches);
|
|
72
215
|
const nextContent = await parsePlanMdxFolder(nextMdx);
|
|
216
|
+
const beforeCounts = planSurfaceCounts(bundle.plan.content);
|
|
217
|
+
const afterCounts = planSurfaceCounts(nextContent);
|
|
218
|
+
assertNoUnexpectedSurfaceCollapse(
|
|
219
|
+
beforeCounts,
|
|
220
|
+
afterCounts,
|
|
221
|
+
args.allowDestructive ?? false,
|
|
222
|
+
);
|
|
223
|
+
const beforeContentHash = stableContentHash(bundle.plan.content);
|
|
224
|
+
const afterContentHash = stableContentHash(nextContent);
|
|
73
225
|
const now = nowIso();
|
|
74
226
|
await createPlanVersionSnapshot(args.planId, {
|
|
75
227
|
force: true,
|
|
@@ -108,6 +260,15 @@ export default defineAction({
|
|
|
108
260
|
`Applied ${args.patches.length} visual plan source patch(es).`,
|
|
109
261
|
payload: {
|
|
110
262
|
patchOps: args.patches.map((patch) => patch.op),
|
|
263
|
+
targets: args.patches.map(sourcePatchAuditTarget),
|
|
264
|
+
counts: {
|
|
265
|
+
before: beforeCounts,
|
|
266
|
+
after: afterCounts,
|
|
267
|
+
},
|
|
268
|
+
contentHashes: {
|
|
269
|
+
before: beforeContentHash,
|
|
270
|
+
after: afterContentHash,
|
|
271
|
+
},
|
|
111
272
|
},
|
|
112
273
|
createdBy: "agent",
|
|
113
274
|
});
|
|
@@ -9,7 +9,7 @@ import { loadPlanBundle, planDeepLink, planPath } from "../server/plans.js";
|
|
|
9
9
|
|
|
10
10
|
export default defineAction({
|
|
11
11
|
description:
|
|
12
|
-
"Read an Agent-Native Plan as source-control friendly MDX files. Returns plan.mdx, canvas.mdx when the plan has a board, optional .plan-state.json,
|
|
12
|
+
"Read an Agent-Native Plan as source-control friendly MDX files. Returns plan.mdx, canvas.mdx when the plan has a board, optional .plan-state.json, the normalized JSON runtime model, and plan.updatedAt. Pass plan.updatedAt exactly as expectedUpdatedAt for replace-file, then reread to verify the write.",
|
|
13
13
|
schema: z.object({
|
|
14
14
|
planId: z.string().describe("Plan ID"),
|
|
15
15
|
}),
|