@agent-native/core 0.108.0 → 0.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +25 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +162 -17
- package/corpus/core/src/a2a/correlation.ts +50 -0
- package/corpus/core/src/a2a/handlers.ts +200 -14
- package/corpus/core/src/a2a/index.ts +7 -1
- package/corpus/core/src/a2a/invoke.ts +77 -1
- package/corpus/core/src/a2a/server.ts +13 -1
- package/corpus/core/src/a2a/task-store.ts +146 -6
- package/corpus/core/src/a2a/types.ts +32 -0
- package/corpus/core/src/action.ts +5 -2
- package/corpus/core/src/agent/production-agent.ts +33 -4
- package/corpus/core/src/client/AssistantChat.tsx +648 -603
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
- package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
- package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
- package/corpus/core/src/client/analytics.ts +84 -0
- package/corpus/core/src/client/chat/message-components.tsx +94 -22
- package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
- package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
- package/corpus/core/src/client/chat-thread-url.ts +11 -0
- package/corpus/core/src/client/error-capture.ts +12 -0
- package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
- package/corpus/core/src/client/index.ts +2 -0
- package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
- package/corpus/core/src/client/session-replay.ts +31 -0
- package/corpus/core/src/client/use-run-stuck-detection.ts +27 -1
- package/corpus/core/src/db/client.ts +55 -0
- package/corpus/core/src/extensions/actions.ts +2 -14
- package/corpus/core/src/extensions/store.ts +1 -1
- package/corpus/core/src/localization/default-messages.ts +3 -0
- package/corpus/core/src/mcp/build-server.ts +2 -2
- package/corpus/core/src/observability/traces.ts +172 -19
- package/corpus/core/src/progress/actions.ts +4 -2
- package/corpus/core/src/provider-api/index.ts +205 -105
- package/corpus/core/src/scripts/call-agent.ts +190 -19
- package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +112 -25
- package/corpus/core/src/server/agent-chat-plugin.ts +136 -4
- package/corpus/core/src/styles/agent-conversation.css +7 -0
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
- package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
- package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
- package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
- package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
- package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
- package/corpus/templates/analytics/AGENTS.md +22 -13
- package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
- package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
- package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
- package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
- package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
- package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
- package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
- package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
- package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
- package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +13 -0
- package/corpus/templates/analytics/app/i18n-data.ts +134 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
- package/corpus/templates/analytics/changelog/2026-07-17-analytics-now-includes-a-default-alert-for-spikes-in-stuck-agent-chats.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +23 -14
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +5 -1
- package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
- package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
- package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +3 -3
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +209 -87
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
- package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
- package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
- package/corpus/templates/analytics/server/lib/gong.ts +54 -66
- package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
- package/corpus/templates/analytics/server/lib/notion.ts +83 -8
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
- package/corpus/templates/analytics/server/lib/slack.ts +242 -90
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
- package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
- package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
- package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
- package/corpus/templates/clips/actions/finalize-recording.ts +541 -62
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
- package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
- package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
- package/corpus/templates/clips/app/components/player/playback-comment-overlay.tsx +17 -2
- package/corpus/templates/clips/app/components/player/video-player.tsx +14 -2
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +2 -2
- package/corpus/templates/clips/app/entry.client.tsx +6 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
- package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
- package/corpus/templates/clips/app/routes/record.tsx +3 -3
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -3
- package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-clips-now-retries-storage-verification-in-the-background-ins.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-fixed-broken-thumbnail-icons-appearing-over-playable-clip-em.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-playback-comments-stay-readable-at-faster-playback-speeds.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/finalize-recovery.ts +3 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +3 -3
- package/corpus/templates/clips/desktop/src/app.tsx +19 -7
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +111 -13
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +16 -7
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -4
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +32 -15
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +45 -18
- package/corpus/templates/clips/server/jobs/media-verification.ts +130 -0
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +15 -0
- package/corpus/templates/clips/server/lib/media-verification-state.ts +38 -0
- package/corpus/templates/clips/server/lib/player-thumbnail-url.ts +31 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +10 -3
- package/corpus/templates/clips/server/plugins/auth.ts +5 -5
- package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +12 -2
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +6 -1
- package/corpus/templates/clips/server/routes/api/thumbnail/[recordingId].get.ts +340 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +24 -7
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +91 -7
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/status.get.ts +14 -0
- package/corpus/templates/clips/shared/finalize-recovery.ts +61 -2
- package/corpus/templates/clips/shared/share-meta.ts +1 -1
- package/corpus/templates/content/app/entry.client.tsx +6 -1
- package/corpus/templates/dispatch/AGENTS.md +5 -0
- package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
- package/corpus/templates/mail/app/entry.client.tsx +6 -1
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
- package/corpus/templates/slides/.env.example +0 -1
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/DEVELOPING.md +2 -2
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
- package/corpus/templates/slides/actions/logo-config.ts +6 -7
- package/corpus/templates/slides/actions/search-images.ts +11 -39
- package/corpus/templates/slides/actions/search-logos.ts +5 -52
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
- package/corpus/templates/slides/app/entry.client.tsx +6 -1
- package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
- package/corpus/templates/slides/server/register-secrets.ts +30 -0
- package/dist/a2a/client.d.ts +47 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +94 -12
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/correlation.d.ts +10 -0
- package/dist/a2a/correlation.d.ts.map +1 -0
- package/dist/a2a/correlation.js +40 -0
- package/dist/a2a/correlation.js.map +1 -0
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +147 -15
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/index.d.ts +4 -4
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +2 -2
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/invoke.d.ts +29 -2
- package/dist/a2a/invoke.d.ts.map +1 -1
- package/dist/a2a/invoke.js +33 -1
- package/dist/a2a/invoke.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +14 -1
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +12 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +96 -6
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/a2a/types.d.ts +27 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/action.d.ts +5 -2
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +14 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +19 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +14 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +158 -136
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +27 -4
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +21 -39
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-sidebar-state.d.ts +1 -0
- package/dist/client/agent-sidebar-state.d.ts.map +1 -1
- package/dist/client/agent-sidebar-state.js +4 -0
- package/dist/client/agent-sidebar-state.js.map +1 -1
- package/dist/client/analytics.d.ts +14 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +67 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +8 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +62 -19
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +6 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +83 -14
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
- package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
- package/dist/client/chat-thread-url.d.ts +2 -0
- package/dist/client/chat-thread-url.d.ts.map +1 -0
- package/dist/client/chat-thread-url.js +12 -0
- package/dist/client/chat-thread-url.js.map +1 -0
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +7 -0
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
- package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionSlot.js +28 -3
- package/dist/client/extensions/ExtensionSlot.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/route-chunk-recovery.d.ts.map +1 -1
- package/dist/client/route-chunk-recovery.js +14 -9
- package/dist/client/route-chunk-recovery.js.map +1 -1
- package/dist/client/session-replay.d.ts +15 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +20 -0
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +25 -1
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/db/client.d.ts +7 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +33 -0
- package/dist/db/client.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +2 -10
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/store.js +1 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/localization/default-messages.d.ts +3 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +3 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/build-server.d.ts +2 -0
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +2 -2
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts +9 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +137 -19
- package/dist/observability/traces.js.map +1 -1
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +3 -2
- package/dist/progress/actions.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +91 -8
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +140 -17
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat/action-filters-a2a.d.ts +24 -2
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +62 -7
- package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +118 -5
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-conversation.css +7 -0
- package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
- package/dist/templates/default/app/i18n/de-DE.ts +20 -0
- package/dist/templates/default/app/i18n/en-US.ts +20 -0
- package/dist/templates/default/app/i18n/es-ES.ts +20 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/package.json +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +20 -0
- package/src/templates/default/app/i18n/de-DE.ts +20 -0
- package/src/templates/default/app/i18n/en-US.ts +20 -0
- package/src/templates/default/app/i18n/es-ES.ts +20 -0
- package/src/templates/default/app/i18n/fr-FR.ts +21 -0
- package/src/templates/default/app/i18n/hi-IN.ts +19 -0
- package/src/templates/default/app/i18n/ja-JP.ts +20 -0
- package/src/templates/default/app/i18n/ko-KR.ts +19 -0
- package/src/templates/default/app/i18n/pt-BR.ts +20 -0
- package/src/templates/default/app/i18n/zh-CN.ts +19 -0
- package/src/templates/default/app/i18n/zh-TW.ts +19 -0
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/corpus/templates/analytics/server/handlers/github.ts +0 -200
- package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
- package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
- package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
- package/corpus/templates/analytics/server/lib/github.ts +0 -660
- package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
- package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
- package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
- package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
- package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
- package/corpus/templates/slides/actions/image-search.ts +0 -64
- package/corpus/templates/slides/actions/import-github.ts +0 -182
- package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
A2ATaskTimeoutError,
|
|
@@ -6,7 +6,12 @@ import {
|
|
|
6
6
|
shouldPreferGlobalA2ASecret,
|
|
7
7
|
signA2AToken,
|
|
8
8
|
} from "../a2a/client.js";
|
|
9
|
-
import
|
|
9
|
+
import { invokeAgentAction } from "../a2a/invoke.js";
|
|
10
|
+
import type {
|
|
11
|
+
A2AApprovedAction,
|
|
12
|
+
A2ACorrelationMetadata,
|
|
13
|
+
Task,
|
|
14
|
+
} from "../a2a/types.js";
|
|
10
15
|
import {
|
|
11
16
|
formatLlmCredentialErrorMessage,
|
|
12
17
|
isLlmCredentialError,
|
|
@@ -27,6 +32,38 @@ const DEFAULT_SERVERLESS_INTEGRATION_A2A_TIMEOUT_MS = 18_000;
|
|
|
27
32
|
const NETLIFY_INTEGRATION_A2A_TIMEOUT_MS = 2_000;
|
|
28
33
|
const INTEGRATION_A2A_TOKEN_TTL = "30m";
|
|
29
34
|
|
|
35
|
+
function buildDelegationCorrelation(
|
|
36
|
+
context: ActionRunContext | undefined,
|
|
37
|
+
selfAppId: string | undefined,
|
|
38
|
+
invocationId?: string,
|
|
39
|
+
): A2ACorrelationMetadata {
|
|
40
|
+
return {
|
|
41
|
+
...(selfAppId?.trim() ? { callerApp: selfAppId.trim() } : {}),
|
|
42
|
+
...(context?.threadId ? { callerThreadId: context.threadId } : {}),
|
|
43
|
+
...(context?.runId ? { parentRunId: context.runId } : {}),
|
|
44
|
+
...(context?.turnId ? { parentTurnId: context.turnId } : {}),
|
|
45
|
+
...(invocationId ? { invocationId } : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function buildMessageIdempotencyKey(
|
|
50
|
+
originatingTurnId: string | undefined,
|
|
51
|
+
target: string,
|
|
52
|
+
exactMessage: string,
|
|
53
|
+
): string | undefined {
|
|
54
|
+
if (!originatingTurnId) return undefined;
|
|
55
|
+
const digest = createHash("sha256")
|
|
56
|
+
.update(
|
|
57
|
+
JSON.stringify({
|
|
58
|
+
originatingTurnId,
|
|
59
|
+
target,
|
|
60
|
+
message: exactMessage,
|
|
61
|
+
}),
|
|
62
|
+
)
|
|
63
|
+
.digest("hex");
|
|
64
|
+
return `v1:${digest}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
30
67
|
function parseTimeoutMs(value: string | undefined): number | undefined {
|
|
31
68
|
if (!value) return undefined;
|
|
32
69
|
const parsed = Number(value);
|
|
@@ -94,12 +131,13 @@ function formatDownstreamLlmCredentialFailure(
|
|
|
94
131
|
|
|
95
132
|
export const tool: ActionTool = {
|
|
96
133
|
description:
|
|
97
|
-
"Call a DIFFERENT, separately-deployed
|
|
134
|
+
"Call a DIFFERENT, separately-deployed app over A2A. When you know the exact exposed read-only action, pass action + input and omit message; this invokes it directly without starting the other app's model and is the fastest path for bounded data reads. Use message only for natural-language investigation, synthesis, mutations, or multi-step work that needs the other agent. NEVER use this to call your own app or perform actions you can do with your own tools. Using call-agent on yourself will fail and waste time. " +
|
|
98
135
|
'For brand-consistent generated media, the first-party Assets agent is available as agent="assets"; use it when another app needs generated heroes, diagrams, product shots, thumbnails, videos, or design imagery, unless the current app has its own generation action that already delegates there. ' +
|
|
99
136
|
"IMPORTANT — handling the response: " +
|
|
100
137
|
"(a) If it contains a URL or ID, copy it VERBATIM into your reply. Do not 'correct' or pluralize the path (e.g. /deck/ → /decks/), normalize casing, or change the slug — any edit breaks the link. " +
|
|
101
138
|
'(b) If it does NOT contain a URL/ID and the user asked for one, say so explicitly (e.g. "the agent created the deck/image but didn\'t return a link — open the app directly to view it"). NEVER invent a URL, slug, or path — guessing produces broken links that look real. ' +
|
|
102
|
-
"(c) If the downstream response reports missing credentials, never repeat raw env var names, Vault key names, token names, secret names, or other credential identifiers. Tell the user the target app needs its LLM/provider connection configured."
|
|
139
|
+
"(c) If the downstream response reports missing credentials, never repeat raw env var names, Vault key names, token names, secret names, or other credential identifiers. Tell the user the target app needs its LLM/provider connection configured. " +
|
|
140
|
+
"(d) A bounded wait can expire while the remote task is still healthy. The result will include its taskId and exact retry instructions. Continue polling that SAME task with taskId; NEVER send a new check-in/follow-up message, because that starts duplicate downstream work.",
|
|
103
141
|
parameters: {
|
|
104
142
|
type: "object",
|
|
105
143
|
properties: {
|
|
@@ -110,7 +148,24 @@ export const tool: ActionTool = {
|
|
|
110
148
|
},
|
|
111
149
|
message: {
|
|
112
150
|
type: "string",
|
|
113
|
-
description:
|
|
151
|
+
description:
|
|
152
|
+
"The message/question to send when starting a new task. Omit when taskId is provided.",
|
|
153
|
+
},
|
|
154
|
+
taskId: {
|
|
155
|
+
type: "string",
|
|
156
|
+
description:
|
|
157
|
+
"Existing A2A task ID returned by a timed-out call. Polls that exact task without sending a new message. Never create a fresh check-in message for work that already has a taskId.",
|
|
158
|
+
},
|
|
159
|
+
action: {
|
|
160
|
+
type: "string",
|
|
161
|
+
description:
|
|
162
|
+
"Exact read-only action exposed by the target app. Use with input and omit message/taskId to skip the downstream agent loop.",
|
|
163
|
+
},
|
|
164
|
+
input: {
|
|
165
|
+
type: "object",
|
|
166
|
+
description:
|
|
167
|
+
"Complete input object for action. The target app validates it and refuses actions that are not explicitly exposed read-only operations.",
|
|
168
|
+
additionalProperties: true,
|
|
114
169
|
},
|
|
115
170
|
approvedActions: {
|
|
116
171
|
type: "array",
|
|
@@ -126,7 +181,7 @@ export const tool: ActionTool = {
|
|
|
126
181
|
},
|
|
127
182
|
},
|
|
128
183
|
},
|
|
129
|
-
required: ["agent"
|
|
184
|
+
required: ["agent"],
|
|
130
185
|
},
|
|
131
186
|
};
|
|
132
187
|
|
|
@@ -137,12 +192,23 @@ export async function run(
|
|
|
137
192
|
): Promise<string> {
|
|
138
193
|
const agentIdOrName = String(args.agent ?? "");
|
|
139
194
|
const message = String(args.message ?? "");
|
|
195
|
+
const taskId = String(args.taskId ?? "").trim();
|
|
196
|
+
const action = String(args.action ?? "").trim();
|
|
197
|
+
const input = args.input ?? {};
|
|
140
198
|
const approvedActions = Array.isArray(args.approvedActions)
|
|
141
199
|
? (args.approvedActions as A2AApprovedAction[])
|
|
142
200
|
: undefined;
|
|
143
201
|
|
|
144
202
|
if (!agentIdOrName) return "Error: --agent is required";
|
|
145
|
-
if (!message
|
|
203
|
+
if (!message && !taskId && !action) {
|
|
204
|
+
return "Error: --message, --taskId, or --action is required";
|
|
205
|
+
}
|
|
206
|
+
if (action && (message || taskId)) {
|
|
207
|
+
return "Error: --action direct-invoke mode cannot be combined with --message or --taskId";
|
|
208
|
+
}
|
|
209
|
+
if (action && (!input || typeof input !== "object" || Array.isArray(input))) {
|
|
210
|
+
return "Error: --input must be an object when --action is provided";
|
|
211
|
+
}
|
|
146
212
|
|
|
147
213
|
// Prevent self-calls — the agent must use its own registered tools instead
|
|
148
214
|
if (selfAppId && agentIdOrName.toLowerCase() === selfAppId.toLowerCase()) {
|
|
@@ -157,16 +223,43 @@ export async function run(
|
|
|
157
223
|
return `Error: Agent "${agentIdOrName}" not found. Available agents: ${available || "(none)"}`;
|
|
158
224
|
}
|
|
159
225
|
|
|
226
|
+
const correlation = buildDelegationCorrelation(context, selfAppId);
|
|
227
|
+
const idempotencyKey =
|
|
228
|
+
message && !taskId
|
|
229
|
+
? buildMessageIdempotencyKey(context?.turnId, agent.url, message)
|
|
230
|
+
: undefined;
|
|
231
|
+
|
|
232
|
+
if (action) {
|
|
233
|
+
if (context?.send) {
|
|
234
|
+
context.send({ type: "agent_call", agent: agent.name, status: "start" });
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
const output = await invokeReadOnlyAppAction(
|
|
238
|
+
agent,
|
|
239
|
+
action,
|
|
240
|
+
input as Record<string, unknown>,
|
|
241
|
+
buildDelegationCorrelation(context, selfAppId, randomUUID()),
|
|
242
|
+
);
|
|
243
|
+
return output;
|
|
244
|
+
} finally {
|
|
245
|
+
if (context?.send) {
|
|
246
|
+
context.send({ type: "agent_call", agent: agent.name, status: "done" });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
160
251
|
// Append a small cross-app hint to the outgoing message so the receiving
|
|
161
252
|
// agent (which may be on an older deploy without the receiver-side hint
|
|
162
253
|
// in handlers.ts) still emits fully-qualified URLs. This is belt-and-
|
|
163
254
|
// suspenders with the receiver hint — but it works against any current
|
|
164
255
|
// deployment, no redeploy required.
|
|
165
|
-
const messageWithHint =
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
256
|
+
const messageWithHint = taskId
|
|
257
|
+
? ""
|
|
258
|
+
: `${message}${integrationSourceContextHint()}\n\n` +
|
|
259
|
+
`[Note: this request comes from another app via A2A. The caller cannot see your local UI, deck list, or navigation — only the literal text you put in your reply. ` +
|
|
260
|
+
`If you create or reference a deck/document/design/dashboard, include its FULLY-QUALIFIED URL (e.g. ${agent.url}/deck/<id>) in your reply, not a relative path. ` +
|
|
261
|
+
`Use only artifact IDs and URL paths returned by successful actions — never invent slugs, IDs, or hosts. ` +
|
|
262
|
+
`Return a concise caller-ready synthesis rather than raw tool output or full transcripts; preserve source counts, IDs, short supporting quotes, and URLs needed to substantiate the answer.]`;
|
|
170
263
|
|
|
171
264
|
try {
|
|
172
265
|
// If we have a send context, use streaming so the UI shows progressive text
|
|
@@ -228,8 +321,9 @@ export async function run(
|
|
|
228
321
|
|
|
229
322
|
let responseText = "";
|
|
230
323
|
let lastSentLength = 0;
|
|
231
|
-
const existingContinuationText =
|
|
232
|
-
|
|
324
|
+
const existingContinuationText = taskId
|
|
325
|
+
? null
|
|
326
|
+
: await formatExistingIntegrationContinuationIfRetry(agent, message);
|
|
233
327
|
if (existingContinuationText) return existingContinuationText;
|
|
234
328
|
|
|
235
329
|
context.send({
|
|
@@ -338,13 +432,15 @@ export async function run(
|
|
|
338
432
|
orgDomain: callerOrgDomain,
|
|
339
433
|
orgSecret: callerOrgSecret,
|
|
340
434
|
approvedActions,
|
|
435
|
+
contextId: context.threadId,
|
|
436
|
+
correlation,
|
|
437
|
+
idempotencyKey,
|
|
438
|
+
...(taskId ? { taskId } : {}),
|
|
341
439
|
onUpdate: onRemotePollUpdate,
|
|
440
|
+
returnRecoverableArtifactsOnTimeout: false,
|
|
342
441
|
...(callTimeoutMs
|
|
343
442
|
? {
|
|
344
443
|
timeoutMs: callTimeoutMs,
|
|
345
|
-
// Integration callers must keep the timeout task id so the
|
|
346
|
-
// catch below can enqueue durable continuation polling.
|
|
347
|
-
returnRecoverableArtifactsOnTimeout: false,
|
|
348
444
|
}
|
|
349
445
|
: {}),
|
|
350
446
|
});
|
|
@@ -387,8 +483,11 @@ export async function run(
|
|
|
387
483
|
agent.url,
|
|
388
484
|
);
|
|
389
485
|
} else {
|
|
390
|
-
|
|
391
|
-
|
|
486
|
+
responseText = formatExistingTaskWaitInstruction(
|
|
487
|
+
agent.name,
|
|
488
|
+
timeoutTaskId,
|
|
489
|
+
agentIdOrName,
|
|
490
|
+
);
|
|
392
491
|
}
|
|
393
492
|
}
|
|
394
493
|
} else {
|
|
@@ -427,6 +526,11 @@ export async function run(
|
|
|
427
526
|
orgDomain: domain,
|
|
428
527
|
orgSecret,
|
|
429
528
|
approvedActions,
|
|
529
|
+
contextId: context?.threadId,
|
|
530
|
+
correlation,
|
|
531
|
+
idempotencyKey,
|
|
532
|
+
...(taskId ? { taskId } : {}),
|
|
533
|
+
returnRecoverableArtifactsOnTimeout: false,
|
|
430
534
|
});
|
|
431
535
|
const sanitized =
|
|
432
536
|
formatDownstreamLlmCredentialFailure(agent.name, response) ?? response;
|
|
@@ -438,6 +542,14 @@ export async function run(
|
|
|
438
542
|
err,
|
|
439
543
|
);
|
|
440
544
|
if (credentialMessage) return credentialMessage;
|
|
545
|
+
const timeoutTaskId = getA2ATaskTimeoutTaskId(err);
|
|
546
|
+
if (timeoutTaskId) {
|
|
547
|
+
return formatExistingTaskWaitInstruction(
|
|
548
|
+
agent.name,
|
|
549
|
+
timeoutTaskId,
|
|
550
|
+
agentIdOrName,
|
|
551
|
+
);
|
|
552
|
+
}
|
|
441
553
|
// Friendlier message for the common timeout case so the calling agent can
|
|
442
554
|
// decide whether to give up or retry.
|
|
443
555
|
if (/timeout|did not complete|Inactivity|504/i.test(msg)) {
|
|
@@ -447,6 +559,65 @@ export async function run(
|
|
|
447
559
|
}
|
|
448
560
|
}
|
|
449
561
|
|
|
562
|
+
async function invokeReadOnlyAppAction(
|
|
563
|
+
agent: { name: string; url: string },
|
|
564
|
+
action: string,
|
|
565
|
+
input: Record<string, unknown>,
|
|
566
|
+
correlation: A2ACorrelationMetadata,
|
|
567
|
+
): Promise<string> {
|
|
568
|
+
const callerEmail = getRequestUserEmail();
|
|
569
|
+
if (!callerEmail) {
|
|
570
|
+
return `Error calling ${agent.name} action ${action}: a signed-in user identity is required`;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
let callerOrgDomain: string | undefined;
|
|
574
|
+
let callerOrgSecret: string | undefined;
|
|
575
|
+
const orgId = getRequestOrgId();
|
|
576
|
+
if (orgId) {
|
|
577
|
+
try {
|
|
578
|
+
callerOrgDomain = (await getOrgDomain(orgId)) ?? undefined;
|
|
579
|
+
} catch {}
|
|
580
|
+
try {
|
|
581
|
+
callerOrgSecret = (await getOrgA2ASecret(orgId)) ?? undefined;
|
|
582
|
+
} catch {}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
if (!callerOrgSecret && !process.env.A2A_SECRET) {
|
|
586
|
+
return `Error calling ${agent.name} action ${action}: direct cross-app reads require A2A identity verification`;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
try {
|
|
590
|
+
const invocation = await invokeAgentAction({
|
|
591
|
+
target: agent.url,
|
|
592
|
+
action,
|
|
593
|
+
input,
|
|
594
|
+
userEmail: callerEmail,
|
|
595
|
+
orgDomain: callerOrgDomain,
|
|
596
|
+
orgSecret: callerOrgSecret,
|
|
597
|
+
correlation,
|
|
598
|
+
});
|
|
599
|
+
return invocation.result.status === "completed"
|
|
600
|
+
? invocation.result.output
|
|
601
|
+
: `Error calling ${agent.name} action ${action}: ${invocation.result.output}`;
|
|
602
|
+
} catch (error) {
|
|
603
|
+
return `Error calling ${agent.name} action ${action}: ${
|
|
604
|
+
error instanceof Error ? error.message : String(error)
|
|
605
|
+
}`;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
function formatExistingTaskWaitInstruction(
|
|
610
|
+
agentName: string,
|
|
611
|
+
taskId: string,
|
|
612
|
+
agentIdOrName: string,
|
|
613
|
+
): string {
|
|
614
|
+
return (
|
|
615
|
+
`The ${agentName} task is still running under taskId "${taskId}". ` +
|
|
616
|
+
`Do not send ${agentName} a new check-in or follow-up message; that would start duplicate work. ` +
|
|
617
|
+
`Call call-agent again with agent="${agentIdOrName}" and taskId="${taskId}" (omit message) to continue waiting for this same task.`
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
|
|
450
621
|
async function enqueueIntegrationContinuationIfPossible(
|
|
451
622
|
taskId: string,
|
|
452
623
|
agent: { name: string; url: string },
|
|
@@ -15,6 +15,10 @@ import {
|
|
|
15
15
|
} from "../../agent/production-agent.js";
|
|
16
16
|
import { runAgentLoopDirectWithSoftTimeout } from "../../agent/run-loop-with-resume.js";
|
|
17
17
|
import type { AgentChatEvent } from "../../agent/types.js";
|
|
18
|
+
import {
|
|
19
|
+
isAuthenticatedReadAction,
|
|
20
|
+
isAutoReadExcludedActionName,
|
|
21
|
+
} from "../../mcp/build-server.js";
|
|
18
22
|
import { withConfiguredAppBasePath } from "../app-base-path.js";
|
|
19
23
|
import type { AgentChatPluginOptions } from "./plugin-options.js";
|
|
20
24
|
|
|
@@ -61,6 +65,42 @@ export function filterPublicAgentActions(
|
|
|
61
65
|
);
|
|
62
66
|
}
|
|
63
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Direct A2A action calls share the authenticated external-agent policy with
|
|
70
|
+
* MCP, but remain stricter: only explicitly exposed, authenticated read-only
|
|
71
|
+
* actions can skip the receiver's model loop.
|
|
72
|
+
*/
|
|
73
|
+
export function filterDirectA2AActions(
|
|
74
|
+
actions: Record<string, ActionEntry>,
|
|
75
|
+
options: Pick<AgentChatPluginOptions, "connectorCatalog" | "externalAgents">,
|
|
76
|
+
): Record<string, ActionEntry> {
|
|
77
|
+
const catalog = new Set(options.connectorCatalog ?? []);
|
|
78
|
+
const denied = new Set(options.externalAgents?.denyActions ?? []);
|
|
79
|
+
const autoReads = options.externalAgents?.authenticatedReads === "auto";
|
|
80
|
+
|
|
81
|
+
return Object.fromEntries(
|
|
82
|
+
Object.entries(actions).filter(([name, entry]) => {
|
|
83
|
+
const exposure = entry.publicAgent;
|
|
84
|
+
const selected =
|
|
85
|
+
catalog.has(name) ||
|
|
86
|
+
(autoReads &&
|
|
87
|
+
isAuthenticatedReadAction(entry) &&
|
|
88
|
+
!isAutoReadExcludedActionName(name));
|
|
89
|
+
return (
|
|
90
|
+
selected &&
|
|
91
|
+
!denied.has(name) &&
|
|
92
|
+
entry.agentTool !== false &&
|
|
93
|
+
entry.readOnly === true &&
|
|
94
|
+
exposure?.expose === true &&
|
|
95
|
+
exposure.readOnly === true &&
|
|
96
|
+
exposure.requiresAuth === true &&
|
|
97
|
+
(entry.needsApproval === undefined || entry.needsApproval === false) &&
|
|
98
|
+
exposure.isConsequential !== true
|
|
99
|
+
);
|
|
100
|
+
}),
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
64
104
|
export function buildPublicAgentA2ASkills(
|
|
65
105
|
actions: Record<string, ActionEntry>,
|
|
66
106
|
): Array<{
|
|
@@ -151,34 +191,81 @@ function formatA2ATerminalError(
|
|
|
151
191
|
|
|
152
192
|
type A2AAgentLoopRunner = typeof runAgentLoopDirectWithSoftTimeout;
|
|
153
193
|
|
|
154
|
-
|
|
194
|
+
export interface DelegatedAgentLoopTelemetry {
|
|
195
|
+
runId: string;
|
|
196
|
+
threadId: string | null;
|
|
197
|
+
userId: string | null;
|
|
198
|
+
delegation: {
|
|
199
|
+
protocol: "a2a" | "mcp";
|
|
200
|
+
callerApp?: string;
|
|
201
|
+
taskId?: string;
|
|
202
|
+
parentRunId?: string;
|
|
203
|
+
parentTurnId?: string;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
interface DelegatedAgentLoopOptions {
|
|
208
|
+
runner?: A2AAgentLoopRunner;
|
|
209
|
+
telemetry?: DelegatedAgentLoopTelemetry;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function runDelegatedAgentLoop(
|
|
155
213
|
runOptions: Parameters<A2AAgentLoopRunner>[0],
|
|
156
214
|
pluginOptions: Pick<
|
|
157
215
|
AgentChatPluginOptions,
|
|
158
216
|
"finalResponseGuard" | "runSoftTimeoutMs"
|
|
159
217
|
>,
|
|
160
218
|
timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
|
|
161
|
-
|
|
219
|
+
options: DelegatedAgentLoopOptions,
|
|
162
220
|
) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
timeoutOptions
|
|
181
|
-
|
|
221
|
+
const runner = options.runner ?? runAgentLoopDirectWithSoftTimeout;
|
|
222
|
+
const resolvedRunOptions = {
|
|
223
|
+
...runOptions,
|
|
224
|
+
// Delegated runs resolve their own model and do not pass through the
|
|
225
|
+
// interactive request handler's output-token setup. Use the same
|
|
226
|
+
// model-aware headroom here so reasoning models (notably GPT-5.x) do
|
|
227
|
+
// not spend the small internal default entirely on reasoning before
|
|
228
|
+
// emitting a tool call or answer. Preserve explicit test/caller values.
|
|
229
|
+
maxOutputTokens:
|
|
230
|
+
runOptions.maxOutputTokens ??
|
|
231
|
+
resolveMainChatMaxOutputTokens(runOptions.model),
|
|
232
|
+
reasoningEffort:
|
|
233
|
+
runOptions.reasoningEffort ??
|
|
234
|
+
resolveAgentRequestReasoningEffort({ model: runOptions.model }),
|
|
235
|
+
finalResponseGuard: pluginOptions.finalResponseGuard,
|
|
236
|
+
};
|
|
237
|
+
const execute = (loopOptions = resolvedRunOptions) =>
|
|
238
|
+
runner(loopOptions, pluginOptions.runSoftTimeoutMs, timeoutOptions);
|
|
239
|
+
|
|
240
|
+
if (!options.telemetry) return execute();
|
|
241
|
+
|
|
242
|
+
let instrumented = false;
|
|
243
|
+
try {
|
|
244
|
+
const { getObservabilityConfig, instrumentAgentLoop } =
|
|
245
|
+
await import("../../observability/traces.js");
|
|
246
|
+
const config = await getObservabilityConfig();
|
|
247
|
+
if (config.enabled) {
|
|
248
|
+
instrumented = true;
|
|
249
|
+
return await instrumentAgentLoop({
|
|
250
|
+
runAgentLoop: (loopOptions) =>
|
|
251
|
+
execute(
|
|
252
|
+
loopOptions as Parameters<A2AAgentLoopRunner>[0] &
|
|
253
|
+
typeof resolvedRunOptions,
|
|
254
|
+
),
|
|
255
|
+
loopOpts: resolvedRunOptions,
|
|
256
|
+
runId: options.telemetry.runId,
|
|
257
|
+
threadId: options.telemetry.threadId,
|
|
258
|
+
userId: options.telemetry.userId,
|
|
259
|
+
config,
|
|
260
|
+
delegation: options.telemetry.delegation,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
} catch (error) {
|
|
264
|
+
// Match interactive chat: setup failures fall through, but a failure from
|
|
265
|
+
// inside an instrumented agent loop is the real run failure and rethrows.
|
|
266
|
+
if (instrumented) throw error;
|
|
267
|
+
}
|
|
268
|
+
return execute();
|
|
182
269
|
}
|
|
183
270
|
|
|
184
271
|
/**
|
|
@@ -196,13 +283,13 @@ export function runA2AAgentLoop(
|
|
|
196
283
|
"finalResponseGuard" | "runSoftTimeoutMs"
|
|
197
284
|
>,
|
|
198
285
|
timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
|
|
199
|
-
|
|
286
|
+
options: DelegatedAgentLoopOptions = {},
|
|
200
287
|
) {
|
|
201
288
|
return runDelegatedAgentLoop(
|
|
202
289
|
runOptions,
|
|
203
290
|
pluginOptions,
|
|
204
291
|
timeoutOptions,
|
|
205
|
-
|
|
292
|
+
options,
|
|
206
293
|
);
|
|
207
294
|
}
|
|
208
295
|
|
|
@@ -218,13 +305,13 @@ export function runMCPAgentLoop(
|
|
|
218
305
|
"finalResponseGuard" | "runSoftTimeoutMs"
|
|
219
306
|
>,
|
|
220
307
|
timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
|
|
221
|
-
|
|
308
|
+
options: DelegatedAgentLoopOptions = {},
|
|
222
309
|
) {
|
|
223
310
|
return runDelegatedAgentLoop(
|
|
224
311
|
runOptions,
|
|
225
312
|
pluginOptions,
|
|
226
313
|
timeoutOptions,
|
|
227
|
-
|
|
314
|
+
options,
|
|
228
315
|
);
|
|
229
316
|
}
|
|
230
317
|
|