@agent-native/core 0.107.0 → 0.107.2

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 (156) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +16 -0
  3. package/corpus/core/docs/content/integrations.mdx +27 -27
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/a2a/artifact-response.ts +32 -10
  6. package/corpus/core/src/agent/production-agent.ts +19 -0
  7. package/corpus/core/src/agent/run-store.ts +98 -2
  8. package/corpus/core/src/client/AssistantChat.tsx +13 -0
  9. package/corpus/core/src/client/CommandMenu.tsx +5 -0
  10. package/corpus/core/src/client/active-run-state.ts +34 -0
  11. package/corpus/core/src/client/agent-chat-adapter.ts +4 -0
  12. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +41 -11
  13. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +27 -9
  14. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +45 -0
  15. package/corpus/core/src/client/sharing/ShareButton.tsx +30 -9
  16. package/corpus/core/src/client/use-agent-chat-home-handoff.ts +2 -2
  17. package/corpus/core/src/integrations/a2a-continuation-processor.ts +107 -3
  18. package/corpus/core/src/integrations/pending-tasks-store.ts +98 -1
  19. package/corpus/core/src/integrations/plugin.ts +129 -4
  20. package/corpus/core/src/integrations/webhook-handler.ts +339 -36
  21. package/corpus/core/src/localization/default-messages.ts +4 -1
  22. package/corpus/core/src/secrets/register-framework-secrets.ts +28 -0
  23. package/corpus/core/src/server/agent-chat-plugin.ts +122 -9
  24. package/corpus/core/src/vite/client.ts +24 -0
  25. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -21
  26. package/corpus/templates/analytics/AGENTS.md +8 -0
  27. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
  28. package/corpus/templates/analytics/actions/update-dashboard.ts +6 -2
  29. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +35 -7
  30. package/corpus/templates/analytics/app/components/layout/Layout.tsx +1 -3
  31. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +11 -1
  32. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/extension-slot.ts +11 -0
  33. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +27 -0
  34. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +6 -0
  35. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extension-boxes.md +6 -0
  36. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +8 -0
  37. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  38. package/corpus/templates/assets/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  39. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +6 -1
  40. package/corpus/templates/brain/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  41. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
  42. package/corpus/templates/calendar/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  43. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +4 -1
  44. package/corpus/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  45. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  46. package/corpus/templates/clips/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  47. package/corpus/templates/content/actions/_content-space-access.ts +45 -2
  48. package/corpus/templates/content/actions/create-content-database.ts +41 -7
  49. package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
  50. package/corpus/templates/content/app/root.tsx +1 -10
  51. package/corpus/templates/content/changelog/2026-07-17-creating-a-database-now-completes-reliably-in-hosted-workspa.md +6 -0
  52. package/corpus/templates/content/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  53. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +4 -1
  54. package/corpus/templates/dispatch/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  55. package/corpus/templates/forms/app/components/layout/Layout.tsx +2 -4
  56. package/corpus/templates/forms/app/components/ui/popover.tsx +25 -1
  57. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +6 -1
  58. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +13 -10
  59. package/corpus/templates/forms/app/root.tsx +6 -1
  60. package/corpus/templates/forms/changelog/2026-07-17-form-builder-popovers-stay-within-the-viewport.md +6 -0
  61. package/corpus/templates/forms/changelog/2026-07-17-form-editor-loading-matches-current-sidebar-free-layout.md +6 -0
  62. package/corpus/templates/forms/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  63. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +1 -1
  64. package/corpus/templates/mail/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  65. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +14 -3
  66. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +8 -1
  67. package/corpus/templates/plan/app/root.tsx +0 -2
  68. package/corpus/templates/plan/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  69. package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
  70. package/corpus/templates/slides/app/context/DeckContext.tsx +23 -23
  71. package/corpus/templates/slides/changelog/2026-07-17-duplicated-slides-now-stay-in-the-deck.md +6 -0
  72. package/corpus/templates/slides/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  73. package/corpus/templates/tasks/app/components/layout/Layout.tsx +2 -13
  74. package/corpus/templates/tasks/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it.md +6 -0
  75. package/dist/a2a/artifact-response.d.ts +5 -1
  76. package/dist/a2a/artifact-response.d.ts.map +1 -1
  77. package/dist/a2a/artifact-response.js +18 -12
  78. package/dist/a2a/artifact-response.js.map +1 -1
  79. package/dist/agent/production-agent.d.ts.map +1 -1
  80. package/dist/agent/production-agent.js +13 -1
  81. package/dist/agent/production-agent.js.map +1 -1
  82. package/dist/agent/run-store.d.ts +17 -0
  83. package/dist/agent/run-store.d.ts.map +1 -1
  84. package/dist/agent/run-store.js +84 -2
  85. package/dist/agent/run-store.js.map +1 -1
  86. package/dist/client/AssistantChat.d.ts.map +1 -1
  87. package/dist/client/AssistantChat.js +10 -1
  88. package/dist/client/AssistantChat.js.map +1 -1
  89. package/dist/client/CommandMenu.d.ts.map +1 -1
  90. package/dist/client/CommandMenu.js +4 -0
  91. package/dist/client/CommandMenu.js.map +1 -1
  92. package/dist/client/active-run-state.d.ts +7 -0
  93. package/dist/client/active-run-state.d.ts.map +1 -1
  94. package/dist/client/active-run-state.js +28 -0
  95. package/dist/client/active-run-state.js.map +1 -1
  96. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  97. package/dist/client/agent-chat-adapter.js +4 -1
  98. package/dist/client/agent-chat-adapter.js.map +1 -1
  99. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  100. package/dist/client/resources/McpConnectionSuggestion.js +27 -8
  101. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  102. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  103. package/dist/client/resources/McpIntegrationDialog.js +4 -2
  104. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  105. package/dist/client/resources/mcp-integration-catalog.d.ts +6 -0
  106. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  107. package/dist/client/resources/mcp-integration-catalog.js +33 -0
  108. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  109. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  110. package/dist/client/sharing/ShareButton.js +15 -12
  111. package/dist/client/sharing/ShareButton.js.map +1 -1
  112. package/dist/client/use-agent-chat-home-handoff.d.ts +1 -1
  113. package/dist/client/use-agent-chat-home-handoff.d.ts.map +1 -1
  114. package/dist/client/use-agent-chat-home-handoff.js +1 -1
  115. package/dist/client/use-agent-chat-home-handoff.js.map +1 -1
  116. package/dist/collab/awareness.d.ts +2 -2
  117. package/dist/collab/awareness.d.ts.map +1 -1
  118. package/dist/collab/routes.d.ts +1 -1
  119. package/dist/integrations/a2a-continuation-processor.js +62 -5
  120. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  121. package/dist/integrations/pending-tasks-store.d.ts +3 -0
  122. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  123. package/dist/integrations/pending-tasks-store.js +75 -1
  124. package/dist/integrations/pending-tasks-store.js.map +1 -1
  125. package/dist/integrations/plugin.d.ts.map +1 -1
  126. package/dist/integrations/plugin.js +81 -5
  127. package/dist/integrations/plugin.js.map +1 -1
  128. package/dist/integrations/webhook-handler.d.ts +23 -2
  129. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  130. package/dist/integrations/webhook-handler.js +257 -35
  131. package/dist/integrations/webhook-handler.js.map +1 -1
  132. package/dist/localization/default-messages.d.ts +2 -0
  133. package/dist/localization/default-messages.d.ts.map +1 -1
  134. package/dist/localization/default-messages.js +3 -1
  135. package/dist/localization/default-messages.js.map +1 -1
  136. package/dist/notifications/routes.d.ts +2 -2
  137. package/dist/observability/routes.d.ts +5 -5
  138. package/dist/resources/handlers.d.ts +1 -1
  139. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  140. package/dist/secrets/register-framework-secrets.js +25 -0
  141. package/dist/secrets/register-framework-secrets.js.map +1 -1
  142. package/dist/secrets/routes.d.ts +9 -9
  143. package/dist/server/agent-chat-plugin.d.ts +6 -0
  144. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  145. package/dist/server/agent-chat-plugin.js +94 -7
  146. package/dist/server/agent-chat-plugin.js.map +1 -1
  147. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  148. package/dist/templates/chat/app/hooks/use-navigation-state.ts +4 -1
  149. package/dist/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  150. package/dist/vite/client.d.ts.map +1 -1
  151. package/dist/vite/client.js +20 -0
  152. package/dist/vite/client.js.map +1 -1
  153. package/docs/content/integrations.mdx +27 -27
  154. package/package.json +1 -1
  155. package/src/templates/chat/app/hooks/use-navigation-state.ts +4 -1
  156. package/src/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
@@ -1,7 +1,7 @@
1
1
  import crypto from "node:crypto";
2
2
  import nodePath from "node:path";
3
3
  import { createError, defineEventHandler, setResponseStatus, setResponseHeader, getMethod, getQuery, getHeader, getRequestIP, } from "h3";
4
- import { buildA2ARecoverableArtifactMessage, } from "../a2a/artifact-response.js";
4
+ import { appendA2AArtifactLinks, buildA2ARecoverableArtifactMessage, } from "../a2a/artifact-response.js";
5
5
  import { hasConfiguredA2ASecret, isLoopbackAddress, isTrustedLocalRuntime, } from "../a2a/auth-policy.js";
6
6
  import { applyAgentTextEventToBuffer } from "../a2a/response-text.js";
7
7
  import { createA2AApproval, updateTaskStatusMessage, } from "../a2a/task-store.js";
@@ -11,7 +11,7 @@ import { AGENT_CHAT_BACKGROUND_RUN_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, backgroun
11
11
  import { resolveEngine, createAnthropicEngine, getStoredModelForEngine, normalizeModelForEngine, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, listAgentEngines, registerBuiltinEngines, } from "../agent/engine/index.js";
12
12
  import { createProductionAgentHandler, actionsToEngineTools, executeAgentToolCall, toolCallCacheKey, getActiveRunForThreadAsync, abortRunDurably, subscribeToRun, } from "../agent/production-agent.js";
13
13
  import { callerHasRunAccess, callerHasThreadAccess, } from "../agent/run-ownership.js";
14
- import { readBackgroundRunClaim } from "../agent/run-store.js";
14
+ import { markTurnAborted, readBackgroundRunClaim } from "../agent/run-store.js";
15
15
  import { buildCurrentTimeUserContext, buildRuntimeContextPrompt, } from "../agent/runtime-context.js";
16
16
  import { buildAssistantMessage, buildUserMessage, extractThreadMeta, foldAssistantTurn, mergeThreadDataForClientSave, upsertUserMessage, } from "../agent/thread-data-builder.js";
17
17
  import { attachToolSearch } from "../agent/tool-search.js";
@@ -77,6 +77,60 @@ export { shouldBlockInProductCodeEditingSurface };
77
77
  export { loadRunCodeToolEntries };
78
78
  export { shouldDisableRecurringJobsRuntime };
79
79
  export { finalizeClaimedAgentChatProcessRunFailure };
80
+ export function createSerializedA2ATaskStatusWriter(taskId, writeStatus = updateTaskStatusMessage, onError = (error) => {
81
+ console.error(`[A2A] Failed to persist recoverable artifact message for task ${taskId}:`, error);
82
+ }) {
83
+ const maxAttempts = 3;
84
+ let latestWrite = Promise.resolve();
85
+ const persistWithRetry = async (message) => {
86
+ let lastError;
87
+ for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
88
+ try {
89
+ await writeStatus(taskId, message);
90
+ return;
91
+ }
92
+ catch (error) {
93
+ lastError = error;
94
+ }
95
+ }
96
+ try {
97
+ onError(lastError);
98
+ }
99
+ catch {
100
+ // The durable-write error below remains the authoritative failure.
101
+ }
102
+ throw lastError;
103
+ };
104
+ return {
105
+ enqueue(message) {
106
+ // A newer checkpoint supersedes an earlier failed checkpoint, so keep
107
+ // the queue moving. flush() still rejects when the latest write itself
108
+ // cannot be made durable after bounded retries.
109
+ latestWrite = latestWrite
110
+ .catch(() => undefined)
111
+ .then(() => {
112
+ return persistWithRetry(message);
113
+ });
114
+ },
115
+ flush() {
116
+ return latestWrite;
117
+ },
118
+ };
119
+ }
120
+ export async function resolveA2ARecoverableArtifactSecret(orgId = getRequestOrgId()) {
121
+ const globalSecret = process.env.A2A_SECRET?.trim();
122
+ if (globalSecret)
123
+ return globalSecret;
124
+ if (!orgId)
125
+ return undefined;
126
+ try {
127
+ const { getOrgA2ASecret } = await import("../org/context.js");
128
+ return (await getOrgA2ASecret(orgId))?.trim() || undefined;
129
+ }
130
+ catch {
131
+ return undefined;
132
+ }
133
+ }
80
134
  export function buildLeanRunPolicyPrompt(codeEditingSurfaceRestriction, prodCodeExecPromptNote) {
81
135
  return codeEditingSurfaceRestriction + prodCodeExecPromptNote;
82
136
  }
@@ -1116,6 +1170,8 @@ export function createAgentChatPlugin(options) {
1116
1170
  const a2aEvents = [];
1117
1171
  const a2aToolResults = [];
1118
1172
  let lastRecoverableArtifactText = "";
1173
+ const recoverableArtifactSecret = await resolveA2ARecoverableArtifactSecret();
1174
+ const recoverableArtifactStatusWriter = createSerializedA2ATaskStatusWriter(context.taskId);
1119
1175
  const controller = new AbortController();
1120
1176
  console.log(`[A2A] Starting agent loop: ${a2aToolSurface.tools.length}/${a2aToolSurface.availableTools.length} initial tools, prompt ${systemPrompt.length} chars`);
1121
1177
  await runA2AAgentLoop({
@@ -1146,13 +1202,21 @@ export function createAgentChatPlugin(options) {
1146
1202
  isError: event.isError,
1147
1203
  completedSideEffect: event.completedSideEffect,
1148
1204
  });
1149
- const recoverableArtifactText = buildA2ARecoverableArtifactMessage(a2aToolResults, {
1150
- baseUrl: resolveArtifactBaseUrl(context.event),
1205
+ const artifactBaseUrl = resolveArtifactBaseUrl(context.event);
1206
+ const recoverableArtifactMessage = buildA2ARecoverableArtifactMessage(a2aToolResults, {
1207
+ baseUrl: artifactBaseUrl,
1151
1208
  });
1209
+ const recoverableArtifactText = recoverableArtifactMessage
1210
+ ? appendA2AArtifactLinks(recoverableArtifactMessage, a2aToolResults, {
1211
+ baseUrl: artifactBaseUrl,
1212
+ includePersistedArtifactMarker: true,
1213
+ persistedArtifactSecret: recoverableArtifactSecret,
1214
+ })
1215
+ : null;
1152
1216
  if (recoverableArtifactText &&
1153
1217
  recoverableArtifactText !== lastRecoverableArtifactText) {
1154
1218
  lastRecoverableArtifactText = recoverableArtifactText;
1155
- updateTaskStatusMessage(context.taskId, {
1219
+ recoverableArtifactStatusWriter.enqueue({
1156
1220
  role: "agent",
1157
1221
  metadata: { agentNativeRecoverableArtifacts: true },
1158
1222
  parts: [
@@ -1161,8 +1225,6 @@ export function createAgentChatPlugin(options) {
1161
1225
  text: recoverableArtifactText,
1162
1226
  },
1163
1227
  ],
1164
- }).catch((err) => {
1165
- console.error(`[A2A] Failed to persist recoverable artifact message for task ${context.taskId}:`, err);
1166
1228
  });
1167
1229
  }
1168
1230
  }
@@ -1181,6 +1243,9 @@ export function createAgentChatPlugin(options) {
1181
1243
  backgroundFunction: options?.durableBackgroundRuns === true &&
1182
1244
  isInBackgroundFunctionRuntime(),
1183
1245
  });
1246
+ // The continuation can observe terminal output immediately, so make
1247
+ // its latest mutation checkpoint durable first.
1248
+ await recoverableArtifactStatusWriter.flush();
1184
1249
  const approval = [...a2aEvents]
1185
1250
  .reverse()
1186
1251
  .find((event) => event.type === "approval_required");
@@ -3293,6 +3358,25 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
3293
3358
  const canViewThread = (threadId) => callerHasThreadAccess(owner, threadId, "viewer", { orgId });
3294
3359
  const canViewRun = (runId) => callerHasRunAccess(owner, runId, "viewer", { orgId });
3295
3360
  const canEditRun = (runId) => callerHasRunAccess(owner, runId, "editor", { orgId });
3361
+ const canEditThread = (threadId) => callerHasThreadAccess(owner, threadId, "editor", { orgId });
3362
+ // Route: POST /runs/turn/:turnId/abort
3363
+ // Covers the short window where the client has sent a turn but the
3364
+ // server has not yet created its background run id.
3365
+ const turnAbortMatch = url.match(/\/runs\/turn\/([^/?]+)\/abort/) ||
3366
+ url.match(/^\/turn\/([^/?]+)\/abort/);
3367
+ if (turnAbortMatch && method === "POST") {
3368
+ const turnId = decodeURIComponent(turnAbortMatch[1]);
3369
+ const body = await readBody(event).catch(() => null);
3370
+ const threadId = typeof body?.threadId === "string" ? body.threadId : "";
3371
+ if (!/^[a-zA-Z0-9_-]{1,160}$/.test(turnId) ||
3372
+ !threadId ||
3373
+ !(await canEditThread(threadId))) {
3374
+ setResponseStatus(event, 404);
3375
+ return { error: "Run not found" };
3376
+ }
3377
+ await markTurnAborted(threadId, turnId);
3378
+ return { ok: true };
3379
+ }
3296
3380
  // Route: GET /runs/list?goalId=agent-team|agent-harness
3297
3381
  // Returns background agents in the Code hub-compatible run shape.
3298
3382
  const listMatch = url.match(/\/runs\/list(?:[/?]|$)/) ||
@@ -4143,6 +4227,9 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4143
4227
  }
4144
4228
  workerBody = {
4145
4229
  ...parsedPayload,
4230
+ ...(prepared.body.internalContinuation === true
4231
+ ? { internalContinuation: true }
4232
+ : {}),
4146
4233
  [AGENT_CHAT_BACKGROUND_RUN_FIELD]: preparedMarker,
4147
4234
  };
4148
4235
  }