@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
|
@@ -404,7 +404,7 @@ export function matchesGongCallQuery(call: GongCall, query: string): boolean {
|
|
|
404
404
|
|
|
405
405
|
function isExternalCall(call: GongCall): boolean {
|
|
406
406
|
const scope = (call as Record<string, unknown>).scope;
|
|
407
|
-
return typeof scope !== "string" || scope === "
|
|
407
|
+
return typeof scope !== "string" || scope.toLowerCase() === "external";
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
function partyMatchesQuery(
|
|
@@ -437,11 +437,6 @@ function partyMatchesQuery(
|
|
|
437
437
|
);
|
|
438
438
|
}
|
|
439
439
|
|
|
440
|
-
const extensivePartyCache = new Map<
|
|
441
|
-
string,
|
|
442
|
-
{ name: string; emailAddress?: string; affiliation?: string }[]
|
|
443
|
-
>();
|
|
444
|
-
|
|
445
440
|
export interface GongCallSearchResult {
|
|
446
441
|
calls: Array<GongCall & { matchedQueries?: string[] }>;
|
|
447
442
|
limit: number;
|
|
@@ -487,6 +482,38 @@ function addMatchedQuery(
|
|
|
487
482
|
});
|
|
488
483
|
}
|
|
489
484
|
|
|
485
|
+
function normalizeExtensiveCall(value: unknown): GongCall | null {
|
|
486
|
+
if (!value || typeof value !== "object") return null;
|
|
487
|
+
const record = value as Record<string, unknown>;
|
|
488
|
+
const metadata =
|
|
489
|
+
record.metaData && typeof record.metaData === "object"
|
|
490
|
+
? (record.metaData as Record<string, unknown>)
|
|
491
|
+
: record;
|
|
492
|
+
const id = typeof metadata.id === "string" ? metadata.id : "";
|
|
493
|
+
const started = typeof metadata.started === "string" ? metadata.started : "";
|
|
494
|
+
if (!id || !started) return null;
|
|
495
|
+
const parties = Array.isArray(record.parties)
|
|
496
|
+
? record.parties.map((party) => {
|
|
497
|
+
const item = party as Record<string, unknown>;
|
|
498
|
+
return {
|
|
499
|
+
name: typeof item.name === "string" ? item.name : "",
|
|
500
|
+
...(typeof item.emailAddress === "string"
|
|
501
|
+
? { emailAddress: item.emailAddress }
|
|
502
|
+
: {}),
|
|
503
|
+
...(typeof item.affiliation === "string"
|
|
504
|
+
? { affiliation: item.affiliation }
|
|
505
|
+
: {}),
|
|
506
|
+
};
|
|
507
|
+
})
|
|
508
|
+
: [];
|
|
509
|
+
return {
|
|
510
|
+
...metadata,
|
|
511
|
+
id,
|
|
512
|
+
started,
|
|
513
|
+
parties,
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
|
|
490
517
|
export async function searchCallsForQueries(
|
|
491
518
|
queries: string[],
|
|
492
519
|
days = 90,
|
|
@@ -515,75 +542,36 @@ export async function searchCallsForQueries(
|
|
|
515
542
|
let searchedCallCount = 0;
|
|
516
543
|
let cursor: string | undefined;
|
|
517
544
|
do {
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
if (cursor) params.set("cursor", cursor);
|
|
521
|
-
const data = await apiGet<{
|
|
522
|
-
calls?: GongCall[];
|
|
545
|
+
const data = await apiPost<{
|
|
546
|
+
calls?: unknown[];
|
|
523
547
|
records?: { cursor?: string; totalRecords?: number };
|
|
524
|
-
}>(
|
|
525
|
-
|
|
548
|
+
}>("/calls/extensive", {
|
|
549
|
+
filter: {
|
|
550
|
+
fromDateTime,
|
|
551
|
+
...(options.toDateTime ? { toDateTime: options.toDateTime } : {}),
|
|
552
|
+
},
|
|
553
|
+
contentSelector: { exposedFields: { parties: true } },
|
|
554
|
+
...(cursor ? { cursor } : {}),
|
|
555
|
+
});
|
|
556
|
+
const calls = (data.calls ?? [])
|
|
557
|
+
.map(normalizeExtensiveCall)
|
|
558
|
+
.filter((call): call is GongCall => Boolean(call))
|
|
559
|
+
.filter(isExternalCall);
|
|
526
560
|
searchedCallCount += calls.length;
|
|
527
561
|
cursor = data.records?.cursor;
|
|
528
562
|
|
|
529
|
-
const remainingForExtensive: GongCall[] = [];
|
|
530
563
|
for (const call of calls) {
|
|
531
|
-
|
|
564
|
+
const parties = call.parties ?? [];
|
|
532
565
|
for (const query of normalizedQueries) {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
566
|
+
const titleMatches = matchesGongCallQuery(
|
|
567
|
+
{ ...call, parties: [] },
|
|
568
|
+
query,
|
|
569
|
+
);
|
|
570
|
+
if (titleMatches || partyMatchesQuery(parties, query)) {
|
|
571
|
+
addMatchedQuery(matches, call, query, parties);
|
|
536
572
|
}
|
|
537
573
|
}
|
|
538
|
-
if (!matched) {
|
|
539
|
-
remainingForExtensive.push(call);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
for (let i = 0; i < remainingForExtensive.length; i += 100) {
|
|
544
574
|
if (!options.exhaustive && matches.size >= normalizedLimit) break;
|
|
545
|
-
const batch = remainingForExtensive.slice(i, i + 100);
|
|
546
|
-
const uncached = batch.filter(
|
|
547
|
-
(call) => !extensivePartyCache.has(call.id),
|
|
548
|
-
);
|
|
549
|
-
if (uncached.length) {
|
|
550
|
-
try {
|
|
551
|
-
const data = await apiPost<{ calls?: any[] }>(
|
|
552
|
-
"/calls/extensive",
|
|
553
|
-
{
|
|
554
|
-
filter: { callIds: uncached.map((call) => call.id) },
|
|
555
|
-
contentSelector: { exposedFields: { parties: true } },
|
|
556
|
-
},
|
|
557
|
-
`extensive-parties-batch:${uncached.map((call) => call.id).join(",")}`,
|
|
558
|
-
);
|
|
559
|
-
for (const call of data.calls ?? []) {
|
|
560
|
-
const id = call.metaData?.id;
|
|
561
|
-
if (!id) continue;
|
|
562
|
-
extensivePartyCache.set(
|
|
563
|
-
id,
|
|
564
|
-
(call.parties ?? []).map((party: any) => ({
|
|
565
|
-
name: party.name ?? "",
|
|
566
|
-
emailAddress: party.emailAddress ?? undefined,
|
|
567
|
-
affiliation: party.affiliation ?? undefined,
|
|
568
|
-
})),
|
|
569
|
-
);
|
|
570
|
-
}
|
|
571
|
-
} catch {
|
|
572
|
-
// Title matches already cover the obvious path. If extensive lookup
|
|
573
|
-
// fails, return those instead of failing the entire account search.
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
for (const call of batch) {
|
|
578
|
-
if (!options.exhaustive && matches.size >= normalizedLimit) break;
|
|
579
|
-
const parties = extensivePartyCache.get(call.id) ?? [];
|
|
580
|
-
if (!parties.length) continue;
|
|
581
|
-
for (const query of normalizedQueries) {
|
|
582
|
-
if (partyMatchesQuery(parties, query)) {
|
|
583
|
-
addMatchedQuery(matches, call, query, parties);
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
575
|
}
|
|
588
576
|
} while (cursor && (options.exhaustive || matches.size < normalizedLimit));
|
|
589
577
|
|
|
@@ -8,6 +8,22 @@ import {
|
|
|
8
8
|
} from "./provider-credentials";
|
|
9
9
|
|
|
10
10
|
const API_BASE = "https://api.hubapi.com";
|
|
11
|
+
const HUBSPOT_SEARCH_MIN_INTERVAL_MS = 200;
|
|
12
|
+
|
|
13
|
+
let hubspotSearchSchedule = Promise.resolve();
|
|
14
|
+
let nextHubSpotSearchAt = 0;
|
|
15
|
+
|
|
16
|
+
async function waitForHubSpotSearchSlot(): Promise<void> {
|
|
17
|
+
const scheduled = hubspotSearchSchedule.then(async () => {
|
|
18
|
+
const delay = Math.max(0, nextHubSpotSearchAt - Date.now());
|
|
19
|
+
if (delay > 0) {
|
|
20
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
21
|
+
}
|
|
22
|
+
nextHubSpotSearchAt = Date.now() + HUBSPOT_SEARCH_MIN_INTERVAL_MS;
|
|
23
|
+
});
|
|
24
|
+
hubspotSearchSchedule = scheduled.catch(() => undefined);
|
|
25
|
+
await scheduled;
|
|
26
|
+
}
|
|
11
27
|
|
|
12
28
|
// In-memory cache
|
|
13
29
|
const cache = new Map<string, { data: unknown; ts: number }>();
|
|
@@ -89,6 +105,10 @@ async function apiPost<T>(
|
|
|
89
105
|
return cached.data as T;
|
|
90
106
|
}
|
|
91
107
|
|
|
108
|
+
if (path.endsWith("/search")) {
|
|
109
|
+
await waitForHubSpotSearchSlot();
|
|
110
|
+
}
|
|
111
|
+
|
|
92
112
|
const res = await hubspotFetch(`${API_BASE}${path}`, {
|
|
93
113
|
method: "POST",
|
|
94
114
|
headers: {
|
|
@@ -164,6 +184,18 @@ export interface Deal {
|
|
|
164
184
|
};
|
|
165
185
|
}
|
|
166
186
|
|
|
187
|
+
export interface HubSpotSearchFilter {
|
|
188
|
+
propertyName: string;
|
|
189
|
+
operator: string;
|
|
190
|
+
value?: string;
|
|
191
|
+
values?: string[];
|
|
192
|
+
highValue?: string;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export interface HubSpotSearchFilterGroup {
|
|
196
|
+
filters: HubSpotSearchFilter[];
|
|
197
|
+
}
|
|
198
|
+
|
|
167
199
|
export interface HubSpotOwner {
|
|
168
200
|
id: string;
|
|
169
201
|
email?: string;
|
|
@@ -398,6 +430,7 @@ async function resolveObjectProperties(
|
|
|
398
430
|
export async function searchHubSpotObjects(options: {
|
|
399
431
|
objectType: HubSpotObjectType;
|
|
400
432
|
query?: string;
|
|
433
|
+
filterGroups?: HubSpotSearchFilterGroup[];
|
|
401
434
|
properties?: string[];
|
|
402
435
|
limit?: number;
|
|
403
436
|
after?: string;
|
|
@@ -408,19 +441,23 @@ export async function searchHubSpotObjects(options: {
|
|
|
408
441
|
properties: string[];
|
|
409
442
|
}> {
|
|
410
443
|
const objectType = options.objectType;
|
|
411
|
-
const limit = Math.max(1, Math.min(
|
|
444
|
+
const limit = Math.max(1, Math.min(200, options.limit ?? 25));
|
|
412
445
|
const query = options.query?.trim();
|
|
446
|
+
const filterGroups = options.filterGroups?.filter(
|
|
447
|
+
(group) => group.filters.length > 0,
|
|
448
|
+
);
|
|
413
449
|
const properties = await resolveObjectProperties(
|
|
414
450
|
objectType,
|
|
415
451
|
options.properties ?? [],
|
|
416
452
|
);
|
|
417
453
|
|
|
418
|
-
if (query) {
|
|
454
|
+
if (query || filterGroups?.length) {
|
|
419
455
|
const body: Record<string, unknown> = {
|
|
420
|
-
query,
|
|
421
456
|
limit,
|
|
422
457
|
properties,
|
|
423
458
|
};
|
|
459
|
+
if (query) body.query = query;
|
|
460
|
+
if (filterGroups?.length) body.filterGroups = filterGroups;
|
|
424
461
|
if (options.after) body.after = options.after;
|
|
425
462
|
const data = await apiPost<HubSpotObjectListResponse>(
|
|
426
463
|
`/crm/v3/objects/${objectType}/search`,
|
|
@@ -7,7 +7,12 @@ import { resolveAnalyticsProviderCredential } from "./provider-credentials";
|
|
|
7
7
|
|
|
8
8
|
const NOTION_API = "https://api.notion.com/v1";
|
|
9
9
|
const NOTION_VERSION = "2022-06-28";
|
|
10
|
-
const
|
|
10
|
+
const CONTENT_DATABASE_REQUIRED_PROPERTIES = [
|
|
11
|
+
"Topic",
|
|
12
|
+
"Status",
|
|
13
|
+
"Publish Date",
|
|
14
|
+
] as const;
|
|
15
|
+
const MAX_DATABASE_DISCOVERY_PAGES = 10;
|
|
11
16
|
|
|
12
17
|
// Cache for Notion data (refreshed less frequently)
|
|
13
18
|
const contentCalendarCache = new Map<
|
|
@@ -15,6 +20,10 @@ const contentCalendarCache = new Map<
|
|
|
15
20
|
{ entries: ContentCalendarEntry[]; ts: number }
|
|
16
21
|
>();
|
|
17
22
|
const CACHE_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
23
|
+
const contentDatabaseCache = new Map<
|
|
24
|
+
string,
|
|
25
|
+
{ databaseId: string; ts: number }
|
|
26
|
+
>();
|
|
18
27
|
|
|
19
28
|
// Page block cache
|
|
20
29
|
const pageCache = new Map<string, { data: NotionPageData; ts: number }>();
|
|
@@ -116,6 +125,66 @@ function extractProp(props: any, name: string): string {
|
|
|
116
125
|
}
|
|
117
126
|
}
|
|
118
127
|
|
|
128
|
+
async function resolveContentDatabaseId(
|
|
129
|
+
requestedDatabaseId?: string,
|
|
130
|
+
): Promise<string> {
|
|
131
|
+
const requested = requestedDatabaseId?.trim();
|
|
132
|
+
if (requested) return requested;
|
|
133
|
+
|
|
134
|
+
const scope = credentialCacheScope("NOTION_API_KEY");
|
|
135
|
+
const cached = contentDatabaseCache.get(scope);
|
|
136
|
+
if (cached && Date.now() - cached.ts < CACHE_TTL_MS) {
|
|
137
|
+
return cached.databaseId;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const candidates: Array<{ id: string; score: number }> = [];
|
|
141
|
+
let startCursor: string | undefined;
|
|
142
|
+
for (let page = 0; page < MAX_DATABASE_DISCOVERY_PAGES; page += 1) {
|
|
143
|
+
const result = (await notionPost("/search", {
|
|
144
|
+
filter: { property: "object", value: "database" },
|
|
145
|
+
page_size: 100,
|
|
146
|
+
...(startCursor ? { start_cursor: startCursor } : {}),
|
|
147
|
+
})) as any;
|
|
148
|
+
|
|
149
|
+
for (const database of result.results ?? []) {
|
|
150
|
+
const properties = database.properties ?? {};
|
|
151
|
+
if (
|
|
152
|
+
!CONTENT_DATABASE_REQUIRED_PROPERTIES.every(
|
|
153
|
+
(name) => name in properties,
|
|
154
|
+
)
|
|
155
|
+
) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const title = richTextToString(database.title ?? []).toLowerCase();
|
|
159
|
+
const titleScore = /content/.test(title) ? 2 : 0;
|
|
160
|
+
const calendarScore = /calendar/.test(title) ? 1 : 0;
|
|
161
|
+
candidates.push({ id: database.id, score: titleScore + calendarScore });
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
startCursor = result.next_cursor ?? undefined;
|
|
165
|
+
if (!result.has_more || !startCursor) break;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
candidates.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
169
|
+
const best = candidates[0];
|
|
170
|
+
if (!best) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
"No accessible Notion database has the required Topic, Status, and Publish Date properties. Pass databaseId explicitly or share the content calendar database with the integration.",
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
if (candidates[1]?.score === best.score) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
"Multiple Notion databases match the content calendar schema. Pass databaseId explicitly to choose one.",
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
contentDatabaseCache.set(scope, {
|
|
182
|
+
databaseId: best.id,
|
|
183
|
+
ts: Date.now(),
|
|
184
|
+
});
|
|
185
|
+
return best.id;
|
|
186
|
+
}
|
|
187
|
+
|
|
119
188
|
export interface ContentCalendarEntry {
|
|
120
189
|
id: string;
|
|
121
190
|
title: string;
|
|
@@ -135,8 +204,11 @@ export interface ContentCalendarEntry {
|
|
|
135
204
|
}
|
|
136
205
|
|
|
137
206
|
// Fetch all content calendar entries, paginating through results
|
|
138
|
-
export async function getContentCalendar(
|
|
139
|
-
|
|
207
|
+
export async function getContentCalendar(
|
|
208
|
+
requestedDatabaseId?: string,
|
|
209
|
+
): Promise<ContentCalendarEntry[]> {
|
|
210
|
+
const databaseId = await resolveContentDatabaseId(requestedDatabaseId);
|
|
211
|
+
const calendarCacheKey = `${credentialCacheScope("NOTION_API_KEY")}:${databaseId}`;
|
|
140
212
|
const cached = contentCalendarCache.get(calendarCacheKey);
|
|
141
213
|
if (cached && Date.now() - cached.ts < CACHE_TTL_MS) {
|
|
142
214
|
return cached.entries;
|
|
@@ -151,7 +223,7 @@ export async function getContentCalendar(): Promise<ContentCalendarEntry[]> {
|
|
|
151
223
|
if (startCursor) body.start_cursor = startCursor;
|
|
152
224
|
|
|
153
225
|
const result = (await notionPost(
|
|
154
|
-
`/databases/${
|
|
226
|
+
`/databases/${encodeURIComponent(databaseId)}/query`,
|
|
155
227
|
body,
|
|
156
228
|
)) as any;
|
|
157
229
|
|
|
@@ -290,10 +362,13 @@ export async function getNotionPage(pageId: string): Promise<NotionPageData> {
|
|
|
290
362
|
return data;
|
|
291
363
|
}
|
|
292
364
|
|
|
293
|
-
export async function getContentCalendarSchema(
|
|
294
|
-
|
|
295
|
-
> {
|
|
296
|
-
const
|
|
365
|
+
export async function getContentCalendarSchema(
|
|
366
|
+
requestedDatabaseId?: string,
|
|
367
|
+
): Promise<{ name: string; type: string }[]> {
|
|
368
|
+
const databaseId = await resolveContentDatabaseId(requestedDatabaseId);
|
|
369
|
+
const db = (await notionGet(
|
|
370
|
+
`/databases/${encodeURIComponent(databaseId)}`,
|
|
371
|
+
)) as any;
|
|
297
372
|
const props = db.properties ?? {};
|
|
298
373
|
return Object.entries(props).map(([name, def]: [string, any]) => ({
|
|
299
374
|
name,
|
|
@@ -29,6 +29,7 @@ export const DATA_QUERY_ACTIONS = new Set([
|
|
|
29
29
|
"match-error-issues",
|
|
30
30
|
"gcloud",
|
|
31
31
|
"gong-calls",
|
|
32
|
+
"gong-native-insights",
|
|
32
33
|
"grafana",
|
|
33
34
|
"hubspot-deals",
|
|
34
35
|
"hubspot-metrics",
|
|
@@ -799,6 +800,9 @@ function actionEvidenceTextForSourceRecords(result: {
|
|
|
799
800
|
transcripts: record.transcripts,
|
|
800
801
|
});
|
|
801
802
|
}
|
|
803
|
+
if (normalizedName === "gong-native-insights") {
|
|
804
|
+
return "";
|
|
805
|
+
}
|
|
802
806
|
if (normalizedName === "run-code") {
|
|
803
807
|
return content;
|
|
804
808
|
}
|