@agent-native/core 0.98.5 → 0.98.7

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.
Files changed (135) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -0
  3. package/corpus/core/docs/content/external-agents.mdx +66 -7
  4. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +40 -7
  5. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +41 -7
  6. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +41 -7
  7. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +41 -7
  8. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +40 -7
  9. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +40 -7
  10. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +40 -7
  11. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +41 -7
  12. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +39 -7
  13. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +39 -7
  14. package/corpus/core/package.json +1 -1
  15. package/corpus/core/src/a2a/handlers.ts +101 -26
  16. package/corpus/core/src/a2a/task-store.ts +128 -3
  17. package/corpus/core/src/client/session-replay.ts +67 -5
  18. package/corpus/core/src/integrations/adapters/slack.ts +207 -17
  19. package/corpus/core/src/integrations/identity-links-store.ts +210 -0
  20. package/corpus/core/src/integrations/identity.ts +196 -0
  21. package/corpus/core/src/integrations/index.ts +6 -0
  22. package/corpus/core/src/integrations/plugin.ts +130 -1
  23. package/corpus/core/src/integrations/types.ts +37 -0
  24. package/corpus/core/src/integrations/webhook-handler.ts +1 -0
  25. package/corpus/core/src/mcp/build-server.ts +127 -22
  26. package/corpus/core/src/mcp/builtin-tools.ts +5 -2
  27. package/corpus/core/src/mcp/external-agent-policy.ts +18 -0
  28. package/corpus/core/src/mcp/index.ts +1 -0
  29. package/corpus/core/src/server/agent-chat/plugin-options.ts +12 -1
  30. package/corpus/core/src/server/agent-chat/script-entries.ts +20 -3
  31. package/corpus/core/src/server/agent-chat-plugin.ts +3 -0
  32. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  33. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +4 -1
  34. package/corpus/templates/analytics/AGENTS.md +20 -5
  35. package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +0 -1
  36. package/corpus/templates/analytics/actions/get-session-replay-events.ts +0 -1
  37. package/corpus/templates/analytics/actions/get-session-replay-timeline.ts +40 -0
  38. package/corpus/templates/analytics/actions/list-error-issues.ts +12 -0
  39. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -1
  40. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +48 -17
  41. package/corpus/templates/analytics/changelog/2026-07-12-analytics-uses-the-full-in-app-agent-for-multi-step-incident.md +6 -0
  42. package/corpus/templates/analytics/changelog/2026-07-12-connected-external-agents-can-now-look-up-sessions-error-iss.md +6 -0
  43. package/corpus/templates/analytics/changelog/2026-07-12-session-identities-stay-visible-when-demo-mode-is-off.md +6 -0
  44. package/corpus/templates/analytics/server/handlers/session-replay.ts +15 -9
  45. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +2 -2
  46. package/corpus/templates/analytics/server/lib/error-capture.ts +47 -5
  47. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +72 -22
  48. package/corpus/templates/analytics/server/lib/session-replay.ts +41 -11
  49. package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -0
  50. package/corpus/templates/analytics/server/plugins/db.ts +15 -0
  51. package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +8 -5
  52. package/corpus/templates/analytics/server/routes/api/session-replay/agent-events.json.get.ts +8 -3
  53. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +12 -2
  54. package/corpus/templates/forms/app/global.css +54 -8
  55. package/corpus/templates/forms/app/pages/AskPage.tsx +35 -13
  56. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +11 -17
  57. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +8 -5
  58. package/corpus/templates/forms/changelog/2026-07-12-ask-forms-suggestions-now-sit-beneath-the-composer-for-a-tig.md +6 -0
  59. package/corpus/templates/forms/changelog/2026-07-12-builder-response-tables-now-fill-the-view-without-a-redundan.md +6 -0
  60. package/corpus/templates/forms/changelog/2026-07-12-response-tables-now-fill-the-available-pane-with-a-flexible-.md +6 -0
  61. package/corpus/templates/mail/AGENTS.md +3 -1
  62. package/corpus/templates/mail/server/lib/mail-integrations.ts +3 -0
  63. package/dist/a2a/handlers.d.ts.map +1 -1
  64. package/dist/a2a/handlers.js +89 -20
  65. package/dist/a2a/handlers.js.map +1 -1
  66. package/dist/a2a/task-store.d.ts +32 -1
  67. package/dist/a2a/task-store.d.ts.map +1 -1
  68. package/dist/a2a/task-store.js +111 -4
  69. package/dist/a2a/task-store.js.map +1 -1
  70. package/dist/client/session-replay.d.ts.map +1 -1
  71. package/dist/client/session-replay.js +53 -8
  72. package/dist/client/session-replay.js.map +1 -1
  73. package/dist/collab/routes.d.ts +1 -1
  74. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  75. package/dist/integrations/adapters/slack.js +176 -17
  76. package/dist/integrations/adapters/slack.js.map +1 -1
  77. package/dist/integrations/identity-links-store.d.ts +23 -0
  78. package/dist/integrations/identity-links-store.d.ts.map +1 -0
  79. package/dist/integrations/identity-links-store.js +158 -0
  80. package/dist/integrations/identity-links-store.js.map +1 -0
  81. package/dist/integrations/identity.d.ts +28 -0
  82. package/dist/integrations/identity.d.ts.map +1 -0
  83. package/dist/integrations/identity.js +142 -0
  84. package/dist/integrations/identity.js.map +1 -0
  85. package/dist/integrations/index.d.ts +2 -0
  86. package/dist/integrations/index.d.ts.map +1 -1
  87. package/dist/integrations/index.js +2 -0
  88. package/dist/integrations/index.js.map +1 -1
  89. package/dist/integrations/plugin.d.ts.map +1 -1
  90. package/dist/integrations/plugin.js +93 -1
  91. package/dist/integrations/plugin.js.map +1 -1
  92. package/dist/integrations/types.d.ts +31 -0
  93. package/dist/integrations/types.d.ts.map +1 -1
  94. package/dist/integrations/types.js.map +1 -1
  95. package/dist/integrations/webhook-handler.js +1 -0
  96. package/dist/integrations/webhook-handler.js.map +1 -1
  97. package/dist/mcp/build-server.d.ts +9 -2
  98. package/dist/mcp/build-server.d.ts.map +1 -1
  99. package/dist/mcp/build-server.js +97 -20
  100. package/dist/mcp/build-server.js.map +1 -1
  101. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  102. package/dist/mcp/builtin-tools.js +5 -2
  103. package/dist/mcp/builtin-tools.js.map +1 -1
  104. package/dist/mcp/external-agent-policy.d.ts +19 -0
  105. package/dist/mcp/external-agent-policy.d.ts.map +1 -0
  106. package/dist/mcp/external-agent-policy.js +2 -0
  107. package/dist/mcp/external-agent-policy.js.map +1 -0
  108. package/dist/mcp/index.d.ts +1 -0
  109. package/dist/mcp/index.d.ts.map +1 -1
  110. package/dist/mcp/index.js.map +1 -1
  111. package/dist/notifications/routes.d.ts +1 -1
  112. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  113. package/dist/server/agent-chat/plugin-options.d.ts +11 -1
  114. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  115. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  116. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  117. package/dist/server/agent-chat/script-entries.js +16 -2
  118. package/dist/server/agent-chat/script-entries.js.map +1 -1
  119. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  120. package/dist/server/agent-chat-plugin.js +3 -0
  121. package/dist/server/agent-chat-plugin.js.map +1 -1
  122. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  123. package/docs/content/external-agents.mdx +66 -7
  124. package/docs/content/locales/ar-SA/external-agents.mdx +40 -7
  125. package/docs/content/locales/de-DE/external-agents.mdx +41 -7
  126. package/docs/content/locales/es-ES/external-agents.mdx +41 -7
  127. package/docs/content/locales/fr-FR/external-agents.mdx +41 -7
  128. package/docs/content/locales/hi-IN/external-agents.mdx +40 -7
  129. package/docs/content/locales/ja-JP/external-agents.mdx +40 -7
  130. package/docs/content/locales/ko-KR/external-agents.mdx +40 -7
  131. package/docs/content/locales/pt-BR/external-agents.mdx +41 -7
  132. package/docs/content/locales/zh-CN/external-agents.mdx +39 -7
  133. package/docs/content/locales/zh-TW/external-agents.mdx +39 -7
  134. package/package.json +1 -1
  135. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
@@ -93,7 +93,7 @@ function explicitlyRequestsFullMcpCatalog(requestMeta) {
93
93
  // (100k+ tokens) into a context window just because a client called itself
94
94
  // "code"/"cursor"/"codex" was a recurring footgun. Everything else gets the
95
95
  // connector/compact catalog plus `tool-search`, which keeps every tool
96
- // reachable on demand.
96
+ // discoverable; only permitted actions are callable without full opt-in.
97
97
  if (process.env.AGENT_NATIVE_MCP_FULL_CATALOG === "1")
98
98
  return true;
99
99
  return requestMeta?.fullCatalog === true;
@@ -117,19 +117,80 @@ function warnFullCatalogServed(toolCount) {
117
117
  `This is a large context payload meant to be a rare, explicit opt-in — most ` +
118
118
  `clients should use the default compact/connector catalog + tool-search instead.`);
119
119
  }
120
+ function isAuthenticatedReadAction(entry) {
121
+ return (entry.http !== false &&
122
+ entry.http?.method === "GET" &&
123
+ entry.readOnly === true &&
124
+ entry.publicAgent?.expose === true &&
125
+ entry.publicAgent.readOnly === true &&
126
+ entry.publicAgent.requiresAuth === true);
127
+ }
120
128
  /**
121
- * Returns true when the given action name is in the template's connector
122
- * catalog, OR is a builtin cross-app tool that is always included for
123
- * external connector clients. Builtin tool names from
124
- * `COMPACT_MCP_APP_CATALOG_BUILTINS` are always allowed since they are the
125
- * stable external-agent verb set.
129
+ * Hard exclusion list for the `authenticatedReads: "auto"` derivation ONLY
130
+ * (see `autoAuthenticatedReadNames` below). Explicit `connectorCatalog`
131
+ * entries are a deliberate, reviewed choice made by the app and are NOT
132
+ * affected by this list an app can still list any of these names in
133
+ * `connectorCatalog` on purpose.
134
+ *
135
+ * These are the footgun families this file's other comments already call
136
+ * out ("removes footguns (db-exec, seed-*, extension tools, browser-session
137
+ * tools, etc.)" above, and "keeps db-exec / seed-* / extension /
138
+ * browser-session footguns off the external surface" near the connector
139
+ * tier below): generic core SQL access, template demo/seed data, the
140
+ * extension-management suite, live browser-session control, and Context
141
+ * X-Ray internals. `isAuthenticatedReadAction` only inspects action
142
+ * metadata (http/readOnly/publicAgent flags) — nothing stops a future
143
+ * change from mis-annotating one of these with that exact flag set again,
144
+ * the way `db-query`/`db-schema` were briefly (and accidentally) annotated
145
+ * before it was caught in review. These names can never be auto-derived
146
+ * from metadata alone; exposing one to external callers requires an
147
+ * explicit `connectorCatalog` entry.
126
148
  */
127
- function isActionInConnectorCatalog(name, config) {
128
- if (COMPACT_MCP_APP_CATALOG_BUILTINS.has(name))
129
- return true;
130
- if (!Array.isArray(config.connectorCatalog))
131
- return false;
132
- return config.connectorCatalog.includes(name);
149
+ const AUTO_READ_EXCLUDED_ACTION_NAMES = new Set([
150
+ "db-query",
151
+ "db-schema",
152
+ "db-exec",
153
+ "db-patch",
154
+ "context-manifest-get",
155
+ "context-pin",
156
+ "context-evict",
157
+ "context-restore",
158
+ "context-report",
159
+ ]);
160
+ /**
161
+ * Substring/prefix patterns for excluded name *families* that aren't a
162
+ * fixed, enumerable set: `seed-*` varies per app/template, and the
163
+ * extension-management and browser-session tool suites use varying verb
164
+ * prefixes around a shared noun (e.g. `list-extensions`, `create-extension`,
165
+ * `hide-extension`; `list-browser-sessions`, `run-browser-session-action`) —
166
+ * so a leading-prefix match alone would miss most of them.
167
+ */
168
+ const AUTO_READ_EXCLUDED_ACTION_PATTERNS = [
169
+ /^seed-/,
170
+ /extension/,
171
+ /browser-session/,
172
+ ];
173
+ function isAutoReadExcludedActionName(name) {
174
+ return (AUTO_READ_EXCLUDED_ACTION_NAMES.has(name) ||
175
+ AUTO_READ_EXCLUDED_ACTION_PATTERNS.some((pattern) => pattern.test(name)));
176
+ }
177
+ function autoAuthenticatedReadNames(actions, config) {
178
+ if (config.externalAgents?.authenticatedReads !== "auto")
179
+ return new Set();
180
+ return new Set(Object.entries(actions)
181
+ .filter(([name, entry]) => isAuthenticatedReadAction(entry) &&
182
+ !isAutoReadExcludedActionName(name))
183
+ .map(([name]) => name));
184
+ }
185
+ function externalAgentDenySet(config) {
186
+ return new Set((config.externalAgents?.denyActions ?? [])
187
+ .map((name) => name.trim())
188
+ .filter(Boolean));
189
+ }
190
+ function externalAgentWritesAreAskAppOnly(config) {
191
+ return (config.externalAgents?.writes === "ask_app_only" ||
192
+ (config.externalAgents?.authenticatedReads === "auto" &&
193
+ config.externalAgents?.writes !== "allowlisted"));
133
194
  }
134
195
  function metadataObject(value) {
135
196
  return value && typeof value === "object" && !Array.isArray(value)
@@ -926,15 +987,19 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
926
987
  const advertisedActionsBeforeConnector = compactMcpAppCatalog
927
988
  ? Object.fromEntries(Object.entries(visibleActions).filter(([name, entry]) => isActionAdvertisedInCompactMcpAppCatalog(name, entry, config)))
928
989
  : visibleActions;
990
+ const autoReadNames = autoAuthenticatedReadNames(visibleActions, config);
991
+ const connectorNames = new Set([
992
+ ...(config.connectorCatalog ?? []),
993
+ ...autoReadNames,
994
+ ]);
995
+ const denyNames = externalAgentDenySet(config);
996
+ const automaticConnectorPolicyActive = config.externalAgents?.authenticatedReads === "auto";
929
997
  // Connector-catalog tier: when a template declares a connector allow-list,
930
- // serve exactly that curated surface (+ cross-app builtins + tool-search) to
931
- // external callers unless they explicitly opted into the full catalog. This
932
- // is active by default whenever a catalog is declared no env flag required —
933
- // so the ~105-tool full catalog can never leak just because a deployment
934
- // forgot to set one. It also keeps db-exec / seed-* / extension /
998
+ // serve exactly that curated surface plus any explicitly annotated
999
+ // authenticated reads from `externalAgents.authenticatedReads: "auto"`.
1000
+ // This stays compact by default and keeps db-exec / seed-* / extension /
935
1001
  // browser-session footguns off the external surface.
936
- const connectorCatalogActive = Array.isArray(config.connectorCatalog) &&
937
- config.connectorCatalog.length > 0 &&
1002
+ const connectorCatalogActive = (connectorNames.size > 0 || automaticConnectorPolicyActive) &&
938
1003
  !fullCatalogRequested;
939
1004
  // When the connector catalog is active, filter directly from visibleActions
940
1005
  // rather than advertisedActionsBeforeConnector. This ensures the connector
@@ -942,7 +1007,19 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
942
1007
  // narrow to just the compact-catalog builtins when shouldUseCompactMcpCatalogByDefault
943
1008
  // would have activated the compact catalog for the same caller.
944
1009
  const advertisedActions = connectorCatalogActive
945
- ? Object.fromEntries(Object.entries(visibleActions).filter(([name]) => isActionInConnectorCatalog(name, config)))
1010
+ ? Object.fromEntries(Object.entries(visibleActions).filter(([name, entry]) => {
1011
+ if (denyNames.has(name))
1012
+ return false;
1013
+ if (COMPACT_MCP_APP_CATALOG_BUILTINS.has(name))
1014
+ return true;
1015
+ if (!connectorNames.has(name))
1016
+ return false;
1017
+ if (externalAgentWritesAreAskAppOnly(config) &&
1018
+ entry.readOnly !== true) {
1019
+ return false;
1020
+ }
1021
+ return true;
1022
+ }))
946
1023
  : advertisedActionsBeforeConnector;
947
1024
  if (fullCatalogRequested) {
948
1025
  warnFullCatalogServed(Object.keys(advertisedActions).length);