@agent-native/core 0.108.0 → 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 +18 -0
- package/corpus/core/package.json +1 -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/action.ts +3 -2
- package/corpus/core/src/agent/production-agent.ts +10 -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/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/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/agent-chat/action-filters-a2a.ts +40 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
- 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 +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/performance/SKILL.md +13 -0
- 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/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-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/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/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/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/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 +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/action.d.ts +3 -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/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/collab/routes.d.ts +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/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 +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/resources/handlers.d.ts +2 -2
- 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/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/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 +28 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- 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 +28 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- 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
|
@@ -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
|
+
});
|