@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
|
@@ -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<{
|
|
@@ -210,6 +210,7 @@ import {
|
|
|
210
210
|
createA2AEngineToolSurface,
|
|
211
211
|
filterAgentTools,
|
|
212
212
|
filterPublicAgentActions,
|
|
213
|
+
filterDirectA2AActions,
|
|
213
214
|
filterReadOnlyActions,
|
|
214
215
|
resolveInitialToolNames,
|
|
215
216
|
runA2AAgentLoop,
|
|
@@ -1216,6 +1217,36 @@ export function createAgentChatPlugin(
|
|
|
1216
1217
|
publicSkillsOnly: true,
|
|
1217
1218
|
streaming: true,
|
|
1218
1219
|
durableBackgroundRuns: options?.durableBackgroundRuns,
|
|
1220
|
+
executeReadOnlyAction: async ({ action, input }) => {
|
|
1221
|
+
const actions = filterDirectA2AActions(
|
|
1222
|
+
mcpFullActions ?? allScripts,
|
|
1223
|
+
options ?? {},
|
|
1224
|
+
);
|
|
1225
|
+
const entry = actions[action];
|
|
1226
|
+
if (!entry) {
|
|
1227
|
+
return {
|
|
1228
|
+
status: "failed" as const,
|
|
1229
|
+
output: "Unknown or unavailable read-only action",
|
|
1230
|
+
};
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
const result = await executeAgentToolCall({
|
|
1234
|
+
actions: { [action]: entry },
|
|
1235
|
+
name: action,
|
|
1236
|
+
input,
|
|
1237
|
+
callId: `a2a-action-${crypto.randomUUID()}`,
|
|
1238
|
+
ownerEmail: getRequestUserEmail(),
|
|
1239
|
+
orgId: getRequestOrgId() ?? null,
|
|
1240
|
+
caller: "a2a",
|
|
1241
|
+
});
|
|
1242
|
+
if (result.status === "approval_required") {
|
|
1243
|
+
return {
|
|
1244
|
+
status: "failed" as const,
|
|
1245
|
+
output: "Read-only action unexpectedly requires approval",
|
|
1246
|
+
};
|
|
1247
|
+
}
|
|
1248
|
+
return { status: result.status, output: result.output };
|
|
1249
|
+
},
|
|
1219
1250
|
executeApproval: async (approval) => {
|
|
1220
1251
|
const result = await executeAgentToolCall({
|
|
1221
1252
|
actions: mcpFullActions ?? allScripts,
|
|
@@ -502,6 +502,13 @@
|
|
|
502
502
|
opacity 150ms ease-out;
|
|
503
503
|
}
|
|
504
504
|
|
|
505
|
+
@starting-style {
|
|
506
|
+
.agent-chat-collapse[data-state="open"] {
|
|
507
|
+
grid-template-rows: 0fr;
|
|
508
|
+
opacity: 0;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
|
|
505
512
|
.agent-chat-collapse[data-state="closed"] {
|
|
506
513
|
grid-template-rows: 0fr;
|
|
507
514
|
opacity: 0;
|
|
@@ -80,12 +80,32 @@ const messages = {
|
|
|
80
80
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
81
81
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
82
82
|
workspaceApps: "تطبيقات مساحة العمل",
|
|
83
|
+
otherApps: "تطبيقات أخرى",
|
|
84
|
+
otherAppsDescription: "افتح التطبيقات الأخرى المتاحة لك.",
|
|
85
|
+
availableCount: "{{count}} متاح",
|
|
83
86
|
activeCount: "{{count}} active",
|
|
84
87
|
hiddenCount: "{{count}} hidden",
|
|
85
88
|
createApp: "إنشاء التطبيق",
|
|
86
89
|
templates: "القوالب",
|
|
87
90
|
checkingTemplates: "التحقق من القوالب المتاحة",
|
|
88
91
|
templatesAvailable: "{{count}} available to scaffold",
|
|
92
|
+
curatedTemplates: "قوالب منسقة",
|
|
93
|
+
curatedTemplatesDescription:
|
|
94
|
+
"ابدأ من شكل تطبيق تمت مراجعته، ثم اجعله خاصًا بك.",
|
|
95
|
+
remix: "إعادة المزج",
|
|
96
|
+
remixTemplate: "إعادة مزج {{name}}",
|
|
97
|
+
remixAppIdLabel: "معرّف التطبيق الجديد",
|
|
98
|
+
remixStarted: "بدأت إعادة مزج {{name}}",
|
|
99
|
+
viewLiveApp: "عرض التطبيق المباشر",
|
|
100
|
+
alreadyInWorkspace: "موجود بالفعل في مساحة العمل",
|
|
101
|
+
remixAppIdDescription:
|
|
102
|
+
"اختر معرّفًا آمنًا لعنوان URL لتطبيق مساحة العمل الجديد.",
|
|
103
|
+
integrationSetup: "إعداد التكامل",
|
|
104
|
+
source: "المصدر",
|
|
105
|
+
remixing: "جارٍ إعادة المزج…",
|
|
106
|
+
remixSuccess: "بدأت إعادة مزج القالب.",
|
|
107
|
+
remixError: "تعذرت إعادة مزج هذا القالب",
|
|
108
|
+
appIdRequired: "معرّف التطبيق مطلوب.",
|
|
89
109
|
hide: "إخفاء",
|
|
90
110
|
show: "Show",
|
|
91
111
|
hiddenApps: "التطبيقات المخفية",
|
|
@@ -79,12 +79,32 @@ const messages = {
|
|
|
79
79
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
80
80
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
81
81
|
workspaceApps: "Workspace-Apps",
|
|
82
|
+
otherApps: "Andere Apps",
|
|
83
|
+
otherAppsDescription: "Andere für dich verfügbare Apps öffnen.",
|
|
84
|
+
availableCount: "{{count}} verfügbar",
|
|
82
85
|
activeCount: "{{count}} active",
|
|
83
86
|
hiddenCount: "{{count}} hidden",
|
|
84
87
|
createApp: "App erstellen",
|
|
85
88
|
templates: "Vorlagen",
|
|
86
89
|
checkingTemplates: "Überprüfen verfügbarer Vorlagen",
|
|
87
90
|
templatesAvailable: "{{count}} available to scaffold",
|
|
91
|
+
curatedTemplates: "Kuratierte Vorlagen",
|
|
92
|
+
curatedTemplatesDescription:
|
|
93
|
+
"Starte mit einer geprüften App-Struktur und passe sie an.",
|
|
94
|
+
remix: "Remix",
|
|
95
|
+
remixTemplate: "{{name}} remixen",
|
|
96
|
+
remixAppIdLabel: "Neue App-ID",
|
|
97
|
+
remixStarted: "Remix für {{name}} gestartet",
|
|
98
|
+
viewLiveApp: "Live-App öffnen",
|
|
99
|
+
alreadyInWorkspace: "Bereits im Workspace",
|
|
100
|
+
remixAppIdDescription:
|
|
101
|
+
"Wähle eine URL-sichere ID für die neue Workspace-App.",
|
|
102
|
+
integrationSetup: "Integration einrichten",
|
|
103
|
+
source: "Quelle",
|
|
104
|
+
remixing: "Remix wird erstellt…",
|
|
105
|
+
remixSuccess: "Template-Remix gestartet.",
|
|
106
|
+
remixError: "Dieses Template konnte nicht geremixt werden",
|
|
107
|
+
appIdRequired: "App-ID ist erforderlich.",
|
|
88
108
|
hide: "Ausblenden",
|
|
89
109
|
show: "Show",
|
|
90
110
|
hiddenApps: "Versteckte Apps",
|
|
@@ -77,12 +77,32 @@ const messages = {
|
|
|
77
77
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
78
78
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
79
79
|
workspaceApps: "Workspace apps",
|
|
80
|
+
otherApps: "Other apps",
|
|
81
|
+
otherAppsDescription: "Open other apps available to you.",
|
|
82
|
+
availableCount: "{{count}} available",
|
|
80
83
|
activeCount: "{{count}} active",
|
|
81
84
|
hiddenCount: "{{count}} hidden",
|
|
82
85
|
createApp: "Create app",
|
|
83
86
|
templates: "Templates",
|
|
84
87
|
checkingTemplates: "Checking available templates",
|
|
85
88
|
templatesAvailable: "{{count}} available to scaffold",
|
|
89
|
+
curatedTemplates: "Curated templates",
|
|
90
|
+
curatedTemplatesDescription:
|
|
91
|
+
"Start from a reviewed app shape, then make it your own.",
|
|
92
|
+
remix: "Remix",
|
|
93
|
+
remixTemplate: "Remix {{name}}",
|
|
94
|
+
remixAppIdLabel: "New app id",
|
|
95
|
+
remixStarted: "Started {{name}} remix",
|
|
96
|
+
viewLiveApp: "View live app",
|
|
97
|
+
alreadyInWorkspace: "Already in workspace",
|
|
98
|
+
remixAppIdDescription:
|
|
99
|
+
"Choose the URL-safe id for the new workspace app.",
|
|
100
|
+
integrationSetup: "Integration setup",
|
|
101
|
+
source: "Source",
|
|
102
|
+
remixing: "Remixing…",
|
|
103
|
+
remixSuccess: "Template remix started.",
|
|
104
|
+
remixError: "Could not remix this template",
|
|
105
|
+
appIdRequired: "App ID is required.",
|
|
86
106
|
hide: "Hide",
|
|
87
107
|
show: "Show",
|
|
88
108
|
hiddenApps: "Hidden apps",
|
|
@@ -79,12 +79,32 @@ const messages = {
|
|
|
79
79
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
80
80
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
81
81
|
workspaceApps: "Aplicaciones de espacio de trabajo",
|
|
82
|
+
otherApps: "Otras aplicaciones",
|
|
83
|
+
otherAppsDescription: "Abre otras aplicaciones disponibles para ti.",
|
|
84
|
+
availableCount: "{{count}} disponibles",
|
|
82
85
|
activeCount: "{{count}} active",
|
|
83
86
|
hiddenCount: "{{count}} hidden",
|
|
84
87
|
createApp: "Crear aplicación",
|
|
85
88
|
templates: "Plantillas",
|
|
86
89
|
checkingTemplates: "Comprobando plantillas disponibles",
|
|
87
90
|
templatesAvailable: "{{count}} available to scaffold",
|
|
91
|
+
curatedTemplates: "Plantillas seleccionadas",
|
|
92
|
+
curatedTemplatesDescription:
|
|
93
|
+
"Empieza con una estructura de aplicación revisada y hazla tuya.",
|
|
94
|
+
remix: "Reutilizar",
|
|
95
|
+
remixTemplate: "Reutilizar {{name}}",
|
|
96
|
+
remixAppIdLabel: "Nuevo ID de aplicación",
|
|
97
|
+
remixStarted: "Se inició la reutilización de {{name}}",
|
|
98
|
+
viewLiveApp: "Ver aplicación en vivo",
|
|
99
|
+
alreadyInWorkspace: "Ya está en el espacio de trabajo",
|
|
100
|
+
remixAppIdDescription:
|
|
101
|
+
"Elige un ID seguro para URL para la nueva aplicación.",
|
|
102
|
+
integrationSetup: "Configuración de integración",
|
|
103
|
+
source: "Origen",
|
|
104
|
+
remixing: "Reutilizando…",
|
|
105
|
+
remixSuccess: "Se inició la reutilización de la plantilla.",
|
|
106
|
+
remixError: "No se pudo reutilizar esta plantilla",
|
|
107
|
+
appIdRequired: "El ID de aplicación es obligatorio.",
|
|
88
108
|
hide: "Ocultar",
|
|
89
109
|
show: "Show",
|
|
90
110
|
hiddenApps: "Aplicaciones ocultas",
|
|
@@ -80,12 +80,33 @@ const messages = {
|
|
|
80
80
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
81
81
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
82
82
|
workspaceApps: "Applications d'espace de travail",
|
|
83
|
+
otherApps: "Autres applications",
|
|
84
|
+
otherAppsDescription:
|
|
85
|
+
"Ouvrez les autres applications qui vous sont accessibles.",
|
|
86
|
+
availableCount: "{{count}} disponibles",
|
|
83
87
|
activeCount: "{{count}} active",
|
|
84
88
|
hiddenCount: "{{count}} hidden",
|
|
85
89
|
createApp: "Créer une application",
|
|
86
90
|
templates: "Modèles",
|
|
87
91
|
checkingTemplates: "Vérification des modèles disponibles",
|
|
88
92
|
templatesAvailable: "{{count}} available to scaffold",
|
|
93
|
+
curatedTemplates: "Modèles sélectionnés",
|
|
94
|
+
curatedTemplatesDescription:
|
|
95
|
+
"Partez d’une structure d’application vérifiée et personnalisez-la.",
|
|
96
|
+
remix: "Remixer",
|
|
97
|
+
remixTemplate: "Remixer {{name}}",
|
|
98
|
+
remixAppIdLabel: "Nouvel identifiant d’application",
|
|
99
|
+
remixStarted: "Remix de {{name}} lancé",
|
|
100
|
+
viewLiveApp: "Voir l’application en direct",
|
|
101
|
+
alreadyInWorkspace: "Déjà dans l’espace de travail",
|
|
102
|
+
remixAppIdDescription:
|
|
103
|
+
"Choisissez un identifiant compatible avec l’URL pour la nouvelle application.",
|
|
104
|
+
integrationSetup: "Configuration de l’intégration",
|
|
105
|
+
source: "Source",
|
|
106
|
+
remixing: "Remix en cours…",
|
|
107
|
+
remixSuccess: "Le remix du modèle a démarré.",
|
|
108
|
+
remixError: "Impossible de remixer ce modèle",
|
|
109
|
+
appIdRequired: "L’identifiant de l’application est requis.",
|
|
89
110
|
hide: "Masquer",
|
|
90
111
|
show: "Show",
|
|
91
112
|
hiddenApps: "Applications cachées",
|
|
@@ -75,12 +75,31 @@ const messages = {
|
|
|
75
75
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
76
76
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
77
77
|
workspaceApps: "कार्यक्षेत्र ऐप्स",
|
|
78
|
+
otherApps: "अन्य ऐप्स",
|
|
79
|
+
otherAppsDescription: "आपके लिए उपलब्ध अन्य ऐप्स खोलें।",
|
|
80
|
+
availableCount: "{{count}} उपलब्ध",
|
|
78
81
|
activeCount: "{{count}} active",
|
|
79
82
|
hiddenCount: "{{count}} hidden",
|
|
80
83
|
createApp: "ऐप बनाएं",
|
|
81
84
|
templates: "टेम्पलेट",
|
|
82
85
|
checkingTemplates: "उपलब्ध टेम्प्लेट की जाँच करना",
|
|
83
86
|
templatesAvailable: "{{count}} available to scaffold",
|
|
87
|
+
curatedTemplates: "चयनित टेम्पलेट",
|
|
88
|
+
curatedTemplatesDescription:
|
|
89
|
+
"समीक्षित ऐप संरचना से शुरू करें और इसे अपने अनुसार बनाएं।",
|
|
90
|
+
remix: "रीमिक्स",
|
|
91
|
+
remixTemplate: "{{name}} रीमिक्स करें",
|
|
92
|
+
remixAppIdLabel: "नया ऐप आईडी",
|
|
93
|
+
remixStarted: "{{name}} रीमिक्स शुरू हुआ",
|
|
94
|
+
viewLiveApp: "लाइव ऐप देखें",
|
|
95
|
+
alreadyInWorkspace: "वर्कस्पेस में पहले से मौजूद",
|
|
96
|
+
remixAppIdDescription: "नए वर्कस्पेस ऐप के लिए URL-सुरक्षित आईडी चुनें।",
|
|
97
|
+
integrationSetup: "इंटीग्रेशन सेटअप",
|
|
98
|
+
source: "स्रोत",
|
|
99
|
+
remixing: "रीमिक्स हो रहा है…",
|
|
100
|
+
remixSuccess: "टेम्पलेट रीमिक्स शुरू हुआ।",
|
|
101
|
+
remixError: "यह टेम्पलेट रीमिक्स नहीं हो सका",
|
|
102
|
+
appIdRequired: "ऐप आईडी आवश्यक है।",
|
|
84
103
|
hide: "छिपाएं",
|
|
85
104
|
show: "Show",
|
|
86
105
|
hiddenApps: "छुपे हुए ऐप्स",
|
|
@@ -77,12 +77,32 @@ const messages = {
|
|
|
77
77
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
78
78
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
79
79
|
workspaceApps: "ワークスペースアプリ",
|
|
80
|
+
otherApps: "その他のアプリ",
|
|
81
|
+
otherAppsDescription: "利用できるその他のアプリを開きます。",
|
|
82
|
+
availableCount: "{{count}}件利用可能",
|
|
80
83
|
activeCount: "{{count}} active",
|
|
81
84
|
hiddenCount: "{{count}} hidden",
|
|
82
85
|
createApp: "アプリの作成",
|
|
83
86
|
templates: "テンプレート",
|
|
84
87
|
checkingTemplates: "利用可能なテンプレートを確認する",
|
|
85
88
|
templatesAvailable: "{{count}} available to scaffold",
|
|
89
|
+
curatedTemplates: "厳選テンプレート",
|
|
90
|
+
curatedTemplatesDescription:
|
|
91
|
+
"レビュー済みのアプリ構成をベースに、自分用にカスタマイズできます。",
|
|
92
|
+
remix: "リミックス",
|
|
93
|
+
remixTemplate: "{{name}} をリミックス",
|
|
94
|
+
remixAppIdLabel: "新しいアプリ ID",
|
|
95
|
+
remixStarted: "{{name}} のリミックスを開始しました",
|
|
96
|
+
viewLiveApp: "ライブアプリを見る",
|
|
97
|
+
alreadyInWorkspace: "ワークスペースに追加済み",
|
|
98
|
+
remixAppIdDescription:
|
|
99
|
+
"新しいワークスペースアプリの URL セーフな ID を選択してください。",
|
|
100
|
+
integrationSetup: "連携の設定",
|
|
101
|
+
source: "提供元",
|
|
102
|
+
remixing: "リミックス中…",
|
|
103
|
+
remixSuccess: "テンプレートのリミックスを開始しました。",
|
|
104
|
+
remixError: "このテンプレートをリミックスできませんでした",
|
|
105
|
+
appIdRequired: "アプリ ID は必須です。",
|
|
86
106
|
hide: "非表示",
|
|
87
107
|
show: "Show",
|
|
88
108
|
hiddenApps: "隠しアプリ",
|
|
@@ -76,12 +76,31 @@ const messages = {
|
|
|
76
76
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
77
77
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
78
78
|
workspaceApps: "작업 공간 앱",
|
|
79
|
+
otherApps: "기타 앱",
|
|
80
|
+
otherAppsDescription: "사용할 수 있는 다른 앱을 엽니다.",
|
|
81
|
+
availableCount: "{{count}}개 사용 가능",
|
|
79
82
|
activeCount: "{{count}} active",
|
|
80
83
|
hiddenCount: "{{count}} hidden",
|
|
81
84
|
createApp: "앱 만들기",
|
|
82
85
|
templates: "템플릿",
|
|
83
86
|
checkingTemplates: "사용 가능한 템플릿 확인 중",
|
|
84
87
|
templatesAvailable: "{{count}} available to scaffold",
|
|
88
|
+
curatedTemplates: "엄선된 템플릿",
|
|
89
|
+
curatedTemplatesDescription:
|
|
90
|
+
"검토된 앱 구조에서 시작해 나만의 앱으로 만들어 보세요.",
|
|
91
|
+
remix: "리믹스",
|
|
92
|
+
remixTemplate: "{{name}} 리믹스",
|
|
93
|
+
remixAppIdLabel: "새 앱 ID",
|
|
94
|
+
remixStarted: "{{name}} 리믹스를 시작했습니다",
|
|
95
|
+
viewLiveApp: "라이브 앱 보기",
|
|
96
|
+
alreadyInWorkspace: "워크스페이스에 이미 있음",
|
|
97
|
+
remixAppIdDescription: "새 워크스페이스 앱의 URL 안전 ID를 선택하세요.",
|
|
98
|
+
integrationSetup: "연동 설정",
|
|
99
|
+
source: "소스",
|
|
100
|
+
remixing: "리믹스 중…",
|
|
101
|
+
remixSuccess: "템플릿 리믹스를 시작했습니다.",
|
|
102
|
+
remixError: "이 템플릿을 리믹스할 수 없습니다",
|
|
103
|
+
appIdRequired: "앱 ID가 필요합니다.",
|
|
85
104
|
hide: "숨기기",
|
|
86
105
|
show: "Show",
|
|
87
106
|
hiddenApps: "숨겨진 앱",
|
|
@@ -80,12 +80,32 @@ const messages = {
|
|
|
80
80
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
81
81
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
82
82
|
workspaceApps: "Aplicativos de espaço de trabalho",
|
|
83
|
+
otherApps: "Outros aplicativos",
|
|
84
|
+
otherAppsDescription: "Abra outros aplicativos disponíveis para você.",
|
|
85
|
+
availableCount: "{{count}} disponíveis",
|
|
83
86
|
activeCount: "{{count}} active",
|
|
84
87
|
hiddenCount: "{{count}} hidden",
|
|
85
88
|
createApp: "Criar aplicativo",
|
|
86
89
|
templates: "Modelos",
|
|
87
90
|
checkingTemplates: "Verificando modelos disponíveis",
|
|
88
91
|
templatesAvailable: "{{count}} available to scaffold",
|
|
92
|
+
curatedTemplates: "Modelos selecionados",
|
|
93
|
+
curatedTemplatesDescription:
|
|
94
|
+
"Comece com uma estrutura de app revisada e personalize-a.",
|
|
95
|
+
remix: "Remixar",
|
|
96
|
+
remixTemplate: "Remixar {{name}}",
|
|
97
|
+
remixAppIdLabel: "Novo ID do app",
|
|
98
|
+
remixStarted: "Remix de {{name}} iniciado",
|
|
99
|
+
viewLiveApp: "Ver app ao vivo",
|
|
100
|
+
alreadyInWorkspace: "Já está no workspace",
|
|
101
|
+
remixAppIdDescription:
|
|
102
|
+
"Escolha um ID seguro para URL para o novo app do workspace.",
|
|
103
|
+
integrationSetup: "Configuração da integração",
|
|
104
|
+
source: "Origem",
|
|
105
|
+
remixing: "Remixando…",
|
|
106
|
+
remixSuccess: "Remix do modelo iniciado.",
|
|
107
|
+
remixError: "Não foi possível remixar este modelo",
|
|
108
|
+
appIdRequired: "O ID do app é obrigatório.",
|
|
89
109
|
hide: "Ocultar",
|
|
90
110
|
show: "Show",
|
|
91
111
|
hiddenApps: "Aplicativos ocultos",
|
|
@@ -73,12 +73,31 @@ const messages = {
|
|
|
73
73
|
'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
|
|
74
74
|
appsInWorkspace: "Apps in {{workspace}}",
|
|
75
75
|
workspaceApps: "工作区应用程序",
|
|
76
|
+
otherApps: "其他应用",
|
|
77
|
+
otherAppsDescription: "打开你可以使用的其他应用。",
|
|
78
|
+
availableCount: "可用 {{count}} 个",
|
|
76
79
|
activeCount: "{{count}} active",
|
|
77
80
|
hiddenCount: "{{count}} hidden",
|
|
78
81
|
createApp: "创建应用程序",
|
|
79
82
|
templates: "模板",
|
|
80
83
|
checkingTemplates: "检查可用模板",
|
|
81
84
|
templatesAvailable: "{{count}} available to scaffold",
|
|
85
|
+
curatedTemplates: "精选模板",
|
|
86
|
+
curatedTemplatesDescription:
|
|
87
|
+
"从经过审核的应用结构开始,然后打造属于你的应用。",
|
|
88
|
+
remix: "再创作",
|
|
89
|
+
remixTemplate: "再创作 {{name}}",
|
|
90
|
+
remixAppIdLabel: "新应用 ID",
|
|
91
|
+
remixStarted: "已开始再创作 {{name}}",
|
|
92
|
+
viewLiveApp: "查看在线应用",
|
|
93
|
+
alreadyInWorkspace: "已在工作区中",
|
|
94
|
+
remixAppIdDescription: "为新的工作区应用选择一个 URL 安全的 ID。",
|
|
95
|
+
integrationSetup: "集成设置",
|
|
96
|
+
source: "来源",
|
|
97
|
+
remixing: "正在再创作…",
|
|
98
|
+
remixSuccess: "已开始再创作模板。",
|
|
99
|
+
remixError: "无法再创作此模板",
|
|
100
|
+
appIdRequired: "应用 ID 是必填项。",
|
|
82
101
|
hide: "隐藏",
|
|
83
102
|
show: "Show",
|
|
84
103
|
hiddenApps: "隐藏的应用程序",
|
|
@@ -73,12 +73,31 @@ const messages = {
|
|
|
73
73
|
"「{{workspace}}」工作區中的應用程式。每個應用程式都會在此工作區下取得自己的路由,並共用資料庫、驗證與代理聊天。",
|
|
74
74
|
appsInWorkspace: "{{workspace}} 中的應用程式",
|
|
75
75
|
workspaceApps: "工作區應用程式",
|
|
76
|
+
otherApps: "其他應用程式",
|
|
77
|
+
otherAppsDescription: "開啟你可以使用的其他應用程式。",
|
|
78
|
+
availableCount: "可用 {{count}} 個",
|
|
76
79
|
activeCount: "{{count}} 個作用中",
|
|
77
80
|
hiddenCount: "{{count}} 個已隱藏",
|
|
78
81
|
createApp: "建立應用程式",
|
|
79
82
|
templates: "範本",
|
|
80
83
|
checkingTemplates: "檢查可用範本",
|
|
81
84
|
templatesAvailable: "{{count}} 個可用於產生架構",
|
|
85
|
+
curatedTemplates: "精選範本",
|
|
86
|
+
curatedTemplatesDescription:
|
|
87
|
+
"從經過審核的應用程式結構開始,打造屬於你的應用程式。",
|
|
88
|
+
remix: "重新混搭",
|
|
89
|
+
remixTemplate: "重新混搭 {{name}}",
|
|
90
|
+
remixAppIdLabel: "新應用程式 ID",
|
|
91
|
+
remixStarted: "已開始重新混搭 {{name}}",
|
|
92
|
+
viewLiveApp: "查看線上應用程式",
|
|
93
|
+
alreadyInWorkspace: "已在工作區中",
|
|
94
|
+
remixAppIdDescription: "為新的工作區應用程式選擇 URL 安全的 ID。",
|
|
95
|
+
integrationSetup: "整合設定",
|
|
96
|
+
source: "來源",
|
|
97
|
+
remixing: "正在重新混搭…",
|
|
98
|
+
remixSuccess: "已開始重新混搭範本。",
|
|
99
|
+
remixError: "無法重新混搭此範本",
|
|
100
|
+
appIdRequired: "應用程式 ID 為必填項目。",
|
|
82
101
|
hide: "隱藏",
|
|
83
102
|
show: "Show",
|
|
84
103
|
hiddenApps: "隱藏的應用程式",
|
|
@@ -117,6 +117,33 @@ const answer = await callAgent(
|
|
|
117
117
|
// answer is a plain string
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
### Fast bounded read: `invokeAgentAction()`
|
|
121
|
+
|
|
122
|
+
When the caller knows the exact receiver-owned read action and arguments, skip
|
|
123
|
+
the receiver's model loop:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
import { invokeAgentAction } from "@agent-native/core/a2a";
|
|
127
|
+
|
|
128
|
+
const { result } = await invokeAgentAction({
|
|
129
|
+
target: "analytics",
|
|
130
|
+
action: "gong-calls",
|
|
131
|
+
input: { company: "Acme", days: 90, includeTranscripts: true },
|
|
132
|
+
userEmail,
|
|
133
|
+
orgDomain,
|
|
134
|
+
orgSecret,
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The receiver still owns schema validation, credentials, access scoping, audit
|
|
139
|
+
attribution, and exposure policy. Direct invocation is available only for
|
|
140
|
+
cataloged, authenticated, explicitly exposed read-only actions that do not
|
|
141
|
+
require approval. Its JWT is audience-bound to the receiving app. Use normal
|
|
142
|
+
message delegation for planning, synthesis, multi-step work, or mutations.
|
|
143
|
+
|
|
144
|
+
Inside an agent loop, `call-agent` exposes the same path with `action` + `input`;
|
|
145
|
+
omit `message` and `taskId` in that mode.
|
|
146
|
+
|
|
120
147
|
### Advanced: `A2AClient` (full control)
|
|
121
148
|
|
|
122
149
|
```ts
|
|
@@ -178,6 +205,7 @@ cannot carry these grants.
|
|
|
178
205
|
| ---------------- | -------------------------------- | ------------- |
|
|
179
206
|
| `message/send` | Send a message, get a task back | Yes |
|
|
180
207
|
| `message/stream` | Send a message, stream responses | Yes |
|
|
208
|
+
| `actions/invoke` | Invoke one exposed read action | Yes, JWT |
|
|
181
209
|
| `tasks/get` | Get task status by ID | Yes |
|
|
182
210
|
| `tasks/cancel` | Cancel a running task | Yes |
|
|
183
211
|
|
package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md
CHANGED
|
@@ -42,6 +42,11 @@ The main agent should discover available siblings before assuming capability:
|
|
|
42
42
|
- In the agent loop, use `call-agent` with the sibling app id when another app
|
|
43
43
|
owns the work or data. Never call the current app through `call-agent`; use
|
|
44
44
|
local actions instead.
|
|
45
|
+
- When the exact sibling-owned read action and input are already known, use
|
|
46
|
+
`invokeAgentAction()` or `call-agent` with `action` + `input`. This preserves
|
|
47
|
+
the receiver's credentials and access checks while skipping its second model
|
|
48
|
+
loop. Use prompt-based `invokeAgent()` only when the sibling must reason,
|
|
49
|
+
synthesize, mutate, or perform a multi-step workflow.
|
|
45
50
|
|
|
46
51
|
Send narrow prompts to siblings: name the exact question, relevant ids, date
|
|
47
52
|
ranges, and expected output shape. Preserve returned ids and URLs verbatim.
|
|
@@ -99,6 +99,19 @@ index the growing tables first.
|
|
|
99
99
|
`await`s — each `await` is another round-trip.
|
|
100
100
|
- Prefer **one composed endpoint** over several dependent calls.
|
|
101
101
|
|
|
102
|
+
For provider wrappers, inspect the upstream API before building a list-then-
|
|
103
|
+
enrich flow. Prefer the richest endpoint that can apply the real filters and
|
|
104
|
+
return the needed associations or participants in one paginated operation.
|
|
105
|
+
Cursor pagination is already serial; adding a serial detail/enrichment request
|
|
106
|
+
to every page doubles its critical path. Exhaustive records belong in corpus
|
|
107
|
+
recipes or data programs with explicit coverage, not one agent tool call per
|
|
108
|
+
page or item.
|
|
109
|
+
|
|
110
|
+
First-class provider actions should represent one stable conceptual operation.
|
|
111
|
+
Keep arbitrary endpoint, filter, and pagination access in the provider API
|
|
112
|
+
substrate; do not turn a convenience action into a capability ceiling or
|
|
113
|
+
duplicate the provider transport, auth, quota, and cache implementation.
|
|
114
|
+
|
|
102
115
|
## 4. Avoid client-side waterfalls
|
|
103
116
|
|
|
104
117
|
- Don't gate query B on query A's result unless B truly needs it. Fire
|
|
@@ -83,7 +83,7 @@ When the user asks for a dashboard:
|
|
|
83
83
|
2. If a metric definition, date range, or grain is ambiguous and the choice would change the panel's numbers, use the `ask-question` clarifying tool once before building. Skip it when the dictionary or the user already settled it.
|
|
84
84
|
3. If a metric is not documented, do not guess column names. Ask for the table/columns or introspect the provider schema, then propose a dictionary entry with `save-data-dictionary-entry`.
|
|
85
85
|
4. Build a complete `SqlDashboardConfig` with `name` and `panels`. Optionally set top-level `columns` (1–6, default 2) to control how many grid columns the panels before any section use.
|
|
86
|
-
5. Every panel needs `id`, `title`, `source`, `chartType`, `width`, and `sql`. `width` is the number of grid columns the panel spans (1..6, clamped to the active section's column count). Section panels skip `source` and `sql` and may set their own `columns` (1–6) to override the dashboard default for the panels following the section. Extension panels (`chartType: "extension"`) also skip `source` and `sql`; use `config.
|
|
86
|
+
5. Every panel needs `id`, `title`, `source`, `chartType`, `width`, and `sql`. `width` is the number of grid columns the panel spans (1..6, clamped to the active section's column count). Section panels skip `source` and `sql` and may set their own `columns` (1–6) to override the dashboard default for the panels following the section. Extension panels (`chartType: "extension"`) also skip `source` and `sql`; use `config.extensionId` for ordinary author-selected shared embeds. Use `config.extensionSlotId` only when the user explicitly asks for a personal/per-viewer slot (see "Embedding An Extension As A Panel").
|
|
87
87
|
6. Persist with `update-dashboard`, not raw SQL or settings writes.
|
|
88
88
|
7. Navigate to it with `pnpm action navigate --view=adhoc --dashboardId=<id>`.
|
|
89
89
|
|
|
@@ -115,8 +115,27 @@ rather than forcing it into a native dashboard config.
|
|
|
115
115
|
## Embedding An Extension As A Panel
|
|
116
116
|
|
|
117
117
|
Use `chartType: "extension"` to add an extension box alongside normal SQL
|
|
118
|
-
charts. The panel skips `source` and `sql`.
|
|
119
|
-
|
|
118
|
+
charts. The panel skips `source` and `sql`. For ordinary requests such as "put
|
|
119
|
+
X in this dashboard," save the author-selected extension id in
|
|
120
|
+
`config.extensionId`. This makes the selection part of the shared dashboard and
|
|
121
|
+
keeps the widget present in scheduled report captures:
|
|
122
|
+
|
|
123
|
+
```jsonc
|
|
124
|
+
{
|
|
125
|
+
"id": "pipeline-widget",
|
|
126
|
+
"title": "Pipeline Widget",
|
|
127
|
+
"chartType": "extension",
|
|
128
|
+
"width": 3,
|
|
129
|
+
"config": { "extensionId": "extension-123" },
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Direct embeds receive the dashboard id, name, description, current filters,
|
|
134
|
+
and panel context. Embedding does not grant extension access, so share the
|
|
135
|
+
extension with the dashboard audience.
|
|
136
|
+
|
|
137
|
+
Use a stable `config.extensionSlotId` only when the user explicitly wants each
|
|
138
|
+
viewer to choose or install their own widget:
|
|
120
139
|
|
|
121
140
|
```text
|
|
122
141
|
analytics.dashboard.<dashboard-id>.panel.<panel-id>
|
|
@@ -141,14 +160,14 @@ Empty slots show the normal install affordance instead of a broken iframe.
|
|
|
141
160
|
|
|
142
161
|
Notes:
|
|
143
162
|
|
|
144
|
-
-
|
|
145
|
-
filters, and panel id/title/slot id as live context.
|
|
163
|
+
- Both direct and slot-backed extensions receive dashboard and panel context.
|
|
146
164
|
- Installs and extension access are per viewer. Sharing the dashboard does not
|
|
147
165
|
automatically install or grant access to its extension for other viewers.
|
|
148
|
-
-
|
|
149
|
-
|
|
166
|
+
- Slot installs are per-user preferences. Different viewers can see different
|
|
167
|
+
widgets, and scheduled reports running as a service identity may show an
|
|
168
|
+
empty slot. This is why slots are opt-in rather than the default.
|
|
150
169
|
|
|
151
|
-
## Cloning A
|
|
170
|
+
## Cloning A Direct-Extension Dashboard (e.g. per-customer copies)
|
|
152
171
|
|
|
153
172
|
When the user asks for a copy of an existing extension-backed dashboard for a
|
|
154
173
|
different customer/org (for example "make an Intuit version of the Roku usage
|
|
@@ -159,7 +178,7 @@ from that written file — never by pulling the body into chat context first or
|
|
|
159
178
|
re-typing it as a `content` argument.
|
|
160
179
|
|
|
161
180
|
1. `get-sql-dashboard` with `includeConfig: true` on the source dashboard and
|
|
162
|
-
confirm the target panel is a
|
|
181
|
+
confirm the target panel is a `chartType: "extension"` panel with
|
|
163
182
|
`config.extensionId`; grab that extension id. For a slot-backed panel, clone
|
|
164
183
|
the dashboard panel with a new stable `extensionSlotId`, then target and
|
|
165
184
|
install the desired extension into that slot instead of using this body-copy
|
|
@@ -405,7 +424,7 @@ type PanelInput = PanelPatch & {
|
|
|
405
424
|
chartType: NonNullable<PanelPatch["chartType"]>;
|
|
406
425
|
source?: PanelPatch["source"]; // required for non-section / non-extension panels
|
|
407
426
|
sql?: string; // required for non-section / non-extension panels
|
|
408
|
-
// For chartType "extension": use config.
|
|
427
|
+
// For chartType "extension": use config.extensionId by default; extensionSlotId is opt-in per-viewer content.
|
|
409
428
|
};
|
|
410
429
|
|
|
411
430
|
type PanelFilter = {
|