@agent-native/core 0.145.5 → 0.145.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +17 -1
- package/corpus/templates/analytics/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +22 -3
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/analytics/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/analytics/AGENTS.md +2 -1
- package/corpus/templates/analytics/actions/account-deep-dive.ts +83 -47
- package/corpus/templates/analytics/actions/create-dashboard-folder.ts +27 -0
- package/corpus/templates/analytics/actions/gong-calls.ts +3 -3
- package/corpus/templates/analytics/actions/list-dashboard-folders.ts +26 -0
- package/corpus/templates/analytics/actions/list-sql-dashboards.ts +1 -0
- package/corpus/templates/analytics/actions/set-dashboard-folder.ts +26 -0
- package/corpus/templates/analytics/app/components/ProviderCorpusJobNotifier.tsx +18 -3
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +6 -4
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +12 -2
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +35 -20
- package/corpus/templates/analytics/app/global.css +17 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +29 -15
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +15 -3
- package/corpus/templates/analytics/app/i18n-data.ts +296 -0
- package/corpus/templates/analytics/app/lib/prefetch-keys.ts +23 -2
- package/corpus/templates/analytics/app/pages/DashboardOverview.tsx +642 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +66 -31
- package/corpus/templates/analytics/app/root.tsx +4 -0
- package/corpus/templates/analytics/app/routes/dashboards._index.tsx +5 -1
- package/corpus/templates/analytics/changelog/2026-08-07-added-a-dashboards-overview-with-personal-and-shared-folders.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-07-analytics-no-longer-stalls-under-bursts-of-event-ingest-key-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-07-analytics-tracking-and-chat-startup-no-longer-emit-avoidable.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-07-dashboard-panels-now-load-custom-api-data-programs-reliably.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-07-gong-searches-conserve-api-quota-and-report-incomplete-coverage.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-07-searchable-dashboards-make-personal-and-shared-folders-easie.md +6 -0
- package/corpus/templates/analytics/netlify.toml +3 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +112 -0
- package/corpus/templates/analytics/server/db/index.ts +12 -0
- package/corpus/templates/analytics/server/db/schema.ts +14 -0
- package/corpus/templates/analytics/server/jobs/analytics-rollup-backfill.ts +4 -0
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +1 -0
- package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +85 -15
- package/corpus/templates/analytics/server/lib/dashboard-folders-store.ts +168 -0
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +9 -4
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +116 -1
- package/corpus/templates/analytics/server/lib/first-party-analytics-rollups.ts +4 -8
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +65 -10
- package/corpus/templates/analytics/server/lib/gong.ts +139 -78
- package/corpus/templates/analytics/server/lib/session-replay.ts +5 -5
- package/corpus/templates/analytics/server/plugins/db.ts +55 -15
- package/corpus/templates/analytics/server/plugins/session-replay-retention-jobs.ts +6 -2
- package/corpus/templates/analytics/server/routes/api/session-replay/retention.post.ts +65 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/assets/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/brain/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/calendar/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/calendar/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/chat/.env.example +3 -0
- package/corpus/templates/chat/AGENTS.md +4 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/clips/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/clips/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +4 -0
- package/corpus/templates/clips/actions/request-transcript.ts +52 -3
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +3 -10
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -0
- package/corpus/templates/clips/changelog/2026-08-07-screen-recordings-now-capture-tab-and-system-audio-even-when.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-07-transcription-now-retries-transient-cloud-failures-automatic.md +6 -0
- package/corpus/templates/clips/server/db/schema.ts +7 -0
- package/corpus/templates/clips/server/plugins/db.ts +8 -0
- package/corpus/templates/clips/shared/recording-capture.ts +38 -0
- package/corpus/templates/clips/shared/transcript-failure.ts +89 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/content/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/content/.env.example +9 -3
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -0
- package/corpus/templates/content/changelog/2026-08-07-collapsed-sidebar-utility-buttons-stay-anchored-at-the-botto.md +6 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/crm/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/design/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/design/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/dispatch/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/factory/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/factory/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/factory/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/factory/actions/babysit-agent-native-pull-request.ts +279 -0
- package/corpus/templates/factory/actions/get-factory-automation-health.ts +23 -4
- package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +1 -1
- package/corpus/templates/factory/app/routes/factory.tsx +21 -3
- package/corpus/templates/factory/changelog/2026-08-07-factory-can-keep-builder-bot-pull-requests-moving-by-request.md +6 -0
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +1 -0
- package/corpus/templates/factory/server/plugins/agent-chat.ts +4 -1
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +81 -12
- package/corpus/templates/factory/server/triage/github-client.ts +31 -0
- package/corpus/templates/factory/server/triage/pr-babysit.ts +75 -1
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/forms/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/forms/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/macros/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/mail/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/mail/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/plan/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -1
- package/corpus/templates/plan/changelog/2026-08-07-inline-help-icons-now-stay-visually-balanced-with-nearby-tex.md +6 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/slides/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/slides/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/slides/.env.example +5 -0
- package/corpus/templates/slides/changelog/2026-08-07-fixed-generated-slides-briefly-disappearing-while-they-are-b.md +6 -0
- package/corpus/templates/slides/server/plugins/collab.ts +20 -8
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +18 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/tasks/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/corpus/templates/tasks/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/corpus/templates/tasks/.env.example +3 -0
- package/dist/agent/production-agent.js +24 -3
- package/dist/client/AgentPanel.d.ts +6 -0
- package/dist/client/AgentPanel.js +176 -30
- package/dist/client/AssistantChat.d.ts +2 -0
- package/dist/client/AssistantChat.js +4 -1
- package/dist/client/ConnectBuilderCard.js +6 -11
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/RuntimeConfigNotice.d.ts +1 -0
- package/dist/client/RuntimeConfigNotice.js +94 -0
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat/index.js +1 -1
- package/dist/client/agent-chat-adapter.js +85 -4
- package/dist/client/agent-page/AgentTabsPage.js +1 -1
- package/dist/client/agent-sidebar-state.d.ts +6 -0
- package/dist/client/agent-sidebar-state.js +25 -0
- package/dist/client/app-providers.js +2 -1
- package/dist/client/assistant-ui-recovery.js +1 -1
- package/dist/client/chat/index.d.ts +1 -1
- package/dist/client/chat/index.js +1 -1
- package/dist/client/chat/markdown-renderer.d.ts +2 -1
- package/dist/client/chat/markdown-renderer.js +48 -2
- package/dist/client/chat/message-components.d.ts +6 -0
- package/dist/client/chat/message-components.js +182 -53
- package/dist/client/chat/tool-call-display.d.ts +16 -4
- package/dist/client/chat/tool-call-display.js +225 -18
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/frame-protocol.d.ts +4 -0
- package/dist/client/i18n.js +9 -0
- package/dist/client/integrations/IntegrationsPanel.js +2 -5
- package/dist/client/onboarding/FirstRunOnboarding.js +2 -3
- package/dist/client/org/TeamPage.js +49 -6
- package/dist/client/org/hooks.d.ts +7 -2
- package/dist/client/org/hooks.js +11 -4
- package/dist/client/resources/McpConnectionSuggestion.js +2 -3
- package/dist/client/resources/McpIntegrationDialog.js +2 -16
- package/dist/client/resources/McpIntegrationLogo.d.ts +11 -0
- package/dist/client/resources/McpIntegrationLogo.js +14 -0
- package/dist/client/resources/ResourceTree.js +1 -1
- package/dist/client/resources/mcp-integration-logos.d.ts +1 -0
- package/dist/client/resources/mcp-integration-logos.js +47 -18
- package/dist/client/settings/useBuilderStatus.js +6 -0
- package/dist/client/ui/index.d.ts +1 -0
- package/dist/client/ui/index.js +1 -0
- package/dist/client/use-db-sync.js +4 -0
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/config.d.ts +26 -3
- package/dist/config.js +106 -14
- package/dist/db/ddl-guard.d.ts +15 -2
- package/dist/db/ddl-guard.js +53 -5
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/jobs/scheduler.js +7 -0
- package/dist/localization/default-messages.d.ts +17 -0
- package/dist/localization/default-messages.js +17 -0
- package/dist/mcp/oauth-client-metadata.js +5 -1
- package/dist/mcp/oauth-route.d.ts +5 -4
- package/dist/mcp/oauth-route.js +25 -9
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +9 -10
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/handlers.d.ts +1 -0
- package/dist/org/handlers.js +17 -2
- package/dist/provider-api/actions/custom-provider-registration.d.ts +5 -5
- package/dist/provider-api/actions/provider-api.d.ts +7 -7
- package/dist/provider-api/corpus-jobs.d.ts +12 -2
- package/dist/provider-api/corpus-jobs.js +31 -1
- package/dist/provider-api/index.d.ts +2 -0
- package/dist/provider-api/index.js +7 -1
- package/dist/secrets/routes.d.ts +3 -3
- package/dist/server/agent-chat/recurring-jobs-runtime.d.ts +1 -1
- package/dist/server/agent-chat/recurring-jobs-runtime.js +14 -2
- package/dist/server/agent-chat/script-entries.js +12 -1
- package/dist/server/agent-chat-plugin.js +2 -2
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts +1 -0
- package/dist/server/auth.js +85 -1
- package/dist/server/better-auth-instance.d.ts +9 -0
- package/dist/server/better-auth-instance.js +25 -11
- package/dist/server/core-routes-plugin.d.ts +7 -0
- package/dist/server/core-routes-plugin.js +51 -5
- package/dist/server/create-server.js +23 -2
- package/dist/server/db-pressure.d.ts +38 -0
- package/dist/server/db-pressure.js +147 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/legacy-auth-migration.d.ts +10 -0
- package/dist/server/legacy-auth-migration.js +37 -0
- package/dist/server/onboarding-html.js +206 -2
- package/dist/server/poll.d.ts +26 -0
- package/dist/server/poll.js +108 -13
- package/dist/server/ssr-handler.js +4 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/runtime-config.d.ts +44 -0
- package/dist/shared/runtime-config.js +284 -0
- package/dist/styles/agent-native.css +48 -1
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +18 -0
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -0
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/dist/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/dist/templates/chat/.env.example +3 -0
- package/dist/templates/chat/AGENTS.md +4 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +18 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +1 -0
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/dist/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/dist/templates/default/AGENTS.md +6 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +6 -0
- package/dist/templates/default/app/i18n/de-DE.ts +6 -0
- package/dist/templates/default/app/i18n/en-US.ts +6 -0
- package/dist/templates/default/app/i18n/es-ES.ts +6 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +6 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +6 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +6 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +6 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +6 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +6 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +6 -0
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +18 -0
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/dist/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +18 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +8 -0
- package/dist/templates/workspace-core/AGENTS.md +7 -2
- package/dist/templates/workspace-root/AGENTS.md +5 -0
- package/dist/vite/client.d.ts +3 -3
- package/dist/vite/client.js +47 -1
- package/dist/vite/index.d.ts +1 -1
- package/docs/content/agent-native-config.mdx +240 -139
- package/docs/content/authentication.mdx +17 -0
- package/docs/content/deployment.mdx +19 -14
- package/docs/content/drop-in-agent.mdx +19 -2
- package/docs/content/environment-variables.mdx +63 -38
- package/docs/content/getting-started-actions.mdx +15 -6
- package/docs/content/getting-started-database.mdx +14 -10
- package/docs/content/getting-started-pages.mdx +32 -35
- package/docs/content/getting-started.mdx +7 -6
- package/package.json +1 -1
- package/src/templates/chat/.agents/skills/actions/SKILL.md +18 -0
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -0
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/src/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/src/templates/chat/.env.example +3 -0
- package/src/templates/chat/AGENTS.md +4 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +18 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -0
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/src/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/src/templates/default/AGENTS.md +6 -1
- package/src/templates/default/app/i18n/ar-SA.ts +6 -0
- package/src/templates/default/app/i18n/de-DE.ts +6 -0
- package/src/templates/default/app/i18n/en-US.ts +6 -0
- package/src/templates/default/app/i18n/es-ES.ts +6 -0
- package/src/templates/default/app/i18n/fr-FR.ts +6 -0
- package/src/templates/default/app/i18n/hi-IN.ts +6 -0
- package/src/templates/default/app/i18n/ja-JP.ts +6 -0
- package/src/templates/default/app/i18n/ko-KR.ts +6 -0
- package/src/templates/default/app/i18n/pt-BR.ts +6 -0
- package/src/templates/default/app/i18n/zh-CN.ts +6 -0
- package/src/templates/default/app/i18n/zh-TW.ts +6 -0
- package/src/templates/headless/.agents/skills/actions/SKILL.md +18 -0
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/src/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +18 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +45 -47
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +76 -23
- package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +8 -0
- package/src/templates/workspace-core/AGENTS.md +7 -2
- package/src/templates/workspace-root/AGENTS.md +5 -0
- package/corpus/templates/dispatch/app/routes/admin.apps.$appId.tsx +0 -1
- package/corpus/templates/dispatch/app/routes/admin.apps.tsx +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: turn-into-app
|
|
3
3
|
description: >-
|
|
4
|
-
Turn a proven thread, skill, or workflow into a
|
|
5
|
-
with simple buttons, visible agent steps, preview,
|
|
6
|
-
Use when a user invokes `/turn-into-app` or asks to
|
|
7
|
-
app.
|
|
4
|
+
Turn visible project context, a proven thread, skill, or workflow into a
|
|
5
|
+
runnable Agent-Native app with simple buttons, visible agent steps, preview,
|
|
6
|
+
and deployment handoff. Use when a user invokes `/turn-into-app` or asks to
|
|
7
|
+
make a workflow into an app.
|
|
8
8
|
user-invocable: true
|
|
9
9
|
scope: both
|
|
10
10
|
metadata:
|
|
@@ -17,34 +17,72 @@ metadata:
|
|
|
17
17
|
|
|
18
18
|
This is an end-to-end build skill, not a request for an app proposal.
|
|
19
19
|
|
|
20
|
-
- With no argument,
|
|
21
|
-
|
|
20
|
+
- With no argument, choose the source in this order: visible project context,
|
|
21
|
+
then the current thread. A fresh Claude or ChatGPT Project is a valid source
|
|
22
|
+
on its first turn. Treat its visible project instructions, knowledge files,
|
|
23
|
+
and supplied past runs as the source; a completed thread is not required.
|
|
24
|
+
Treat the current turn as a request or configuration unless it contains a
|
|
25
|
+
concrete repeatable workflow.
|
|
22
26
|
- With a named skill or local workflow, read that source and package it
|
|
23
27
|
immediately, even at the beginning of a thread. For example,
|
|
24
28
|
`/turn-into-app /some-skill` means “turn `/some-skill` into an app.”
|
|
25
29
|
- With an attachment or path, read the supplied artifact as the source.
|
|
26
30
|
- Do not ask the user to restate context that is already in the thread.
|
|
27
|
-
- When invoked from an Agent-Native app,
|
|
28
|
-
and use the available workspace/coding-agent
|
|
29
|
-
cannot edit files. Do not claim the app
|
|
30
|
-
verification result.
|
|
31
|
+
- When invoked from an Agent-Native app, use its visible project context first,
|
|
32
|
+
then the current thread, and use the available workspace/coding-agent
|
|
33
|
+
handoff when the current runtime cannot edit files. Do not claim the app
|
|
34
|
+
exists without an actual path and verification result.
|
|
31
35
|
|
|
32
36
|
## Source support
|
|
33
37
|
|
|
34
|
-
Supported source paths today are
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
Supported source paths today are visible Claude or ChatGPT Project context, the
|
|
39
|
+
current Codex or host thread, a named skill, or a local workflow/transcript
|
|
40
|
+
supplied as a path or attachment. An exported ChatGPT or Claude transcript can
|
|
41
|
+
use the same local-file path today.
|
|
37
42
|
|
|
38
|
-
ChatGPT
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
Claude and ChatGPT Project context is supported only when the host supplies it
|
|
44
|
+
to the model in the current context. The MCP connector does not read hidden
|
|
45
|
+
project chats, private URLs, account settings, or credentials. Do not claim
|
|
46
|
+
private web access, invent an importer, add fake OAuth, or scrape a logged-in
|
|
47
|
+
page. If the needed context is not visible, ask for an export, transcript, or
|
|
48
|
+
attachment and treat that artifact as imported source material.
|
|
43
49
|
|
|
44
50
|
Deliver a fresh app in a new directory, implement the repeatable workflow with
|
|
45
51
|
buttons and agent handoffs, start its dev server, verify the main path, and
|
|
46
52
|
continue through build/deployment handoff. Do not stop at a plan.
|
|
47
53
|
|
|
54
|
+
## Fresh project context mode
|
|
55
|
+
|
|
56
|
+
When the source is a fresh Claude or ChatGPT Project, build a short source brief
|
|
57
|
+
before creating the app. Read the host-provided context in this order:
|
|
58
|
+
|
|
59
|
+
1. Project instructions and configuration: goal, audience, constraints, output
|
|
60
|
+
standards, approved tools, and integration expectations. Treat these as
|
|
61
|
+
product configuration, not as a transcript.
|
|
62
|
+
2. Knowledge files and attachments: read the relevant files fully, preserve
|
|
63
|
+
their provenance, and reduce them to bounded references, IDs, URLs, or
|
|
64
|
+
summaries for the new app. Do not copy secrets or large raw payloads into
|
|
65
|
+
prompts or SQL.
|
|
66
|
+
3. Past runs or examples that are actually visible in the context: select at
|
|
67
|
+
most 1-3 successful, representative runs. Extract repeatable decisions and
|
|
68
|
+
review criteria. Treat one-off answers and private data as examples, not as
|
|
69
|
+
product behavior. If no runs are supplied, proceed from the instructions
|
|
70
|
+
and knowledge files and say that examples were not available.
|
|
71
|
+
4. The current turn: use it for the requested app boundary, target workspace,
|
|
72
|
+
naming, and any explicit corrections.
|
|
73
|
+
|
|
74
|
+
Record the brief with these headings before handoff: source and provenance,
|
|
75
|
+
project goal, configuration and constraints, knowledge sources, repeatable
|
|
76
|
+
workflow, inputs and outputs, judgment and review points, representative runs,
|
|
77
|
+
integrations and permissions, and unknowns. This is the compact contract for
|
|
78
|
+
the app. It keeps the new app useful without pretending that hidden Project
|
|
79
|
+
history was imported. See [the fresh Project reference](references/fresh-project.md)
|
|
80
|
+
for the host setup and brief template.
|
|
81
|
+
|
|
82
|
+
If the visible Project context has no concrete repeatable job, ask for one
|
|
83
|
+
focused clarification or a representative artifact. Do not fall back to a
|
|
84
|
+
generic “what app do you want to make?” builder.
|
|
85
|
+
|
|
48
86
|
## Source selection guard
|
|
49
87
|
|
|
50
88
|
The generated app must implement the concrete workflow found in the source. It
|
|
@@ -151,6 +189,14 @@ pnpm exec agent-native add-app <slug> --template=chat
|
|
|
151
189
|
Do not use `create` for an existing workspace; it scaffolds a new standalone
|
|
152
190
|
workspace rather than adding an app to the current one.
|
|
153
191
|
|
|
192
|
+
When the source came from a fresh external Project and the target is a Builder
|
|
193
|
+
workspace, prefer the available Dispatch MCP workspace handoff after writing
|
|
194
|
+
the source brief. Call `start-workspace-app-creation` with a concise prompt,
|
|
195
|
+
the inferred app id, and the brief's repeatable workflow. Pass selected
|
|
196
|
+
workspace resource IDs when they are available, rather than pasting entire
|
|
197
|
+
knowledge files. Continue from the returned workspace path or Builder handoff
|
|
198
|
+
and report the actual verification result.
|
|
199
|
+
|
|
154
200
|
Use a first-party template only when it materially fits the workflow. Keep the
|
|
155
201
|
new app independent from the source thread's working tree unless the user
|
|
156
202
|
explicitly asks to extend an existing app.
|
|
@@ -167,13 +213,20 @@ should make the repeated path obvious without hiding the agent's judgment:
|
|
|
167
213
|
- Give each important repeated moment a clear button, such as “Analyze,”
|
|
168
214
|
“Suggest options,” “Draft,” “Review,” or “Publish.” Use the source's actual
|
|
169
215
|
vocabulary when it is clear.
|
|
170
|
-
- Put deterministic reads, writes, approvals, and publishing
|
|
171
|
-
with `defineAction`. The UI and agent must call the
|
|
216
|
+
- Put deterministic reads, writes, approvals, provider fetches, and publishing
|
|
217
|
+
in focused `actions/` with `defineAction`. The UI and agent must call the
|
|
218
|
+
same action surface.
|
|
219
|
+
- If a workflow is framed as research, analysis, generation, recommendation,
|
|
220
|
+
or synthesis, start it in the AgentSidebar and let the agent orchestrate
|
|
221
|
+
those actions. Do not hide an AI-shaped multi-step workflow behind one
|
|
222
|
+
opaque action just because the implementation is deterministic.
|
|
172
223
|
- Use application state for the current screen, selected item, and focused
|
|
173
224
|
object so the agent can see where the user is.
|
|
174
|
-
- Use `sendToAgentChat({ message, context, submit: true })`
|
|
175
|
-
button-triggered agent work. Use `submit: false` when the
|
|
176
|
-
or edit the proposed prompt first.
|
|
225
|
+
- Use `sendToAgentChat({ message, context, submit: true, openSidebar: true })`
|
|
226
|
+
for intentional button-triggered agent work. Use `submit: false` when the
|
|
227
|
+
user should review or edit the proposed prompt in the AgentSidebar first.
|
|
228
|
+
Keep follow-up and revision prompts in that same thread; do not add a second
|
|
229
|
+
freeform textbox beside the result.
|
|
177
230
|
- Pass IDs, URLs, and bounded summaries in context. Do not paste large provider
|
|
178
231
|
dumps into prompts, call an LLM directly from the browser, or invent fake
|
|
179
232
|
progress.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "Turn Into App"
|
|
3
|
-
short_description: "Turn
|
|
4
|
-
default_prompt: "
|
|
3
|
+
short_description: "Turn project context or a workflow into a runnable app"
|
|
4
|
+
default_prompt: "Use the visible project context first, then any supplied workflow. Turn the instructions, knowledge files, and selected successful runs into a new Agent-Native app with clear buttons, run it locally, verify it, and complete the deployment handoff."
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Fresh Project source guide
|
|
2
|
+
|
|
3
|
+
Use this guide when `/turn-into-app` is invoked in a new Claude or ChatGPT
|
|
4
|
+
Project rather than after a completed thread.
|
|
5
|
+
|
|
6
|
+
## What the host can provide
|
|
7
|
+
|
|
8
|
+
The source is whatever the host put in the model's current context:
|
|
9
|
+
|
|
10
|
+
- Project instructions: the job, audience, constraints, quality bar, and
|
|
11
|
+
approved tools or integrations.
|
|
12
|
+
- Knowledge files and attachments: reference material, templates, examples,
|
|
13
|
+
and links that the app should use.
|
|
14
|
+
- Past runs: only conversations or outputs the host actually supplied. They
|
|
15
|
+
are examples and evaluation material, not an automatic import of every
|
|
16
|
+
private Project conversation.
|
|
17
|
+
- The current request: the app boundary, target workspace, name, and explicit
|
|
18
|
+
corrections.
|
|
19
|
+
|
|
20
|
+
Do not infer hidden system prompts, account settings, private history, API keys,
|
|
21
|
+
or credentials. The Dispatch MCP connector can start a workspace app creation,
|
|
22
|
+
but it cannot unlock or scrape private Project content.
|
|
23
|
+
|
|
24
|
+
## Source brief
|
|
25
|
+
|
|
26
|
+
Write a compact brief before starting the app:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
Source: host-provided Claude/ChatGPT Project context
|
|
30
|
+
Provenance: project instructions, selected knowledge files, and visible runs
|
|
31
|
+
Project goal:
|
|
32
|
+
Configuration and constraints:
|
|
33
|
+
Knowledge sources:
|
|
34
|
+
Repeatable workflow:
|
|
35
|
+
Inputs and outputs:
|
|
36
|
+
Judgment and review points:
|
|
37
|
+
Representative runs: none, or 1-3 selected examples
|
|
38
|
+
Integrations and permissions:
|
|
39
|
+
Unknowns and follow-up:
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Keep source references bounded. Prefer a file name, URL, resource ID, or short
|
|
43
|
+
summary over a large pasted document. Do not put secrets or raw customer data
|
|
44
|
+
in the brief.
|
|
45
|
+
|
|
46
|
+
## Fresh-box setup
|
|
47
|
+
|
|
48
|
+
Install the exported `turn-into-app` skill in the host when the host supports
|
|
49
|
+
skills. For a ChatGPT Project or any host that exposes only the MCP connector,
|
|
50
|
+
also place the skill instructions or this reference in the Project
|
|
51
|
+
instructions/knowledge files. Then add and authenticate the Dispatch MCP
|
|
52
|
+
connector from the packaged `adapters/chatgpt-mcp/connector.json`.
|
|
53
|
+
|
|
54
|
+
In a new Project chat, say:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
Turn this project into an app. Use the visible Project instructions,
|
|
58
|
+
knowledge files, and any selected successful runs as the source. Create the
|
|
59
|
+
app in the connected Agent-Native workspace, keep the source brief bounded,
|
|
60
|
+
and report the real path and verification result.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
If the host does not show the Project instructions or files to the model, stop
|
|
64
|
+
and request an export or attachment. Do not claim that the Project was read.
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core/action";
|
|
2
|
+
import { and, eq } from "drizzle-orm";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
5
|
+
import { resolveConnectorSecret } from "../server/connectors/credentials.js";
|
|
6
|
+
import { getDb } from "../server/db/index.js";
|
|
7
|
+
import { triageConfig, triageItems } from "../server/db/schema.js";
|
|
8
|
+
import { requireFactoryAutomation } from "../server/lib/require-factory-automation.js";
|
|
9
|
+
import {
|
|
10
|
+
requireWorkspaceMember,
|
|
11
|
+
workspaceMemberIdentityFromContext,
|
|
12
|
+
} from "../server/lib/require-workspace-member.js";
|
|
13
|
+
import { createAiServicesGitReadClient } from "../server/triage/ai-services-git.js";
|
|
14
|
+
import { createGitHubClient } from "../server/triage/github-client.js";
|
|
15
|
+
import {
|
|
16
|
+
metadataString,
|
|
17
|
+
parseTriageMetadata,
|
|
18
|
+
serializeTriageMetadata,
|
|
19
|
+
} from "../server/triage/metadata.js";
|
|
20
|
+
import {
|
|
21
|
+
babysitFingerprint,
|
|
22
|
+
DEFAULT_BABYSIT_BOT_AUTHORS,
|
|
23
|
+
reconcileBabysitState,
|
|
24
|
+
shouldBabysitBuilderBotPullRequest,
|
|
25
|
+
} from "../server/triage/pr-babysit.js";
|
|
26
|
+
import { detectOwnerOwnedArea } from "../server/triage/pr-policy.js";
|
|
27
|
+
|
|
28
|
+
const QUIET_PERIOD_MS = 20 * 60_000;
|
|
29
|
+
const MIN_COMMENT_INTERVAL_MS = 90_000;
|
|
30
|
+
const BUILDER_BOT_REQUEST =
|
|
31
|
+
"@builderio-bot look at latest PR feedback and fix anything you agree with. Be skeptical. Reply to every comment (directly on the comment thread of each comment) if you fixed it or not and why. then check back every 2 minutes on a loop and see if any new feedback posted, until at least 20 minutes go by without any new feedback posted we want to address, including making sure CI passes too and no merge conflicts (make sure code is mergeable)";
|
|
32
|
+
|
|
33
|
+
function requiredAiServicesEnv(
|
|
34
|
+
name: "BUILDER_AI_SERVICES_URL" | "BUILDER_PROJECT_ID",
|
|
35
|
+
): string {
|
|
36
|
+
const value =
|
|
37
|
+
name === "BUILDER_AI_SERVICES_URL"
|
|
38
|
+
? process.env.BUILDER_AI_SERVICES_URL // guard:allow-env-credential - non-secret deployment endpoint
|
|
39
|
+
: process.env.BUILDER_PROJECT_ID; // guard:allow-env-credential - non-secret deployment project id
|
|
40
|
+
if (!value) throw new Error(`${name} is required for PR babysitting.`);
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function parseTimestamp(value: string | undefined): number | null {
|
|
45
|
+
if (!value) return null;
|
|
46
|
+
const parsed = Date.parse(value);
|
|
47
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function repositoryRef(value: string): { owner: string; repo: string } {
|
|
51
|
+
const match = /^([^/\s]+)\/([^/\s]+)$/.exec(value.trim());
|
|
52
|
+
if (!match)
|
|
53
|
+
throw new Error("Repository must use the owner/repository format.");
|
|
54
|
+
return { owner: match[1], repo: match[2] };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function updateBabysitMetadata(
|
|
58
|
+
itemId: string,
|
|
59
|
+
orgId: string,
|
|
60
|
+
patch: Record<string, unknown>,
|
|
61
|
+
): Promise<void> {
|
|
62
|
+
const db = getDb();
|
|
63
|
+
const item = (
|
|
64
|
+
await db
|
|
65
|
+
.select({ metadataJson: triageItems.metadataJson })
|
|
66
|
+
.from(triageItems)
|
|
67
|
+
.where(and(eq(triageItems.id, itemId), eq(triageItems.orgId, orgId)))
|
|
68
|
+
.limit(1)
|
|
69
|
+
)[0];
|
|
70
|
+
if (!item) throw new Error("Factory item disappeared during PR babysitting.");
|
|
71
|
+
const metadata = parseTriageMetadata(item.metadataJson);
|
|
72
|
+
Object.assign(metadata, patch);
|
|
73
|
+
await db
|
|
74
|
+
.update(triageItems)
|
|
75
|
+
.set({
|
|
76
|
+
metadataJson: serializeTriageMetadata(metadata),
|
|
77
|
+
updatedAt: new Date().toISOString(),
|
|
78
|
+
})
|
|
79
|
+
.where(and(eq(triageItems.id, itemId), eq(triageItems.orgId, orgId)));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default defineAction({
|
|
83
|
+
description:
|
|
84
|
+
"Watch one builder-io-bot pull request, post the bounded feedback-fix request when CI, mergeability, or review feedback needs work, and stop after 20 quiet minutes. The action never merges or approves.",
|
|
85
|
+
schema: z.object({
|
|
86
|
+
itemId: z.string().min(1),
|
|
87
|
+
}),
|
|
88
|
+
http: false,
|
|
89
|
+
run: async ({ itemId }, context) => {
|
|
90
|
+
const { userEmail, orgId } = await requireWorkspaceMember(
|
|
91
|
+
workspaceMemberIdentityFromContext(context),
|
|
92
|
+
);
|
|
93
|
+
await requireFactoryAutomation(context, { userEmail, orgId }, "prBabysit");
|
|
94
|
+
|
|
95
|
+
const db = getDb();
|
|
96
|
+
const item = (
|
|
97
|
+
await db
|
|
98
|
+
.select()
|
|
99
|
+
.from(triageItems)
|
|
100
|
+
.where(and(eq(triageItems.id, itemId), eq(triageItems.orgId, orgId)))
|
|
101
|
+
.limit(1)
|
|
102
|
+
)[0];
|
|
103
|
+
if (!item) throw new Error("Factory item not found for PR babysitting.");
|
|
104
|
+
if (
|
|
105
|
+
item.source !== "github" ||
|
|
106
|
+
!item.repository ||
|
|
107
|
+
!item.pullRequestNumber
|
|
108
|
+
) {
|
|
109
|
+
return {
|
|
110
|
+
ok: true,
|
|
111
|
+
action: "skipped",
|
|
112
|
+
reason: "Item is not a pull request.",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const configuredRepository = (
|
|
117
|
+
await db
|
|
118
|
+
.select({ repository: triageConfig.repository })
|
|
119
|
+
.from(triageConfig)
|
|
120
|
+
.where(and(eq(triageConfig.id, orgId), eq(triageConfig.orgId, orgId)))
|
|
121
|
+
.limit(1)
|
|
122
|
+
)[0]?.repository;
|
|
123
|
+
if (
|
|
124
|
+
!configuredRepository ||
|
|
125
|
+
configuredRepository.trim() !== item.repository.trim()
|
|
126
|
+
) {
|
|
127
|
+
throw new Error(
|
|
128
|
+
"PR babysitting is restricted to the configured Factory repository.",
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const repository = repositoryRef(item.repository);
|
|
133
|
+
const github = createGitHubClient({ ownerEmail: userEmail, orgId });
|
|
134
|
+
const pullRequest = await github.getPullRequestSummary(
|
|
135
|
+
repository,
|
|
136
|
+
item.pullRequestNumber,
|
|
137
|
+
);
|
|
138
|
+
if (pullRequest.state !== "open" || pullRequest.draft) {
|
|
139
|
+
await updateBabysitMetadata(itemId, orgId, {
|
|
140
|
+
prBabysitState: "closed-or-draft",
|
|
141
|
+
prBabysitLastCheckedAt: new Date().toISOString(),
|
|
142
|
+
});
|
|
143
|
+
return { ok: true, action: "skipped", reason: "PR is closed or draft." };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const ownerOwnedArea = detectOwnerOwnedArea([
|
|
147
|
+
item.repository,
|
|
148
|
+
pullRequest.title,
|
|
149
|
+
pullRequest.body,
|
|
150
|
+
]);
|
|
151
|
+
if (ownerOwnedArea) {
|
|
152
|
+
await updateBabysitMetadata(itemId, orgId, {
|
|
153
|
+
prBabysitState: "owner-managed",
|
|
154
|
+
prBabysitOwnerArea: ownerOwnedArea,
|
|
155
|
+
prBabysitLastCheckedAt: new Date().toISOString(),
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
ok: true,
|
|
159
|
+
action: "skipped",
|
|
160
|
+
reason: `${ownerOwnedArea} is owner-managed.`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const privateKey = await resolveConnectorSecret(
|
|
165
|
+
"BUILDER_PRIVATE_KEY",
|
|
166
|
+
userEmail,
|
|
167
|
+
{ orgId },
|
|
168
|
+
);
|
|
169
|
+
if (!privateKey) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
"BUILDER_PRIVATE_KEY is required to read PR feedback for babysitting.",
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const snapshot = await createAiServicesGitReadClient({
|
|
175
|
+
baseUrl: requiredAiServicesEnv("BUILDER_AI_SERVICES_URL"),
|
|
176
|
+
authorization: `Bearer ${privateKey.startsWith("bpk-") ? privateKey : `bpk-${privateKey}`}`,
|
|
177
|
+
}).fetchPullRequest({
|
|
178
|
+
projectId: requiredAiServicesEnv("BUILDER_PROJECT_ID"),
|
|
179
|
+
repo: item.repository,
|
|
180
|
+
pullRequestNumber: item.pullRequestNumber,
|
|
181
|
+
});
|
|
182
|
+
if (snapshot.headSha !== pullRequest.headSha) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
`PR evidence is stale: GitHub reports ${pullRequest.headSha}, ai-services reports ${snapshot.headSha}.`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const proposal = reconcileBabysitState({
|
|
189
|
+
comments: snapshot.comments,
|
|
190
|
+
checks: snapshot.checks,
|
|
191
|
+
commentsTruncated: snapshot.commentsTruncated,
|
|
192
|
+
botAuthors: [...DEFAULT_BABYSIT_BOT_AUTHORS],
|
|
193
|
+
});
|
|
194
|
+
const unresolvedReviewState = snapshot.reviews.some(
|
|
195
|
+
(review) =>
|
|
196
|
+
review.state === "changes_requested" || review.state === "pending",
|
|
197
|
+
);
|
|
198
|
+
const signal = {
|
|
199
|
+
...proposal,
|
|
200
|
+
isClean: proposal.isClean && !unresolvedReviewState,
|
|
201
|
+
};
|
|
202
|
+
const needsBabysit = shouldBabysitBuilderBotPullRequest({
|
|
203
|
+
author: pullRequest.userLogin,
|
|
204
|
+
mergeable: pullRequest.mergeable,
|
|
205
|
+
mergeableState: pullRequest.mergeableState,
|
|
206
|
+
snapshot: signal,
|
|
207
|
+
});
|
|
208
|
+
const now = new Date();
|
|
209
|
+
const nowIso = now.toISOString();
|
|
210
|
+
const metadata = parseTriageMetadata(item.metadataJson);
|
|
211
|
+
const fingerprint = babysitFingerprint({
|
|
212
|
+
headSha: snapshot.headSha,
|
|
213
|
+
mergeable: pullRequest.mergeable,
|
|
214
|
+
mergeableState: pullRequest.mergeableState,
|
|
215
|
+
snapshot: signal,
|
|
216
|
+
reviewStates: snapshot.reviews.map((review) => review.state),
|
|
217
|
+
});
|
|
218
|
+
const previousFingerprint = metadataString(
|
|
219
|
+
metadata,
|
|
220
|
+
"prBabysitFingerprint",
|
|
221
|
+
);
|
|
222
|
+
const previousState = metadataString(metadata, "prBabysitState");
|
|
223
|
+
if (!needsBabysit) {
|
|
224
|
+
await updateBabysitMetadata(itemId, orgId, {
|
|
225
|
+
prBabysitState: "clean",
|
|
226
|
+
prBabysitLastCheckedAt: nowIso,
|
|
227
|
+
prBabysitFingerprint: fingerprint,
|
|
228
|
+
});
|
|
229
|
+
return { ok: true, action: "clean" };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const quietSince =
|
|
233
|
+
previousFingerprint === fingerprint && previousState !== "clean"
|
|
234
|
+
? (parseTimestamp(metadataString(metadata, "prBabysitQuietSinceAt")) ??
|
|
235
|
+
now.getTime())
|
|
236
|
+
: now.getTime();
|
|
237
|
+
const lastCommentAt = parseTimestamp(
|
|
238
|
+
metadataString(metadata, "prBabysitLastCommentAt"),
|
|
239
|
+
);
|
|
240
|
+
const quietForMs = now.getTime() - quietSince;
|
|
241
|
+
const shouldPost =
|
|
242
|
+
previousFingerprint !== fingerprint &&
|
|
243
|
+
(lastCommentAt === null ||
|
|
244
|
+
now.getTime() - lastCommentAt >= MIN_COMMENT_INTERVAL_MS);
|
|
245
|
+
if (!shouldPost || quietForMs >= QUIET_PERIOD_MS) {
|
|
246
|
+
await updateBabysitMetadata(itemId, orgId, {
|
|
247
|
+
prBabysitState: quietForMs >= QUIET_PERIOD_MS ? "quiet" : "waiting",
|
|
248
|
+
prBabysitFingerprint: fingerprint,
|
|
249
|
+
prBabysitQuietSinceAt: new Date(quietSince).toISOString(),
|
|
250
|
+
prBabysitLastCheckedAt: nowIso,
|
|
251
|
+
});
|
|
252
|
+
return {
|
|
253
|
+
ok: true,
|
|
254
|
+
action: quietForMs >= QUIET_PERIOD_MS ? "quiet" : "waiting",
|
|
255
|
+
quietForMinutes: Math.floor(Math.max(0, quietForMs) / 60_000),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const comment = await github.createIssueComment(
|
|
260
|
+
repository,
|
|
261
|
+
item.pullRequestNumber,
|
|
262
|
+
BUILDER_BOT_REQUEST,
|
|
263
|
+
);
|
|
264
|
+
await updateBabysitMetadata(itemId, orgId, {
|
|
265
|
+
prBabysitState: "active",
|
|
266
|
+
prBabysitFingerprint: fingerprint,
|
|
267
|
+
prBabysitQuietSinceAt: new Date(quietSince).toISOString(),
|
|
268
|
+
prBabysitLastCheckedAt: nowIso,
|
|
269
|
+
prBabysitLastCommentAt: nowIso,
|
|
270
|
+
prBabysitLastCommentUrl: comment.htmlUrl,
|
|
271
|
+
});
|
|
272
|
+
return {
|
|
273
|
+
ok: true,
|
|
274
|
+
action: "commented",
|
|
275
|
+
commentUrl: comment.htmlUrl,
|
|
276
|
+
quietForMinutes: Math.floor(Math.max(0, quietForMs) / 60_000),
|
|
277
|
+
};
|
|
278
|
+
},
|
|
279
|
+
});
|
|
@@ -19,10 +19,27 @@ export default defineAction({
|
|
|
19
19
|
const { orgId } = await requireWorkspaceMember(
|
|
20
20
|
workspaceMemberIdentityFromContext(context),
|
|
21
21
|
);
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
const [organizationHealth, globalHealth] = await Promise.all([
|
|
23
|
+
getAutomationSchedulerHealth({
|
|
24
|
+
appId: "factory",
|
|
25
|
+
orgId,
|
|
26
|
+
}),
|
|
27
|
+
getAutomationSchedulerHealth({ appId: "factory", orgId: null }),
|
|
28
|
+
]);
|
|
29
|
+
const health =
|
|
30
|
+
[organizationHealth, globalHealth]
|
|
31
|
+
.filter(
|
|
32
|
+
(candidate): candidate is NonNullable<typeof candidate> =>
|
|
33
|
+
candidate !== null && candidate.lastCheckedAt !== null,
|
|
34
|
+
)
|
|
35
|
+
.sort(
|
|
36
|
+
(left, right) =>
|
|
37
|
+
(right.lastCheckedAt ?? 0) - (left.lastCheckedAt ?? 0),
|
|
38
|
+
)[0] ??
|
|
39
|
+
organizationHealth ??
|
|
40
|
+
globalHealth;
|
|
41
|
+
const healthScope =
|
|
42
|
+
health?.orgId === orgId ? ("organization" as const) : ("global" as const);
|
|
26
43
|
if (!health?.lastCheckedAt) {
|
|
27
44
|
return {
|
|
28
45
|
status: "no-data" as const,
|
|
@@ -30,6 +47,7 @@ export default defineAction({
|
|
|
30
47
|
lastDispatchedAt: health?.lastDispatchedAt ?? null,
|
|
31
48
|
lastError: health?.lastError ?? null,
|
|
32
49
|
runtime: health?.runtime ?? null,
|
|
50
|
+
scope: healthScope,
|
|
33
51
|
staleAfterMs: STALE_AFTER_MS,
|
|
34
52
|
};
|
|
35
53
|
}
|
|
@@ -44,6 +62,7 @@ export default defineAction({
|
|
|
44
62
|
lastDispatchedAt: health.lastDispatchedAt,
|
|
45
63
|
lastError: health.lastError,
|
|
46
64
|
runtime: health.runtime,
|
|
65
|
+
scope: healthScope,
|
|
47
66
|
staleAfterMs: STALE_AFTER_MS,
|
|
48
67
|
};
|
|
49
68
|
},
|
|
@@ -258,7 +258,10 @@ export default function FactoryRoute() {
|
|
|
258
258
|
|
|
259
259
|
function updateGraph(next: FactoryCanvasGraph) {
|
|
260
260
|
setDraftGraph(next);
|
|
261
|
-
setDirty(
|
|
261
|
+
setDirty(
|
|
262
|
+
!graphData?.graph ||
|
|
263
|
+
JSON.stringify(next) !== JSON.stringify(graphData.graph),
|
|
264
|
+
);
|
|
262
265
|
}
|
|
263
266
|
|
|
264
267
|
function addNode() {
|
|
@@ -645,14 +648,29 @@ function AutomationsView({
|
|
|
645
648
|
|
|
646
649
|
useEffect(() => {
|
|
647
650
|
if (!selected) {
|
|
648
|
-
setDraft(null);
|
|
651
|
+
setDraft((current) => (current === null ? current : null));
|
|
649
652
|
return;
|
|
650
653
|
}
|
|
651
654
|
if (selected.id !== selectedId) {
|
|
652
655
|
selectAutomation(selected.id);
|
|
653
656
|
return;
|
|
654
657
|
}
|
|
655
|
-
|
|
658
|
+
const nextDraft = draftForAutomation(selected);
|
|
659
|
+
setDraft((current) => {
|
|
660
|
+
if (
|
|
661
|
+
current &&
|
|
662
|
+
current.id === nextDraft.id &&
|
|
663
|
+
current.name === nextDraft.name &&
|
|
664
|
+
current.prompt === nextDraft.prompt &&
|
|
665
|
+
current.body === nextDraft.body &&
|
|
666
|
+
current.model === nextDraft.model &&
|
|
667
|
+
current.schedule === nextDraft.schedule &&
|
|
668
|
+
current.enabled === nextDraft.enabled
|
|
669
|
+
) {
|
|
670
|
+
return current;
|
|
671
|
+
}
|
|
672
|
+
return nextDraft;
|
|
673
|
+
});
|
|
656
674
|
}, [selected, selectedId]);
|
|
657
675
|
|
|
658
676
|
async function saveAutomation() {
|
|
@@ -24,6 +24,7 @@ const INITIAL_TOOL_NAMES = [
|
|
|
24
24
|
"start-builder-for-item",
|
|
25
25
|
"govern-agent-native-pull-request",
|
|
26
26
|
"babysit-pull-request",
|
|
27
|
+
"babysit-agent-native-pull-request",
|
|
27
28
|
"approve-factory-item",
|
|
28
29
|
"list-triage-rules",
|
|
29
30
|
"get-triage-config",
|
|
@@ -70,7 +71,9 @@ BuilderIO author, a clear bug, passing CI, and handled review feedback. Auto-mer
|
|
|
70
71
|
also requires a verified Factory Builder run. When a user says to do a review-gated
|
|
71
72
|
item now, use the explicit approval action, which records the approver and applies
|
|
72
73
|
the rule's configured executor policy. Keep Slack replies concise and link to the
|
|
73
|
-
Factory item when a review is needed
|
|
74
|
+
Factory item when a review is needed. The scheduled builder-io-bot PR babysitter
|
|
75
|
+
posts its exact feedback-fix request through GitHub, persists a 20-minute quiet
|
|
76
|
+
window, and never approves or merges.`,
|
|
74
77
|
} satisfies AgentChatPluginOptions;
|
|
75
78
|
|
|
76
79
|
export default createAgentChatPlugin(options);
|