@agent-native/core 0.122.2 → 0.122.3

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 (71) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +6 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/run-loop-with-resume.ts +12 -0
  5. package/corpus/core/src/integrations/a2a-continuation-processor.ts +182 -0
  6. package/corpus/core/src/integrations/a2a-continuations-store.ts +122 -12
  7. package/corpus/core/src/integrations/integration-campaign-recovery.ts +127 -0
  8. package/corpus/core/src/integrations/integration-campaigns-store.ts +1039 -0
  9. package/corpus/core/src/integrations/integration-durable-dispatch.ts +28 -3
  10. package/corpus/core/src/integrations/pending-tasks-retry-job.ts +8 -0
  11. package/corpus/core/src/integrations/plugin.ts +453 -35
  12. package/corpus/core/src/integrations/webhook-handler.ts +469 -11
  13. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +7 -3
  14. package/corpus/templates/content/app/components/editor/body-hydration.ts +10 -0
  15. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -0
  16. package/corpus/templates/content/app/root.tsx +12 -1
  17. package/corpus/templates/content/changelog/2026-07-23-new-pages-open-immediately-while-slow-network-work-continues.md +6 -0
  18. package/corpus/templates/content/changelog/2026-07-25-database-preview-actions-open-reliably.md +6 -0
  19. package/corpus/templates/content/e2e/playwright.config.ts +1 -1
  20. package/dist/agent/run-loop-with-resume.d.ts +7 -1
  21. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  22. package/dist/agent/run-loop-with-resume.js +7 -0
  23. package/dist/agent/run-loop-with-resume.js.map +1 -1
  24. package/dist/collab/awareness.d.ts +2 -2
  25. package/dist/collab/awareness.d.ts.map +1 -1
  26. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  27. package/dist/integrations/a2a-continuation-processor.d.ts +14 -0
  28. package/dist/integrations/a2a-continuation-processor.d.ts.map +1 -1
  29. package/dist/integrations/a2a-continuation-processor.js +134 -1
  30. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  31. package/dist/integrations/a2a-continuations-store.d.ts +23 -0
  32. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  33. package/dist/integrations/a2a-continuations-store.js +99 -13
  34. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  35. package/dist/integrations/integration-campaign-recovery.d.ts +16 -0
  36. package/dist/integrations/integration-campaign-recovery.d.ts.map +1 -0
  37. package/dist/integrations/integration-campaign-recovery.js +94 -0
  38. package/dist/integrations/integration-campaign-recovery.js.map +1 -0
  39. package/dist/integrations/integration-campaigns-store.d.ts +121 -0
  40. package/dist/integrations/integration-campaigns-store.d.ts.map +1 -0
  41. package/dist/integrations/integration-campaigns-store.js +784 -0
  42. package/dist/integrations/integration-campaigns-store.js.map +1 -0
  43. package/dist/integrations/integration-durable-dispatch.d.ts +3 -0
  44. package/dist/integrations/integration-durable-dispatch.d.ts.map +1 -1
  45. package/dist/integrations/integration-durable-dispatch.js +22 -3
  46. package/dist/integrations/integration-durable-dispatch.js.map +1 -1
  47. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  48. package/dist/integrations/pending-tasks-retry-job.js +6 -0
  49. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  50. package/dist/integrations/plugin.d.ts.map +1 -1
  51. package/dist/integrations/plugin.js +325 -18
  52. package/dist/integrations/plugin.js.map +1 -1
  53. package/dist/integrations/webhook-handler.d.ts +16 -1
  54. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  55. package/dist/integrations/webhook-handler.js +368 -13
  56. package/dist/integrations/webhook-handler.js.map +1 -1
  57. package/dist/notifications/routes.d.ts +3 -3
  58. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  59. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  60. package/dist/resources/handlers.d.ts +1 -1
  61. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  62. package/package.json +1 -1
  63. package/src/agent/run-loop-with-resume.ts +12 -0
  64. package/src/integrations/a2a-continuation-processor.ts +182 -0
  65. package/src/integrations/a2a-continuations-store.ts +122 -12
  66. package/src/integrations/integration-campaign-recovery.ts +127 -0
  67. package/src/integrations/integration-campaigns-store.ts +1039 -0
  68. package/src/integrations/integration-durable-dispatch.ts +28 -3
  69. package/src/integrations/pending-tasks-retry-job.ts +8 -0
  70. package/src/integrations/plugin.ts +453 -35
  71. package/src/integrations/webhook-handler.ts +469 -11
@@ -30,6 +30,9 @@ export type IntegrationDispatchOutcome =
30
30
  | "portable-unconfirmed"
31
31
  | "failed";
32
32
 
33
+ export const INTEGRATION_CAMPAIGN_PROCESSOR_FIELD =
34
+ "__integrationCampaignContinuation";
35
+
33
36
  export interface IntegrationDispatchTaskScope {
34
37
  platform: string;
35
38
  externalThreadId: string;
@@ -136,9 +139,19 @@ export async function dispatchPendingIntegrationTask(input: {
136
139
  event?: unknown;
137
140
  baseUrl?: string;
138
141
  portableSettleMs?: number;
142
+ campaignContinuation?: boolean;
143
+ allowPortableConfirmedReceiptReconciliation?: boolean;
139
144
  }): Promise<IntegrationDispatchOutcome> {
140
145
  const startedAt = Date.now();
141
146
  const durable = isIntegrationDurableDispatchEnabledForTask(input.task);
147
+ if (
148
+ input.campaignContinuation &&
149
+ !durable &&
150
+ !input.allowPortableConfirmedReceiptReconciliation
151
+ ) {
152
+ logDispatch(input.taskId, "failed", startedAt);
153
+ return "failed";
154
+ }
142
155
  if (durable) {
143
156
  const backgroundPath = resolveDurableBackgroundDispatchPath(
144
157
  INTEGRATION_PROCESS_TASK_PATH,
@@ -152,11 +165,16 @@ export async function dispatchPendingIntegrationTask(input: {
152
165
  body: {
153
166
  [AGENT_BACKGROUND_PROCESSOR_FIELD]:
154
167
  AGENT_BACKGROUND_PROCESSOR_INTEGRATION,
168
+ ...(input.campaignContinuation
169
+ ? { [INTEGRATION_CAMPAIGN_PROCESSOR_FIELD]: true }
170
+ : {}),
155
171
  },
156
172
  awaitResponse: true,
157
173
  responseTimeoutMs: 2_000,
158
174
  });
159
- await recordDispatch(input.taskId, "background-acknowledged");
175
+ if (!input.campaignContinuation) {
176
+ await recordDispatch(input.taskId, "background-acknowledged");
177
+ }
160
178
  logDispatch(input.taskId, "background-acknowledged", startedAt);
161
179
  return "background-acknowledged";
162
180
  } catch (error) {
@@ -173,9 +191,14 @@ export async function dispatchPendingIntegrationTask(input: {
173
191
  baseUrl: input.baseUrl,
174
192
  path: INTEGRATION_PROCESS_TASK_PATH,
175
193
  taskId: input.taskId,
194
+ body: input.campaignContinuation
195
+ ? { [INTEGRATION_CAMPAIGN_PROCESSOR_FIELD]: true }
196
+ : undefined,
176
197
  settleMs: input.portableSettleMs,
177
198
  });
178
- await recordDispatch(input.taskId, "portable-unconfirmed");
199
+ if (!input.campaignContinuation) {
200
+ await recordDispatch(input.taskId, "portable-unconfirmed");
201
+ }
179
202
  logDispatch(input.taskId, "portable-unconfirmed", startedAt);
180
203
  return "portable-unconfirmed";
181
204
  } catch (error) {
@@ -183,7 +206,9 @@ export async function dispatchPendingIntegrationTask(input: {
183
206
  `[integrations] Portable dispatch failed for ${input.taskId}:`,
184
207
  error,
185
208
  );
186
- await recordDispatch(input.taskId, "failed");
209
+ if (!input.campaignContinuation) {
210
+ await recordDispatch(input.taskId, "failed");
211
+ }
187
212
  logDispatch(input.taskId, "failed", startedAt);
188
213
  return "failed";
189
214
  }
@@ -1,4 +1,5 @@
1
1
  import { getDbExec } from "../db/client.js";
2
+ import { hasActiveIntegrationCampaign } from "./integration-campaigns-store.js";
2
3
  import {
3
4
  configuredIntegrationDurableDispatchScopes,
4
5
  dispatchPendingIntegrationTask,
@@ -231,6 +232,13 @@ export async function retryStuckPendingTasks(
231
232
 
232
233
  for (const row of stuckRows) {
233
234
  try {
235
+ if (
236
+ row.status === "processing" &&
237
+ (await hasActiveIntegrationCampaign(row.id))
238
+ ) {
239
+ result.skipped += 1;
240
+ continue;
241
+ }
234
242
  // Cap retries — mark failed and move on so the row stops bouncing
235
243
  // between pending and processing forever.
236
244
  if (row.attempts >= MAX_PENDING_TASK_ATTEMPTS) {