@agent-native/core 0.107.2 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +24 -0
- package/corpus/core/docs/content/actions.mdx +48 -0
- package/corpus/core/docs/content/locales/ar-SA/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/de-DE/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/es-ES/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/fr-FR/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/hi-IN/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/ja-JP/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/ko-KR/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/pt-BR/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/zh-CN/actions.mdx +38 -0
- package/corpus/core/docs/content/locales/zh-TW/actions.mdx +38 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/a2a/client.ts +140 -17
- package/corpus/core/src/a2a/handlers.ts +60 -0
- package/corpus/core/src/a2a/index.ts +6 -1
- package/corpus/core/src/a2a/invoke.ts +68 -1
- package/corpus/core/src/a2a/server.ts +13 -1
- package/corpus/core/src/a2a/types.ts +16 -0
- package/corpus/core/src/a2a-claims.ts +52 -0
- package/corpus/core/src/action.ts +7 -2
- package/corpus/core/src/agent/production-agent.ts +10 -4
- package/corpus/core/src/audit/record.ts +6 -0
- package/corpus/core/src/client/AssistantChat.tsx +648 -603
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
- package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
- package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
- package/corpus/core/src/client/analytics.ts +84 -0
- package/corpus/core/src/client/chat/message-components.tsx +94 -22
- package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
- package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
- package/corpus/core/src/client/chat-thread-url.ts +11 -0
- package/corpus/core/src/client/error-capture.ts +12 -0
- package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
- package/corpus/core/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
- package/corpus/core/src/client/feature-flags/helpers.ts +77 -0
- package/corpus/core/src/client/feature-flags/index.ts +13 -0
- package/corpus/core/src/client/feature-flags/types.ts +29 -0
- package/corpus/core/src/client/feature-flags/use-feature-flag.ts +26 -0
- package/corpus/core/src/client/index.ts +13 -0
- package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
- package/corpus/core/src/client/session-replay.ts +31 -0
- package/corpus/core/src/extensions/actions.ts +2 -14
- package/corpus/core/src/extensions/routes.ts +1 -1
- package/corpus/core/src/extensions/store.ts +1 -1
- package/corpus/core/src/feature-flags/a2a-action-route.ts +56 -0
- package/corpus/core/src/feature-flags/actions/get-feature-flags.ts +24 -0
- package/corpus/core/src/feature-flags/actions/list-feature-flags.ts +69 -0
- package/corpus/core/src/feature-flags/actions/set-feature-flag.ts +89 -0
- package/corpus/core/src/feature-flags/index.ts +21 -0
- package/corpus/core/src/feature-flags/permissions.ts +53 -0
- package/corpus/core/src/feature-flags/plugin.ts +44 -0
- package/corpus/core/src/feature-flags/registry.ts +96 -0
- package/corpus/core/src/feature-flags/store.ts +176 -0
- package/corpus/core/src/index.ts +15 -0
- package/corpus/core/src/localization/default-messages.ts +50 -0
- package/corpus/core/src/mcp/build-server.ts +2 -2
- package/corpus/core/src/progress/actions.ts +4 -2
- package/corpus/core/src/provider-api/index.ts +205 -105
- package/corpus/core/src/scripts/call-agent.ts +137 -17
- package/corpus/core/src/server/action-discovery.ts +12 -0
- package/corpus/core/src/server/action-routes.ts +47 -5
- package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
- package/corpus/core/src/server/index.ts +1 -0
- package/corpus/core/src/settings/org-settings.ts +13 -0
- package/corpus/core/src/settings/store.ts +57 -0
- package/corpus/core/src/styles/agent-conversation.css +7 -0
- package/corpus/core/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/core/src/templates/default/AGENTS.md +1 -0
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
- package/corpus/core/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +1 -1
- package/corpus/core/src/templates/workspace-root/AGENTS.md +1 -1
- package/corpus/core/src/vite/action-types-plugin.ts +12 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
- package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
- package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
- package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
- package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
- package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
- package/corpus/templates/analytics/AGENTS.md +37 -16
- package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
- package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
- package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
- package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
- package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
- package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
- package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
- package/corpus/templates/analytics/actions/list-workspace-feature-flags.ts +15 -0
- package/corpus/templates/analytics/actions/navigate.ts +2 -2
- package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
- package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +45 -0
- package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
- package/corpus/templates/analytics/actions/view-screen.ts +13 -0
- package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +243 -0
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +11 -3
- package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
- package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +3 -1
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +30 -0
- package/corpus/templates/analytics/app/i18n-data.ts +385 -0
- package/corpus/templates/analytics/app/pages/Agents.tsx +22 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
- package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-manage-feature-flag-rollouts-across-your-organization-s-apps.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
- package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
- package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
- package/corpus/templates/analytics/server/lib/db-admin-connections.ts +13 -5
- package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
- package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
- package/corpus/templates/analytics/server/lib/gong.ts +54 -66
- package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
- package/corpus/templates/analytics/server/lib/notion.ts +83 -8
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
- package/corpus/templates/analytics/server/lib/slack.ts +242 -90
- package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +347 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
- package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
- package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
- package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
- package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
- package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
- package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
- package/corpus/templates/clips/app/entry.client.tsx +6 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
- package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
- package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +1 -1
- package/corpus/templates/clips/server/plugins/feature-flags.ts +11 -0
- package/corpus/templates/clips/shared/feature-flags.ts +30 -37
- package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/content/app/entry.client.tsx +6 -1
- package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/design/AGENTS.md +5 -3
- package/corpus/templates/design/actions/add-fusion-screens.ts +4 -6
- package/corpus/templates/design/actions/apply-fusion-edits.ts +4 -6
- package/corpus/templates/design/actions/create-fusion-app.ts +5 -4
- package/corpus/templates/design/actions/deploy-fusion-app.ts +4 -3
- package/corpus/templates/design/actions/get-fusion-deploy-status.ts +4 -6
- package/corpus/templates/design/actions/list-fusion-edits.ts +4 -3
- package/corpus/templates/design/actions/push-fusion-app.ts +4 -6
- package/corpus/templates/design/actions/queue-fusion-edit.ts +4 -3
- package/corpus/templates/design/actions/send-fusion-message.ts +4 -6
- package/corpus/templates/design/actions/sync-fusion-app.ts +4 -3
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +1 -1
- package/corpus/templates/design/app/pages/Index.tsx +8 -6
- package/corpus/templates/design/server/plugins/feature-flags.ts +5 -0
- package/corpus/templates/design/shared/full-app.ts +10 -7
- package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/dispatch/AGENTS.md +5 -0
- package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
- package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/mail/app/entry.client.tsx +6 -1
- package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
- package/corpus/templates/slides/.env.example +0 -1
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/DEVELOPING.md +2 -2
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
- package/corpus/templates/slides/actions/logo-config.ts +6 -7
- package/corpus/templates/slides/actions/search-images.ts +11 -39
- package/corpus/templates/slides/actions/search-logos.ts +5 -52
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
- package/corpus/templates/slides/app/entry.client.tsx +6 -1
- package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
- package/corpus/templates/slides/server/register-secrets.ts +30 -0
- package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +169 -0
- package/dist/a2a/client.d.ts +38 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +81 -12
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +47 -0
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/index.d.ts +4 -4
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +2 -2
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/invoke.d.ts +26 -2
- package/dist/a2a/invoke.d.ts.map +1 -1
- package/dist/a2a/invoke.js +30 -1
- package/dist/a2a/invoke.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +14 -1
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/types.d.ts +12 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/a2a-claims.d.ts +10 -0
- package/dist/a2a-claims.d.ts.map +1 -0
- package/dist/a2a-claims.js +41 -0
- package/dist/a2a-claims.js.map +1 -0
- package/dist/action.d.ts +7 -2
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +5 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +5 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/audit/record.d.ts +3 -0
- package/dist/audit/record.d.ts.map +1 -1
- package/dist/audit/record.js +3 -0
- package/dist/audit/record.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +14 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +158 -136
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +27 -4
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +21 -39
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-sidebar-state.d.ts +1 -0
- package/dist/client/agent-sidebar-state.d.ts.map +1 -1
- package/dist/client/agent-sidebar-state.js +4 -0
- package/dist/client/agent-sidebar-state.js.map +1 -1
- package/dist/client/analytics.d.ts +14 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +67 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +8 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +62 -19
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +6 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +83 -14
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
- package/dist/client/chat-thread-url.d.ts +2 -0
- package/dist/client/chat-thread-url.d.ts.map +1 -0
- package/dist/client/chat-thread-url.js +12 -0
- package/dist/client/chat-thread-url.js.map +1 -0
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +7 -0
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
- package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionSlot.js +28 -3
- package/dist/client/extensions/ExtensionSlot.js.map +1 -1
- package/dist/client/feature-flags/FeatureFlagsPanel.d.ts +10 -0
- package/dist/client/feature-flags/FeatureFlagsPanel.d.ts.map +1 -0
- package/dist/client/feature-flags/FeatureFlagsPanel.js +143 -0
- package/dist/client/feature-flags/FeatureFlagsPanel.js.map +1 -0
- package/dist/client/feature-flags/helpers.d.ts +16 -0
- package/dist/client/feature-flags/helpers.d.ts.map +1 -0
- package/dist/client/feature-flags/helpers.js +50 -0
- package/dist/client/feature-flags/helpers.js.map +1 -0
- package/dist/client/feature-flags/index.d.ts +5 -0
- package/dist/client/feature-flags/index.d.ts.map +1 -0
- package/dist/client/feature-flags/index.js +4 -0
- package/dist/client/feature-flags/index.js.map +1 -0
- package/dist/client/feature-flags/types.d.ts +27 -0
- package/dist/client/feature-flags/types.d.ts.map +1 -0
- package/dist/client/feature-flags/types.js +2 -0
- package/dist/client/feature-flags/types.js.map +1 -0
- package/dist/client/feature-flags/use-feature-flag.d.ts +8 -0
- package/dist/client/feature-flags/use-feature-flag.d.ts.map +1 -0
- package/dist/client/feature-flags/use-feature-flag.js +15 -0
- package/dist/client/feature-flags/use-feature-flag.js.map +1 -0
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/route-chunk-recovery.d.ts.map +1 -1
- package/dist/client/route-chunk-recovery.js +14 -9
- package/dist/client/route-chunk-recovery.js.map +1 -1
- package/dist/client/session-replay.d.ts +15 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +20 -0
- package/dist/client/session-replay.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +2 -10
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +1 -1
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/store.js +1 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/feature-flags/a2a-action-route.d.ts +14 -0
- package/dist/feature-flags/a2a-action-route.d.ts.map +1 -0
- package/dist/feature-flags/a2a-action-route.js +50 -0
- package/dist/feature-flags/a2a-action-route.js.map +1 -0
- package/dist/feature-flags/actions/get-feature-flags.d.ts +3 -0
- package/dist/feature-flags/actions/get-feature-flags.d.ts.map +1 -0
- package/dist/feature-flags/actions/get-feature-flags.js +18 -0
- package/dist/feature-flags/actions/get-feature-flags.js.map +1 -0
- package/dist/feature-flags/actions/list-feature-flags.d.ts +28 -0
- package/dist/feature-flags/actions/list-feature-flags.d.ts.map +1 -0
- package/dist/feature-flags/actions/list-feature-flags.js +60 -0
- package/dist/feature-flags/actions/list-feature-flags.js.map +1 -0
- package/dist/feature-flags/actions/set-feature-flag.d.ts +26 -0
- package/dist/feature-flags/actions/set-feature-flag.d.ts.map +1 -0
- package/dist/feature-flags/actions/set-feature-flag.js +78 -0
- package/dist/feature-flags/actions/set-feature-flag.js.map +1 -0
- package/dist/feature-flags/index.d.ts +5 -0
- package/dist/feature-flags/index.d.ts.map +1 -0
- package/dist/feature-flags/index.js +5 -0
- package/dist/feature-flags/index.js.map +1 -0
- package/dist/feature-flags/permissions.d.ts +13 -0
- package/dist/feature-flags/permissions.d.ts.map +1 -0
- package/dist/feature-flags/permissions.js +37 -0
- package/dist/feature-flags/permissions.js.map +1 -0
- package/dist/feature-flags/plugin.d.ts +17 -0
- package/dist/feature-flags/plugin.d.ts.map +1 -0
- package/dist/feature-flags/plugin.js +29 -0
- package/dist/feature-flags/plugin.js.map +1 -0
- package/dist/feature-flags/registry.d.ts +23 -0
- package/dist/feature-flags/registry.d.ts.map +1 -0
- package/dist/feature-flags/registry.js +59 -0
- package/dist/feature-flags/registry.js.map +1 -0
- package/dist/feature-flags/store.d.ts +31 -0
- package/dist/feature-flags/store.d.ts.map +1 -0
- package/dist/feature-flags/store.js +124 -0
- package/dist/feature-flags/store.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +45 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +45 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/build-server.d.ts +2 -0
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +2 -2
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +3 -2
- package/dist/progress/actions.js.map +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +91 -8
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +107 -16
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +12 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.d.ts +3 -0
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +45 -5
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +27 -0
- package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +27 -1
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/settings/org-settings.d.ts +2 -0
- package/dist/settings/org-settings.d.ts.map +1 -1
- package/dist/settings/org-settings.js +5 -1
- package/dist/settings/org-settings.js.map +1 -1
- package/dist/settings/store.d.ts +8 -0
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +48 -0
- package/dist/settings/store.js.map +1 -1
- package/dist/styles/agent-conversation.css +7 -0
- package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
- package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
- package/dist/templates/default/AGENTS.md +1 -0
- package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
- package/dist/templates/default/app/i18n/de-DE.ts +20 -0
- package/dist/templates/default/app/i18n/en-US.ts +20 -0
- package/dist/templates/default/app/i18n/es-ES.ts +20 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
- package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/dist/templates/workspace-core/AGENTS.md +1 -1
- package/dist/templates/workspace-root/AGENTS.md +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +12 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/actions.mdx +48 -0
- package/docs/content/locales/ar-SA/actions.mdx +38 -0
- package/docs/content/locales/de-DE/actions.mdx +38 -0
- package/docs/content/locales/es-ES/actions.mdx +38 -0
- package/docs/content/locales/fr-FR/actions.mdx +38 -0
- package/docs/content/locales/hi-IN/actions.mdx +38 -0
- package/docs/content/locales/ja-JP/actions.mdx +38 -0
- package/docs/content/locales/ko-KR/actions.mdx +38 -0
- package/docs/content/locales/pt-BR/actions.mdx +38 -0
- package/docs/content/locales/zh-CN/actions.mdx +38 -0
- package/docs/content/locales/zh-TW/actions.mdx +38 -0
- package/package.json +5 -1
- package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
- package/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
- package/src/templates/default/AGENTS.md +1 -0
- package/src/templates/default/app/i18n/ar-SA.ts +20 -0
- package/src/templates/default/app/i18n/de-DE.ts +20 -0
- package/src/templates/default/app/i18n/en-US.ts +20 -0
- package/src/templates/default/app/i18n/es-ES.ts +20 -0
- package/src/templates/default/app/i18n/fr-FR.ts +21 -0
- package/src/templates/default/app/i18n/hi-IN.ts +19 -0
- package/src/templates/default/app/i18n/ja-JP.ts +20 -0
- package/src/templates/default/app/i18n/ko-KR.ts +19 -0
- package/src/templates/default/app/i18n/pt-BR.ts +20 -0
- package/src/templates/default/app/i18n/zh-CN.ts +19 -0
- package/src/templates/default/app/i18n/zh-TW.ts +19 -0
- package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/src/templates/workspace-core/AGENTS.md +1 -1
- package/src/templates/workspace-root/AGENTS.md +1 -1
- package/corpus/templates/analytics/server/handlers/github.ts +0 -200
- package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
- package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
- package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
- package/corpus/templates/analytics/server/lib/github.ts +0 -660
- package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
- package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
- package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
- package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
- package/corpus/templates/clips/actions/get-feature-flags.ts +0 -30
- package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
- package/corpus/templates/slides/actions/image-search.ts +0 -64
- package/corpus/templates/slides/actions/import-github.ts +0 -182
- package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
|
@@ -1,55 +1,27 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
|
-
import { resolveSecret } from "@agent-native/core/server";
|
|
3
2
|
import { z } from "zod";
|
|
4
3
|
|
|
4
|
+
import { searchProviderImages } from "../server/lib/media-search-providers.js";
|
|
5
|
+
|
|
5
6
|
export default defineAction({
|
|
6
7
|
description: "Search for images using Google Custom Search API.",
|
|
7
8
|
schema: z.object({
|
|
8
9
|
q: z.string().optional().describe("Search query (required)"),
|
|
10
|
+
count: z.coerce
|
|
11
|
+
.number()
|
|
12
|
+
.int()
|
|
13
|
+
.min(1)
|
|
14
|
+
.max(10)
|
|
15
|
+
.default(10)
|
|
16
|
+
.describe("Maximum number of image results to return."),
|
|
9
17
|
}),
|
|
10
18
|
http: { method: "GET" },
|
|
19
|
+
readOnly: true,
|
|
11
20
|
run: async (args) => {
|
|
12
21
|
const q = args.q;
|
|
13
22
|
if (!q) {
|
|
14
23
|
throw new Error("Missing query parameter 'q'");
|
|
15
24
|
}
|
|
16
|
-
|
|
17
|
-
const [apiKey, cx] = await Promise.all([
|
|
18
|
-
resolveSecret("GOOGLE_API_KEY"),
|
|
19
|
-
resolveSecret("GOOGLE_SEARCH_CX"),
|
|
20
|
-
]);
|
|
21
|
-
|
|
22
|
-
if (!apiKey || !cx) {
|
|
23
|
-
throw new Error(
|
|
24
|
-
"Google Search not configured. Save GOOGLE_API_KEY and GOOGLE_SEARCH_CX in settings.",
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const params = new URLSearchParams({
|
|
29
|
-
key: apiKey,
|
|
30
|
-
cx,
|
|
31
|
-
q,
|
|
32
|
-
searchType: "image",
|
|
33
|
-
num: "10",
|
|
34
|
-
safe: "active",
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
const response = await fetch(
|
|
38
|
-
`https://www.googleapis.com/customsearch/v1?${params}`,
|
|
39
|
-
);
|
|
40
|
-
if (!response.ok) {
|
|
41
|
-
const text = await response.text();
|
|
42
|
-
console.error("Google API error:", response.status, text);
|
|
43
|
-
throw new Error("Google API error");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const data = await response.json();
|
|
47
|
-
return (data.items || []).map((item: any) => ({
|
|
48
|
-
url: item.link,
|
|
49
|
-
thumbnail: item.image?.thumbnailLink || item.link,
|
|
50
|
-
title: item.title,
|
|
51
|
-
width: item.image?.width,
|
|
52
|
-
height: item.image?.height,
|
|
53
|
-
}));
|
|
25
|
+
return searchProviderImages(q, args.count);
|
|
54
26
|
},
|
|
55
27
|
});
|
|
@@ -1,67 +1,20 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
|
|
4
|
+
import { searchProviderLogos } from "../server/lib/media-search-providers.js";
|
|
5
|
+
|
|
4
6
|
export default defineAction({
|
|
5
7
|
description: "Search for company logos by name or domain.",
|
|
6
8
|
schema: z.object({
|
|
7
9
|
q: z.string().optional().describe("Company name or domain to search"),
|
|
8
10
|
}),
|
|
9
11
|
http: { method: "GET" },
|
|
12
|
+
readOnly: true,
|
|
10
13
|
run: async (args) => {
|
|
11
|
-
const q = (args.q || "").trim()
|
|
14
|
+
const q = (args.q || "").trim();
|
|
12
15
|
if (!q) {
|
|
13
16
|
throw new Error("Missing ?q= parameter");
|
|
14
17
|
}
|
|
15
|
-
|
|
16
|
-
const secretKey = process.env.LOGO_DEV_SECRET_KEY;
|
|
17
|
-
|
|
18
|
-
// If we have a secret key that's actually an sk_ key, use the search API
|
|
19
|
-
if (secretKey && secretKey.startsWith("sk_")) {
|
|
20
|
-
try {
|
|
21
|
-
const response = await fetch(
|
|
22
|
-
`https://api.logo.dev/search?q=${encodeURIComponent(q)}`,
|
|
23
|
-
{ headers: { Authorization: `Bearer ${secretKey}` } },
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
if (response.ok) {
|
|
27
|
-
const results: Array<{ name: string; domain: string }> =
|
|
28
|
-
await response.json();
|
|
29
|
-
return results.map((r) => ({ name: r.name, domain: r.domain }));
|
|
30
|
-
}
|
|
31
|
-
} catch {
|
|
32
|
-
// Fall through to domain guessing
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Domain guessing: generate candidate domains from the query
|
|
37
|
-
const candidates: Array<{ name: string; domain: string }> = [];
|
|
38
|
-
|
|
39
|
-
if (q.includes(".")) {
|
|
40
|
-
const clean = q
|
|
41
|
-
.replace(/^https?:\/\//, "")
|
|
42
|
-
.replace(/^www\./, "")
|
|
43
|
-
.split("/")[0];
|
|
44
|
-
candidates.push({ name: clean.split(".")[0], domain: clean });
|
|
45
|
-
} else {
|
|
46
|
-
const slug = q.replace(/[^a-z0-9]/g, "");
|
|
47
|
-
const slugDashed = q.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
48
|
-
|
|
49
|
-
const tlds = [".com", ".io", ".co", ".dev", ".org", ".net"];
|
|
50
|
-
const seen = new Set<string>();
|
|
51
|
-
|
|
52
|
-
for (const tld of tlds) {
|
|
53
|
-
const domain = slug + tld;
|
|
54
|
-
if (!seen.has(domain)) {
|
|
55
|
-
seen.add(domain);
|
|
56
|
-
candidates.push({ name: q, domain });
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (slugDashed !== slug) {
|
|
61
|
-
candidates.push({ name: q, domain: slugDashed + ".com" });
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return candidates;
|
|
18
|
+
return searchProviderLogos(q);
|
|
66
19
|
},
|
|
67
20
|
});
|
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
agentNativePath,
|
|
3
|
-
useActionQuery,
|
|
4
|
-
useT,
|
|
5
|
-
} from "@agent-native/core/client";
|
|
1
|
+
import { callAction, useActionQuery, useT } from "@agent-native/core/client";
|
|
6
2
|
import { IconX, IconSearch, IconLoader2 } from "@tabler/icons-react";
|
|
7
3
|
import { useState, useEffect, useRef } from "react";
|
|
8
4
|
import { createPortal } from "react-dom";
|
|
9
5
|
|
|
10
|
-
const LOGO_DEV_PK = "pk_VwOyCAOgT0aBNpecT2qO-A";
|
|
11
|
-
|
|
12
6
|
interface LogoResult {
|
|
13
7
|
name: string;
|
|
14
8
|
domain: string;
|
|
9
|
+
logoUrl?: string;
|
|
15
10
|
}
|
|
16
11
|
|
|
17
12
|
interface LogoSearchPanelProps {
|
|
@@ -32,6 +27,7 @@ export default function LogoSearchPanel({
|
|
|
32
27
|
const [error, setError] = useState<string | null>(null);
|
|
33
28
|
const [selectedDomain, setSelectedDomain] = useState<string | null>(null);
|
|
34
29
|
const [brandfetchId, setBrandfetchId] = useState<string | null>(null);
|
|
30
|
+
const [logoDevToken, setLogoDevToken] = useState<string | null>(null);
|
|
35
31
|
const panelRef = useRef<HTMLDivElement>(null);
|
|
36
32
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
37
33
|
|
|
@@ -41,6 +37,7 @@ export default function LogoSearchPanel({
|
|
|
41
37
|
if (logoConfigData?.brandfetchId) {
|
|
42
38
|
setBrandfetchId(logoConfigData.brandfetchId);
|
|
43
39
|
}
|
|
40
|
+
setLogoDevToken(logoConfigData?.logoDevToken ?? null);
|
|
44
41
|
}, [logoConfigData]);
|
|
45
42
|
|
|
46
43
|
useEffect(() => {
|
|
@@ -84,17 +81,7 @@ export default function LogoSearchPanel({
|
|
|
84
81
|
setResults([]);
|
|
85
82
|
setSelectedDomain(null);
|
|
86
83
|
try {
|
|
87
|
-
const
|
|
88
|
-
agentNativePath(
|
|
89
|
-
`/_agent-native/actions/search-logos?q=${encodeURIComponent(q)}`,
|
|
90
|
-
),
|
|
91
|
-
);
|
|
92
|
-
if (!res.ok) {
|
|
93
|
-
const data = await res.json();
|
|
94
|
-
setError(data.error || "Search failed");
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const data: LogoResult[] = await res.json();
|
|
84
|
+
const data = await callAction("search-logos", { q }, { method: "GET" });
|
|
98
85
|
if (data.length === 0) {
|
|
99
86
|
setError("No logos found");
|
|
100
87
|
} else {
|
|
@@ -116,7 +103,7 @@ export default function LogoSearchPanel({
|
|
|
116
103
|
|
|
117
104
|
// Build variations for the selected domain
|
|
118
105
|
const variations = selectedDomain
|
|
119
|
-
? buildVariations(selectedDomain, brandfetchId, t)
|
|
106
|
+
? buildVariations(selectedDomain, brandfetchId, logoDevToken, t)
|
|
120
107
|
: [];
|
|
121
108
|
|
|
122
109
|
return createPortal(
|
|
@@ -323,14 +310,12 @@ interface VariationGroup {
|
|
|
323
310
|
function buildVariations(
|
|
324
311
|
domain: string,
|
|
325
312
|
_brandfetchId: string | null,
|
|
313
|
+
logoDevToken: string | null,
|
|
326
314
|
t: ReturnType<typeof useT>,
|
|
327
315
|
): VariationGroup[] {
|
|
328
316
|
// Brandfetch CDN works without client ID for free tier
|
|
329
317
|
const bf = (path: string) => `https://cdn.brandfetch.io/${domain}/${path}`;
|
|
330
|
-
const
|
|
331
|
-
`https://img.logo.dev/${domain}?token=${LOGO_DEV_PK}&${params}`;
|
|
332
|
-
|
|
333
|
-
return [
|
|
318
|
+
const groups: VariationGroup[] = [
|
|
334
319
|
{
|
|
335
320
|
label: "Logo",
|
|
336
321
|
items: [
|
|
@@ -355,7 +340,11 @@ function buildVariations(
|
|
|
355
340
|
{ label: "Icon", url: bf("icon.png"), bg: "rgba(255,255,255,0.03)" },
|
|
356
341
|
],
|
|
357
342
|
},
|
|
358
|
-
|
|
343
|
+
];
|
|
344
|
+
if (logoDevToken) {
|
|
345
|
+
const ld = (params: string) =>
|
|
346
|
+
`https://img.logo.dev/${domain}?token=${encodeURIComponent(logoDevToken)}&${params}`;
|
|
347
|
+
groups.push({
|
|
359
348
|
label: "Logo.dev",
|
|
360
349
|
items: [
|
|
361
350
|
{
|
|
@@ -374,6 +363,7 @@ function buildVariations(
|
|
|
374
363
|
bg: "rgba(255,255,255,0.03)",
|
|
375
364
|
},
|
|
376
365
|
],
|
|
377
|
-
}
|
|
378
|
-
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
return groups;
|
|
379
369
|
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
appBasePath,
|
|
3
|
+
installRouteChunkRecovery,
|
|
4
|
+
} from "@agent-native/core/client";
|
|
2
5
|
import { hydrateRoot } from "react-dom/client";
|
|
3
6
|
import { HydratedRouter } from "react-router/dom";
|
|
4
7
|
|
|
8
|
+
installRouteChunkRecovery();
|
|
9
|
+
|
|
5
10
|
const basePath = appBasePath();
|
|
6
11
|
const pathname = window.location.pathname;
|
|
7
12
|
const routerBasePath =
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { resolveSecret } from "@agent-native/core/server";
|
|
2
|
+
|
|
3
|
+
const GOOGLE_IMAGE_SEARCH_URL = "https://www.googleapis.com/customsearch/v1";
|
|
4
|
+
const LOGO_DEV_SEARCH_URL = "https://api.logo.dev/search";
|
|
5
|
+
const PROVIDER_TIMEOUT_MS = 15_000;
|
|
6
|
+
|
|
7
|
+
export interface ImageSearchResult {
|
|
8
|
+
url: string;
|
|
9
|
+
thumbnail: string;
|
|
10
|
+
title: string;
|
|
11
|
+
width?: number;
|
|
12
|
+
height?: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface LogoSearchResult {
|
|
16
|
+
name: string;
|
|
17
|
+
domain: string;
|
|
18
|
+
logoUrl: string;
|
|
19
|
+
source: "logo.dev" | "domain-guess";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface MediaSearchRuntime {
|
|
23
|
+
resolveSecret: (key: string) => Promise<string | null | undefined>;
|
|
24
|
+
fetch: typeof fetch;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const defaultRuntime: MediaSearchRuntime = {
|
|
28
|
+
resolveSecret,
|
|
29
|
+
fetch: (...args) => fetch(...args),
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function fetchOptions(init: RequestInit = {}): RequestInit {
|
|
33
|
+
return {
|
|
34
|
+
...init,
|
|
35
|
+
signal: init.signal ?? AbortSignal.timeout(PROVIDER_TIMEOUT_MS),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function normalizedDomain(value: string): string {
|
|
40
|
+
return value
|
|
41
|
+
.trim()
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
.replace(/^https?:\/\//, "")
|
|
44
|
+
.replace(/^www\./, "")
|
|
45
|
+
.split("/", 1)[0]!
|
|
46
|
+
.replace(/[^a-z0-9.-]/g, "");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function logoResult(
|
|
50
|
+
name: string,
|
|
51
|
+
domain: string,
|
|
52
|
+
source: LogoSearchResult["source"],
|
|
53
|
+
): LogoSearchResult | null {
|
|
54
|
+
const normalized = normalizedDomain(domain);
|
|
55
|
+
if (!normalized || !normalized.includes(".")) return null;
|
|
56
|
+
return {
|
|
57
|
+
name: name.trim() || normalized.split(".")[0] || normalized,
|
|
58
|
+
domain: normalized,
|
|
59
|
+
logoUrl: `https://cdn.brandfetch.io/${normalized}/logo.png`,
|
|
60
|
+
source,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function guessedLogoDomains(query: string): LogoSearchResult[] {
|
|
65
|
+
const normalized = normalizedDomain(query);
|
|
66
|
+
if (normalized.includes(".")) {
|
|
67
|
+
const result = logoResult(
|
|
68
|
+
normalized.split(".")[0] ?? normalized,
|
|
69
|
+
normalized,
|
|
70
|
+
"domain-guess",
|
|
71
|
+
);
|
|
72
|
+
return result ? [result] : [];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const compact = query.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
76
|
+
const dashed = query
|
|
77
|
+
.toLowerCase()
|
|
78
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
79
|
+
.replace(/^-|-$/g, "");
|
|
80
|
+
if (!compact) return [];
|
|
81
|
+
|
|
82
|
+
const candidates = [
|
|
83
|
+
...["com", "io", "co", "dev", "org", "net"].map(
|
|
84
|
+
(tld) => `${compact}.${tld}`,
|
|
85
|
+
),
|
|
86
|
+
...(dashed && dashed !== compact ? [`${dashed}.com`] : []),
|
|
87
|
+
];
|
|
88
|
+
return candidates.flatMap((domain) => {
|
|
89
|
+
const result = logoResult(query, domain, "domain-guess");
|
|
90
|
+
return result ? [result] : [];
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export async function searchProviderImages(
|
|
95
|
+
query: string,
|
|
96
|
+
count = 10,
|
|
97
|
+
runtime: MediaSearchRuntime = defaultRuntime,
|
|
98
|
+
): Promise<ImageSearchResult[]> {
|
|
99
|
+
const normalizedQuery = query.trim();
|
|
100
|
+
if (!normalizedQuery) throw new Error("Image search requires a query.");
|
|
101
|
+
|
|
102
|
+
const [apiKey, searchEngineId] = await Promise.all([
|
|
103
|
+
runtime.resolveSecret("GOOGLE_API_KEY"),
|
|
104
|
+
runtime.resolveSecret("GOOGLE_SEARCH_CX"),
|
|
105
|
+
]);
|
|
106
|
+
if (!apiKey || !searchEngineId) {
|
|
107
|
+
throw new Error(
|
|
108
|
+
"Google Search not configured. Save GOOGLE_API_KEY and GOOGLE_SEARCH_CX in settings.",
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const params = new URLSearchParams({
|
|
113
|
+
key: apiKey,
|
|
114
|
+
cx: searchEngineId,
|
|
115
|
+
q: normalizedQuery,
|
|
116
|
+
searchType: "image",
|
|
117
|
+
num: String(Math.max(1, Math.min(Math.floor(count), 10))),
|
|
118
|
+
safe: "active",
|
|
119
|
+
});
|
|
120
|
+
const response = await runtime.fetch(
|
|
121
|
+
`${GOOGLE_IMAGE_SEARCH_URL}?${params}`,
|
|
122
|
+
fetchOptions(),
|
|
123
|
+
);
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
throw new Error(`Google image search failed (${response.status}).`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const data = (await response.json()) as {
|
|
129
|
+
items?: Array<{
|
|
130
|
+
link?: unknown;
|
|
131
|
+
title?: unknown;
|
|
132
|
+
image?: {
|
|
133
|
+
width?: unknown;
|
|
134
|
+
height?: unknown;
|
|
135
|
+
thumbnailLink?: unknown;
|
|
136
|
+
};
|
|
137
|
+
}>;
|
|
138
|
+
};
|
|
139
|
+
return (data.items ?? []).flatMap((item) => {
|
|
140
|
+
if (typeof item.link !== "string" || !item.link) return [];
|
|
141
|
+
const thumbnail =
|
|
142
|
+
typeof item.image?.thumbnailLink === "string"
|
|
143
|
+
? item.image.thumbnailLink
|
|
144
|
+
: item.link;
|
|
145
|
+
return [
|
|
146
|
+
{
|
|
147
|
+
url: item.link,
|
|
148
|
+
thumbnail,
|
|
149
|
+
title: typeof item.title === "string" ? item.title : "Untitled image",
|
|
150
|
+
...(typeof item.image?.width === "number"
|
|
151
|
+
? { width: item.image.width }
|
|
152
|
+
: {}),
|
|
153
|
+
...(typeof item.image?.height === "number"
|
|
154
|
+
? { height: item.image.height }
|
|
155
|
+
: {}),
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export async function searchProviderLogos(
|
|
162
|
+
query: string,
|
|
163
|
+
runtime: MediaSearchRuntime = defaultRuntime,
|
|
164
|
+
): Promise<LogoSearchResult[]> {
|
|
165
|
+
const normalizedQuery = query.trim();
|
|
166
|
+
if (!normalizedQuery) throw new Error("Logo search requires a query.");
|
|
167
|
+
|
|
168
|
+
const secretKey = await runtime.resolveSecret("LOGO_DEV_SECRET_KEY");
|
|
169
|
+
if (secretKey?.startsWith("sk_")) {
|
|
170
|
+
try {
|
|
171
|
+
const url = new URL(LOGO_DEV_SEARCH_URL);
|
|
172
|
+
url.searchParams.set("q", normalizedQuery);
|
|
173
|
+
const response = await runtime.fetch(
|
|
174
|
+
url,
|
|
175
|
+
fetchOptions({
|
|
176
|
+
headers: { Authorization: `Bearer ${secretKey}` },
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
179
|
+
if (response.ok) {
|
|
180
|
+
const data = (await response.json()) as Array<{
|
|
181
|
+
name?: unknown;
|
|
182
|
+
domain?: unknown;
|
|
183
|
+
}>;
|
|
184
|
+
const results = data.flatMap((item) => {
|
|
185
|
+
if (typeof item.domain !== "string") return [];
|
|
186
|
+
const result = logoResult(
|
|
187
|
+
typeof item.name === "string" ? item.name : normalizedQuery,
|
|
188
|
+
item.domain,
|
|
189
|
+
"logo.dev",
|
|
190
|
+
);
|
|
191
|
+
return result ? [result] : [];
|
|
192
|
+
});
|
|
193
|
+
if (results.length > 0) return results;
|
|
194
|
+
}
|
|
195
|
+
} catch {
|
|
196
|
+
// The deterministic domain fallback keeps the UI usable during provider outages.
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return guessedLogoDomains(normalizedQuery);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export async function getLogoProviderConfig(
|
|
204
|
+
runtime: MediaSearchRuntime = defaultRuntime,
|
|
205
|
+
) {
|
|
206
|
+
const [brandfetchId, logoDevToken, logoDevSecret] = await Promise.all([
|
|
207
|
+
runtime.resolveSecret("BRANDFETCH_CLIENT_ID"),
|
|
208
|
+
runtime.resolveSecret("LOGO_DEV_TOKEN"),
|
|
209
|
+
runtime.resolveSecret("LOGO_DEV_SECRET_KEY"),
|
|
210
|
+
]);
|
|
211
|
+
return {
|
|
212
|
+
brandfetchId: brandfetchId || null,
|
|
213
|
+
logoDevToken: logoDevToken?.startsWith("pk_") ? logoDevToken : null,
|
|
214
|
+
hasLogoDevSecret: logoDevSecret?.startsWith("sk_") === true,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
@@ -94,6 +94,36 @@ registerRequiredSecret({
|
|
|
94
94
|
required: false,
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
+
registerRequiredSecret({
|
|
98
|
+
key: "LOGO_DEV_SECRET_KEY",
|
|
99
|
+
label: "Logo.dev Search Key",
|
|
100
|
+
description: "Optional server-side key for company and domain logo search.",
|
|
101
|
+
docsUrl: "https://www.logo.dev/",
|
|
102
|
+
scope: "user",
|
|
103
|
+
kind: "api-key",
|
|
104
|
+
required: false,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
registerRequiredSecret({
|
|
108
|
+
key: "LOGO_DEV_TOKEN",
|
|
109
|
+
label: "Logo.dev Publishable Token",
|
|
110
|
+
description: "Optional publishable token for rendering Logo.dev images.",
|
|
111
|
+
docsUrl: "https://www.logo.dev/",
|
|
112
|
+
scope: "user",
|
|
113
|
+
kind: "api-key",
|
|
114
|
+
required: false,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
registerRequiredSecret({
|
|
118
|
+
key: "BRANDFETCH_CLIENT_ID",
|
|
119
|
+
label: "Brandfetch Client ID",
|
|
120
|
+
description: "Optional public client ID for Brandfetch logo rendering.",
|
|
121
|
+
docsUrl: "https://developers.brandfetch.com/",
|
|
122
|
+
scope: "user",
|
|
123
|
+
kind: "api-key",
|
|
124
|
+
required: false,
|
|
125
|
+
});
|
|
126
|
+
|
|
97
127
|
registerRequiredSecret({
|
|
98
128
|
key: "GOOGLE_CLIENT_ID",
|
|
99
129
|
label: "Google OAuth Client ID",
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-flags
|
|
3
|
+
description: >-
|
|
4
|
+
Declare, evaluate, manage, and remove framework feature flags. Use when
|
|
5
|
+
shipping a capability gradually, targeting users or organizations, or
|
|
6
|
+
replacing a compile-time rollout switch with a production-safe runtime flag.
|
|
7
|
+
scope: dev
|
|
8
|
+
metadata:
|
|
9
|
+
internal: true
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Feature Flags
|
|
13
|
+
|
|
14
|
+
A feature flag is a boolean declared in app code, evaluated locally by Core,
|
|
15
|
+
and managed from the Analytics fleet control plane. Code owns whether a flag
|
|
16
|
+
exists. Runtime settings own only its rollout state.
|
|
17
|
+
|
|
18
|
+
Flags let an app deploy dormant code and turn it on in the real environment
|
|
19
|
+
without another deployment. They are not experiments: do not add variants,
|
|
20
|
+
hypotheses, conversion metrics, exposure tracking, or lifecycle states.
|
|
21
|
+
|
|
22
|
+
## When to use one
|
|
23
|
+
|
|
24
|
+
Use a flag for a reversible rollout of a user-facing capability whose dormant
|
|
25
|
+
code is safe to deploy. Flags are useful for production dogfooding, exact-user
|
|
26
|
+
or organization pilots, and deterministic percentage rollouts.
|
|
27
|
+
|
|
28
|
+
Do not use a flag for authentication, authorization, secrets, audit enablement,
|
|
29
|
+
SSR cache behavior, or another security boundary. Client hiding is presentation
|
|
30
|
+
only; every guarded server action must evaluate the same registered flag.
|
|
31
|
+
|
|
32
|
+
## Agent workflow
|
|
33
|
+
|
|
34
|
+
### 1. Declare
|
|
35
|
+
|
|
36
|
+
Keep definitions in a shared TypeScript module so server and client code use the
|
|
37
|
+
same stable key. Flags are boolean and default-off.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { defineFeatureFlag } from "@agent-native/core/feature-flags";
|
|
41
|
+
|
|
42
|
+
export const FULL_APP_BUILDING = defineFeatureFlag({
|
|
43
|
+
key: "full-app-building",
|
|
44
|
+
displayName: "Full app building",
|
|
45
|
+
description: "Create and edit Fusion-backed applications.",
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Keys are immutable, never reused, and contain only letters, numbers, dots,
|
|
50
|
+
underscores, or hyphens. Prefer a concise app-owned name. Do not create flag
|
|
51
|
+
definitions or rollout rows from Analytics.
|
|
52
|
+
|
|
53
|
+
### 2. Register
|
|
54
|
+
|
|
55
|
+
Register app definitions from a Nitro plugin before actions are discovered.
|
|
56
|
+
Do not add app-specific flags to a Core registry.
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { createFeatureFlagsPlugin } from "@agent-native/core/server";
|
|
60
|
+
|
|
61
|
+
import { FULL_APP_BUILDING } from "../../shared/feature-flags.js";
|
|
62
|
+
|
|
63
|
+
export default createFeatureFlagsPlugin({ flags: [FULL_APP_BUILDING] });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. Guard server and client
|
|
67
|
+
|
|
68
|
+
The server action is the enforcement boundary:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
|
|
72
|
+
|
|
73
|
+
run: async (args, ctx) => {
|
|
74
|
+
if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
|
|
75
|
+
throw new Error("Full app building is not enabled for this account.");
|
|
76
|
+
}
|
|
77
|
+
// guarded operation
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Use the client hook only to hide or reveal hydrated UI:
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
import { useFeatureFlag } from "@agent-native/core/client";
|
|
85
|
+
|
|
86
|
+
const enabled = useFeatureFlag(FULL_APP_BUILDING.key);
|
|
87
|
+
return enabled ? <FullAppOption /> : null;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The client hook intentionally returns false while loading or for an unknown
|
|
91
|
+
flag. Never replace that fail-closed behavior with app-local bucketing or a
|
|
92
|
+
compile-time fallback. Never evaluate personalized flags in the public SSR
|
|
93
|
+
shell; it is shared and cached for every visitor.
|
|
94
|
+
|
|
95
|
+
### 4. Verify and roll out
|
|
96
|
+
|
|
97
|
+
1. Verify the off path before changing rollout state.
|
|
98
|
+
2. Confirm the registered flag appears in **Analytics → Feature flags** for the
|
|
99
|
+
app and is Off by default.
|
|
100
|
+
3. Use **Enable for me** for initial production dogfood.
|
|
101
|
+
4. Expand to exact emails, organization IDs, or a percentage only from
|
|
102
|
+
Analytics.
|
|
103
|
+
5. Confirm the client presentation and authoritative server action agree.
|
|
104
|
+
|
|
105
|
+
## Management contract
|
|
106
|
+
|
|
107
|
+
Core mounts three actions in registered apps:
|
|
108
|
+
|
|
109
|
+
| Action | Purpose |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| `get-feature-flags` | Return the current caller's evaluated boolean values. |
|
|
112
|
+
| `list-feature-flags` | Return definitions and rollout metadata to an authorized operator. |
|
|
113
|
+
| `set-feature-flag` | Atomically turn a flag off, enable it for the operator, or replace targeting rules. |
|
|
114
|
+
|
|
115
|
+
Analytics calls the app-local operator actions through narrowly scoped A2A
|
|
116
|
+
delegation. Tokens require an exact audience, organization, scope, operator
|
|
117
|
+
role, and audit correlation id. Management is permission-checked and audited
|
|
118
|
+
by the target app. Never manage flags through generic settings routes, raw SQL,
|
|
119
|
+
or per-app toggle UIs.
|
|
120
|
+
|
|
121
|
+
## Rollout semantics
|
|
122
|
+
|
|
123
|
+
The operator modes are **Off**, **Targeted**, and **Everyone**. Core stores them
|
|
124
|
+
as `off`, `rules`, and `on`.
|
|
125
|
+
|
|
126
|
+
Targeted rules combine exact normalized emails, exact organization IDs, and a
|
|
127
|
+
percentage with OR semantics. Exact matches are checked first. Percentage
|
|
128
|
+
buckets use Core's stable hash of the flag key and authenticated user identity;
|
|
129
|
+
anonymous callers fail closed. Raising a percentage preserves the users already
|
|
130
|
+
included at a lower percentage. Do not implement bucketing in app code.
|
|
131
|
+
|
|
132
|
+
Unknown definitions, missing state, malformed state, storage errors, and
|
|
133
|
+
evaluation errors all return the code default (`false` in v1). Explicit Off
|
|
134
|
+
wins over every target; Everyone enables every authenticated caller.
|
|
135
|
+
|
|
136
|
+
## Remove a flag
|
|
137
|
+
|
|
138
|
+
After a rollout is permanent:
|
|
139
|
+
|
|
140
|
+
1. Replace guarded branches with the chosen behavior.
|
|
141
|
+
2. Delete the server and client gates.
|
|
142
|
+
3. Delete the definition and registration entry.
|
|
143
|
+
4. Verify the flag disappears from the Analytics fleet.
|
|
144
|
+
5. Remove stale tests and rollout instructions.
|
|
145
|
+
|
|
146
|
+
A permanent flag is just an if statement with a pension plan.
|
|
147
|
+
|
|
148
|
+
## Verification checklist
|
|
149
|
+
|
|
150
|
+
- Unknown and unregistered keys evaluate false.
|
|
151
|
+
- UI hiding and server enforcement use the same registered key.
|
|
152
|
+
- Exact-user, organization, deterministic percentage, Everyone, and Off paths
|
|
153
|
+
have focused tests.
|
|
154
|
+
- Increasing a percentage is monotonic; anonymous percentage evaluation is off.
|
|
155
|
+
- Unauthorized callers cannot list targeting details or mutate flags.
|
|
156
|
+
- Mutations are atomic, read back stored state, emit refresh, and appear in the
|
|
157
|
+
audit log with the flag key.
|
|
158
|
+
- Analytics represents ready, no-definition, unsupported, forbidden, legacy,
|
|
159
|
+
and unreachable directory apps honestly.
|
|
160
|
+
- Future agents can find this skill from root `AGENTS.md`, and
|
|
161
|
+
`pnpm guard:workspace-skills` passes after syncing generated copies.
|
|
162
|
+
|
|
163
|
+
## Related skills
|
|
164
|
+
|
|
165
|
+
- **adding-a-feature** — preserve UI/action/instruction/application-state parity
|
|
166
|
+
- **actions** — define and call guarded app operations
|
|
167
|
+
- **audit-log** — inspect automatic action mutation history
|
|
168
|
+
- **reliable-mutations** — make rollout changes atomic and provable
|
|
169
|
+
- **security** — keep security controls out of feature flags
|