@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
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { getOrgSetting, mutateOrgSetting } from "../settings/org-settings.js";
|
|
2
|
+
import { getSetting, mutateSetting } from "../settings/store.js";
|
|
3
|
+
import {
|
|
4
|
+
getFeatureFlagDefinition,
|
|
5
|
+
type FeatureFlagDefinition,
|
|
6
|
+
} from "./registry.js";
|
|
7
|
+
|
|
8
|
+
export type FeatureFlagMode = "off" | "on" | "rules";
|
|
9
|
+
|
|
10
|
+
export interface FeatureFlagRules {
|
|
11
|
+
version: 1;
|
|
12
|
+
mode: FeatureFlagMode;
|
|
13
|
+
emails: string[];
|
|
14
|
+
orgIds: string[];
|
|
15
|
+
percentage: number;
|
|
16
|
+
updatedAt: number | null;
|
|
17
|
+
updatedBy: string | null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface FeatureFlagScope {
|
|
21
|
+
userEmail?: string;
|
|
22
|
+
/** Canonical authenticated identity. V1 callers use normalized email. */
|
|
23
|
+
userKey?: string;
|
|
24
|
+
orgId?: string | null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const FEATURE_FLAG_SETTINGS_PREFIX = "feature-flag:";
|
|
28
|
+
|
|
29
|
+
function settingKey(key: string): string {
|
|
30
|
+
return `${FEATURE_FLAG_SETTINGS_PREFIX}${key}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function defaultFeatureFlagRules(): FeatureFlagRules {
|
|
34
|
+
return {
|
|
35
|
+
version: 1,
|
|
36
|
+
mode: "off",
|
|
37
|
+
emails: [],
|
|
38
|
+
orgIds: [],
|
|
39
|
+
percentage: 0,
|
|
40
|
+
updatedAt: null,
|
|
41
|
+
updatedBy: null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function stringList(value: unknown): string[] {
|
|
46
|
+
if (!Array.isArray(value)) return [];
|
|
47
|
+
return [
|
|
48
|
+
...new Set(
|
|
49
|
+
value
|
|
50
|
+
.filter((item): item is string => typeof item === "string")
|
|
51
|
+
.map((item) => item.trim())
|
|
52
|
+
.filter(Boolean),
|
|
53
|
+
),
|
|
54
|
+
].sort();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function normalizeFeatureFlagRules(value: unknown): FeatureFlagRules {
|
|
58
|
+
if (!value || typeof value !== "object") return defaultFeatureFlagRules();
|
|
59
|
+
const raw = value as Record<string, unknown>;
|
|
60
|
+
const mode: FeatureFlagMode =
|
|
61
|
+
raw.mode === "on" || raw.mode === "rules" || raw.mode === "off"
|
|
62
|
+
? raw.mode
|
|
63
|
+
: "off";
|
|
64
|
+
const percentage =
|
|
65
|
+
typeof raw.percentage === "number" && Number.isFinite(raw.percentage)
|
|
66
|
+
? Math.max(0, Math.min(100, Math.floor(raw.percentage)))
|
|
67
|
+
: 0;
|
|
68
|
+
return {
|
|
69
|
+
version: 1,
|
|
70
|
+
mode,
|
|
71
|
+
emails: stringList(raw.emails).map((email) => email.toLowerCase()),
|
|
72
|
+
orgIds: stringList(raw.orgIds),
|
|
73
|
+
percentage,
|
|
74
|
+
updatedAt:
|
|
75
|
+
typeof raw.updatedAt === "number" && Number.isSafeInteger(raw.updatedAt)
|
|
76
|
+
? raw.updatedAt
|
|
77
|
+
: null,
|
|
78
|
+
updatedBy:
|
|
79
|
+
typeof raw.updatedBy === "string" && raw.updatedBy.trim()
|
|
80
|
+
? raw.updatedBy.trim().toLowerCase()
|
|
81
|
+
: null,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function getFeatureFlagRules(
|
|
86
|
+
key: string,
|
|
87
|
+
scope: Pick<FeatureFlagScope, "orgId">,
|
|
88
|
+
): Promise<FeatureFlagRules> {
|
|
89
|
+
if (!getFeatureFlagDefinition(key)) return defaultFeatureFlagRules();
|
|
90
|
+
// An organization-specific rule overrides the global rule. The fallback is
|
|
91
|
+
// what makes global exact-org targeting meaningful for callers in an org.
|
|
92
|
+
const stored = scope.orgId?.trim()
|
|
93
|
+
? ((await getOrgSetting(scope.orgId, settingKey(key))) ??
|
|
94
|
+
(await getSetting(settingKey(key))))
|
|
95
|
+
: await getSetting(settingKey(key));
|
|
96
|
+
return normalizeFeatureFlagRules(stored);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Atomically derive one flag's scoped rules. An org's first override starts
|
|
101
|
+
* from the global fallback, then becomes independently CAS-protected.
|
|
102
|
+
*/
|
|
103
|
+
export async function mutateFeatureFlagRules(
|
|
104
|
+
key: string,
|
|
105
|
+
scope: Pick<FeatureFlagScope, "orgId">,
|
|
106
|
+
updater: (
|
|
107
|
+
current: FeatureFlagRules,
|
|
108
|
+
) => FeatureFlagRules | Promise<FeatureFlagRules>,
|
|
109
|
+
): Promise<FeatureFlagRules> {
|
|
110
|
+
if (!getFeatureFlagDefinition(key)) {
|
|
111
|
+
throw new Error(`Unknown feature flag: ${key}`);
|
|
112
|
+
}
|
|
113
|
+
const mutate = async (stored: Record<string, unknown> | null) => {
|
|
114
|
+
const fallback =
|
|
115
|
+
stored == null && scope.orgId?.trim()
|
|
116
|
+
? await getSetting(settingKey(key))
|
|
117
|
+
: null;
|
|
118
|
+
return {
|
|
119
|
+
...(await updater(normalizeFeatureFlagRules(stored ?? fallback))),
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
const persisted = scope.orgId?.trim()
|
|
123
|
+
? await mutateOrgSetting(scope.orgId, settingKey(key), mutate)
|
|
124
|
+
: await mutateSetting(settingKey(key), mutate);
|
|
125
|
+
return normalizeFeatureFlagRules(persisted);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function rolloutBucket(input: string): number {
|
|
129
|
+
// FNV-1a is deliberately tiny, deterministic, and independent of runtime.
|
|
130
|
+
let hash = 0x811c9dc5;
|
|
131
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
132
|
+
hash ^= input.charCodeAt(index);
|
|
133
|
+
hash = Math.imul(hash, 0x01000193);
|
|
134
|
+
}
|
|
135
|
+
return (hash >>> 0) % 100;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function evaluateFeatureFlagRules(
|
|
139
|
+
key: string,
|
|
140
|
+
rules: FeatureFlagRules,
|
|
141
|
+
scope: FeatureFlagScope,
|
|
142
|
+
): boolean {
|
|
143
|
+
if (rules.mode === "off") return false;
|
|
144
|
+
if (rules.mode === "on") return true;
|
|
145
|
+
const email = scope.userEmail?.trim().toLowerCase();
|
|
146
|
+
if (email && rules.emails.includes(email)) return true;
|
|
147
|
+
if (scope.orgId && rules.orgIds.includes(scope.orgId)) return true;
|
|
148
|
+
const userKey = scope.userKey?.trim() || email;
|
|
149
|
+
if (!userKey || rules.percentage <= 0) return false;
|
|
150
|
+
return rolloutBucket(`${key}:${userKey}`) < rules.percentage;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export async function evaluateFeatureFlag(
|
|
154
|
+
key: string,
|
|
155
|
+
scope: FeatureFlagScope = {},
|
|
156
|
+
): Promise<boolean> {
|
|
157
|
+
if (!getFeatureFlagDefinition(key)) return false;
|
|
158
|
+
try {
|
|
159
|
+
return evaluateFeatureFlagRules(
|
|
160
|
+
key,
|
|
161
|
+
await getFeatureFlagRules(key, scope),
|
|
162
|
+
scope,
|
|
163
|
+
);
|
|
164
|
+
} catch {
|
|
165
|
+
// A feature flag must never become an availability dependency.
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Ergonomic app-action guard. Accepts either a registered definition or its key. */
|
|
171
|
+
export async function isFeatureFlagEnabled(
|
|
172
|
+
flag: string | FeatureFlagDefinition,
|
|
173
|
+
scope: FeatureFlagScope = {},
|
|
174
|
+
): Promise<boolean> {
|
|
175
|
+
return evaluateFeatureFlag(typeof flag === "string" ? flag : flag.key, scope);
|
|
176
|
+
}
|
package/corpus/core/src/index.ts
CHANGED
|
@@ -142,6 +142,21 @@ export {
|
|
|
142
142
|
type AutomationWorkflowDefinition,
|
|
143
143
|
type JsonSchema,
|
|
144
144
|
} from "./automation/index.js";
|
|
145
|
+
export {
|
|
146
|
+
createFeatureFlagsPlugin,
|
|
147
|
+
defineFeatureFlag,
|
|
148
|
+
defineFeatureFlags,
|
|
149
|
+
evaluateFeatureFlag,
|
|
150
|
+
getFeatureFlagDefinition,
|
|
151
|
+
getFeatureFlagRules,
|
|
152
|
+
isFeatureFlagEnabled,
|
|
153
|
+
listFeatureFlags,
|
|
154
|
+
registerFeatureFlags,
|
|
155
|
+
type FeatureFlagDefinition,
|
|
156
|
+
type FeatureFlagMode,
|
|
157
|
+
type FeatureFlagRules,
|
|
158
|
+
type FeatureFlagScope,
|
|
159
|
+
} from "./feature-flags/index.js";
|
|
145
160
|
|
|
146
161
|
// Server
|
|
147
162
|
export {
|
|
@@ -33,6 +33,53 @@ const messages = {
|
|
|
33
33
|
openResourceSettings: "Open resource settings",
|
|
34
34
|
backHome: "Back to home",
|
|
35
35
|
},
|
|
36
|
+
featureFlags: {
|
|
37
|
+
title: "Feature flags",
|
|
38
|
+
description: "Control staged capabilities without changing a deployment.",
|
|
39
|
+
enableForMe: "Enable for me",
|
|
40
|
+
enabledForMe: "Enabled for you",
|
|
41
|
+
youHaveAccess: "You have access",
|
|
42
|
+
youDoNotHaveAccess: "You don't have access",
|
|
43
|
+
currentUserUnknown: "Your access couldn't be evaluated",
|
|
44
|
+
moreActions: "More actions for {{name}}",
|
|
45
|
+
disableForEveryone: "Disable for everyone",
|
|
46
|
+
disableForEveryoneTitle: "Disable {{name}} for everyone?",
|
|
47
|
+
disableForEveryoneDescription:
|
|
48
|
+
"This immediately removes access for every targeted person and organization. You can configure a new rollout later.",
|
|
49
|
+
editTargeting: "Edit targeting",
|
|
50
|
+
editTargetingFor: "Edit targeting for {{name}}",
|
|
51
|
+
targetingTitle: "Edit targeting — {{name}}",
|
|
52
|
+
targetingDescription:
|
|
53
|
+
"Choose who can use this capability. Changes apply immediately.",
|
|
54
|
+
noFlags: "No feature flags are registered for this app.",
|
|
55
|
+
defaultOn: "Code fallback: on",
|
|
56
|
+
defaultOff: "Code fallback: off",
|
|
57
|
+
enabledFor: "Enabled for",
|
|
58
|
+
modeLabel: "Availability",
|
|
59
|
+
emailsLabel: "People",
|
|
60
|
+
orgIdsLabel: "Organization IDs",
|
|
61
|
+
percentageLabel: "Percentage of users",
|
|
62
|
+
targetingRuleHelp:
|
|
63
|
+
"A person gets access if they match any email, organization, or percentage rule.",
|
|
64
|
+
targetingSummary: "Currently enabled for: {{audience}}.",
|
|
65
|
+
saveRules: "Save changes",
|
|
66
|
+
cancel: "Cancel",
|
|
67
|
+
inherited: "No matching targets",
|
|
68
|
+
off: "Off",
|
|
69
|
+
targeted: "Targeted",
|
|
70
|
+
everyone: "Everyone",
|
|
71
|
+
everyoneAudience: "everyone",
|
|
72
|
+
emailCount_one: "{{count}} email",
|
|
73
|
+
emailCount_other: "{{count}} emails",
|
|
74
|
+
organizationCount_one: "{{count}} organization",
|
|
75
|
+
organizationCount_other: "{{count}} organizations",
|
|
76
|
+
percentageRollout: "{{count}}% rollout",
|
|
77
|
+
lastChanged: "Last changed: {{metadata}}",
|
|
78
|
+
mutationUnverified:
|
|
79
|
+
"We couldn't verify the change to {{name}}. Reload flags before trying again.",
|
|
80
|
+
mutationUnverifiedGeneric:
|
|
81
|
+
"We couldn't verify this feature flag change. Reload flags before trying again.",
|
|
82
|
+
},
|
|
36
83
|
dispatch: {
|
|
37
84
|
nav: {
|
|
38
85
|
chat: "Chat",
|
|
@@ -82,6 +129,9 @@ const messages = {
|
|
|
82
129
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
83
130
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
84
131
|
workspaceApps: "Workspace apps",
|
|
132
|
+
otherApps: "Other apps",
|
|
133
|
+
otherAppsDescription: "Open other apps available to you.",
|
|
134
|
+
availableCount: "{{count}} available",
|
|
85
135
|
activeCount: "{{count}} active",
|
|
86
136
|
hiddenCount: "{{count}} hidden",
|
|
87
137
|
createApp: "Create app",
|
|
@@ -345,7 +345,7 @@ function warnFullCatalogServed(toolCount: number): void {
|
|
|
345
345
|
);
|
|
346
346
|
}
|
|
347
347
|
|
|
348
|
-
function isAuthenticatedReadAction(entry: ActionEntry): boolean {
|
|
348
|
+
export function isAuthenticatedReadAction(entry: ActionEntry): boolean {
|
|
349
349
|
return (
|
|
350
350
|
entry.http !== false &&
|
|
351
351
|
entry.http?.method === "GET" &&
|
|
@@ -404,7 +404,7 @@ const AUTO_READ_EXCLUDED_ACTION_PATTERNS: RegExp[] = [
|
|
|
404
404
|
/browser-session/,
|
|
405
405
|
];
|
|
406
406
|
|
|
407
|
-
function isAutoReadExcludedActionName(name: string): boolean {
|
|
407
|
+
export function isAutoReadExcludedActionName(name: string): boolean {
|
|
408
408
|
return (
|
|
409
409
|
AUTO_READ_EXCLUDED_ACTION_NAMES.has(name) ||
|
|
410
410
|
AUTO_READ_EXCLUDED_ACTION_PATTERNS.some((pattern) => pattern.test(name))
|
|
@@ -35,6 +35,7 @@ Use for non-trivial work with multiple real steps (not single-action lookups). D
|
|
|
35
35
|
- Exactly one task in progress at a time; never batch-complete steps after the fact — update as you go.
|
|
36
36
|
- Always transition pending → in_progress before completing a step.
|
|
37
37
|
- If the task pivots (scope change, unexpected blocker), update the current step to reflect it before continuing.
|
|
38
|
+
- Only include fields for the selected action; do not send empty placeholder fields.
|
|
38
39
|
- End every run with "complete" (succeeded / failed / cancelled). Never leave a run open indefinitely.
|
|
39
40
|
|
|
40
41
|
Actions:
|
|
@@ -78,8 +79,9 @@ Actions:
|
|
|
78
79
|
},
|
|
79
80
|
status: {
|
|
80
81
|
type: "string",
|
|
81
|
-
enum: ["succeeded", "failed", "cancelled"],
|
|
82
|
-
description:
|
|
82
|
+
enum: ["", "succeeded", "failed", "cancelled"],
|
|
83
|
+
description:
|
|
84
|
+
'[complete] Terminal status for the run. Omit it for "start" and "update".',
|
|
83
85
|
},
|
|
84
86
|
active: {
|
|
85
87
|
type: "boolean",
|
|
@@ -1284,6 +1284,35 @@ const PROVIDER_CONFIGS: Record<ProviderApiId, ProviderApiConfig> = {
|
|
|
1284
1284
|
defaultHeaders: { "Notion-Version": "2026-03-11" },
|
|
1285
1285
|
templateUses: ["analytics", "brain", "content", "dispatch"],
|
|
1286
1286
|
examples: [{ label: "Search", method: "POST", path: "/search", body: {} }],
|
|
1287
|
+
corpusRecipes: [
|
|
1288
|
+
{
|
|
1289
|
+
label: "Search a Notion data source with complete cursor coverage",
|
|
1290
|
+
useWhen:
|
|
1291
|
+
"Use for coverage-sensitive searches across one known Notion data source's page properties. This does not search page block bodies.",
|
|
1292
|
+
workflow: [
|
|
1293
|
+
"Resolve the exact data source id and apply the narrowest provider-side filter and filter_properties projection first.",
|
|
1294
|
+
"Start provider-corpus-job with mode=paginated-search and pass next_cursor back as start_cursor in the POST body.",
|
|
1295
|
+
"Search only the returned properties and report the 10,000-result API ceiling plus any incomplete request_status.",
|
|
1296
|
+
"For page body text, stage page ids and fetch block children through a separate bounded data program; property search is not body search.",
|
|
1297
|
+
],
|
|
1298
|
+
request: {
|
|
1299
|
+
method: "POST",
|
|
1300
|
+
path: "/data_sources/<data-source-id>/query",
|
|
1301
|
+
body: { page_size: 100 },
|
|
1302
|
+
},
|
|
1303
|
+
pagination: {
|
|
1304
|
+
itemsPath: "results",
|
|
1305
|
+
nextCursorPath: "next_cursor",
|
|
1306
|
+
cursorBodyPath: "start_cursor",
|
|
1307
|
+
maxPages: 100,
|
|
1308
|
+
},
|
|
1309
|
+
search: {
|
|
1310
|
+
textPaths: ["properties"],
|
|
1311
|
+
idPaths: ["id"],
|
|
1312
|
+
metadataPaths: ["id", "url", "created_time", "last_edited_time"],
|
|
1313
|
+
},
|
|
1314
|
+
},
|
|
1315
|
+
],
|
|
1287
1316
|
},
|
|
1288
1317
|
posthog: {
|
|
1289
1318
|
id: "posthog",
|
|
@@ -1306,11 +1335,21 @@ const PROVIDER_CONFIGS: Record<ProviderApiId, ProviderApiConfig> = {
|
|
|
1306
1335
|
],
|
|
1307
1336
|
examples: [
|
|
1308
1337
|
{
|
|
1309
|
-
label: "
|
|
1310
|
-
method: "
|
|
1311
|
-
path: "/api/projects/{projectId}/
|
|
1338
|
+
label: "Aggregate events with HogQL",
|
|
1339
|
+
method: "POST",
|
|
1340
|
+
path: "/api/projects/{projectId}/query/",
|
|
1341
|
+
body: {
|
|
1342
|
+
query: {
|
|
1343
|
+
kind: "HogQLQuery",
|
|
1344
|
+
query:
|
|
1345
|
+
"SELECT event, count() AS events FROM events WHERE timestamp >= now() - INTERVAL 7 DAY GROUP BY event ORDER BY events DESC LIMIT 100",
|
|
1346
|
+
},
|
|
1347
|
+
},
|
|
1312
1348
|
},
|
|
1313
1349
|
],
|
|
1350
|
+
notes: [
|
|
1351
|
+
"Prefer the query endpoint with a bounded HogQL projection or server-side aggregation over paging raw events into the agent context.",
|
|
1352
|
+
],
|
|
1314
1353
|
},
|
|
1315
1354
|
prometheus: {
|
|
1316
1355
|
id: "prometheus",
|
|
@@ -1400,6 +1439,39 @@ const PROVIDER_CONFIGS: Record<ProviderApiId, ProviderApiConfig> = {
|
|
|
1400
1439
|
{ label: "Search messages", method: "GET", path: "/search.messages" },
|
|
1401
1440
|
{ label: "Post message", method: "POST", path: "/chat.postMessage" },
|
|
1402
1441
|
],
|
|
1442
|
+
notes: [
|
|
1443
|
+
"Bot-token reads must not call conversations.join implicitly. A bot can read only conversations it is already a member of with the required history scope.",
|
|
1444
|
+
"search.messages requires a compatible user token; do not assume a bot token can use it. Use conversations.history for channel-scoped bot reads.",
|
|
1445
|
+
],
|
|
1446
|
+
corpusRecipes: [
|
|
1447
|
+
{
|
|
1448
|
+
label: "Search complete Slack channel history",
|
|
1449
|
+
useWhen:
|
|
1450
|
+
"Use for all-message, mention, phrase, or absence-sensitive searches in one known Slack conversation without one agent turn per cursor page.",
|
|
1451
|
+
workflow: [
|
|
1452
|
+
"Resolve the exact channel id without joining or mutating membership.",
|
|
1453
|
+
"Start provider-corpus-job with mode=paginated-search against conversations.history, bounded by oldest/latest when possible.",
|
|
1454
|
+
"Pass response_metadata.next_cursor back as cursor and let quota_wait pause/resume rate-limited installations.",
|
|
1455
|
+
"Report channel id, time bounds, pages, messages searched, matches, and is_limited or access gaps.",
|
|
1456
|
+
],
|
|
1457
|
+
request: {
|
|
1458
|
+
method: "GET",
|
|
1459
|
+
path: "/conversations.history",
|
|
1460
|
+
query: { channel: "<channel-id>" },
|
|
1461
|
+
},
|
|
1462
|
+
pagination: {
|
|
1463
|
+
itemsPath: "messages",
|
|
1464
|
+
nextCursorPath: "response_metadata.next_cursor",
|
|
1465
|
+
cursorParam: "cursor",
|
|
1466
|
+
maxPages: 500,
|
|
1467
|
+
},
|
|
1468
|
+
search: {
|
|
1469
|
+
textPaths: ["text", "blocks", "attachments"],
|
|
1470
|
+
idPaths: ["ts", "client_msg_id"],
|
|
1471
|
+
metadataPaths: ["ts", "user", "thread_ts", "type", "subtype"],
|
|
1472
|
+
},
|
|
1473
|
+
},
|
|
1474
|
+
],
|
|
1403
1475
|
},
|
|
1404
1476
|
stripe: {
|
|
1405
1477
|
id: "stripe",
|
|
@@ -1690,60 +1762,66 @@ export async function executeProviderApiRequest(
|
|
|
1690
1762
|
// --- fetchAllPages mode ---
|
|
1691
1763
|
if (args.fetchAllPages) {
|
|
1692
1764
|
const pageCfg = args.fetchAllPages;
|
|
1693
|
-
const {
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1765
|
+
const {
|
|
1766
|
+
items,
|
|
1767
|
+
pageCount,
|
|
1768
|
+
lastStatus,
|
|
1769
|
+
lastContentType,
|
|
1770
|
+
truncated,
|
|
1771
|
+
nextCursor,
|
|
1772
|
+
} = await fetchAllPages(pageCfg, async (extra) => {
|
|
1773
|
+
const queryWithCursor = extra?.query
|
|
1774
|
+
? mergeQueryObjects(
|
|
1775
|
+
substituteUnknown(args.query, placeholders),
|
|
1776
|
+
extra.query,
|
|
1777
|
+
)
|
|
1778
|
+
: substituteUnknown(args.query, placeholders);
|
|
1779
|
+
const pageUrl = buildProviderUrl({
|
|
1780
|
+
config,
|
|
1781
|
+
baseUrl,
|
|
1782
|
+
rawPath: substituteString(args.path, placeholders),
|
|
1783
|
+
query: queryWithCursor,
|
|
1784
|
+
});
|
|
1785
|
+
const bodyWithCursor = extra?.bodyCursor
|
|
1786
|
+
? setValueAtPath(
|
|
1787
|
+
substituteUnknown(args.body, placeholders),
|
|
1788
|
+
extra.bodyCursor.path,
|
|
1789
|
+
extra.bodyCursor.value,
|
|
1790
|
+
)
|
|
1791
|
+
: substituteUnknown(args.body, placeholders);
|
|
1792
|
+
const pageBody = prepareBody(bodyWithCursor, headers);
|
|
1793
|
+
const requestKey = createProviderRequestDedupeKey({
|
|
1794
|
+
method,
|
|
1795
|
+
url: pageUrl.href,
|
|
1796
|
+
body: pageBody,
|
|
1797
|
+
headers,
|
|
1798
|
+
});
|
|
1799
|
+
const resp = await fetchWithTimeout(pageUrl.href, {
|
|
1800
|
+
method,
|
|
1801
|
+
headers,
|
|
1802
|
+
body: pageBody,
|
|
1803
|
+
maxBytes: effectiveMaxBytes,
|
|
1804
|
+
timeoutMs: clampTimeout(args.timeoutMs),
|
|
1805
|
+
secretValues: auth.secretValues,
|
|
1806
|
+
quota: {
|
|
1807
|
+
identity: quotaIdentity,
|
|
1722
1808
|
method,
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
identity: quotaIdentity,
|
|
1730
|
-
method,
|
|
1731
|
-
target: describeProviderRequestTarget(
|
|
1732
|
-
pageUrl.href,
|
|
1733
|
-
auth.secretValues,
|
|
1734
|
-
),
|
|
1735
|
-
requestKey,
|
|
1736
|
-
},
|
|
1737
|
-
});
|
|
1738
|
-
return {
|
|
1739
|
-
text:
|
|
1740
|
-
resp.text ??
|
|
1741
|
-
(resp.json !== undefined ? JSON.stringify(resp.json) : ""),
|
|
1742
|
-
contentType: resp.contentType,
|
|
1743
|
-
status: resp.status,
|
|
1744
|
-
ok: resp.ok,
|
|
1745
|
-
};
|
|
1809
|
+
target: describeProviderRequestTarget(
|
|
1810
|
+
pageUrl.href,
|
|
1811
|
+
auth.secretValues,
|
|
1812
|
+
),
|
|
1813
|
+
requestKey,
|
|
1814
|
+
},
|
|
1746
1815
|
});
|
|
1816
|
+
return {
|
|
1817
|
+
text:
|
|
1818
|
+
resp.text ??
|
|
1819
|
+
(resp.json !== undefined ? JSON.stringify(resp.json) : ""),
|
|
1820
|
+
contentType: resp.contentType,
|
|
1821
|
+
status: resp.status,
|
|
1822
|
+
ok: resp.ok,
|
|
1823
|
+
};
|
|
1824
|
+
});
|
|
1747
1825
|
|
|
1748
1826
|
const allItemsJson = JSON.stringify(items, null, 2);
|
|
1749
1827
|
const metadata = {
|
|
@@ -1751,6 +1829,8 @@ export async function executeProviderApiRequest(
|
|
|
1751
1829
|
pagesRead: pageCount,
|
|
1752
1830
|
totalItems: Array.isArray(items) ? items.length : 0,
|
|
1753
1831
|
lastStatus,
|
|
1832
|
+
truncated,
|
|
1833
|
+
nextCursor,
|
|
1754
1834
|
};
|
|
1755
1835
|
|
|
1756
1836
|
if (args.saveToFile) {
|
|
@@ -2642,57 +2722,63 @@ async function executeCustomProviderApiRequest(
|
|
|
2642
2722
|
// --- fetchAllPages mode (same cursor pagination as built-in providers) ---
|
|
2643
2723
|
if (args.fetchAllPages) {
|
|
2644
2724
|
const pageCfg = args.fetchAllPages;
|
|
2645
|
-
const {
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2725
|
+
const {
|
|
2726
|
+
items,
|
|
2727
|
+
pageCount,
|
|
2728
|
+
lastStatus,
|
|
2729
|
+
lastContentType,
|
|
2730
|
+
truncated,
|
|
2731
|
+
nextCursor,
|
|
2732
|
+
} = await fetchAllPages(pageCfg, async (extra) => {
|
|
2733
|
+
const queryWithCursor = extra?.query
|
|
2734
|
+
? mergeQueryObjects(args.query, extra.query)
|
|
2735
|
+
: args.query;
|
|
2736
|
+
const pageUrl = buildProviderUrl({
|
|
2737
|
+
config: syntheticConfig,
|
|
2738
|
+
baseUrl,
|
|
2739
|
+
rawPath: args.path,
|
|
2740
|
+
query: queryWithCursor,
|
|
2741
|
+
});
|
|
2742
|
+
const bodyWithCursor = extra?.bodyCursor
|
|
2743
|
+
? setValueAtPath(
|
|
2744
|
+
args.body,
|
|
2745
|
+
extra.bodyCursor.path,
|
|
2746
|
+
extra.bodyCursor.value,
|
|
2747
|
+
)
|
|
2748
|
+
: args.body;
|
|
2749
|
+
const pageBody = prepareBody(bodyWithCursor, headers);
|
|
2750
|
+
const requestKey = createProviderRequestDedupeKey({
|
|
2751
|
+
method,
|
|
2752
|
+
url: pageUrl.href,
|
|
2753
|
+
body: pageBody,
|
|
2754
|
+
headers,
|
|
2755
|
+
});
|
|
2756
|
+
const resp = await fetchWithTimeout(pageUrl.href, {
|
|
2757
|
+
method,
|
|
2758
|
+
headers,
|
|
2759
|
+
body: pageBody,
|
|
2760
|
+
maxBytes: effectiveMaxBytes,
|
|
2761
|
+
timeoutMs: clampTimeout(args.timeoutMs),
|
|
2762
|
+
secretValues: auth.secretValues,
|
|
2763
|
+
quota: {
|
|
2764
|
+
identity: quotaIdentity,
|
|
2671
2765
|
method,
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
identity: quotaIdentity,
|
|
2679
|
-
method,
|
|
2680
|
-
target: describeProviderRequestTarget(
|
|
2681
|
-
pageUrl.href,
|
|
2682
|
-
auth.secretValues,
|
|
2683
|
-
),
|
|
2684
|
-
requestKey,
|
|
2685
|
-
},
|
|
2686
|
-
});
|
|
2687
|
-
return {
|
|
2688
|
-
text:
|
|
2689
|
-
resp.text ??
|
|
2690
|
-
(resp.json !== undefined ? JSON.stringify(resp.json) : ""),
|
|
2691
|
-
contentType: resp.contentType,
|
|
2692
|
-
status: resp.status,
|
|
2693
|
-
ok: resp.ok,
|
|
2694
|
-
};
|
|
2766
|
+
target: describeProviderRequestTarget(
|
|
2767
|
+
pageUrl.href,
|
|
2768
|
+
auth.secretValues,
|
|
2769
|
+
),
|
|
2770
|
+
requestKey,
|
|
2771
|
+
},
|
|
2695
2772
|
});
|
|
2773
|
+
return {
|
|
2774
|
+
text:
|
|
2775
|
+
resp.text ??
|
|
2776
|
+
(resp.json !== undefined ? JSON.stringify(resp.json) : ""),
|
|
2777
|
+
contentType: resp.contentType,
|
|
2778
|
+
status: resp.status,
|
|
2779
|
+
ok: resp.ok,
|
|
2780
|
+
};
|
|
2781
|
+
});
|
|
2696
2782
|
|
|
2697
2783
|
const allItemsJson = JSON.stringify(items, null, 2);
|
|
2698
2784
|
const metadata = {
|
|
@@ -2704,6 +2790,8 @@ async function executeCustomProviderApiRequest(
|
|
|
2704
2790
|
pagesRead: pageCount,
|
|
2705
2791
|
totalItems: Array.isArray(items) ? items.length : 0,
|
|
2706
2792
|
lastStatus,
|
|
2793
|
+
truncated,
|
|
2794
|
+
nextCursor,
|
|
2707
2795
|
};
|
|
2708
2796
|
|
|
2709
2797
|
if (args.saveToFile) {
|
|
@@ -5146,6 +5234,8 @@ async function fetchAllPages(
|
|
|
5146
5234
|
pageCount: number;
|
|
5147
5235
|
lastStatus: number;
|
|
5148
5236
|
lastContentType: string | null;
|
|
5237
|
+
truncated: boolean;
|
|
5238
|
+
nextCursor: string | null;
|
|
5149
5239
|
}> {
|
|
5150
5240
|
const maxPages = Math.min(
|
|
5151
5241
|
Number.isFinite(config.maxPages) && config.maxPages! > 0
|
|
@@ -5159,6 +5249,7 @@ async function fetchAllPages(
|
|
|
5159
5249
|
let pageCount = 0;
|
|
5160
5250
|
let lastStatus = 0;
|
|
5161
5251
|
let lastContentType: string | null = null;
|
|
5252
|
+
let truncated = false;
|
|
5162
5253
|
|
|
5163
5254
|
if (!config.cursorParam && !config.cursorBodyPath) {
|
|
5164
5255
|
throw new Error(
|
|
@@ -5224,12 +5315,21 @@ async function fetchAllPages(
|
|
|
5224
5315
|
nextCursor === null ||
|
|
5225
5316
|
nextCursor === cursor
|
|
5226
5317
|
) {
|
|
5318
|
+
truncated = false;
|
|
5227
5319
|
break;
|
|
5228
5320
|
}
|
|
5229
5321
|
cursor = String(nextCursor);
|
|
5322
|
+
truncated = pageCount >= maxPages;
|
|
5230
5323
|
}
|
|
5231
5324
|
|
|
5232
|
-
return {
|
|
5325
|
+
return {
|
|
5326
|
+
items,
|
|
5327
|
+
pageCount,
|
|
5328
|
+
lastStatus,
|
|
5329
|
+
lastContentType,
|
|
5330
|
+
truncated,
|
|
5331
|
+
nextCursor: truncated ? (cursor ?? null) : null,
|
|
5332
|
+
};
|
|
5233
5333
|
}
|
|
5234
5334
|
|
|
5235
5335
|
function fingerprint(value: string): string {
|