@agent-native/core 0.108.0 → 0.109.1
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 +25 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +162 -17
- package/corpus/core/src/a2a/correlation.ts +50 -0
- package/corpus/core/src/a2a/handlers.ts +200 -14
- package/corpus/core/src/a2a/index.ts +7 -1
- package/corpus/core/src/a2a/invoke.ts +77 -1
- package/corpus/core/src/a2a/server.ts +13 -1
- package/corpus/core/src/a2a/task-store.ts +146 -6
- package/corpus/core/src/a2a/types.ts +32 -0
- package/corpus/core/src/action.ts +5 -2
- package/corpus/core/src/agent/production-agent.ts +33 -4
- 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/index.ts +2 -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/client/use-run-stuck-detection.ts +27 -1
- package/corpus/core/src/db/client.ts +55 -0
- package/corpus/core/src/extensions/actions.ts +2 -14
- package/corpus/core/src/extensions/store.ts +1 -1
- package/corpus/core/src/localization/default-messages.ts +3 -0
- package/corpus/core/src/mcp/build-server.ts +2 -2
- package/corpus/core/src/observability/traces.ts +172 -19
- 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 +190 -19
- package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +112 -25
- package/corpus/core/src/server/agent-chat-plugin.ts +136 -4
- package/corpus/core/src/styles/agent-conversation.css +7 -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/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -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/observability/SKILL.md +7 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
- 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 +22 -13
- 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/pylon-issues.ts +123 -0
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
- 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/i18n/zh-TW.ts +13 -0
- package/corpus/templates/analytics/app/i18n-data.ts +134 -0
- 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-analytics-now-includes-a-default-alert-for-spikes-in-stuck-agent-chats.md +6 -0
- 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-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/docs/schemas/first-party-analytics.md +23 -14
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +5 -1
- 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/jobs/analytics-alerts.ts +3 -3
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +209 -87
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
- 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/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/clips/actions/finalize-recording.ts +541 -62
- 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/components/player/playback-comment-overlay.tsx +17 -2
- package/corpus/templates/clips/app/components/player/video-player.tsx +14 -2
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +2 -2
- 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/app/routes/r.$recordingId.tsx +1 -1
- package/corpus/templates/clips/app/routes/record.tsx +3 -3
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -3
- 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-clips-now-retries-storage-verification-in-the-background-ins.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/changelog/2026-07-17-fixed-broken-thumbnail-icons-appearing-over-playable-clip-em.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-playback-comments-stay-readable-at-faster-playback-speeds.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/finalize-recovery.ts +3 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +3 -3
- package/corpus/templates/clips/desktop/src/app.tsx +19 -7
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +111 -13
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +16 -7
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -4
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +32 -15
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +45 -18
- package/corpus/templates/clips/server/jobs/media-verification.ts +130 -0
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +15 -0
- package/corpus/templates/clips/server/lib/media-verification-state.ts +38 -0
- package/corpus/templates/clips/server/lib/player-thumbnail-url.ts +31 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +10 -3
- package/corpus/templates/clips/server/plugins/auth.ts +5 -5
- package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +12 -2
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +6 -1
- package/corpus/templates/clips/server/routes/api/thumbnail/[recordingId].get.ts +340 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +24 -7
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +91 -7
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/status.get.ts +14 -0
- package/corpus/templates/clips/shared/finalize-recovery.ts +61 -2
- package/corpus/templates/clips/shared/share-meta.ts +1 -1
- package/corpus/templates/content/app/entry.client.tsx +6 -1
- 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/mail/app/entry.client.tsx +6 -1
- 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/dist/a2a/client.d.ts +47 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +94 -12
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/correlation.d.ts +10 -0
- package/dist/a2a/correlation.d.ts.map +1 -0
- package/dist/a2a/correlation.js +40 -0
- package/dist/a2a/correlation.js.map +1 -0
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +147 -15
- 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 +29 -2
- package/dist/a2a/invoke.d.ts.map +1 -1
- package/dist/a2a/invoke.js +33 -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/task-store.d.ts +12 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +96 -6
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/a2a/types.d.ts +27 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/action.d.ts +5 -2
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +14 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +19 -3
- package/dist/agent/production-agent.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/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -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/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +25 -1
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/db/client.d.ts +7 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +33 -0
- package/dist/db/client.js.map +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/store.js +1 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/localization/default-messages.d.ts +3 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +3 -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/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts +9 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +137 -19
- package/dist/observability/traces.js.map +1 -1
- 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/progress/routes.d.ts +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/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +140 -17
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat/action-filters-a2a.d.ts +24 -2
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +62 -7
- 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 +118 -5
- 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/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-conversation.css +7 -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/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/package.json +1 -1
- 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/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.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/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,166 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
callMcpTool,
|
|
4
|
+
listVisibleMcpTools,
|
|
5
|
+
type AppMcpTool,
|
|
6
|
+
} from "@agent-native/core/mcp-client";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
import { readGongNativeInsightsPolicy } from "../server/lib/gong-native-policy";
|
|
10
|
+
|
|
11
|
+
const GONG_NATIVE_OPERATIONS = [
|
|
12
|
+
"ask_account",
|
|
13
|
+
"ask_deal",
|
|
14
|
+
"generate_brief",
|
|
15
|
+
] as const;
|
|
16
|
+
|
|
17
|
+
type GongNativeOperation = (typeof GONG_NATIVE_OPERATIONS)[number];
|
|
18
|
+
|
|
19
|
+
function operationName(value: string): string {
|
|
20
|
+
return value.trim().toLowerCase().replace(/-/g, "_");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function gongNativeTools(tools: AppMcpTool[]): AppMcpTool[] {
|
|
24
|
+
const names = new Set<string>(GONG_NATIVE_OPERATIONS);
|
|
25
|
+
return tools.filter((tool) => names.has(operationName(tool.name)));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function selectTool(
|
|
29
|
+
tools: AppMcpTool[],
|
|
30
|
+
operation: GongNativeOperation,
|
|
31
|
+
): AppMcpTool | null {
|
|
32
|
+
const matches = tools.filter(
|
|
33
|
+
(tool) => operationName(tool.name) === operation,
|
|
34
|
+
);
|
|
35
|
+
if (matches.length === 1) return matches[0];
|
|
36
|
+
const gongNamed = matches.filter((tool) => /gong/i.test(tool.serverId));
|
|
37
|
+
return gongNamed.length === 1 ? gongNamed[0] : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default defineAction({
|
|
41
|
+
description:
|
|
42
|
+
"Use Gong's official MCP semantic operations for one bounded qualitative synthesis request. Omit operation to inspect the connected schemas without spending Gong credits. Paid calls fail closed unless configure-gong-native-insights has enabled them for this workspace and this invocation sets allowCreditRequest=true. With operation, pass one consolidated arguments object; each invocation independently consumes Gong credits. Use this only for themes, risks, summaries, and deck narrative. For transcripts, quotes, counts, source records, or absence/exhaustive claims use gong-calls or the provider corpus evidence path instead.",
|
|
43
|
+
schema: z.object({
|
|
44
|
+
operation: z
|
|
45
|
+
.enum(GONG_NATIVE_OPERATIONS)
|
|
46
|
+
.optional()
|
|
47
|
+
.describe(
|
|
48
|
+
"Official Gong MCP operation. Omit to list the currently connected operation schemas without calling Gong AI.",
|
|
49
|
+
),
|
|
50
|
+
allowCreditRequest: z
|
|
51
|
+
.boolean()
|
|
52
|
+
.default(false)
|
|
53
|
+
.describe(
|
|
54
|
+
"Explicitly authorize this one Gong semantic request. Leave false while inspecting schemas or when the workspace should not spend Gong credits.",
|
|
55
|
+
),
|
|
56
|
+
arguments: z
|
|
57
|
+
.record(z.string(), z.unknown())
|
|
58
|
+
.default({})
|
|
59
|
+
.describe(
|
|
60
|
+
"Arguments passed unchanged to the connected Gong MCP operation. Consolidate related questions into one request and narrow the entity/date scope.",
|
|
61
|
+
),
|
|
62
|
+
}),
|
|
63
|
+
readOnly: true,
|
|
64
|
+
parallelSafe: true,
|
|
65
|
+
needsApproval: ({ operation, allowCreditRequest }) =>
|
|
66
|
+
Boolean(operation && allowCreditRequest),
|
|
67
|
+
publicAgent: { expose: true, readOnly: true, requiresAuth: true },
|
|
68
|
+
http: false,
|
|
69
|
+
run: async ({ operation, allowCreditRequest, arguments: args }) => {
|
|
70
|
+
const tools = gongNativeTools(await listVisibleMcpTools());
|
|
71
|
+
if (!operation) {
|
|
72
|
+
return {
|
|
73
|
+
connected: tools.length > 0,
|
|
74
|
+
creditRequests: 0,
|
|
75
|
+
creditUnit: "request",
|
|
76
|
+
evidenceMode: "provider-synthesis",
|
|
77
|
+
rawEvidenceAvailable: false,
|
|
78
|
+
operations: tools.map((tool) => ({
|
|
79
|
+
operation: operationName(tool.name),
|
|
80
|
+
serverId: tool.serverId,
|
|
81
|
+
description: tool.description,
|
|
82
|
+
inputSchema: tool.inputSchema,
|
|
83
|
+
})),
|
|
84
|
+
evidenceFallbackAction: "gong-calls",
|
|
85
|
+
guidance:
|
|
86
|
+
tools.length > 0
|
|
87
|
+
? "Choose one operation and make one consolidated, narrowly scoped request. Inspecting this catalog did not call Gong AI or consume a Gong credit request."
|
|
88
|
+
: "No official Gong semantic MCP operations are connected in this request scope. Use gong-calls for bounded evidence, or connect Gong MCP before using the synthesis path.",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!allowCreditRequest) {
|
|
93
|
+
return {
|
|
94
|
+
connected: tools.length > 0,
|
|
95
|
+
operation,
|
|
96
|
+
blocked: true,
|
|
97
|
+
creditRequests: 0,
|
|
98
|
+
creditUnit: "request",
|
|
99
|
+
evidenceMode: "provider-synthesis",
|
|
100
|
+
rawEvidenceAvailable: false,
|
|
101
|
+
evidenceFallbackAction: "gong-calls",
|
|
102
|
+
guidance:
|
|
103
|
+
"This Gong semantic request was not sent. Set allowCreditRequest=true only after choosing one consolidated, narrowly scoped request; use gong-calls for evidence retrieval without Gong AI synthesis.",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const policy = await readGongNativeInsightsPolicy();
|
|
108
|
+
if (!policy.enabled) {
|
|
109
|
+
return {
|
|
110
|
+
connected: tools.length > 0,
|
|
111
|
+
operation,
|
|
112
|
+
blocked: true,
|
|
113
|
+
blockedBy: "workspace-policy",
|
|
114
|
+
policy,
|
|
115
|
+
creditRequests: 0,
|
|
116
|
+
creditUnit: "request",
|
|
117
|
+
evidenceMode: "provider-synthesis",
|
|
118
|
+
rawEvidenceAvailable: false,
|
|
119
|
+
evidenceFallbackAction: "gong-calls",
|
|
120
|
+
guidance:
|
|
121
|
+
"This Gong semantic request was not sent because paid native insights are disabled for this workspace. An authorized user can enable them with configure-gong-native-insights; use gong-calls for evidence retrieval in the meantime.",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const tool = selectTool(tools, operation);
|
|
126
|
+
if (!tool) {
|
|
127
|
+
return {
|
|
128
|
+
connected: tools.length > 0,
|
|
129
|
+
operation,
|
|
130
|
+
creditRequests: 0,
|
|
131
|
+
creditUnit: "request",
|
|
132
|
+
evidenceMode: "provider-synthesis",
|
|
133
|
+
rawEvidenceAvailable: false,
|
|
134
|
+
error:
|
|
135
|
+
tools.length === 0
|
|
136
|
+
? "No official Gong semantic MCP operations are connected in this request scope."
|
|
137
|
+
: `The ${operation} operation is missing or ambiguous across connected MCP servers.`,
|
|
138
|
+
availableOperations: tools.map((candidate) => ({
|
|
139
|
+
operation: operationName(candidate.name),
|
|
140
|
+
serverId: candidate.serverId,
|
|
141
|
+
})),
|
|
142
|
+
evidenceFallbackAction: "gong-calls",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const startedAt = Date.now();
|
|
147
|
+
const result = await callMcpTool(tool.serverId, tool.name, args);
|
|
148
|
+
return {
|
|
149
|
+
connected: true,
|
|
150
|
+
source: "gong-native-mcp",
|
|
151
|
+
operation,
|
|
152
|
+
creditRequests: 1,
|
|
153
|
+
creditUnit: "request",
|
|
154
|
+
durationMs: Date.now() - startedAt,
|
|
155
|
+
evidenceMode: "provider-synthesis",
|
|
156
|
+
synthesisOnly: true,
|
|
157
|
+
rawEvidenceAvailable: false,
|
|
158
|
+
coverageComplete: false,
|
|
159
|
+
coverageUnknown: true,
|
|
160
|
+
result,
|
|
161
|
+
evidenceFallbackAction: "gong-calls",
|
|
162
|
+
guidance:
|
|
163
|
+
"Treat this as Gong-generated qualitative synthesis, not transcript evidence. Do not use it for verbatim quotes, exact counts, source-record claims, or proof of absence; route those to gong-calls or the provider corpus evidence path.",
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
});
|
|
@@ -2,12 +2,13 @@ import { defineAction } from "@agent-native/core";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
getAllDeals,
|
|
6
5
|
getDealPipelines,
|
|
7
6
|
getDealOwners,
|
|
8
7
|
getVisiblePipelines,
|
|
9
8
|
searchHubSpotObjects,
|
|
10
9
|
type Deal,
|
|
10
|
+
type HubSpotSearchFilter,
|
|
11
|
+
type HubSpotSearchFilterGroup,
|
|
11
12
|
type Pipeline,
|
|
12
13
|
} from "../server/lib/hubspot";
|
|
13
14
|
|
|
@@ -22,6 +23,7 @@ const StringListSchema = z.preprocess((value) => {
|
|
|
22
23
|
|
|
23
24
|
const TextMatchSchema = z.enum(["token", "contains", "exact"]);
|
|
24
25
|
const ClosedStatusSchema = z.enum(["any", "won", "lost", "closed", "open"]);
|
|
26
|
+
const HUBSPOT_SEARCH_RESULT_CAP = 10_000;
|
|
25
27
|
|
|
26
28
|
function stageLookups(pipelines: Pipeline[]) {
|
|
27
29
|
const stageLabels: Record<string, string> = {};
|
|
@@ -261,6 +263,102 @@ function hasStructuredFilters(filters: ReturnType<typeof buildFilterSummary>) {
|
|
|
261
263
|
].some((key) => key in filters);
|
|
262
264
|
}
|
|
263
265
|
|
|
266
|
+
function buildHubSpotDealFilters(options: {
|
|
267
|
+
visiblePipelines: Pipeline[];
|
|
268
|
+
owners: Record<string, string>;
|
|
269
|
+
owner?: string;
|
|
270
|
+
product?: string;
|
|
271
|
+
productMatch: TextMatchMode;
|
|
272
|
+
pipeline?: string;
|
|
273
|
+
closedStatus: ClosedStatus;
|
|
274
|
+
closedDateFromMs: number | null;
|
|
275
|
+
closedDateToMs: number | null;
|
|
276
|
+
}): { filterGroups: HubSpotSearchFilterGroup[]; impossible: boolean } {
|
|
277
|
+
let pipelineIds = options.visiblePipelines.map((pipeline) => pipeline.id);
|
|
278
|
+
if (options.pipeline) {
|
|
279
|
+
const needle = options.pipeline.toLowerCase();
|
|
280
|
+
pipelineIds = options.visiblePipelines
|
|
281
|
+
.filter(
|
|
282
|
+
(pipeline) =>
|
|
283
|
+
pipeline.id.toLowerCase().includes(needle) ||
|
|
284
|
+
pipeline.label.toLowerCase().includes(needle),
|
|
285
|
+
)
|
|
286
|
+
.map((pipeline) => pipeline.id);
|
|
287
|
+
}
|
|
288
|
+
if (!pipelineIds.length) return { filterGroups: [], impossible: true };
|
|
289
|
+
|
|
290
|
+
const filters: HubSpotSearchFilter[] = [
|
|
291
|
+
{ propertyName: "pipeline", operator: "IN", values: pipelineIds },
|
|
292
|
+
];
|
|
293
|
+
|
|
294
|
+
if (options.owner) {
|
|
295
|
+
const needle = options.owner.toLowerCase();
|
|
296
|
+
const ownerIds = Object.entries(options.owners)
|
|
297
|
+
.filter(
|
|
298
|
+
([id, name]) =>
|
|
299
|
+
id.toLowerCase() === needle || name.toLowerCase() === needle,
|
|
300
|
+
)
|
|
301
|
+
.map(([id]) => id);
|
|
302
|
+
if (!ownerIds.length) return { filterGroups: [], impossible: true };
|
|
303
|
+
filters.push({
|
|
304
|
+
propertyName: "hubspot_owner_id",
|
|
305
|
+
operator: "IN",
|
|
306
|
+
values: ownerIds,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (options.product) {
|
|
311
|
+
filters.push({
|
|
312
|
+
propertyName: "products",
|
|
313
|
+
operator: options.productMatch === "exact" ? "EQ" : "CONTAINS_TOKEN",
|
|
314
|
+
value:
|
|
315
|
+
options.productMatch === "contains"
|
|
316
|
+
? `*${options.product}*`
|
|
317
|
+
: options.product,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (options.closedStatus !== "any") {
|
|
322
|
+
const lookups = stageLookups(options.visiblePipelines);
|
|
323
|
+
const wonIds = [...lookups.wonStageIds];
|
|
324
|
+
const lostIds = [...lookups.lostStageIds];
|
|
325
|
+
const closedIds = [...new Set([...wonIds, ...lostIds])];
|
|
326
|
+
const values =
|
|
327
|
+
options.closedStatus === "won"
|
|
328
|
+
? wonIds
|
|
329
|
+
: options.closedStatus === "lost"
|
|
330
|
+
? lostIds
|
|
331
|
+
: closedIds;
|
|
332
|
+
if (!values.length && options.closedStatus !== "open") {
|
|
333
|
+
return { filterGroups: [], impossible: true };
|
|
334
|
+
}
|
|
335
|
+
if (closedIds.length) {
|
|
336
|
+
filters.push({
|
|
337
|
+
propertyName: "dealstage",
|
|
338
|
+
operator: options.closedStatus === "open" ? "NOT_IN" : "IN",
|
|
339
|
+
values: options.closedStatus === "open" ? closedIds : values,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (options.closedDateFromMs != null) {
|
|
345
|
+
filters.push({
|
|
346
|
+
propertyName: "closedate",
|
|
347
|
+
operator: "GTE",
|
|
348
|
+
value: String(options.closedDateFromMs),
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
if (options.closedDateToMs != null) {
|
|
352
|
+
filters.push({
|
|
353
|
+
propertyName: "closedate",
|
|
354
|
+
operator: "LTE",
|
|
355
|
+
value: String(options.closedDateToMs),
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return { filterGroups: [{ filters }], impossible: false };
|
|
360
|
+
}
|
|
361
|
+
|
|
264
362
|
function buildGuidance(options: {
|
|
265
363
|
query: string | undefined;
|
|
266
364
|
structuredFilters: boolean;
|
|
@@ -270,6 +368,7 @@ function buildGuidance(options: {
|
|
|
270
368
|
returned: number;
|
|
271
369
|
offset: number;
|
|
272
370
|
limit: number;
|
|
371
|
+
searchCoverageLimited: boolean;
|
|
273
372
|
}) {
|
|
274
373
|
const guidance: string[] = [];
|
|
275
374
|
|
|
@@ -278,7 +377,9 @@ function buildGuidance(options: {
|
|
|
278
377
|
"Used HubSpot full-text deal search for the query. Treat query matches as broad keyword/account matches, not proof that a specific property equals the query.",
|
|
279
378
|
);
|
|
280
379
|
} else {
|
|
281
|
-
guidance.push(
|
|
380
|
+
guidance.push(
|
|
381
|
+
"Used HubSpot CRM search with provider-side pipeline and structured filters; the action did not scan the full deal corpus locally.",
|
|
382
|
+
);
|
|
282
383
|
}
|
|
283
384
|
|
|
284
385
|
if (options.structuredFilters) {
|
|
@@ -292,11 +393,26 @@ function buildGuidance(options: {
|
|
|
292
393
|
}
|
|
293
394
|
|
|
294
395
|
if (options.truncated) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
396
|
+
if (options.query) {
|
|
397
|
+
const more = options.hasMore
|
|
398
|
+
? "Fetch the next page with the returned nextAfter cursor."
|
|
399
|
+
: "This query has no usable next cursor.";
|
|
400
|
+
guidance.push(
|
|
401
|
+
`Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}). This is a partial slice — do NOT treat it as the full cohort. ${more} Narrow the query or use provider-api-request with provider = hubspot and stageAs for a projected corpus.`,
|
|
402
|
+
);
|
|
403
|
+
} else {
|
|
404
|
+
const more = options.hasMore
|
|
405
|
+
? `Fetch the next page with offset ${options.offset + options.returned}.`
|
|
406
|
+
: "This is the last page of the cohort.";
|
|
407
|
+
guidance.push(
|
|
408
|
+
`Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}, offset ${options.offset}). This is a partial slice — do NOT treat it as the full cohort. Use total for counts/aggregates. ${more} Narrow the filters or, for exhaustive cohort analysis, use provider-api-request with provider = hubspot and stageAs.`,
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
if (options.searchCoverageLimited) {
|
|
298
414
|
guidance.push(
|
|
299
|
-
|
|
415
|
+
"HubSpot search cannot page beyond 10,000 results for one query, so coverage is incomplete even if this page has no next cursor. Split the cohort into non-overlapping closed-date windows and combine the projected results; do not report an exhaustive count or absence claim from this query alone.",
|
|
300
416
|
);
|
|
301
417
|
}
|
|
302
418
|
|
|
@@ -308,7 +424,7 @@ export default defineAction({
|
|
|
308
424
|
// reusable across continuation retries (no re-fetch on resume).
|
|
309
425
|
readOnly: true,
|
|
310
426
|
description:
|
|
311
|
-
"Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. Both paths are bounded: at most limit deals are returned (default 25, max
|
|
427
|
+
"Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. Both paths are bounded: at most limit deals are returned (default 25, max 200). HubSpot search returns a total but no server-side aggregates and cannot page past 10,000 matches for one query; compute metrics on filtered/projected rows, and split larger cohorts into non-overlapping date windows while reporting coverage. The structured-filter path returns total as the matched count and a truncated flag; page with offset (or narrow filters) instead of expecting the whole cohort in one call, since a full enriched cohort can be several MB and overruns extension and context budgets. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
|
|
312
428
|
schema: z.object({
|
|
313
429
|
properties: StringListSchema.describe(
|
|
314
430
|
"Optional comma-separated extra HubSpot deal property names to include.",
|
|
@@ -357,7 +473,7 @@ export default defineAction({
|
|
|
357
473
|
.number()
|
|
358
474
|
.int()
|
|
359
475
|
.min(1)
|
|
360
|
-
.max(
|
|
476
|
+
.max(200)
|
|
361
477
|
.default(25)
|
|
362
478
|
.describe(
|
|
363
479
|
"Maximum deals to return. Applies to BOTH full-text query results and structured-filter cohorts. The structured-filter path returns at most this many enriched deals (use total for the true matched count and offset to page).",
|
|
@@ -366,6 +482,7 @@ export default defineAction({
|
|
|
366
482
|
.number()
|
|
367
483
|
.int()
|
|
368
484
|
.min(0)
|
|
485
|
+
.max(HUBSPOT_SEARCH_RESULT_CAP - 1)
|
|
369
486
|
.default(0)
|
|
370
487
|
.describe(
|
|
371
488
|
"Number of structured-filter results to skip before returning limit deals. Use for paging through a large cohort; ignored when query is provided.",
|
|
@@ -408,27 +525,57 @@ export default defineAction({
|
|
|
408
525
|
);
|
|
409
526
|
}
|
|
410
527
|
|
|
411
|
-
const [
|
|
412
|
-
trimmedQuery
|
|
413
|
-
? searchHubSpotObjects({
|
|
414
|
-
objectType: "deals",
|
|
415
|
-
query: trimmedQuery,
|
|
416
|
-
properties,
|
|
417
|
-
limit,
|
|
418
|
-
after,
|
|
419
|
-
})
|
|
420
|
-
: getAllDeals(properties),
|
|
528
|
+
const [allPipelines, owners] = await Promise.all([
|
|
421
529
|
getDealPipelines(),
|
|
422
530
|
getDealOwners(),
|
|
423
531
|
]);
|
|
424
|
-
|
|
425
532
|
const visiblePipelines = getVisiblePipelines(allPipelines);
|
|
426
533
|
const visibleIds = new Set(visiblePipelines.map((p) => p.id));
|
|
427
534
|
const lookups = stageLookups(visiblePipelines);
|
|
428
535
|
const ownerFilter = owner?.trim().toLowerCase();
|
|
429
|
-
const
|
|
430
|
-
|
|
431
|
-
|
|
536
|
+
const providerFilters = buildHubSpotDealFilters({
|
|
537
|
+
visiblePipelines,
|
|
538
|
+
owners,
|
|
539
|
+
owner: trimmedOwner,
|
|
540
|
+
product: trimmedProduct,
|
|
541
|
+
productMatch,
|
|
542
|
+
pipeline: trimmedPipeline,
|
|
543
|
+
closedStatus,
|
|
544
|
+
closedDateFromMs: fromMs,
|
|
545
|
+
closedDateToMs: toMs,
|
|
546
|
+
});
|
|
547
|
+
const requestedAfter = trimmedQuery ? after : String(offset);
|
|
548
|
+
const numericAfter = requestedAfter
|
|
549
|
+
? Number.parseInt(requestedAfter, 10)
|
|
550
|
+
: 0;
|
|
551
|
+
if (
|
|
552
|
+
requestedAfter &&
|
|
553
|
+
Number.isFinite(numericAfter) &&
|
|
554
|
+
numericAfter >= HUBSPOT_SEARCH_RESULT_CAP
|
|
555
|
+
) {
|
|
556
|
+
throw new Error(
|
|
557
|
+
"HubSpot search cannot page beyond 10,000 results. Split the query into non-overlapping closed-date windows and report the combined coverage.",
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
const requestLimit = Number.isFinite(numericAfter)
|
|
561
|
+
? Math.min(limit, HUBSPOT_SEARCH_RESULT_CAP - numericAfter)
|
|
562
|
+
: limit;
|
|
563
|
+
const dealResult = providerFilters.impossible
|
|
564
|
+
? {
|
|
565
|
+
records: [],
|
|
566
|
+
total: 0,
|
|
567
|
+
nextAfter: null,
|
|
568
|
+
properties: properties ?? [],
|
|
569
|
+
}
|
|
570
|
+
: await searchHubSpotObjects({
|
|
571
|
+
objectType: "deals",
|
|
572
|
+
query: trimmedQuery,
|
|
573
|
+
filterGroups: providerFilters.filterGroups,
|
|
574
|
+
properties,
|
|
575
|
+
limit: requestLimit,
|
|
576
|
+
after: requestedAfter,
|
|
577
|
+
});
|
|
578
|
+
const rawDeals = dealResult.records.map(recordToDeal);
|
|
432
579
|
const filters = buildFilterSummary({
|
|
433
580
|
owner: trimmedOwner,
|
|
434
581
|
query: trimmedQuery,
|
|
@@ -461,24 +608,21 @@ export default defineAction({
|
|
|
461
608
|
return matchesDateRange(deal, fromMs, toMs);
|
|
462
609
|
});
|
|
463
610
|
|
|
464
|
-
//
|
|
465
|
-
//
|
|
466
|
-
//
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
const
|
|
478
|
-
|
|
479
|
-
: matchedDeals.slice(offset, offset + limit);
|
|
480
|
-
const truncated = !trimmedQuery && deals.length < matchedTotal;
|
|
481
|
-
const hasMore = !trimmedQuery && offset + deals.length < matchedTotal;
|
|
611
|
+
// HubSpot applies the cohort filters and pagination before returning the
|
|
612
|
+
// page. Keep the local checks as a compatibility/correctness guard, but do
|
|
613
|
+
// not scan and slice the full deal corpus in this action.
|
|
614
|
+
const matchedTotal = dealResult.total;
|
|
615
|
+
const deals = matchedDeals;
|
|
616
|
+
const searchCoverageLimited = matchedTotal >= HUBSPOT_SEARCH_RESULT_CAP;
|
|
617
|
+
const nextCursor = dealResult.nextAfter
|
|
618
|
+
? Number.parseInt(dealResult.nextAfter, 10)
|
|
619
|
+
: null;
|
|
620
|
+
const nextCursorWithinCap =
|
|
621
|
+
nextCursor == null ||
|
|
622
|
+
!Number.isFinite(nextCursor) ||
|
|
623
|
+
nextCursor < HUBSPOT_SEARCH_RESULT_CAP;
|
|
624
|
+
const hasMore = dealResult.nextAfter != null && nextCursorWithinCap;
|
|
625
|
+
const truncated = deals.length < matchedTotal || searchCoverageLimited;
|
|
482
626
|
|
|
483
627
|
return {
|
|
484
628
|
deals,
|
|
@@ -488,7 +632,10 @@ export default defineAction({
|
|
|
488
632
|
count: deals.length,
|
|
489
633
|
query: trimmedQuery || null,
|
|
490
634
|
filters,
|
|
491
|
-
nextAfter:
|
|
635
|
+
nextAfter: hasMore ? dealResult.nextAfter : null,
|
|
636
|
+
searchResultCap: HUBSPOT_SEARCH_RESULT_CAP,
|
|
637
|
+
searchCoverageComplete: !searchCoverageLimited,
|
|
638
|
+
searchCoverageLimited,
|
|
492
639
|
...(trimmedQuery
|
|
493
640
|
? {}
|
|
494
641
|
: {
|
|
@@ -507,12 +654,9 @@ export default defineAction({
|
|
|
507
654
|
returned: deals.length,
|
|
508
655
|
offset,
|
|
509
656
|
limit,
|
|
657
|
+
searchCoverageLimited,
|
|
510
658
|
}),
|
|
511
|
-
|
|
512
|
-
? {}
|
|
513
|
-
: {
|
|
514
|
-
searchedProperties: dealResult.properties,
|
|
515
|
-
}),
|
|
659
|
+
searchedProperties: dealResult.properties,
|
|
516
660
|
};
|
|
517
661
|
},
|
|
518
662
|
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
import { executeProviderApiRequest } from "../server/lib/provider-api";
|
|
5
|
+
|
|
6
|
+
const DAY_MS = 24 * 60 * 60 * 1_000;
|
|
7
|
+
|
|
8
|
+
export default defineAction({
|
|
9
|
+
description:
|
|
10
|
+
"Fetch a bounded Pylon issue corpus through Pylon's server-side search endpoint, or preserve the legacy account/accounts compatibility calls used by generated extensions. Agents should prefer provider-api-request or provider-corpus-job for ad hoc Pylon queries.",
|
|
11
|
+
schema: z.object({
|
|
12
|
+
account: z.string().optional(),
|
|
13
|
+
accounts: z.coerce.boolean().default(false),
|
|
14
|
+
query: z.string().optional(),
|
|
15
|
+
days: z.coerce
|
|
16
|
+
.number()
|
|
17
|
+
.int()
|
|
18
|
+
.min(1)
|
|
19
|
+
.max(730)
|
|
20
|
+
.default(371)
|
|
21
|
+
.describe("Created-at lookback window. Defaults to 53 weeks."),
|
|
22
|
+
pageSize: z.coerce.number().int().min(1).max(999).default(500),
|
|
23
|
+
maxPages: z.coerce.number().int().min(1).max(50).default(20),
|
|
24
|
+
}),
|
|
25
|
+
readOnly: true,
|
|
26
|
+
parallelSafe: true,
|
|
27
|
+
agentTool: false,
|
|
28
|
+
toolCallable: true,
|
|
29
|
+
http: { method: "POST" },
|
|
30
|
+
run: async ({ account, accounts, query, days, pageSize, maxPages }) => {
|
|
31
|
+
if (accounts) {
|
|
32
|
+
const response = (await executeProviderApiRequest({
|
|
33
|
+
provider: "pylon",
|
|
34
|
+
method: "GET",
|
|
35
|
+
path: "/accounts",
|
|
36
|
+
...(query?.trim() ? { query: { query: query.trim() } } : {}),
|
|
37
|
+
})) as { response?: { json?: unknown } };
|
|
38
|
+
const body = response.response?.json;
|
|
39
|
+
const values = Array.isArray(body)
|
|
40
|
+
? body
|
|
41
|
+
: body && typeof body === "object" && "data" in body
|
|
42
|
+
? Array.isArray((body as { data?: unknown }).data)
|
|
43
|
+
? (body as { data: unknown[] }).data
|
|
44
|
+
: []
|
|
45
|
+
: [];
|
|
46
|
+
return {
|
|
47
|
+
accounts: values,
|
|
48
|
+
total: values.length,
|
|
49
|
+
source: "pylon-accounts-compatibility",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (account?.trim() || query?.trim()) {
|
|
54
|
+
const now = new Date();
|
|
55
|
+
const start = new Date(now.getTime() - 30 * DAY_MS);
|
|
56
|
+
const response = (await executeProviderApiRequest({
|
|
57
|
+
provider: "pylon",
|
|
58
|
+
method: "GET",
|
|
59
|
+
path: "/issues",
|
|
60
|
+
query: {
|
|
61
|
+
...(account?.trim() ? { account_id: account.trim() } : {}),
|
|
62
|
+
...(query?.trim() ? { query: query.trim() } : {}),
|
|
63
|
+
start_time: start.toISOString(),
|
|
64
|
+
end_time: now.toISOString(),
|
|
65
|
+
},
|
|
66
|
+
})) as { response?: { json?: unknown } };
|
|
67
|
+
const body = response.response?.json;
|
|
68
|
+
const values = Array.isArray(body)
|
|
69
|
+
? body
|
|
70
|
+
: body && typeof body === "object" && "data" in body
|
|
71
|
+
? Array.isArray((body as { data?: unknown }).data)
|
|
72
|
+
? (body as { data: unknown[] }).data
|
|
73
|
+
: []
|
|
74
|
+
: [];
|
|
75
|
+
return {
|
|
76
|
+
issues: values,
|
|
77
|
+
total: values.length,
|
|
78
|
+
...(account?.trim() ? { account: account.trim() } : {}),
|
|
79
|
+
source: "pylon-issues-compatibility",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const createdAfter = new Date(Date.now() - days * DAY_MS).toISOString();
|
|
84
|
+
const response = (await executeProviderApiRequest({
|
|
85
|
+
provider: "pylon",
|
|
86
|
+
method: "POST",
|
|
87
|
+
path: "/issues/search",
|
|
88
|
+
body: {
|
|
89
|
+
filter: {
|
|
90
|
+
field: "created_at",
|
|
91
|
+
operator: "time_is_after",
|
|
92
|
+
value: createdAfter,
|
|
93
|
+
},
|
|
94
|
+
limit: pageSize,
|
|
95
|
+
},
|
|
96
|
+
fetchAllPages: {
|
|
97
|
+
cursorPath: "pagination.cursor",
|
|
98
|
+
cursorBodyPath: "cursor",
|
|
99
|
+
itemsPath: "data",
|
|
100
|
+
maxPages,
|
|
101
|
+
},
|
|
102
|
+
})) as {
|
|
103
|
+
items?: unknown[];
|
|
104
|
+
pagesRead?: number;
|
|
105
|
+
totalItems?: number;
|
|
106
|
+
lastStatus?: number;
|
|
107
|
+
truncated?: boolean;
|
|
108
|
+
nextCursor?: string | null;
|
|
109
|
+
};
|
|
110
|
+
const issues = Array.isArray(response.items) ? response.items : [];
|
|
111
|
+
const pagesRead = Number(response.pagesRead ?? 0);
|
|
112
|
+
return {
|
|
113
|
+
issues,
|
|
114
|
+
total: Number(response.totalItems ?? issues.length),
|
|
115
|
+
pagesRead,
|
|
116
|
+
createdAfter,
|
|
117
|
+
coverageComplete: response.truncated !== true,
|
|
118
|
+
truncated: response.truncated === true,
|
|
119
|
+
nextCursor: response.nextCursor ?? null,
|
|
120
|
+
source: "pylon-issues-search",
|
|
121
|
+
};
|
|
122
|
+
},
|
|
123
|
+
});
|
|
@@ -15,7 +15,7 @@ function resolveScope() {
|
|
|
15
15
|
|
|
16
16
|
export default defineAction({
|
|
17
17
|
description:
|
|
18
|
-
"Query the built-in first-party Analytics source: events recorded through this app's analytics collector endpoint (/track) and session replay summaries recorded through /api/analytics/replay. This source does not require an external provider connection. Use it for questions about app/site traffic, product events, template/app usage, conversions, session recordings, LLM/agent observability, model cost, token volume, latency, and other first-party data collected by this analytics app. Use source-specific actions such as BigQuery, GA4, Mixpanel, PostHog, or Amplitude when the user asks for those sources or the relevant data lives there. SQL may read analytics_events and session_recordings only; session_replay_chunks is intentionally unavailable, and reads are automatically scoped to the current user/org. analytics_events columns include event_name, timestamp, event_date, user_id, anonymous_id, user_key, session_id, app, template, signed_in, url, path, hostname, referrer, properties, and context. LLM observability events use event_name = '$ai_generation'; useful properties include $ai_trace_id/run_id, $ai_session_id/thread_id, $ai_model/model, $ai_provider/provider, $ai_input_tokens/input_tokens, $ai_output_tokens/output_tokens, cache_read_tokens, cache_write_tokens, cost_cents_x100, $ai_total_cost_usd/cost_usd, duration_ms/$ai_latency, status, tool_calls, successful_tools, failed_tools, and error_message/$ai_error. session_recordings columns include id, session_id, user_id, anonymous_id, user_key, started_at, ended_at, duration_ms, chunk_count, event_count, page_count, error_count, rage_click_count, app, template, status, first_url, last_url, path, hostname, referrer, and metadata.",
|
|
18
|
+
"Query the built-in first-party Analytics source: events recorded through this app's analytics collector endpoint (/track) and session replay summaries recorded through /api/analytics/replay. This source does not require an external provider connection. Use it for questions about app/site traffic, product events, template/app usage, conversions, session recordings, LLM/agent observability, model cost, token volume, latency, and other first-party data collected by this analytics app. Use source-specific actions such as BigQuery, GA4, Mixpanel, PostHog, or Amplitude when the user asks for those sources or the relevant data lives there. SQL may read analytics_events and session_recordings only; session_replay_chunks is intentionally unavailable, and reads are automatically scoped to the current user/org. analytics_events columns include event_name, timestamp, event_date, user_id, anonymous_id, user_key, session_id, app, template, signed_in, url, path, hostname, referrer, properties, and context. LLM observability events use event_name = '$ai_generation'; useful properties include $ai_trace_id/run_id, $ai_session_id/thread_id, $ai_model/model, $ai_provider/provider, $ai_input_tokens/input_tokens, $ai_output_tokens/output_tokens, cache_read_tokens, cache_write_tokens, cost_cents_x100, $ai_total_cost_usd/cost_usd, duration_ms/$ai_latency, status, tool_calls, successful_tools, failed_tools, tools, tools_truncated, delegated, delegation_protocol, caller_app, a2a_task_id, parent_run_id, parent_turn_id, and error_message/$ai_error. The bounded tools array contains names, relative start times, durations, statuses, and coarse error classes only, never args or results; failed runs and interrupted tools remain queryable. session_recordings columns include id, session_id, user_id, anonymous_id, user_key, started_at, ended_at, duration_ms, chunk_count, event_count, page_count, error_count, rage_click_count, app, template, status, first_url, last_url, path, hostname, referrer, and metadata.",
|
|
19
19
|
schema: z.object({
|
|
20
20
|
sql: z
|
|
21
21
|
.string()
|