@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
|
@@ -20,10 +20,12 @@ const DEFAULT_GONG_TRANSCRIPT_LIMIT = 3;
|
|
|
20
20
|
const MAX_GONG_TRANSCRIPT_LIMIT = 50;
|
|
21
21
|
const DEFAULT_TRANSCRIPT_MAX_CHARS = 8_000;
|
|
22
22
|
const MAX_TRANSCRIPT_MAX_CHARS = 100_000;
|
|
23
|
+
const MAX_AGGREGATE_TRANSCRIPT_CHARS = 60_000;
|
|
23
24
|
const DEFAULT_TRANSCRIPT_SCAN_LIMIT = 50;
|
|
24
25
|
const MAX_TRANSCRIPT_SCAN_LIMIT = 200;
|
|
25
26
|
const DEFAULT_TRANSCRIPT_SEARCH_MAX_CHARS = MAX_TRANSCRIPT_MAX_CHARS;
|
|
26
27
|
const TRANSCRIPT_BATCH_SIZE = 20;
|
|
28
|
+
const TRANSCRIPT_BATCH_CONCURRENCY = 3;
|
|
27
29
|
const MAX_TRANSCRIPT_MATCHES_PER_CALL = 5;
|
|
28
30
|
const MATCH_SNIPPET_RADIUS = 240;
|
|
29
31
|
|
|
@@ -74,6 +76,20 @@ function normalizeBoundedInt(
|
|
|
74
76
|
return Math.max(min, Math.min(max, Math.floor(value!)));
|
|
75
77
|
}
|
|
76
78
|
|
|
79
|
+
function boundedTranscriptExcerptChars(
|
|
80
|
+
requestedChars: number,
|
|
81
|
+
transcriptCount: number,
|
|
82
|
+
): number {
|
|
83
|
+
if (transcriptCount <= 0) return requestedChars;
|
|
84
|
+
return Math.min(
|
|
85
|
+
requestedChars,
|
|
86
|
+
Math.max(
|
|
87
|
+
1_000,
|
|
88
|
+
Math.floor(MAX_AGGREGATE_TRANSCRIPT_CHARS / transcriptCount),
|
|
89
|
+
),
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
77
93
|
function asRecord(value: unknown): Record<string, unknown> | null {
|
|
78
94
|
return value && typeof value === "object"
|
|
79
95
|
? (value as Record<string, unknown>)
|
|
@@ -218,6 +234,36 @@ async function fetchTranscriptBatch(calls: GongCall[]): Promise<{
|
|
|
218
234
|
}
|
|
219
235
|
}
|
|
220
236
|
|
|
237
|
+
async function fetchTranscriptBatches(calls: GongCall[]): Promise<
|
|
238
|
+
Array<{
|
|
239
|
+
calls: GongCall[];
|
|
240
|
+
result: Awaited<ReturnType<typeof fetchTranscriptBatch>>;
|
|
241
|
+
}>
|
|
242
|
+
> {
|
|
243
|
+
const batches = chunkCalls(calls, TRANSCRIPT_BATCH_SIZE);
|
|
244
|
+
const results: Array<{
|
|
245
|
+
calls: GongCall[];
|
|
246
|
+
result: Awaited<ReturnType<typeof fetchTranscriptBatch>>;
|
|
247
|
+
}> = [];
|
|
248
|
+
for (
|
|
249
|
+
let index = 0;
|
|
250
|
+
index < batches.length;
|
|
251
|
+
index += TRANSCRIPT_BATCH_CONCURRENCY
|
|
252
|
+
) {
|
|
253
|
+
results.push(
|
|
254
|
+
...(await Promise.all(
|
|
255
|
+
batches
|
|
256
|
+
.slice(index, index + TRANSCRIPT_BATCH_CONCURRENCY)
|
|
257
|
+
.map(async (batch) => ({
|
|
258
|
+
calls: batch,
|
|
259
|
+
result: await fetchTranscriptBatch(batch),
|
|
260
|
+
})),
|
|
261
|
+
)),
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
return results;
|
|
265
|
+
}
|
|
266
|
+
|
|
221
267
|
async function searchTranscriptEvidence(
|
|
222
268
|
calls: GongCall[],
|
|
223
269
|
query: string,
|
|
@@ -234,8 +280,10 @@ async function searchTranscriptEvidence(
|
|
|
234
280
|
let truncatedTranscripts = 0;
|
|
235
281
|
const callsToScan = calls.slice(0, scanLimit);
|
|
236
282
|
|
|
237
|
-
for (const
|
|
238
|
-
|
|
283
|
+
for (const {
|
|
284
|
+
calls: batch,
|
|
285
|
+
result: batchResult,
|
|
286
|
+
} of await fetchTranscriptBatches(callsToScan)) {
|
|
239
287
|
errors.push(...batchResult.errors);
|
|
240
288
|
|
|
241
289
|
for (const call of batch) {
|
|
@@ -374,8 +422,10 @@ async function loadTranscriptEvidence(
|
|
|
374
422
|
): Promise<TranscriptEvidence[]> {
|
|
375
423
|
const evidence: TranscriptEvidence[] = [];
|
|
376
424
|
const callsToLoad = calls.slice(0, limit);
|
|
377
|
-
for (const
|
|
378
|
-
|
|
425
|
+
for (const {
|
|
426
|
+
calls: batch,
|
|
427
|
+
result: batchResult,
|
|
428
|
+
} of await fetchTranscriptBatches(callsToLoad)) {
|
|
379
429
|
const errorByCallId = new Map(
|
|
380
430
|
batchResult.errors.map((error) => [error.callId, error.error]),
|
|
381
431
|
);
|
|
@@ -411,19 +461,31 @@ async function loadTranscriptEvidence(
|
|
|
411
461
|
* ISO string for the Gong window filters. Returns undefined for empty/invalid
|
|
412
462
|
* input so the caller falls back to the `days` window.
|
|
413
463
|
*/
|
|
414
|
-
function normalizeGongDate(
|
|
464
|
+
function normalizeGongDate(
|
|
465
|
+
value: string | undefined,
|
|
466
|
+
boundary: "start" | "end" = "start",
|
|
467
|
+
): string | undefined {
|
|
415
468
|
if (!value || typeof value !== "string") return undefined;
|
|
416
|
-
const
|
|
469
|
+
const normalized = value.trim();
|
|
470
|
+
const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(normalized);
|
|
471
|
+
const ms = Date.parse(dateOnly ? `${normalized}T00:00:00.000Z` : normalized);
|
|
417
472
|
if (Number.isNaN(ms)) return undefined;
|
|
418
|
-
|
|
473
|
+
const date = new Date(ms);
|
|
474
|
+
if (dateOnly && boundary === "end") date.setUTCDate(date.getUTCDate() + 1);
|
|
475
|
+
return date.toISOString();
|
|
419
476
|
}
|
|
420
477
|
|
|
421
478
|
export default defineAction({
|
|
422
479
|
// Read-only provider query: safe to call from run-code `appAction` and
|
|
423
480
|
// reusable across continuation retries (no re-fetch on resume).
|
|
424
481
|
readOnly: true,
|
|
482
|
+
publicAgent: { expose: true, readOnly: true, requiresAuth: true },
|
|
483
|
+
// A bounded multi-call transcript review is intentionally larger than the
|
|
484
|
+
// shared 50K tool default. One batched result avoids 10+ one-call-at-a-time
|
|
485
|
+
// model round trips while still staying well below the model context limit.
|
|
486
|
+
maxResultChars: 100_000,
|
|
425
487
|
description:
|
|
426
|
-
"Query Gong sales calls, transcripts, and users. Pass --users for user list, --transcript for one transcript, --company to search by company/domain/person/email. For bounded account-level transcript mention/search questions, set transcriptQuery to search matching transcripts server-side and return coverage counts plus snippets instead of large transcript blobs. For deal, customer, objection, next-step, or deep-dive analysis, set includeTranscripts=true only when you need broad qualitative context rather than a specific term search. For
|
|
488
|
+
"Query Gong sales calls, transcripts, and users. Pass --users for user list, --transcript for one transcript, --company to search by company/domain/person/email. For bounded account-level transcript mention/search questions, set transcriptQuery to search matching transcripts server-side and return coverage counts plus snippets instead of large transcript blobs. For deal, customer, objection, next-step, or deep-dive analysis, set includeTranscripts=true only when you need broad qualitative context rather than a specific term search. For an 'all calls' transcript review in a bounded account/date window, use exhaustive=true with after/before and includeTranscripts=true; the action batches transcript retrieval and reports complete/partial coverage instead of forcing one tool call per transcript. For very broad cohorts or defensible absence searches, use provider-api-catalog(provider='gong') and provider-corpus-job mode='batch-search' against /calls/transcript after call-id discovery.",
|
|
427
489
|
schema: z.object({
|
|
428
490
|
users: cliBoolean.optional().describe("Set to true to list Gong users"),
|
|
429
491
|
transcript: z.string().optional().describe("Call ID to get transcript"),
|
|
@@ -470,7 +532,7 @@ export default defineAction({
|
|
|
470
532
|
.max(MAX_TRANSCRIPT_MAX_CHARS)
|
|
471
533
|
.optional()
|
|
472
534
|
.describe(
|
|
473
|
-
"Maximum transcript characters to return per call (default 8000, max 100000). Use the default for analysis; raise it only when the user asks for more quoted detail.",
|
|
535
|
+
"Maximum transcript characters to return per call (default 8000, max 100000). Batched results also share a 60000-character aggregate excerpt budget. Use the default for analysis; raise it only when the user asks for more quoted detail.",
|
|
474
536
|
),
|
|
475
537
|
transcriptQuery: z
|
|
476
538
|
.string()
|
|
@@ -490,7 +552,7 @@ export default defineAction({
|
|
|
490
552
|
exhaustive: cliBoolean
|
|
491
553
|
.optional()
|
|
492
554
|
.describe(
|
|
493
|
-
"Return EVERY matching call in the window instead of stopping at `limit` — use this for complete cohort/account coverage when 'how many' or absence matters
|
|
555
|
+
"Return EVERY matching call in the window instead of stopping at `limit` — use this for complete cohort/account coverage when 'how many' or absence matters. By default this is metadata-only. With includeTranscripts=true, transcripts are fetched in batches up to transcriptLimit (all matched calls by default when there are 50 or fewer) and explicit coverage is returned. Always bound it with after/before or a small days window: an unbounded exhaustive scan pages the whole Gong org and can hit the function timeout.",
|
|
494
556
|
),
|
|
495
557
|
after: z
|
|
496
558
|
.string()
|
|
@@ -532,21 +594,21 @@ export default defineAction({
|
|
|
532
594
|
);
|
|
533
595
|
const exhaustive = Boolean(args.exhaustive);
|
|
534
596
|
const fromDateTime = normalizeGongDate(args.after);
|
|
535
|
-
const toDateTime = normalizeGongDate(args.before);
|
|
597
|
+
const toDateTime = normalizeGongDate(args.before, "end");
|
|
536
598
|
const result = await searchCalls(args.company, days, limit, {
|
|
537
599
|
exhaustive,
|
|
538
600
|
...(fromDateTime ? { fromDateTime } : {}),
|
|
539
601
|
...(toDateTime ? { toDateTime } : {}),
|
|
540
602
|
});
|
|
541
|
-
|
|
542
|
-
// transcripts (that would bloat context and risk the function timeout).
|
|
543
|
-
// The agent pulls transcripts deliberately afterward (--transcript or a
|
|
544
|
-
// run-code scan over result.calls).
|
|
545
|
-
const shouldLoadTranscripts =
|
|
546
|
-
Boolean(args.includeTranscripts) && !exhaustive;
|
|
603
|
+
const shouldLoadTranscripts = Boolean(args.includeTranscripts);
|
|
547
604
|
const transcriptLimit = normalizeBoundedInt(
|
|
548
605
|
args.transcriptLimit,
|
|
549
|
-
|
|
606
|
+
exhaustive
|
|
607
|
+
? Math.max(
|
|
608
|
+
1,
|
|
609
|
+
Math.min(result.calls.length, MAX_GONG_TRANSCRIPT_LIMIT),
|
|
610
|
+
)
|
|
611
|
+
: DEFAULT_GONG_TRANSCRIPT_LIMIT,
|
|
550
612
|
1,
|
|
551
613
|
MAX_GONG_TRANSCRIPT_LIMIT,
|
|
552
614
|
);
|
|
@@ -557,6 +619,10 @@ export default defineAction({
|
|
|
557
619
|
1_000,
|
|
558
620
|
MAX_TRANSCRIPT_MAX_CHARS,
|
|
559
621
|
);
|
|
622
|
+
const boundedTranscriptExcerptMaxChars = boundedTranscriptExcerptChars(
|
|
623
|
+
transcriptExcerptMaxChars,
|
|
624
|
+
Math.min(transcriptLimit, result.calls.length),
|
|
625
|
+
);
|
|
560
626
|
const transcriptSearchMaxChars = normalizeBoundedInt(
|
|
561
627
|
args.transcriptMaxChars,
|
|
562
628
|
transcriptQuery
|
|
@@ -583,9 +649,16 @@ export default defineAction({
|
|
|
583
649
|
? await loadTranscriptEvidence(
|
|
584
650
|
result.calls,
|
|
585
651
|
transcriptLimit,
|
|
586
|
-
|
|
652
|
+
boundedTranscriptExcerptMaxChars,
|
|
587
653
|
)
|
|
588
654
|
: undefined;
|
|
655
|
+
const transcriptErrors =
|
|
656
|
+
transcripts?.filter((transcript) => Boolean(transcript.error)) ?? [];
|
|
657
|
+
const transcriptCoverageComplete = Boolean(
|
|
658
|
+
transcripts &&
|
|
659
|
+
transcripts.length >= result.calls.length &&
|
|
660
|
+
transcriptErrors.length === 0,
|
|
661
|
+
);
|
|
589
662
|
|
|
590
663
|
return {
|
|
591
664
|
...result,
|
|
@@ -611,15 +684,29 @@ export default defineAction({
|
|
|
611
684
|
}
|
|
612
685
|
: {}),
|
|
613
686
|
...(transcripts ? { transcripts } : {}),
|
|
687
|
+
...(transcripts
|
|
688
|
+
? {
|
|
689
|
+
transcriptCoverage: {
|
|
690
|
+
availableCalls: result.calls.length,
|
|
691
|
+
inspectedCalls: transcripts.length,
|
|
692
|
+
successfulCalls: transcripts.length - transcriptErrors.length,
|
|
693
|
+
errorCount: transcriptErrors.length,
|
|
694
|
+
coverageComplete: transcriptCoverageComplete,
|
|
695
|
+
scanLimited: transcripts.length < result.calls.length,
|
|
696
|
+
},
|
|
697
|
+
}
|
|
698
|
+
: {}),
|
|
614
699
|
guidance: [
|
|
615
700
|
transcriptSearch
|
|
616
701
|
? `Transcript search inspected ${transcriptSearch.inspectedCalls} of ${result.calls.length} matching call(s) for "${transcriptQuery}" and found ${transcriptSearch.matches.length} matching call(s). Use coverageComplete/errors before making absence claims; increase transcriptScanLimit or narrow the window if coverage is incomplete.`
|
|
617
702
|
: "",
|
|
618
703
|
exhaustive
|
|
619
|
-
?
|
|
704
|
+
? shouldLoadTranscripts
|
|
705
|
+
? `Exhaustive discovery returned all ${result.calls.length} matching call(s) in the bounded window before loading transcripts.`
|
|
706
|
+
: `Exhaustive discovery: returned all ${result.calls.length} matching call(s) in the window (metadata only). Set includeTranscripts=true to fetch the bounded set in batches, or use a provider-corpus job for a broader transcript search.`
|
|
620
707
|
: callLimitGuidance(result.limit, result.truncated),
|
|
621
708
|
shouldLoadTranscripts
|
|
622
|
-
? `Loaded transcript excerpts for ${transcripts?.length ?? 0} matching call(s). Ground qualitative claims in the transcript text and cite
|
|
709
|
+
? `Loaded transcript excerpts for ${transcripts?.length ?? 0} of ${result.calls.length} matching call(s) in batches (${transcriptCoverageComplete ? "complete coverage" : "partial coverage"}). Ground qualitative claims in the transcript text and cite transcriptCoverage; do not fetch these calls again one at a time.`
|
|
623
710
|
: exhaustive
|
|
624
711
|
? ""
|
|
625
712
|
: "For deep-dive or qualitative analysis, call this action again with includeTranscripts=true before drawing conclusions from call content.",
|
|
@@ -651,6 +738,10 @@ export default defineAction({
|
|
|
651
738
|
1_000,
|
|
652
739
|
MAX_TRANSCRIPT_MAX_CHARS,
|
|
653
740
|
);
|
|
741
|
+
const boundedTranscriptExcerptMaxChars = boundedTranscriptExcerptChars(
|
|
742
|
+
transcriptExcerptMaxChars,
|
|
743
|
+
Math.min(transcriptLimit, limited.calls.length),
|
|
744
|
+
);
|
|
654
745
|
const transcriptSearchMaxChars = normalizeBoundedInt(
|
|
655
746
|
args.transcriptMaxChars,
|
|
656
747
|
transcriptQuery
|
|
@@ -677,7 +768,7 @@ export default defineAction({
|
|
|
677
768
|
? await loadTranscriptEvidence(
|
|
678
769
|
limited.calls,
|
|
679
770
|
transcriptLimit,
|
|
680
|
-
|
|
771
|
+
boundedTranscriptExcerptMaxChars,
|
|
681
772
|
)
|
|
682
773
|
: undefined;
|
|
683
774
|
|
|
@@ -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
|
+
});
|