@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
@@ -78,13 +78,16 @@ import {
78
78
  import { startPendingTasksRetryJob } from "./pending-tasks-retry-job.js";
79
79
  import {
80
80
  claimPendingTask,
81
+ failTaskDeliveryTransition,
81
82
  getNextPendingTaskIdForThread,
82
83
  insertPendingTask,
83
84
  isDuplicateEventError,
84
85
  MAX_PENDING_TASK_ATTEMPTS,
85
86
  markTaskCompleted,
87
+ markTaskDeliveryRetryable,
86
88
  markTaskFailed,
87
89
  markTaskRetryable,
90
+ stageTaskDeliveryPayload,
88
91
  } from "./pending-tasks-store.js";
89
92
  import {
90
93
  claimNextComputerCommand,
@@ -142,12 +145,18 @@ import type {
142
145
  IntegrationStatus,
143
146
  IntegrationExecutionContext,
144
147
  IncomingMessage,
148
+ PlatformDeliveryReceipt,
145
149
  } from "./types.js";
146
150
  import {
147
151
  listIntegrationUsageBudgets,
148
152
  saveIntegrationUsageBudget,
149
153
  } from "./usage-budget-store.js";
150
- import { handleWebhook, processIntegrationTask } from "./webhook-handler.js";
154
+ import {
155
+ handleWebhook,
156
+ processIntegrationTask,
157
+ recordIntegrationResponseDelivery,
158
+ type IntegrationResponseDeliveryTaskPayload,
159
+ } from "./webhook-handler.js";
151
160
 
152
161
  type NitroPluginDef = (nitroApp: any) => void | Promise<void>;
153
162
 
@@ -1615,6 +1624,11 @@ export function createIntegrationsPlugin(
1615
1624
  return { ok: true, skipped: "already-claimed-or-missing" };
1616
1625
  }
1617
1626
 
1627
+ let deliveryRetryTransitionStarted = false;
1628
+ let deliveryRetryRecovery:
1629
+ | { payload: string; errorMessage: string }
1630
+ | undefined;
1631
+ let confirmedDeliveryRetryPayload: string | undefined;
1618
1632
  try {
1619
1633
  const adapter = adapterMap.get(task.platform);
1620
1634
  if (!adapter) {
@@ -1622,7 +1636,7 @@ export function createIntegrationsPlugin(
1622
1636
  setResponseStatus(event, 404);
1623
1637
  return { error: "Unknown platform" };
1624
1638
  }
1625
- await runWithRequestContext(
1639
+ const processingResult = await runWithRequestContext(
1626
1640
  {
1627
1641
  userEmail: task.ownerEmail,
1628
1642
  ...(task.orgId ? { orgId: task.orgId } : {}),
@@ -1631,6 +1645,7 @@ export function createIntegrationsPlugin(
1631
1645
  async () => {
1632
1646
  const taskPayload = JSON.parse(task.payload) as
1633
1647
  | IntegrationSystemNoticeTaskPayload
1648
+ | IntegrationResponseDeliveryTaskPayload
1634
1649
  | { kind?: undefined };
1635
1650
  if (taskPayload.kind === "system-notice") {
1636
1651
  if (!adapter.sendSystemNotice) {
@@ -1657,13 +1672,59 @@ export function createIntegrationsPlugin(
1657
1672
  );
1658
1673
  return;
1659
1674
  }
1675
+ if (taskPayload.kind === "response-delivery") {
1676
+ let receipt: void | PlatformDeliveryReceipt =
1677
+ taskPayload.deliveryReceipt;
1678
+ if (!receipt) {
1679
+ receipt = await adapter.sendResponse(
1680
+ taskPayload.message,
1681
+ taskPayload.incoming,
1682
+ {
1683
+ ...(taskPayload.placeholderRef
1684
+ ? { placeholderRef: taskPayload.placeholderRef }
1685
+ : {}),
1686
+ },
1687
+ );
1688
+ }
1689
+ if (receipt?.status !== "delivered") {
1690
+ throw new Error(
1691
+ `${task.platform} response completed without delivery proof`,
1692
+ );
1693
+ }
1694
+ const deliveredPayload = taskPayload.deliveryReceipt
1695
+ ? taskPayload
1696
+ : {
1697
+ ...taskPayload,
1698
+ deliveryReceipt: receipt,
1699
+ deliveredAt: new Date().toISOString(),
1700
+ };
1701
+ confirmedDeliveryRetryPayload =
1702
+ JSON.stringify(deliveredPayload);
1703
+ if (!taskPayload.deliveryReceipt) {
1704
+ deliveryRetryRecovery = {
1705
+ payload: confirmedDeliveryRetryPayload,
1706
+ errorMessage:
1707
+ "Provider delivery was confirmed but its receipt checkpoint failed",
1708
+ };
1709
+ await stageTaskDeliveryPayload(
1710
+ task.id,
1711
+ deliveryRetryRecovery.payload,
1712
+ );
1713
+ deliveryRetryRecovery = undefined;
1714
+ }
1715
+ await recordIntegrationResponseDelivery(
1716
+ deliveredPayload,
1717
+ receipt,
1718
+ );
1719
+ return;
1720
+ }
1660
1721
  const resources = await loadResourcesForPrompt(
1661
1722
  task.ownerEmail,
1662
1723
  true,
1663
1724
  options?.appId,
1664
1725
  task.orgId,
1665
1726
  );
1666
- await processIntegrationTask(task, {
1727
+ const result = await processIntegrationTask(task, {
1667
1728
  adapter,
1668
1729
  systemPrompt: baseSystemPrompt + resources,
1669
1730
  actions,
@@ -1674,8 +1735,22 @@ export function createIntegrationsPlugin(
1674
1735
  ownerEmail: task.ownerEmail,
1675
1736
  appId: options?.appId,
1676
1737
  });
1738
+ if (result?.status === "delivery-pending") {
1739
+ deliveryRetryTransitionStarted = true;
1740
+ await markTaskDeliveryRetryable(
1741
+ task.id,
1742
+ JSON.stringify(result.payload),
1743
+ result.errorMessage,
1744
+ );
1745
+ return "delivery-retry" as const;
1746
+ }
1747
+ return "completed" as const;
1677
1748
  },
1678
1749
  );
1750
+ if (processingResult === "delivery-retry") {
1751
+ setResponseStatus(event, 202);
1752
+ return { ok: true, taskId, retrying: "response-delivery" };
1753
+ }
1679
1754
  await markTaskCompleted(taskId);
1680
1755
  const nextTaskId = await getNextPendingTaskIdForThread(
1681
1756
  task.platform,
@@ -1711,7 +1786,57 @@ export function createIntegrationsPlugin(
1711
1786
  const errorMessage = err?.message
1712
1787
  ? String(err.message).slice(0, 1000)
1713
1788
  : "processor failed";
1714
- if (task.attempts >= MAX_PENDING_TASK_ATTEMPTS) {
1789
+ if (deliveryRetryRecovery) {
1790
+ try {
1791
+ await markTaskDeliveryRetryable(
1792
+ taskId,
1793
+ deliveryRetryRecovery.payload,
1794
+ `${deliveryRetryRecovery.errorMessage}: ${errorMessage}`,
1795
+ );
1796
+ setResponseStatus(event, 202);
1797
+ return { ok: true, taskId, retrying: "response-delivery" };
1798
+ } catch (transitionError) {
1799
+ const transitionMessage =
1800
+ transitionError instanceof Error
1801
+ ? transitionError.message
1802
+ : String(transitionError);
1803
+ await failTaskDeliveryTransition(
1804
+ taskId,
1805
+ `Could not safely checkpoint the delivery receipt: ${transitionMessage}`,
1806
+ ).catch((failureTransitionError) => {
1807
+ console.error(
1808
+ "[integrations] Failed to contain delivery receipt transition failure:",
1809
+ failureTransitionError,
1810
+ );
1811
+ });
1812
+ }
1813
+ } else if (confirmedDeliveryRetryPayload) {
1814
+ try {
1815
+ await markTaskDeliveryRetryable(
1816
+ taskId,
1817
+ confirmedDeliveryRetryPayload,
1818
+ `Provider delivery was confirmed but history persistence failed: ${errorMessage}`,
1819
+ );
1820
+ console.error("[integrations] process-task failure:", err);
1821
+ setResponseStatus(event, 202);
1822
+ return { ok: true, taskId, retrying: "response-delivery" };
1823
+ } catch (transitionError) {
1824
+ console.error(
1825
+ "[integrations] Failed to requeue confirmed delivery history:",
1826
+ transitionError,
1827
+ );
1828
+ }
1829
+ } else if (deliveryRetryTransitionStarted) {
1830
+ await failTaskDeliveryTransition(
1831
+ taskId,
1832
+ `Could not safely checkpoint the delivery retry: ${errorMessage}`,
1833
+ ).catch((transitionError) => {
1834
+ console.error(
1835
+ "[integrations] Failed to contain delivery retry transition failure:",
1836
+ transitionError,
1837
+ );
1838
+ });
1839
+ } else if (task.attempts >= MAX_PENDING_TASK_ATTEMPTS) {
1715
1840
  await markTaskFailed(taskId, errorMessage);
1716
1841
  } else {
1717
1842
  await markTaskRetryable(taskId, errorMessage);