@agent-native/core 0.141.6 → 0.144.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/agent-native.eject.json +9 -0
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +3 -14
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +11 -6
- package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +5 -5
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +19 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/analytics/AGENTS.md +37 -40
- package/corpus/templates/analytics/actions/compose-dashboard.ts +1 -1
- package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +1 -1
- package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +17 -22
- package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +135 -0
- package/corpus/templates/analytics/actions/navigate.ts +5 -6
- package/corpus/templates/analytics/actions/provider-api-register.ts +50 -0
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +46 -13
- package/corpus/templates/analytics/actions/test-custom-api-connection.ts +106 -0
- package/corpus/templates/analytics/actions/update-dashboard.ts +0 -1
- package/corpus/templates/analytics/actions/view-screen.ts +0 -20
- package/corpus/templates/analytics/app/components/CustomApiCard.tsx +430 -0
- package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +5 -5
- package/corpus/templates/analytics/app/i18n-data.ts +682 -90
- package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +6 -0
- package/corpus/templates/analytics/app/lib/sql-query.ts +33 -6
- package/corpus/templates/analytics/app/pages/Agents.tsx +0 -3
- package/corpus/templates/analytics/app/pages/DataSources.tsx +4 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +22 -43
- package/corpus/templates/analytics/app/pages/settings/settings-search.ts +23 -20
- package/corpus/templates/analytics/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/analytics/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/analytics/app/routes/team.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-08-05-settings-no-longer-includes-an-unnecessary-about-section.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-load-reliably-during-background-data-sw.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-remain-responsive-while-historical-data.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-analytics-query-results-now-render-as-a-table-with-csv-downl.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-connect-public-https-custom-apis-and-hand-tested-endpoints-t.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-durable-agent-worker-memory.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-live-dashboard-panels-use-the-shared-query-timeout.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-on-demand-billing-is-available-as-a-native-dashboard-with-ta.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-visible-dashboard-names-are-unique.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +1 -1
- package/corpus/templates/analytics/netlify.toml +7 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +4 -0
- package/corpus/templates/analytics/scripts/first-party-analytics-bigquery.sql +104 -0
- package/corpus/templates/analytics/server/db/index.ts +27 -0
- package/corpus/templates/analytics/server/db/schema.ts +10 -0
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -2
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +227 -60
- package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +1147 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +34 -15
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +57 -4
- package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +227 -1
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +1 -3
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -4
- package/corpus/templates/analytics/server/plugins/analytics-rollup-backfill-jobs.ts +1 -0
- package/corpus/templates/analytics/server/plugins/db.ts +52 -18
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +36 -8
- package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +16 -1
- package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +16 -1
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/assets/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/assets/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/assets/AGENTS.md +1 -0
- package/corpus/templates/assets/actions/_helpers.ts +12 -0
- package/corpus/templates/assets/actions/generate-image.ts +9 -3
- package/corpus/templates/assets/actions/import-style-from-url.ts +115 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +3 -1
- package/corpus/templates/assets/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/assets/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/assets/app/routes/settings.tsx +5 -0
- package/corpus/templates/assets/app/routes/team.tsx +1 -1
- package/corpus/templates/assets/changelog/2026-08-05-brand-kits-can-import-a-website-s-hydrated-visual-language-a.md +6 -0
- package/corpus/templates/assets/changelog/2026-08-05-generated-images-now-hand-off-embeddable-previews-to-other-w.md +6 -0
- package/corpus/templates/assets/server/lib/generation.ts +58 -0
- package/corpus/templates/assets/shared/api.ts +12 -0
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/brain/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/brain/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/brain/actions/list-connection-providers.ts +24 -3
- package/corpus/templates/brain/app/lib/dispatch-links.ts +44 -0
- package/corpus/templates/brain/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/brain/app/routes/sources.tsx +15 -7
- package/corpus/templates/brain/app/routes/team.tsx +1 -1
- package/corpus/templates/brain/app/routes.ts +1 -1
- package/corpus/templates/brain/changelog/2026-08-06-brain-provider-setup-links-open-dispatch-correctly-in-standa.md +6 -0
- package/corpus/templates/brain/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +26 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/calendar/AGENTS.md +11 -32
- package/corpus/templates/calendar/actions/update-event.ts +107 -1
- package/corpus/templates/calendar/app/components/calendar/EventCalendarSelect.tsx +83 -0
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +57 -0
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +59 -73
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
- package/corpus/templates/calendar/app/hooks/use-events.ts +4 -1
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/calendar/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-06-existing-events-can-move-between-connected-google-account-ca.md +6 -0
- package/corpus/templates/calendar/server/lib/google-calendar.ts +101 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +7 -1
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/chat/app/root.tsx +1 -1
- package/corpus/templates/chat/app/routes/agent.tsx +7 -7
- package/corpus/templates/chat/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/chat/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/chat/app/routes/team.tsx +1 -1
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/clips/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/clips/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +9 -24
- package/corpus/templates/clips/app/components/editor/timeline-geometry.ts +15 -0
- package/corpus/templates/clips/app/components/editor/waveform.tsx +4 -17
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +14 -3
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +28 -38
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -27
- package/corpus/templates/clips/changelog/2026-08-06-clips-recovers-from-stalled-recording-setup-without-requirin.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-06-clips-starts-faster-after-a-deploy-or-idle-period-startup-no.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-06-deleting-a-recording-returns-cleanly-to-the-library-and-fit-.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-06-hide-clip-insights-from-viewers-without-analytics-access.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +48 -20
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +275 -74
- package/corpus/templates/clips/desktop/src/lib/recording-start-guard.ts +84 -0
- package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +14 -4
- package/corpus/templates/clips/server/plugins/db.ts +214 -26
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/content/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/content/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/content/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/content/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/content/e2e/global-setup.ts +1 -1
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/crm/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/crm/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/crm/changelog/2026-08-06-crm-starts-faster-after-a-deploy-or-idle-period-one-time-dat.md +6 -0
- package/corpus/templates/crm/server/plugins/db.ts +11 -8
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +36 -1
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -1
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/design/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/design/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/design/actions/analyze-brand-assets.ts +7 -7
- package/corpus/templates/design/actions/import-from-url.ts +6 -5
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +27 -18
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +2 -2
- package/corpus/templates/design/app/pages/Index.tsx +6 -2
- package/corpus/templates/design/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/design/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/design/app/routes/team.tsx +1 -1
- package/corpus/templates/design/changelog/2026-08-05-deleting-a-design-from-the-home-page-no-longer-leaves-the-ap.md +6 -0
- package/corpus/templates/design/changelog/2026-08-05-renaming-a-layer-now-focuses-its-name-field-automatically.md +6 -0
- package/corpus/templates/design/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-de.md +6 -0
- package/corpus/templates/design/e2e/global-setup.ts +1 -1
- package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/dispatch/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
- package/corpus/templates/dispatch/changelog/2026-08-06-ready-workspace-apps-stay-one-click-away-in-a-compact-dispat.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-08-06-shared-vault-values-and-management-are-now-restricted-to-wor.md +6 -0
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/factory/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/factory/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/factory/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/factory/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/factory/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/factory/app/routes/team.tsx +1 -1
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/forms/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/forms/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/forms/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/forms/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
- package/corpus/templates/forms/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/forms/shared/navigation.ts +1 -1
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/macros/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/macros/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/macros/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/macros/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/macros/app/routes/team.tsx +1 -1
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/mail/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/mail/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/mail/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/mail/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/mail/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
- package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/plan/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/plan/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/plan/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/plan/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/plan/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +48 -5
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +40 -2
- package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +6 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +15 -2
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +29 -24
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/slides/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/slides/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/slides/AGENTS.md +7 -9
- package/corpus/templates/slides/_gitignore +1 -0
- package/corpus/templates/slides/actions/analyze-brand-assets.ts +7 -7
- package/corpus/templates/slides/actions/export-pptx.ts +402 -36
- package/corpus/templates/slides/actions/import-file.ts +46 -85
- package/corpus/templates/slides/actions/import-from-url.ts +6 -6
- package/corpus/templates/slides/actions/import-google-slides-reference.ts +271 -12
- package/corpus/templates/slides/actions/import-pptx.ts +85 -60
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +10 -13
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +5 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +25 -12
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +112 -57
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +202 -0
- package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +26 -14
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +176 -0
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +182 -141
- package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +1 -0
- package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +18 -0
- package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +85 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -0
- package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +13 -3
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +27 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +71 -20
- package/corpus/templates/slides/app/global.css +6 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/app/lib/create-deck-generation.ts +10 -6
- package/corpus/templates/slides/app/lib/deck-preview-frame.ts +15 -0
- package/corpus/templates/slides/app/lib/deck-share-links.ts +9 -0
- package/corpus/templates/slides/app/lib/export-pptx-client.ts +89 -0
- package/corpus/templates/slides/app/lib/slide-animation-elements.ts +3 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -0
- package/corpus/templates/slides/app/pages/Index.tsx +107 -6
- package/corpus/templates/slides/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/slides/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/slides/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-08-05-failed-deck-creation-and-reference-uploads-now-recover-clean.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-05-slides-recover-completed-generation-results-after-a-sync-hic.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-st.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-clicking-the-gray-canvas-around-a-slide-clears-its-selection.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-deck-thumbnails-keep-a-consistent-listing-frame-across-aspec.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-deep-linked-decks-open-directly-instead-of-being-interrupted.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-google-slides-exports-now-show-clear-import-steps-when-direc.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-import-pdf-google-slides-and-powerpoint-decks-directly-from-.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-imported-powerpoint-exports-keep-text-and-images-editable-an.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-presentation-prompts-continue-adding-rendered-slides-until-t.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-public-decks-now-share-read-only-presentation-links-by-defau.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-slides-offers-a-direct-connect-google-button-when-a-drive-co.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-slides-preserve-uploaded-pdf-layouts-accept-larger-reference.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-styled-words-stay-part-of-their-text-box-instead-of-becoming.md +6 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +7 -20
- package/corpus/templates/slides/server/handlers/import/html-converter.ts +236 -13
- package/corpus/templates/slides/server/handlers/import/pptx-assets.ts +67 -0
- package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +2 -0
- package/corpus/templates/slides/server/handlers/uploads.ts +7 -3
- package/corpus/templates/slides/server/lib/chat-attachments.ts +6 -3
- package/corpus/templates/slides/server/lib/emails.ts +7 -2
- package/corpus/templates/slides/server/lib/google-docs-error.ts +50 -0
- package/corpus/templates/slides/server/lib/google-docs-oauth.ts +1 -0
- package/corpus/templates/slides/server/lib/import-asset-storage.ts +127 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +4 -3
- package/corpus/templates/slides/server/routes/api/import-assets/[token].get.ts +70 -0
- package/corpus/templates/slides/shared/upload-types.ts +3 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/app/components/layout/Header.tsx +3 -1
- package/corpus/templates/tasks/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/tasks/app/routes/settings.$.tsx +1 -0
- package/dist/agent/engine/ai-sdk-engine.js +49 -3
- package/dist/agent/production-agent.d.ts +18 -0
- package/dist/agent/production-agent.js +80 -1
- package/dist/agent/types.d.ts +7 -0
- package/dist/cli/agent-plugin.d.ts +112 -0
- package/dist/cli/agent-plugin.js +1081 -0
- package/dist/cli/app-skill.js +39 -1
- package/dist/cli/code-agent-executor.d.ts +3 -0
- package/dist/cli/code-agent-executor.js +51 -13
- package/dist/cli/index.js +13 -0
- package/dist/cli/templates-meta.js +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.js +9 -2
- package/dist/client/AssistantChat.d.ts +8 -0
- package/dist/client/AssistantChat.js +23 -8
- package/dist/client/NewWorkspaceAppFlow.js +1 -0
- package/dist/client/agent-chat-adapter.d.ts +1 -1
- package/dist/client/agent-chat-adapter.js +153 -7
- package/dist/client/agent-page/AgentWorkspaceContent.d.ts +1 -1
- package/dist/client/agent-page/AgentWorkspaceContent.js +13 -13
- package/dist/client/assistant-ui-recovery.d.ts +2 -1
- package/dist/client/assistant-ui-recovery.js +7 -3
- package/dist/client/chat/run-recovery.js +5 -1
- package/dist/client/embed-auth.js +6 -2
- package/dist/client/error-format.js +12 -0
- package/dist/client/integrations/IntegrationsPanel.js +40 -6
- package/dist/client/onboarding/FirstRunOnboarding.js +11 -4
- package/dist/client/org/OrgSwitcher.js +2 -2
- package/dist/client/org/TeamPage.js +92 -72
- package/dist/client/require-session.d.ts +1 -1
- package/dist/client/require-session.js +4 -4
- package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
- package/dist/client/resources/McpConnectionSuggestion.js +27 -10
- package/dist/client/resources/McpIntegrationDialog.js +77 -45
- package/dist/client/resources/mcp-integration-catalog.d.ts +13 -1
- package/dist/client/resources/mcp-integration-catalog.js +255 -2
- package/dist/client/resources/mcp-integration-logos.js +18 -2
- package/dist/client/resources/use-mcp-servers.d.ts +5 -0
- package/dist/client/resources/use-mcp-servers.js +36 -0
- package/dist/client/settings/AccountSettingsCard.js +42 -36
- package/dist/client/settings/AutomationsSection.js +1 -1
- package/dist/client/settings/DemoModeSection.d.ts +3 -1
- package/dist/client/settings/DemoModeSection.js +4 -1
- package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
- package/dist/client/settings/SchedulingTimezoneField.d.ts +3 -1
- package/dist/client/settings/SchedulingTimezoneField.js +9 -5
- package/dist/client/settings/SettingsPanel.d.ts +4 -1
- package/dist/client/settings/SettingsPanel.js +21 -21
- package/dist/client/settings/SettingsTabsPage.d.ts +2 -2
- package/dist/client/settings/SettingsTabsPage.js +98 -45
- package/dist/client/settings/VoiceTranscriptionSection.js +6 -1
- package/dist/client/settings/useSettingsPanelController.js +47 -8
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts +9 -0
- package/dist/db/client.js +51 -16
- package/dist/db/create-get-db.js +2 -2
- package/dist/db/ddl-guard.d.ts +11 -10
- package/dist/db/ddl-guard.js +40 -12
- package/dist/deploy/build.d.ts +2 -0
- package/dist/deploy/build.js +97 -4
- package/dist/deploy/workspace-deploy.js +0 -2
- package/dist/guards/no-env-credentials.js +9 -0
- package/dist/ingestion/index.d.ts +1 -1
- package/dist/ingestion/pptx.d.ts +68 -0
- package/dist/ingestion/pptx.js +660 -213
- package/dist/ingestion/website.d.ts +30 -0
- package/dist/integrations/plugin.js +9 -6
- package/dist/localization/default-messages.d.ts +59 -0
- package/dist/localization/default-messages.js +62 -2
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp-client/oauth-routes.d.ts +2 -0
- package/dist/mcp-client/oauth-routes.js +74 -7
- package/dist/mcp-client/routes.d.ts +1 -0
- package/dist/mcp-client/routes.js +49 -0
- package/dist/navigation/index.js +16 -5
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/onboarding/app-profile.js +11 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +13 -13
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/resources/store.js +15 -1
- package/dist/scripts/call-agent.js +45 -4
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat/action-filters-a2a.d.ts +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +36 -1
- package/dist/server/agent-chat-plugin.js +29 -8
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.js +55 -17
- package/dist/server/better-auth-instance.js +5 -3
- package/dist/server/core-routes-plugin.d.ts +8 -1
- package/dist/server/core-routes-plugin.js +28 -3
- package/dist/server/credential-provider.d.ts +3 -3
- package/dist/server/credential-provider.js +90 -4
- package/dist/server/identity-sso.js +2 -1
- package/dist/server/onboarding-html.d.ts +2 -0
- package/dist/server/onboarding-html.js +171 -62
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/self-dispatch.d.ts +5 -4
- package/dist/server/self-dispatch.js +25 -14
- package/dist/server/ssr-handler.d.ts +1 -1
- package/dist/server/ssr-handler.js +1 -1
- package/dist/server/workspace-provider-oauth.js +1 -1
- package/dist/setup-connections/onboarding.js +1 -1
- package/dist/shared/cache-control.d.ts +26 -2
- package/dist/shared/cache-control.js +43 -2
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/password-policy.d.ts +3 -0
- package/dist/shared/password-policy.js +3 -0
- package/dist/shared/sign-in-journey.d.ts +5 -2
- package/dist/shared/sign-in-journey.js +10 -4
- package/dist/sharing/actions/set-resource-visibility.js +16 -4
- package/dist/sharing/registry.d.ts +14 -0
- package/dist/styles/agent-native.css +6 -0
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/dist/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/dist/templates/chat/app/root.tsx +1 -1
- package/dist/templates/chat/app/routes/agent.tsx +7 -7
- package/dist/templates/chat/app/routes/extensions._index.tsx +1 -1
- package/dist/templates/chat/app/routes/settings.$.tsx +1 -0
- package/dist/templates/chat/app/routes/team.tsx +1 -1
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/workspace-root/AGENTS.md +7 -0
- package/dist/user-profile/actions/change-password.js +8 -3
- package/dist/user-profile/actions/set-password.js +5 -1
- package/dist/vite/action-types-plugin.js +59 -0
- package/docs/content/authentication.mdx +4 -5
- package/docs/content/skills-guide.mdx +13 -0
- package/docs/content/template-analytics-developers.mdx +1 -1
- package/docs/content/template-calendar-developers.mdx +1 -1
- package/docs/content/template-chat-developers.mdx +2 -2
- package/docs/content/template-content-developers.mdx +1 -1
- package/docs/content/template-mail-developers.mdx +1 -1
- package/docs/content/template-plan-developers.mdx +1 -1
- package/docs/content/toolkit-command-navigation.mdx +6 -6
- package/docs/content/toolkit-org-team.mdx +1 -1
- package/docs/content/toolkit-settings.mdx +8 -8
- package/docs/content/toolkit-setup-connections.mdx +1 -1
- package/package.json +6 -2
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/src/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/src/templates/chat/app/root.tsx +1 -1
- package/src/templates/chat/app/routes/agent.tsx +7 -7
- package/src/templates/chat/app/routes/extensions._index.tsx +1 -1
- package/src/templates/chat/app/routes/settings.$.tsx +1 -0
- package/src/templates/chat/app/routes/team.tsx +1 -1
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
- package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/workspace-root/AGENTS.md +7 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +0 -62
- package/corpus/templates/analytics/actions/install-dashboard-template.ts +0 -369
- package/corpus/templates/analytics/actions/list-dashboard-templates.ts +0 -47
- package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +0 -34
- package/corpus/templates/analytics/app/routes/catalog.tsx +0 -240
- package/src/templates/default/actions/navigate.spec.ts +0 -53
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turn-into-app
|
|
3
|
+
description: >-
|
|
4
|
+
Turn a proven thread, skill, or workflow into a runnable Agent-Native app
|
|
5
|
+
with simple buttons, visible agent steps, preview, and deployment handoff.
|
|
6
|
+
Use when a user invokes `/turn-into-app` or asks to make a workflow into an
|
|
7
|
+
app.
|
|
8
|
+
user-invocable: true
|
|
9
|
+
scope: both
|
|
10
|
+
metadata:
|
|
11
|
+
internal: true
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Turn Into App
|
|
15
|
+
|
|
16
|
+
## Default behavior
|
|
17
|
+
|
|
18
|
+
This is an end-to-end build skill, not a request for an app proposal.
|
|
19
|
+
|
|
20
|
+
- With no argument, use the current thread as the source. This is the normal
|
|
21
|
+
invocation at the end of a successful workflow.
|
|
22
|
+
- With a named skill or local workflow, read that source and package it
|
|
23
|
+
immediately, even at the beginning of a thread. For example,
|
|
24
|
+
`/turn-into-app /some-skill` means “turn `/some-skill` into an app.”
|
|
25
|
+
- With an attachment or path, read the supplied artifact as the source.
|
|
26
|
+
- Do not ask the user to restate context that is already in the thread.
|
|
27
|
+
- When invoked from an Agent-Native app, keep the current thread as the source
|
|
28
|
+
and use the available workspace/coding-agent handoff when the current runtime
|
|
29
|
+
cannot edit files. Do not claim the app exists without an actual path and
|
|
30
|
+
verification result.
|
|
31
|
+
|
|
32
|
+
## Source support
|
|
33
|
+
|
|
34
|
+
Supported source paths today are the current Codex thread, a named skill, or a
|
|
35
|
+
local workflow/transcript supplied as a path or attachment. An exported
|
|
36
|
+
ChatGPT or Claude transcript can use the same local-file path today.
|
|
37
|
+
|
|
38
|
+
ChatGPT shared-conversation import and Claude web conversation/project import
|
|
39
|
+
are **coming soon**. Do not claim private web access, invent an importer, add
|
|
40
|
+
fake OAuth, or scrape a logged-in page without an explicit supported adapter.
|
|
41
|
+
If a user gives one of those URLs before an adapter exists, ask for an export or
|
|
42
|
+
transcript instead and treat it as imported source material.
|
|
43
|
+
|
|
44
|
+
Deliver a fresh app in a new directory, implement the repeatable workflow with
|
|
45
|
+
buttons and agent handoffs, start its dev server, verify the main path, and
|
|
46
|
+
continue through build/deployment handoff. Do not stop at a plan.
|
|
47
|
+
|
|
48
|
+
## Source selection guard
|
|
49
|
+
|
|
50
|
+
The generated app must implement the concrete workflow found in the source. It
|
|
51
|
+
must not become a generic “what app do you want to make?” intake form.
|
|
52
|
+
|
|
53
|
+
- In a delegated or forked task, read the actual referenced source thread and
|
|
54
|
+
the latest explicit workflow direction in the current task. If they disagree,
|
|
55
|
+
the latest concrete workflow direction wins.
|
|
56
|
+
- Do not treat a thread that merely discusses building this skill as the product
|
|
57
|
+
source unless the user explicitly asks to appify that meta-workflow.
|
|
58
|
+
- If the source contains several workflows, choose the latest successful,
|
|
59
|
+
repeatable job that motivated the request and name it in the handoff. If no
|
|
60
|
+
concrete job can be identified, stop and report what is missing instead of
|
|
61
|
+
inventing an app-builder UI.
|
|
62
|
+
|
|
63
|
+
## UI contract for generated apps
|
|
64
|
+
|
|
65
|
+
Generated apps must follow the shared Agent-Native surface model:
|
|
66
|
+
|
|
67
|
+
- Keep the domain workflow on a named route (`/workflow`, `/automations`,
|
|
68
|
+
`/block`, or the source's equivalent). Preserve the scaffold's full-page
|
|
69
|
+
chat route instead of replacing it with a domain form while leaving the
|
|
70
|
+
layout configured as a chat page.
|
|
71
|
+
- Use the right `AgentSidebar` for contextual AI. Every button-triggered
|
|
72
|
+
`sendToAgentChat` handoff should open or focus that sidebar and keep the user
|
|
73
|
+
on the current domain page.
|
|
74
|
+
- Use a sans-first SaaS hierarchy for the app shell. Choose a named visual
|
|
75
|
+
direction in `DESIGN.md` before styling: product mode, audience, palette
|
|
76
|
+
family, type treatment, composition, shape language, and anti-references.
|
|
77
|
+
One restrained editorial cue is welcome, but warm beige plus terracotta is
|
|
78
|
+
not the default and serif type belongs in content previews or a deliberate
|
|
79
|
+
brand moment rather than the whole tool.
|
|
80
|
+
- Preserve existing brand tokens. For a new unbranded app, choose a
|
|
81
|
+
product-fitting palette family and compare sibling apps before reusing their
|
|
82
|
+
accent. Keep shared semantic tokens and Agent-Native behavior consistent
|
|
83
|
+
while varying the visual world, density, composition, and shape language.
|
|
84
|
+
- Give the AgentSidebar a subtle surface or divider boundary so it is visually
|
|
85
|
+
distinct from the domain page without becoming a heavy panel wall.
|
|
86
|
+
- Every AI-labeled button must actually call `sendToAgentChat` with bounded
|
|
87
|
+
context and `openSidebar: true`. Keep `submit: true` for direct execution and
|
|
88
|
+
`submit: false` only when the user should edit the staged prompt first. Label
|
|
89
|
+
deterministic local actions as local, preview, or analyze instead of AI.
|
|
90
|
+
- Standalone apps that render `AgentSidebar` must keep one assistant-ui runtime
|
|
91
|
+
context. Pin the versions compatible with the installed core/toolkit peer
|
|
92
|
+
graph, and add Vite dedupe/aliases when linked or transitive packages resolve
|
|
93
|
+
duplicate assistant-ui modules. Verify a fresh AI handoff has no
|
|
94
|
+
`AssistantUiStaleIndexErrorBoundary` or stale-index console error.
|
|
95
|
+
- Make the left navigation describe domain destinations. Chat is a separate
|
|
96
|
+
destination, not the label for every app page.
|
|
97
|
+
- Start with one primary action and one compact state. Put setup choices,
|
|
98
|
+
advanced inputs, diagnostics, and long explanations behind progressive
|
|
99
|
+
disclosure or later workflow steps.
|
|
100
|
+
- Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a
|
|
101
|
+
message or neutral action icon, or no icon when the button label is enough.
|
|
102
|
+
- Before handoff, inspect the first viewport for text density, repeated cards,
|
|
103
|
+
unrelated forms, and generic helper copy. Remove what the user does not need
|
|
104
|
+
until the next decision.
|
|
105
|
+
- Run a `distill`, `typeset`, `colorize`, `layout`, `polish`, and `audit` pass
|
|
106
|
+
as useful named reviews. Make one intervention at a time and commit the
|
|
107
|
+
chosen direction rather than averaging several options into generic SaaS.
|
|
108
|
+
- For before/after or original/generated review, stack the source first and the
|
|
109
|
+
result second by default. Reserve side-by-side layouts for short content that
|
|
110
|
+
remains comfortable to scan at the target width.
|
|
111
|
+
|
|
112
|
+
## 1. Extract the workflow
|
|
113
|
+
|
|
114
|
+
Read the full available source before coding. Reduce it to a short working
|
|
115
|
+
brief:
|
|
116
|
+
|
|
117
|
+
- the user and repeatable job;
|
|
118
|
+
- inputs and outputs;
|
|
119
|
+
- the 1-3 judgment-heavy agent moments;
|
|
120
|
+
- the buttons, review points, and retry states a user needs;
|
|
121
|
+
- data, permissions, integrations, and failure boundaries.
|
|
122
|
+
|
|
123
|
+
Preserve useful judgment from the source, but do not turn a one-off answer,
|
|
124
|
+
private data, or an unverified result into a product contract. If the source is
|
|
125
|
+
not available or does not contain a repeatable job, say what is missing rather
|
|
126
|
+
than claiming the app is complete.
|
|
127
|
+
|
|
128
|
+
## 2. Create a fresh app
|
|
129
|
+
|
|
130
|
+
Choose a short slug from the workflow and create a new directory. Never
|
|
131
|
+
overwrite an existing app. If the user supplied a directory, use it; otherwise
|
|
132
|
+
use `apps/<slug>` inside an existing Agent-Native workspace, or a new sibling
|
|
133
|
+
directory when working outside one.
|
|
134
|
+
|
|
135
|
+
For a new UI-bearing standalone app, use the current Agent-Native scaffold and
|
|
136
|
+
then read the generated `AGENTS.md`:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
npx @agent-native/core@latest create <app-directory> --template chat
|
|
140
|
+
cd <app-directory>
|
|
141
|
+
pnpm install
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
When working inside an existing Agent-Native workspace, create the app from
|
|
145
|
+
the workspace root instead:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
pnpm exec agent-native add-app <slug> --template=chat
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Do not use `create` for an existing workspace; it scaffolds a new standalone
|
|
152
|
+
workspace rather than adding an app to the current one.
|
|
153
|
+
|
|
154
|
+
Use a first-party template only when it materially fits the workflow. Keep the
|
|
155
|
+
new app independent from the source thread's working tree unless the user
|
|
156
|
+
explicitly asks to extend an existing app.
|
|
157
|
+
|
|
158
|
+
Read the generated `DESIGN.md` before building the first screen and fill in the
|
|
159
|
+
visual direction as part of the app brief. Do not copy the previous app's
|
|
160
|
+
palette just because its tokens are nearby.
|
|
161
|
+
|
|
162
|
+
## 3. Turn the workflow into buttons and agent work
|
|
163
|
+
|
|
164
|
+
Implement the smallest useful surface around the extracted brief. The app
|
|
165
|
+
should make the repeated path obvious without hiding the agent's judgment:
|
|
166
|
+
|
|
167
|
+
- Give each important repeated moment a clear button, such as “Analyze,”
|
|
168
|
+
“Suggest options,” “Draft,” “Review,” or “Publish.” Use the source's actual
|
|
169
|
+
vocabulary when it is clear.
|
|
170
|
+
- Put deterministic reads, writes, approvals, and publishing in `actions/`
|
|
171
|
+
with `defineAction`. The UI and agent must call the same action surface.
|
|
172
|
+
- Use application state for the current screen, selected item, and focused
|
|
173
|
+
object so the agent can see where the user is.
|
|
174
|
+
- Use `sendToAgentChat({ message, context, submit: true })` for intentional
|
|
175
|
+
button-triggered agent work. Use `submit: false` when the user should review
|
|
176
|
+
or edit the proposed prompt first.
|
|
177
|
+
- Pass IDs, URLs, and bounded summaries in context. Do not paste large provider
|
|
178
|
+
dumps into prompts, call an LLM directly from the browser, or invent fake
|
|
179
|
+
progress.
|
|
180
|
+
- Make agent results visible, editable, retryable, and attributable. Keep
|
|
181
|
+
irreversible actions behind an explicit review or confirmation point.
|
|
182
|
+
|
|
183
|
+
Use the existing shadcn/ui primitives, Tabler icons, shared composer, and
|
|
184
|
+
optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
185
|
+
|
|
186
|
+
## 4. Keep onboarding shared
|
|
187
|
+
|
|
188
|
+
Use the framework's existing setup experience. The app should offer the normal
|
|
189
|
+
“Connect Builder” and “Add your own keys” paths for AI setup. Do not create a
|
|
190
|
+
second credential form or hardcode a provider key.
|
|
191
|
+
|
|
192
|
+
In local-development instructions, add a brief note that a developer can set
|
|
193
|
+
an environment variable such as `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` before
|
|
194
|
+
starting the app; after restart, the setup prompt is no longer shown when the
|
|
195
|
+
key is available. Keep real secrets out of source, examples, and generated
|
|
196
|
+
content.
|
|
197
|
+
|
|
198
|
+
Turn-into-app apps should commit an `agent-native.json` app configuration so a
|
|
199
|
+
plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{
|
|
203
|
+
"version": 1,
|
|
204
|
+
"onboarding": {
|
|
205
|
+
"firstRun": {
|
|
206
|
+
"development": "connect",
|
|
207
|
+
"production": "connect-and-integrations"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
`connect` keeps the Connect Builder / Add your own keys choice visible and
|
|
214
|
+
skips only the generic “This app is an agent.” integrations catalog. The
|
|
215
|
+
production value includes that catalog for a hosted app. Do not replace this
|
|
216
|
+
with a local credential form or remove the shared onboarding. In development,
|
|
217
|
+
the shared Connect Builder card also explains the deployment-level
|
|
218
|
+
`ANTHROPIC_API_KEY` / `OPENAI_API_KEY` fallback and links to the full
|
|
219
|
+
environment-variable guide.
|
|
220
|
+
|
|
221
|
+
When the onboarding default needs code rather than a static mode map, add an
|
|
222
|
+
optional `agent-native.config.ts` with the same returned shape:
|
|
223
|
+
|
|
224
|
+
```ts
|
|
225
|
+
import { defineAgentNativeConfig } from "@agent-native/core/config";
|
|
226
|
+
|
|
227
|
+
export default defineAgentNativeConfig(({ isDev }) => ({
|
|
228
|
+
version: 1,
|
|
229
|
+
onboarding: {
|
|
230
|
+
firstRun: isDev ? "connect" : "connect-and-integrations",
|
|
231
|
+
},
|
|
232
|
+
}));
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
The Vite preset loads this file automatically on supported Node versions. The
|
|
236
|
+
JSON file remains the portable, inspectable fallback. See the [Agent-Native
|
|
237
|
+
app configuration guide](/docs/agent-native-config) for precedence, supported
|
|
238
|
+
modes, and the boundary between committed config and deployment secrets.
|
|
239
|
+
|
|
240
|
+
For an account-free local preview, create the ignored local `.env` file with
|
|
241
|
+
`AUTH_DISABLED=1` before starting the dev server. This is only for loopback
|
|
242
|
+
development; never commit or deploy this setting. AI/provider connections still
|
|
243
|
+
use the normal onboarding flow or the documented environment-variable keys.
|
|
244
|
+
|
|
245
|
+
## 5. Run it immediately
|
|
246
|
+
|
|
247
|
+
From the new app directory:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
pnpm dev
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
For a fresh local test app, use the ignored `.env` with `AUTH_DISABLED=1` so the
|
|
254
|
+
domain UI opens without an account; the committed app config makes shared
|
|
255
|
+
onboarding visible. Keep the process running so the user can try the app. Read
|
|
256
|
+
the actual server output and report the real local URL. If the app needs installation or a setup step,
|
|
257
|
+
complete it when possible and distinguish “not configured” from an unavailable
|
|
258
|
+
credential store.
|
|
259
|
+
|
|
260
|
+
## 6. Verify, build, and deploy
|
|
261
|
+
|
|
262
|
+
Exercise the actual happy path, not only the source files:
|
|
263
|
+
|
|
264
|
+
1. Load the reported URL and confirm the main route renders.
|
|
265
|
+
2. Confirm the shared onboarding state or a configured local key.
|
|
266
|
+
3. Click the primary workflow button and confirm the intended agent handoff.
|
|
267
|
+
Also click every other AI-labeled button and confirm it opens the same
|
|
268
|
+
contextual sidebar with the expected prompt or staged context.
|
|
269
|
+
4. Confirm the result, action persistence, application state, and sync path.
|
|
270
|
+
5. Check the dev output for browser/runtime errors, and capture input, result,
|
|
271
|
+
and agent-sidebar states so the complete flow is reviewable.
|
|
272
|
+
|
|
273
|
+
Then run the supported build. For a standalone app, use the generated app's
|
|
274
|
+
documented build and hosting path. For an app inside a workspace, use the
|
|
275
|
+
workspace deploy command, for example:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
npx @agent-native/core@latest build
|
|
279
|
+
npx @agent-native/core@latest deploy --preset netlify
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Use `vercel` or another supported preset when that is the configured target.
|
|
283
|
+
Attempt deployment when the user requested it or the project already has the
|
|
284
|
+
required provider configuration. If external authentication, a production
|
|
285
|
+
secret, or a hosting decision is missing, finish local verification and report
|
|
286
|
+
the exact remaining handoff without claiming a live deployment.
|
|
287
|
+
|
|
288
|
+
Label evidence separately: locally running, locally verified, build-ready,
|
|
289
|
+
deployed, and live-verified are different states.
|
|
290
|
+
|
|
291
|
+
## Handoff
|
|
292
|
+
|
|
293
|
+
End with the new app directory, local URL, visual direction, what the buttons do,
|
|
294
|
+
account-free local-preview status, verification performed, deployment URL if it is real,
|
|
295
|
+
and one precise pending step when something could not be completed. Keep the
|
|
296
|
+
handoff short enough to use in a demo or recording.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Turn Into App"
|
|
3
|
+
short_description: "Turn a thread or skill into a runnable app"
|
|
4
|
+
default_prompt: "Scan the current thread, turn the workflow into a new Agent-Native app with clear buttons, run it locally, verify it, and complete the deployment handoff."
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turn-into-skill
|
|
3
|
+
description: >-
|
|
4
|
+
Capture a proven thread or workflow as a reusable Agent-Native skill and save
|
|
5
|
+
it as a personal or organization resource. Use when a user invokes
|
|
6
|
+
`/turn-into-skill` or asks to save a workflow for reuse.
|
|
7
|
+
user-invocable: true
|
|
8
|
+
scope: both
|
|
9
|
+
metadata:
|
|
10
|
+
internal: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Turn Into Skill
|
|
14
|
+
|
|
15
|
+
This is a packaging-and-save workflow, not a request for a proposal. A skill
|
|
16
|
+
is the lightweight path for a repeatable job that mostly needs guidance and
|
|
17
|
+
existing app actions. Use `turn-into-app` when the job needs a dedicated UI,
|
|
18
|
+
new persistent domain state, or a distinct app route.
|
|
19
|
+
|
|
20
|
+
## Default behavior
|
|
21
|
+
|
|
22
|
+
- With no argument, use the current thread as the source.
|
|
23
|
+
- With a named skill, local workflow, transcript path, or attachment, read that
|
|
24
|
+
source and package it immediately.
|
|
25
|
+
- Do not ask the user to restate context already present in the source.
|
|
26
|
+
- Default to a personal skill unless the user explicitly asks for a team,
|
|
27
|
+
organization, or all-app skill, or passes `shared` as the scope.
|
|
28
|
+
- If the current thread only discusses creating a skill, do not package that
|
|
29
|
+
meta-workflow unless the user explicitly asks for it.
|
|
30
|
+
- Treat an explicit `/turn-into-skill` invocation as authorization to save the
|
|
31
|
+
resulting skill, but never overwrite an existing skill at the target path
|
|
32
|
+
unless the user clearly asks to update it.
|
|
33
|
+
|
|
34
|
+
## 1. Extract the repeatable workflow
|
|
35
|
+
|
|
36
|
+
Read the full source before writing. Reduce it to a concise working brief:
|
|
37
|
+
|
|
38
|
+
- the repeatable job and the user outcome;
|
|
39
|
+
- when the skill should trigger;
|
|
40
|
+
- required inputs, context, permissions, and integrations;
|
|
41
|
+
- the ordered steps and the one to three judgment-heavy decisions;
|
|
42
|
+
- expected outputs, verification, retry, and failure boundaries.
|
|
43
|
+
|
|
44
|
+
Preserve the useful judgment from the source, not its transcript. Do not turn
|
|
45
|
+
one-off answers, private data, customer data, secrets, or unverified claims into
|
|
46
|
+
the skill's contract. If no repeatable job can be identified, stop and report
|
|
47
|
+
what is missing instead of inventing generic guidance.
|
|
48
|
+
|
|
49
|
+
## 2. Author the skill
|
|
50
|
+
|
|
51
|
+
Create a single `SKILL.md` with:
|
|
52
|
+
|
|
53
|
+
- a short hyphen-case name and a description under 40 words that says what the
|
|
54
|
+
skill does and when to use it;
|
|
55
|
+
- `user-invocable: true` so it can be selected from the app's `/` picker;
|
|
56
|
+
- `scope: both` so the saved skill can guide the app runtime and connected
|
|
57
|
+
coding agents;
|
|
58
|
+
- concise sections for purpose, trigger, inputs, workflow, verification, and
|
|
59
|
+
failure or retry behavior.
|
|
60
|
+
|
|
61
|
+
Write imperative, reusable instructions. Keep exact action names, field rules,
|
|
62
|
+
and decision criteria when they matter. Use placeholders for credentials and
|
|
63
|
+
provider data. Do not paste the source transcript, large dumps, or ephemeral
|
|
64
|
+
thread details into the saved skill.
|
|
65
|
+
|
|
66
|
+
Choose a new slug when the target path already exists. Read an existing skill
|
|
67
|
+
before changing it, and update it only when the user explicitly requested an
|
|
68
|
+
update.
|
|
69
|
+
|
|
70
|
+
## 3. Save at the requested scope
|
|
71
|
+
|
|
72
|
+
Skills are resources at `skills/<slug>/SKILL.md`.
|
|
73
|
+
|
|
74
|
+
| User intent | Save path |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| Just me or personal reuse | Use the `resources` tool with `action: "write"`, `scope: "personal"`, `visibility: "workspace"`, and the generated skill content. |
|
|
77
|
+
| Shared organization or app reuse | Use the `resources` tool with `action: "write"`, `scope: "shared"`, `visibility: "workspace"`, and the generated skill content. |
|
|
78
|
+
| Every workspace app | Use `create-workspace-resource` with `kind: "skill"`, `scope: "all"`, the generated path, name, description, and content. |
|
|
79
|
+
| Only selected apps | Use the workspace resource flow with `scope: "selected"` only when the user names the app set. |
|
|
80
|
+
|
|
81
|
+
For an all-app workspace skill, use the workspace resource action when it is
|
|
82
|
+
available. If the current app does not expose it, discover or delegate to the
|
|
83
|
+
configured Dispatch workspace agent. Do not silently save a personal skill and
|
|
84
|
+
report it as shared. If organization approval is queued, report that the skill
|
|
85
|
+
is pending approval rather than claiming it is active.
|
|
86
|
+
|
|
87
|
+
Set `visibility: "workspace"` for an explicitly requested saved skill. Use
|
|
88
|
+
`agent_scratch` only for temporary drafting, then promote or rewrite it before
|
|
89
|
+
reporting the skill as saved.
|
|
90
|
+
|
|
91
|
+
## 4. Verify and hand off
|
|
92
|
+
|
|
93
|
+
After saving, read the exact `skills/<slug>/SKILL.md` resource back at the
|
|
94
|
+
target scope. Confirm that the frontmatter name, trigger description, and full
|
|
95
|
+
workflow body are present. If the read-back fails or the save returned an
|
|
96
|
+
approval request, say so plainly and include the actual pending state.
|
|
97
|
+
|
|
98
|
+
Report:
|
|
99
|
+
|
|
100
|
+
- the skill name and path;
|
|
101
|
+
- whether it is personal, organization-wide, or selected-app;
|
|
102
|
+
- the trigger users can invoke from `/`;
|
|
103
|
+
- the verification result and any approval or setup still required.
|
|
104
|
+
|
|
105
|
+
## Related skills
|
|
106
|
+
|
|
107
|
+
- `turn-into-app` — package the same source as a UI-bearing app with buttons,
|
|
108
|
+
agent handoffs, and a domain workflow.
|
|
109
|
+
- `create-skill` — general skill format and authoring rules.
|
|
110
|
+
- `capture-learnings` — lightweight memory for preferences and corrections,
|
|
111
|
+
rather than reusable workflows.
|
|
112
|
+
- `self-modifying-code` — safety boundaries when the agent edits app source.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Turn Into Skill"
|
|
3
|
+
short_description: "Save a proven workflow as a reusable skill"
|
|
4
|
+
default_prompt: "Read the current thread, distill the repeatable workflow into a concise user-invocable skill, save it at personal or organization scope, verify the saved resource, and report its path."
|
|
@@ -34,6 +34,12 @@ Dispatch vault access is workspace-wide by default: every saved vault key is
|
|
|
34
34
|
available to every workspace app. Only create or request per-app vault grants
|
|
35
35
|
when Dispatch's vault access setting is switched to manual mode.
|
|
36
36
|
|
|
37
|
+
When an app needs a provider credential, use the app's scoped secret or
|
|
38
|
+
workspace-connection resolver so Dispatch remains the source of truth. Do not
|
|
39
|
+
ask a non-admin builder to add a key to local project settings or `.env`; use
|
|
40
|
+
Dispatch's vault request workflow for a missing key and keep the value out of
|
|
41
|
+
app code.
|
|
42
|
+
|
|
37
43
|
## Discovery, Links, And The UI Stack
|
|
38
44
|
|
|
39
45
|
Workspace apps are discovered from `apps/<app-name>/package.json`. There is no
|
|
@@ -38,7 +38,35 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
38
38
|
|
|
39
39
|
Use web browsing only for public URLs. Auth-gated docs usually need their matching connector. For threads, read the parent and all replies; note when there are no replies, and inspect linked files or newer follow-ups when the source refers to them.
|
|
40
40
|
|
|
41
|
-
2.
|
|
41
|
+
2. Check whether this defect has already been reported.
|
|
42
|
+
|
|
43
|
+
A feedback channel holds months of reports and nobody remembers all of them,
|
|
44
|
+
so the same defect gets filed by different people weeks apart and every
|
|
45
|
+
filing reads as new. One recorded case: the same Clips recording bug was
|
|
46
|
+
filed almost word-for-word 29 days apart by the same reporter, and neither
|
|
47
|
+
message mentions the other. Another defect was reported fifteen times by
|
|
48
|
+
nine people across three months, was announced as fixed once in the middle,
|
|
49
|
+
and was reported again two weeks later.
|
|
50
|
+
|
|
51
|
+
Search before fixing, going back at least three months: the source channel
|
|
52
|
+
in the reporter's words and in your own, Sentry, and merged PR titles. Search
|
|
53
|
+
the feature name, the error text, and the surface separately — repeat reports
|
|
54
|
+
rarely share vocabulary.
|
|
55
|
+
|
|
56
|
+
- **No prior report** — proceed normally.
|
|
57
|
+
- **Prior report, no fix landed** — say how long it has been open. The person
|
|
58
|
+
forwarding it to you is likely seeing it for the second time too.
|
|
59
|
+
- **Prior report, fix landed** — this is a regression, and the bar is now
|
|
60
|
+
different. Patching it again and reporting done is exactly how it returns a
|
|
61
|
+
third time. Find why the first fix stopped holding, and leave behind
|
|
62
|
+
something that fails when it breaks again: a test that reproduces the
|
|
63
|
+
user's path, or an assertion in the flow the report names.
|
|
64
|
+
|
|
65
|
+
Report the repeat explicitly, with dates and reporters. A defect on its third
|
|
66
|
+
report is not a bug ticket, it is a missing check — and the missing check is
|
|
67
|
+
the deliverable, not the patch.
|
|
68
|
+
|
|
69
|
+
3. Decompose and categorize every actionable item.
|
|
42
70
|
|
|
43
71
|
Build a compact checklist before changing code. For each item, record the
|
|
44
72
|
symptom, expected behavior, evidence, and owning surface: UI, action/tool,
|
|
@@ -49,7 +77,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
49
77
|
- **Question or unclear**: Missing detail, contradictory feedback, or behavior you cannot inspect. Ask or flag it.
|
|
50
78
|
- **Out of scope**: Outside this repo, already shipped, intentionally unsupported, or too low-signal. Note briefly and skip.
|
|
51
79
|
|
|
52
|
-
|
|
80
|
+
4. For data, permissions, or resource-lifecycle feedback, verify the whole capability boundary before calling it UX.
|
|
53
81
|
|
|
54
82
|
- Check the supported create/read/update/delete lifecycle, including whether the backend/action exists when a UI control is missing.
|
|
55
83
|
- Inspect both the UI and the shared action/tool surface so agent and UI behavior stay in parity.
|
|
@@ -57,7 +85,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
57
85
|
- Treat possible cross-user or cross-organization exposure as a security/correctness bug and verify it before proposing polish.
|
|
58
86
|
- Keep undefined product policy separate from implementation bugs. If supported source types or scope semantics are not defined, flag the contract question instead of inventing behavior.
|
|
59
87
|
|
|
60
|
-
|
|
88
|
+
5. Check Sentry when the feedback smells like an error.
|
|
61
89
|
|
|
62
90
|
- Use the Sentry skill/plugin if available, or the repo's Sentry scripts if documented.
|
|
63
91
|
- Search by route, stack symbol, error text, and symptom keywords.
|
|
@@ -65,7 +93,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
65
93
|
- Cite issue IDs or links when you find a match.
|
|
66
94
|
- If nothing matches, say that plainly.
|
|
67
95
|
|
|
68
|
-
|
|
96
|
+
6. Fix only the clear bugs you agree with.
|
|
69
97
|
|
|
70
98
|
- Verify before fixing: reproduce locally, read the relevant code, inspect logs, or confirm with a stack trace.
|
|
71
99
|
- Keep each fix narrow and mapped to a feedback item.
|
|
@@ -73,7 +101,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
73
101
|
- Do not switch branches, stash, reset, force-push, or open a PR unless the user asks.
|
|
74
102
|
- Add or update focused tests when the bug risk warrants it.
|
|
75
103
|
|
|
76
|
-
|
|
104
|
+
7. Treat UX feedback with restraint.
|
|
77
105
|
|
|
78
106
|
Do not solve UX problems by adding more visible controls, helper text, banners, top-level nav, or always-open panels by default. Prefer cleaner interaction models:
|
|
79
107
|
|
|
@@ -85,7 +113,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
85
113
|
|
|
86
114
|
When proposing a UX change, write it as: what to change, why it helps, and the tradeoff. Keep each proposal short.
|
|
87
115
|
|
|
88
|
-
|
|
116
|
+
8. Verify changed behavior.
|
|
89
117
|
|
|
90
118
|
- Run the smallest relevant test or typecheck command.
|
|
91
119
|
- For UI fixes, inspect the actual screen with a browser tool you already
|
|
@@ -100,6 +128,9 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
|
|
|
100
128
|
Keep the final report short:
|
|
101
129
|
|
|
102
130
|
```md
|
|
131
|
+
## Repeat Reports
|
|
132
|
+
- [defect] - reported [N] times since [date] by [reporters]; [what now fails if it regresses]
|
|
133
|
+
|
|
103
134
|
## Bugs Fixed
|
|
104
135
|
- [feedback item] - [what changed, file:line]
|
|
105
136
|
|
|
@@ -204,7 +204,7 @@ For public pages (share links, embeds, marketing pages) that need anonymous view
|
|
|
204
204
|
```ts
|
|
205
205
|
const ret = window.location.pathname + window.location.search;
|
|
206
206
|
window.location.href =
|
|
207
|
-
"/
|
|
207
|
+
"/sign-in?return=" + encodeURIComponent(ret);
|
|
208
208
|
```
|
|
209
209
|
|
|
210
210
|
After successful sign-in (token / email-password / Google OAuth), the framework redirects to `return`. The path is validated as same-origin via the URL parser — open-redirect / header-injection inputs fall back to `/`.
|
|
@@ -230,7 +230,9 @@ will be rejected.
|
|
|
230
230
|
|
|
231
231
|
`AppProviders` applies `RequireSession` automatically on its private branch. It
|
|
232
232
|
resolves the session on the client and redirects signed-out visitors to
|
|
233
|
-
`/
|
|
233
|
+
`/sign-in?return=…` before mounting the routed shell. The legacy
|
|
234
|
+
`/_agent-native/sign-in` path remains supported for older generated apps and
|
|
235
|
+
bookmarks:
|
|
234
236
|
|
|
235
237
|
```tsx
|
|
236
238
|
import { AppProviders } from "@agent-native/core/client/hooks";
|
|
@@ -182,6 +182,55 @@ another visitor's shared CDN entry.
|
|
|
182
182
|
- **Virtualize** very long rendered lists on the client so off-screen rows aren't
|
|
183
183
|
parsed/rendered every update.
|
|
184
184
|
|
|
185
|
+
## 8. Don't do data work at startup
|
|
186
|
+
|
|
187
|
+
A server plugin's body is not "once per deploy." These apps run as serverless
|
|
188
|
+
functions, so it runs **once per cold start** — on the critical path of whichever
|
|
189
|
+
user's request woke the process, and again on the next cold start. An in-process
|
|
190
|
+
`let done = false` memo does not help: the new isolate starts with `false`.
|
|
191
|
+
|
|
192
|
+
This has already cost real outages and sustained slowness here, not hypothetical
|
|
193
|
+
ones — Slides startup slowness, Analytics paying startup cost on API calls, and a
|
|
194
|
+
production incident. The shape that did it:
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
// templates/<app>/server/plugins/db.ts — every cold start pays all of this
|
|
198
|
+
export default async (nitroApp) => {
|
|
199
|
+
await migrations(nitroApp);
|
|
200
|
+
await retypeBooleanColumnsOnPostgres(); // rewrites tables on Postgres
|
|
201
|
+
await backfillLegacyTables();
|
|
202
|
+
await syncWorkspacesToOrganizations();
|
|
203
|
+
await backfillRecordingOrgId();
|
|
204
|
+
};
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Schema DDL is **not** exempt, though it reads like it should be. Measured on a
|
|
208
|
+
180-table production database: the migration "fast path" (`SELECT MAX(version)`)
|
|
209
|
+
took **5.5s** and the `information_schema` probe **8.3s** — paid on every cold
|
|
210
|
+
start, until health checks timed out and the app was down. Bounded is not the
|
|
211
|
+
same as fast, and "it short-circuits cheaply" is an assumption until someone
|
|
212
|
+
measures it on the largest database you have.
|
|
213
|
+
|
|
214
|
+
The same applies doubly to **work whose cost grows with the data** — backfills, retypes, aggregations, recomputes, re-syncs,
|
|
215
|
+
sweeps, cache warming, index rebuilds. Those have three better homes, all of
|
|
216
|
+
which already exist:
|
|
217
|
+
|
|
218
|
+
- a **scheduled job** (`recurring-jobs`, `automations` skills),
|
|
219
|
+
- a **one-off CLI or release-time script**, run deliberately, once,
|
|
220
|
+
- **lazily behind the first caller that needs it**, memoized — accepting that
|
|
221
|
+
the memo is per-isolate, so the work must be small enough to repeat.
|
|
222
|
+
|
|
223
|
+
If it truly must complete before the app can serve a correct response, it is a
|
|
224
|
+
migration, not a backfill — say so on the line and keep it bounded:
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
await backfillOneRow(); // guard:allow-boot-data-work — single row, bounded
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`guard:no-boot-data-work` fails on new boot-time data work, scoped to lines this
|
|
231
|
+
branch adds. It cannot see everything — a helper that hides the work one call
|
|
232
|
+
deeper reads as innocent — so the rule matters more than the check.
|
|
233
|
+
|
|
185
234
|
## Checklist — run before shipping a list/read or a new table
|
|
186
235
|
|
|
187
236
|
- [ ] List selects only displayed columns; heavy blobs excluded or `substr`-truncated.
|
|
@@ -193,5 +242,7 @@ another visitor's shared CDN entry.
|
|
|
193
242
|
- [ ] Unbounded lists are paginated/windowed; large blobs aren't inlined on the hot path.
|
|
194
243
|
- [ ] SSR HTML/`.data` path stays session-blind and cacheable — no `private`,
|
|
195
244
|
`no-store`, `Vary: Cookie`, or auth branch added to it.
|
|
245
|
+
- [ ] No data work added to a server plugin body / module scope — backfills,
|
|
246
|
+
aggregations and re-syncs run on every cold start there (see §8).
|
|
196
247
|
- [ ] Mutation-fresh reads go through actions + `useActionQuery`, not SSR loader
|
|
197
248
|
data.
|