@agent-native/core 0.101.6 → 0.101.10

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 (237) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +28 -0
  3. package/corpus/core/docs/content/deployment.mdx +9 -7
  4. package/corpus/core/docs/content/locales/ar-SA/deployment.mdx +9 -7
  5. package/corpus/core/docs/content/locales/de-DE/deployment.mdx +9 -7
  6. package/corpus/core/docs/content/locales/es-ES/deployment.mdx +9 -7
  7. package/corpus/core/docs/content/locales/fr-FR/deployment.mdx +9 -7
  8. package/corpus/core/docs/content/locales/hi-IN/deployment.mdx +9 -7
  9. package/corpus/core/docs/content/locales/ja-JP/deployment.mdx +9 -7
  10. package/corpus/core/docs/content/locales/ko-KR/deployment.mdx +9 -7
  11. package/corpus/core/docs/content/locales/pt-BR/deployment.mdx +9 -7
  12. package/corpus/core/docs/content/locales/zh-CN/deployment.mdx +9 -7
  13. package/corpus/core/docs/content/locales/zh-TW/deployment.mdx +9 -7
  14. package/corpus/core/package.json +1 -1
  15. package/corpus/core/src/a2a/artifact-response.ts +255 -12
  16. package/corpus/core/src/agent/thread-data-builder.ts +84 -11
  17. package/corpus/core/src/client/review/ReviewCommentComposer.tsx +9 -1
  18. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +17 -2
  19. package/corpus/core/src/client/settings/SettingsPanel.tsx +41 -21
  20. package/corpus/core/src/client/settings/useBuilderStatus.ts +28 -9
  21. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +2 -7
  22. package/corpus/core/src/integrations/a2a-continuation-processor.ts +99 -7
  23. package/corpus/core/src/integrations/adapters/discord.ts +3 -1
  24. package/corpus/core/src/integrations/adapters/email.ts +4 -1
  25. package/corpus/core/src/integrations/adapters/google-docs.ts +4 -1
  26. package/corpus/core/src/integrations/adapters/microsoft-teams.ts +3 -1
  27. package/corpus/core/src/integrations/adapters/slack.ts +38 -9
  28. package/corpus/core/src/integrations/adapters/telegram.ts +32 -10
  29. package/corpus/core/src/integrations/adapters/whatsapp.ts +5 -1
  30. package/corpus/core/src/integrations/index.ts +1 -0
  31. package/corpus/core/src/integrations/types.ts +9 -2
  32. package/corpus/core/src/integrations/webhook-handler.ts +69 -45
  33. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +1 -0
  34. package/corpus/core/src/server/auth.ts +25 -1
  35. package/corpus/core/src/server/builder-browser.ts +353 -1
  36. package/corpus/core/src/server/core-routes-plugin.ts +601 -223
  37. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +80 -1
  38. package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +28 -3
  39. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +5 -1
  40. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +30 -3
  41. package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +196 -0
  42. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +115 -1
  43. package/corpus/templates/calendar/app/lib/out-of-office.ts +45 -0
  44. package/corpus/templates/calendar/changelog/2026-07-14-out-of-office-blocks-now-sit-behind-meetings-and-event-stack.md +6 -0
  45. package/corpus/templates/content/.agents/skills/content/SKILL.md +31 -0
  46. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +35 -21
  47. package/corpus/templates/content/AGENTS.md +32 -9
  48. package/corpus/templates/content/actions/_builder-cms-intent-lookup.ts +87 -0
  49. package/corpus/templates/content/actions/_builder-cms-read-client.ts +173 -25
  50. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +1 -0
  51. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +427 -18
  52. package/corpus/templates/content/actions/_builder-cms-write-client.ts +17 -73
  53. package/corpus/templates/content/actions/_builder-cms-write-settings.ts +27 -7
  54. package/corpus/templates/content/actions/_builder-source-execution-claim.ts +124 -0
  55. package/corpus/templates/content/actions/_builder-source-execution-preservation.ts +21 -0
  56. package/corpus/templates/content/actions/_builder-source-timings.ts +57 -0
  57. package/corpus/templates/content/actions/_database-source-utils.ts +1071 -170
  58. package/corpus/templates/content/actions/_database-utils.ts +104 -13
  59. package/corpus/templates/content/actions/_local-file-documents.ts +53 -1
  60. package/corpus/templates/content/actions/_preview-document-draft.ts +31 -0
  61. package/corpus/templates/content/actions/_property-utils.ts +7 -1
  62. package/corpus/templates/content/actions/cancel-prepared-builder-source-update.ts +309 -0
  63. package/corpus/templates/content/actions/configure-document-property.ts +11 -0
  64. package/corpus/templates/content/actions/create-content-database.ts +11 -0
  65. package/corpus/templates/content/actions/create-document.ts +9 -0
  66. package/corpus/templates/content/actions/create-inline-content-database.ts +3 -0
  67. package/corpus/templates/content/actions/execute-builder-source-batch.ts +120 -49
  68. package/corpus/templates/content/actions/execute-builder-source-execution.ts +608 -264
  69. package/corpus/templates/content/actions/export-content-source.ts +1 -0
  70. package/corpus/templates/content/actions/get-content-database.ts +13 -1
  71. package/corpus/templates/content/actions/get-document.ts +12 -2
  72. package/corpus/templates/content/actions/get-preview-document-draft.ts +26 -0
  73. package/corpus/templates/content/actions/import-content-source.ts +6 -0
  74. package/corpus/templates/content/actions/list-documents.ts +3 -0
  75. package/corpus/templates/content/actions/materialize-builder-required-fields.ts +550 -0
  76. package/corpus/templates/content/actions/prepare-builder-source-execution.ts +112 -65
  77. package/corpus/templates/content/actions/prepare-builder-source-review.ts +463 -170
  78. package/corpus/templates/content/actions/preview-builder-source-review.ts +99 -0
  79. package/corpus/templates/content/actions/pull-document.ts +2 -0
  80. package/corpus/templates/content/actions/search-documents.ts +5 -1
  81. package/corpus/templates/content/actions/set-content-database-source-write-mode.ts +2 -2
  82. package/corpus/templates/content/actions/update-document.ts +16 -1
  83. package/corpus/templates/content/actions/update-preview-document-draft.ts +153 -0
  84. package/corpus/templates/content/actions/view-screen.ts +15 -2
  85. package/corpus/templates/content/app/components/editor/DescriptionField.tsx +121 -0
  86. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +14 -0
  87. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +250 -49
  88. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +57 -5
  89. package/corpus/templates/content/app/components/editor/body-hydration.ts +27 -0
  90. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2414 -589
  91. package/corpus/templates/content/app/components/editor/database/settings.tsx +13 -10
  92. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +358 -75
  93. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +124 -29
  94. package/corpus/templates/content/app/components/editor/previewDocumentSaveRegistry.ts +2 -0
  95. package/corpus/templates/content/app/global.css +18 -1
  96. package/corpus/templates/content/app/hooks/use-content-database.ts +68 -0
  97. package/corpus/templates/content/app/hooks/use-documents.ts +53 -4
  98. package/corpus/templates/content/app/i18n/zh-TW.ts +30 -0
  99. package/corpus/templates/content/app/i18n-data.ts +339 -0
  100. package/corpus/templates/content/changelog/2026-07-10-builder-backed-preview-edits-are-preserved-when-article-bodi.md +6 -0
  101. package/corpus/templates/content/changelog/2026-07-10-builder-cms-sources-can-now-be-enabled-for-guarded-staged-or.md +6 -0
  102. package/corpus/templates/content/changelog/2026-07-13-builder-connection-setup-is-now-available-directly-from-conn.md +6 -0
  103. package/corpus/templates/content/changelog/2026-07-13-builder-reviews-now-hide-already-applied-writes-detect-nativ.md +6 -0
  104. package/corpus/templates/content/changelog/2026-07-13-required-builder-publishing-fields-can-now-be-added-directly.md +6 -0
  105. package/corpus/templates/content/changelog/2026-07-13-you-can-now-cancel-a-prepared-builder-update-safely-before-i.md +6 -0
  106. package/corpus/templates/content/changelog/2026-07-14-builder-account-connection-now-remains-available-when-branch.md +6 -0
  107. package/corpus/templates/content/changelog/2026-07-14-builder-backed-articles-now-preserve-fifth-and-sixth-level-h.md +6 -0
  108. package/corpus/templates/content/changelog/2026-07-14-builder-sources-now-review-and-publish-rich-article-updates-.md +6 -0
  109. package/corpus/templates/content/changelog/2026-07-14-builder-writes-now-stop-retries-when-reconciliation-is-needed.md +6 -0
  110. package/corpus/templates/content/changelog/2026-07-14-file-and-media-links-now-validate-before-saving.md +6 -0
  111. package/corpus/templates/content/changelog/2026-07-14-pages-and-databases-can-describe-themselves-with-guidance-fo.md +6 -0
  112. package/corpus/templates/content/changelog/2026-07-14-slack-follow-ups-now-retain-created-content-identity-and-per.md +6 -0
  113. package/corpus/templates/content/parity/matrix.md +27 -25
  114. package/corpus/templates/content/parity/matrix.ts +50 -2
  115. package/corpus/templates/content/server/db/schema.ts +51 -0
  116. package/corpus/templates/content/server/lib/document-context.ts +76 -0
  117. package/corpus/templates/content/server/lib/public-documents.ts +3 -0
  118. package/corpus/templates/content/server/plugins/auth.ts +1 -0
  119. package/corpus/templates/content/server/plugins/db.ts +59 -0
  120. package/corpus/templates/content/server/routes/api/document-agent-context.json.get.ts +5 -0
  121. package/corpus/templates/content/shared/api.ts +87 -1
  122. package/corpus/templates/content/shared/builder-mdx.ts +705 -15
  123. package/corpus/templates/content/shared/content-source.ts +7 -0
  124. package/corpus/templates/content/shared/nfm.ts +3 -3
  125. package/corpus/templates/content/shared/properties.ts +2 -0
  126. package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +52 -7
  127. package/corpus/templates/design/app/components/design/ReviewCommentsPanel.tsx +36 -4
  128. package/corpus/templates/design/app/components/visual-editor/ReviewCanvasPins.tsx +4 -1
  129. package/corpus/templates/design/app/i18n/ar-SA.ts +1 -0
  130. package/corpus/templates/design/app/i18n/de-DE.ts +1 -0
  131. package/corpus/templates/design/app/i18n/en-US.ts +1 -0
  132. package/corpus/templates/design/app/i18n/es-ES.ts +1 -0
  133. package/corpus/templates/design/app/i18n/fr-FR.ts +1 -0
  134. package/corpus/templates/design/app/i18n/hi-IN.ts +1 -0
  135. package/corpus/templates/design/app/i18n/ja-JP.ts +1 -0
  136. package/corpus/templates/design/app/i18n/ko-KR.ts +1 -0
  137. package/corpus/templates/design/app/i18n/pt-BR.ts +1 -0
  138. package/corpus/templates/design/app/i18n/zh-CN.ts +1 -0
  139. package/corpus/templates/design/app/i18n/zh-TW.ts +1 -0
  140. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +8 -0
  141. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +11 -0
  142. package/corpus/templates/design/changelog/2026-07-14-reviewers-can-now-pin-comments-from-the-canvas-toolbar-targe.md +6 -0
  143. package/corpus/templates/design/changelog/2026-07-15-viewer-comment-controls-now-sit-inside-the-read-only-notice-.md +6 -0
  144. package/corpus/templates/design/shared/review-anchor.ts +48 -0
  145. package/corpus/templates/plan/server/plan-mdx.ts +53 -7
  146. package/dist/a2a/artifact-response.d.ts +15 -0
  147. package/dist/a2a/artifact-response.d.ts.map +1 -1
  148. package/dist/a2a/artifact-response.js +204 -5
  149. package/dist/a2a/artifact-response.js.map +1 -1
  150. package/dist/agent/thread-data-builder.d.ts +6 -0
  151. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  152. package/dist/agent/thread-data-builder.js +71 -8
  153. package/dist/agent/thread-data-builder.js.map +1 -1
  154. package/dist/client/review/ReviewCommentComposer.d.ts +2 -1
  155. package/dist/client/review/ReviewCommentComposer.d.ts.map +1 -1
  156. package/dist/client/review/ReviewCommentComposer.js +3 -3
  157. package/dist/client/review/ReviewCommentComposer.js.map +1 -1
  158. package/dist/client/review/ReviewThreadPanel.d.ts +9 -1
  159. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -1
  160. package/dist/client/review/ReviewThreadPanel.js +6 -4
  161. package/dist/client/review/ReviewThreadPanel.js.map +1 -1
  162. package/dist/client/settings/SettingsPanel.d.ts +3 -0
  163. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  164. package/dist/client/settings/SettingsPanel.js +11 -4
  165. package/dist/client/settings/SettingsPanel.js.map +1 -1
  166. package/dist/client/settings/useBuilderStatus.d.ts +8 -4
  167. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  168. package/dist/client/settings/useBuilderStatus.js +19 -6
  169. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  170. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  171. package/dist/client/setup-connections/BuilderConnectCard.js +2 -5
  172. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  173. package/dist/collab/awareness.d.ts +2 -2
  174. package/dist/collab/awareness.d.ts.map +1 -1
  175. package/dist/integrations/a2a-continuation-processor.d.ts.map +1 -1
  176. package/dist/integrations/a2a-continuation-processor.js +72 -6
  177. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  178. package/dist/integrations/adapters/discord.d.ts.map +1 -1
  179. package/dist/integrations/adapters/discord.js +1 -0
  180. package/dist/integrations/adapters/discord.js.map +1 -1
  181. package/dist/integrations/adapters/email.d.ts.map +1 -1
  182. package/dist/integrations/adapters/email.js +2 -0
  183. package/dist/integrations/adapters/email.js.map +1 -1
  184. package/dist/integrations/adapters/google-docs.d.ts.map +1 -1
  185. package/dist/integrations/adapters/google-docs.js +2 -0
  186. package/dist/integrations/adapters/google-docs.js.map +1 -1
  187. package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -1
  188. package/dist/integrations/adapters/microsoft-teams.js +1 -0
  189. package/dist/integrations/adapters/microsoft-teams.js.map +1 -1
  190. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  191. package/dist/integrations/adapters/slack.js +21 -6
  192. package/dist/integrations/adapters/slack.js.map +1 -1
  193. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  194. package/dist/integrations/adapters/telegram.js +11 -2
  195. package/dist/integrations/adapters/telegram.js.map +1 -1
  196. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  197. package/dist/integrations/adapters/whatsapp.js +3 -0
  198. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  199. package/dist/integrations/index.d.ts +1 -1
  200. package/dist/integrations/index.d.ts.map +1 -1
  201. package/dist/integrations/index.js.map +1 -1
  202. package/dist/integrations/types.d.ts +8 -2
  203. package/dist/integrations/types.d.ts.map +1 -1
  204. package/dist/integrations/types.js.map +1 -1
  205. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  206. package/dist/integrations/webhook-handler.js +40 -43
  207. package/dist/integrations/webhook-handler.js.map +1 -1
  208. package/dist/observability/routes.d.ts +5 -5
  209. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  210. package/dist/secrets/routes.d.ts +9 -9
  211. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  212. package/dist/server/agent-chat/action-filters-a2a.js +1 -0
  213. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  214. package/dist/server/auth.d.ts +1 -0
  215. package/dist/server/auth.d.ts.map +1 -1
  216. package/dist/server/auth.js +19 -2
  217. package/dist/server/auth.js.map +1 -1
  218. package/dist/server/builder-browser.d.ts +78 -0
  219. package/dist/server/builder-browser.d.ts.map +1 -1
  220. package/dist/server/builder-browser.js +246 -1
  221. package/dist/server/builder-browser.js.map +1 -1
  222. package/dist/server/core-routes-plugin.d.ts +41 -0
  223. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  224. package/dist/server/core-routes-plugin.js +260 -14
  225. package/dist/server/core-routes-plugin.js.map +1 -1
  226. package/docs/content/deployment.mdx +9 -7
  227. package/docs/content/locales/ar-SA/deployment.mdx +9 -7
  228. package/docs/content/locales/de-DE/deployment.mdx +9 -7
  229. package/docs/content/locales/es-ES/deployment.mdx +9 -7
  230. package/docs/content/locales/fr-FR/deployment.mdx +9 -7
  231. package/docs/content/locales/hi-IN/deployment.mdx +9 -7
  232. package/docs/content/locales/ja-JP/deployment.mdx +9 -7
  233. package/docs/content/locales/ko-KR/deployment.mdx +9 -7
  234. package/docs/content/locales/pt-BR/deployment.mdx +9 -7
  235. package/docs/content/locales/zh-CN/deployment.mdx +9 -7
  236. package/docs/content/locales/zh-TW/deployment.mdx +9 -7
  237. package/package.json +2 -2
@@ -1,3 +1,88 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ const ARTIFACT_IDENTITY_WRITE_TOOLS = new Set([
3
+ "save-monitor",
4
+ "create-form",
5
+ "submit-content-database-form",
6
+ "add-database-item",
7
+ "create-document",
8
+ "update-document",
9
+ "create-deck",
10
+ "duplicate-deck",
11
+ "add-slide",
12
+ "update-dashboard",
13
+ "rename-dashboard",
14
+ "save-analysis",
15
+ "generate-image",
16
+ "edit-image",
17
+ "refine-image",
18
+ "restyle-image",
19
+ "save-generated-image",
20
+ "save-generated-asset",
21
+ "export-image",
22
+ "export-asset",
23
+ "generate-image-batch",
24
+ "create-design",
25
+ "generate-design",
26
+ "create-file",
27
+ "duplicate-design",
28
+ ]);
29
+ const PERSISTED_ARTIFACT_MARKER = "agent-native:persisted-artifacts=";
30
+ const PERSISTED_ARTIFACT_MARKER_PATTERN = /\s*<!--\s*agent-native:persisted-artifacts=[A-Za-z0-9_-]+\.[a-f0-9]{64}\s*-->/g;
31
+ const ARTIFACT_RESOURCE_TYPES = new Set([
32
+ "document",
33
+ "deck",
34
+ "dashboard",
35
+ "analysis",
36
+ "image",
37
+ "design",
38
+ "monitor",
39
+ "form",
40
+ ]);
41
+ function persistedArtifactIdentitiesFromMarker(result) {
42
+ const secret = process.env.A2A_SECRET;
43
+ if (!secret)
44
+ return [];
45
+ const match = result.match(/<!--\s*agent-native:persisted-artifacts=([A-Za-z0-9_-]+)\.([a-f0-9]{64})\s*-->/);
46
+ if (!match)
47
+ return [];
48
+ try {
49
+ const payload = match[1];
50
+ const expected = createHmac("sha256", secret).update(payload).digest();
51
+ const supplied = Buffer.from(match[2], "hex");
52
+ if (supplied.length !== expected.length ||
53
+ !timingSafeEqual(supplied, expected)) {
54
+ return [];
55
+ }
56
+ const parsed = JSON.parse(Buffer.from(payload, "base64url").toString());
57
+ if (!Array.isArray(parsed))
58
+ return [];
59
+ return parsed
60
+ .slice(0, 12)
61
+ .filter((identity) => {
62
+ const item = asRecord(identity);
63
+ return (!!item &&
64
+ ARTIFACT_RESOURCE_TYPES.has(item.resourceType) &&
65
+ typeof item.id === "string" &&
66
+ typeof item.sourceAction === "string");
67
+ });
68
+ }
69
+ catch {
70
+ return [];
71
+ }
72
+ }
73
+ function withPersistedArtifactMarker(text, toolResults) {
74
+ const identities = extractA2AArtifactIdentities(toolResults).slice(0, 12);
75
+ const secret = process.env.A2A_SECRET;
76
+ if (identities.length === 0 || !secret)
77
+ return text;
78
+ const payload = Buffer.from(JSON.stringify(identities)).toString("base64url");
79
+ const signature = createHmac("sha256", secret).update(payload).digest("hex");
80
+ const marker = `<!-- ${PERSISTED_ARTIFACT_MARKER}${payload}.${signature} -->`;
81
+ return text ? `${text}\n\n${marker}` : marker;
82
+ }
83
+ export function stripA2APersistedArtifactMarkers(text) {
84
+ return text.replace(PERSISTED_ARTIFACT_MARKER_PATTERN, "").trim();
85
+ }
1
86
  function asRecord(value) {
2
87
  return value && typeof value === "object" && !Array.isArray(value)
3
88
  ? value
@@ -450,13 +535,22 @@ function collectArtifacts(results) {
450
535
  continue;
451
536
  }
452
537
  if (toolResult.tool === "generate-image" ||
538
+ toolResult.tool === "edit-image" ||
453
539
  toolResult.tool === "refine-image" ||
540
+ toolResult.tool === "restyle-image" ||
454
541
  toolResult.tool === "get-asset" ||
455
542
  toolResult.tool === "save-generated-image" ||
543
+ toolResult.tool === "save-generated-asset" ||
456
544
  toolResult.tool === "export-image") {
457
545
  addImageArtifact(images, parsed);
458
546
  continue;
459
547
  }
548
+ if (toolResult.tool === "export-asset") {
549
+ if (stringValue(parsed.artifactType) === "image") {
550
+ addImageArtifact(images, parsed);
551
+ }
552
+ continue;
553
+ }
460
554
  if (toolResult.tool === "generate-image-batch") {
461
555
  if (Array.isArray(parsed.images)) {
462
556
  for (const item of parsed.images) {
@@ -553,6 +647,107 @@ function collectArtifacts(results) {
553
647
  forms: [...forms.values()],
554
648
  };
555
649
  }
650
+ /**
651
+ * Extract a compact, verified identity ledger from successful artifact tools.
652
+ * The ledger deliberately excludes raw tool results so it is safe to retain in
653
+ * long-lived thread context and stable even when a resource is later renamed.
654
+ */
655
+ export function extractA2AArtifactIdentities(results) {
656
+ const identities = new Map();
657
+ const remember = (identity) => {
658
+ identities.set(`${identity.resourceType}:${identity.id}`, identity);
659
+ };
660
+ for (const result of results) {
661
+ if (result.tool === "call-agent") {
662
+ for (const identity of persistedArtifactIdentitiesFromMarker(result.result)) {
663
+ remember({ ...identity, sourceAction: "call-agent" });
664
+ }
665
+ continue;
666
+ }
667
+ if (!ARTIFACT_IDENTITY_WRITE_TOOLS.has(result.tool))
668
+ continue;
669
+ const artifacts = collectArtifacts([result]);
670
+ for (const document of artifacts.documents) {
671
+ remember({
672
+ resourceType: "document",
673
+ id: document.id,
674
+ sourceAction: result.tool,
675
+ titleAtAction: document.title,
676
+ url: document.url,
677
+ });
678
+ }
679
+ for (const deck of artifacts.decks) {
680
+ remember({
681
+ resourceType: "deck",
682
+ id: deck.id,
683
+ sourceAction: result.tool,
684
+ url: deck.url,
685
+ });
686
+ }
687
+ for (const dashboard of artifacts.dashboards) {
688
+ remember({
689
+ resourceType: "dashboard",
690
+ id: dashboard.id,
691
+ sourceAction: result.tool,
692
+ titleAtAction: dashboard.title,
693
+ url: dashboard.url,
694
+ });
695
+ }
696
+ for (const analysis of artifacts.analyses) {
697
+ remember({
698
+ resourceType: "analysis",
699
+ id: analysis.id,
700
+ sourceAction: result.tool,
701
+ titleAtAction: analysis.title,
702
+ url: analysis.url,
703
+ });
704
+ }
705
+ for (const image of artifacts.images) {
706
+ remember({
707
+ resourceType: "image",
708
+ id: image.id,
709
+ sourceAction: result.tool,
710
+ titleAtAction: image.title,
711
+ url: image.url,
712
+ });
713
+ }
714
+ for (const design of artifacts.designShells) {
715
+ remember({
716
+ resourceType: "design",
717
+ id: design.id,
718
+ sourceAction: result.tool,
719
+ titleAtAction: design.title,
720
+ });
721
+ }
722
+ for (const design of artifacts.generatedDesigns) {
723
+ remember({
724
+ resourceType: "design",
725
+ id: design.id,
726
+ sourceAction: result.tool,
727
+ url: design.url,
728
+ });
729
+ }
730
+ for (const monitor of artifacts.monitors) {
731
+ remember({
732
+ resourceType: "monitor",
733
+ id: monitor.id,
734
+ sourceAction: result.tool,
735
+ titleAtAction: monitor.name,
736
+ url: monitor.url,
737
+ });
738
+ }
739
+ for (const form of artifacts.forms) {
740
+ remember({
741
+ resourceType: "form",
742
+ id: form.id,
743
+ sourceAction: result.tool,
744
+ titleAtAction: form.title,
745
+ url: form.url,
746
+ });
747
+ }
748
+ }
749
+ return [...identities.values()];
750
+ }
556
751
  function parseDownstreamArtifactBlock(result) {
557
752
  const artifacts = [];
558
753
  for (const line of downstreamArtifactLines(result)) {
@@ -857,6 +1052,9 @@ function formatUnverifiedArtifactMessage(refs, documents, decks, dashboards, ana
857
1052
  export function appendA2AArtifactLinks(responseText, toolResults, options = {}) {
858
1053
  const baseUrl = normalizeBaseUrl(options.baseUrl);
859
1054
  const includeReferencedArtifacts = options.includeReferencedArtifacts ?? false;
1055
+ const finalize = (value) => options.includePersistedArtifactMarker
1056
+ ? withPersistedArtifactMarker(value, toolResults)
1057
+ : value;
860
1058
  const { documents, decks, dashboards, analyses, images, designShells, generatedDesigns, monitors, forms, } = collectArtifacts(toolResults);
861
1059
  const generatedDesignIds = new Set(generatedDesigns.map((design) => design.id));
862
1060
  const incompleteShells = designShells.filter((shell) => !generatedDesignIds.has(shell.id));
@@ -866,11 +1064,11 @@ export function appendA2AArtifactLinks(responseText, toolResults, options = {})
866
1064
  !responseAlreadyWarnsIncompleteDesign(text) &&
867
1065
  (incompleteShells.some((shell) => responseMentionsDesignShell(text, shell)) ||
868
1066
  /\b(?:done|created|ready|here(?:'s| is)|complete|finished)\b/i.test(text))) {
869
- return formatIncompleteDesignMessage(incompleteShells);
1067
+ return finalize(formatIncompleteDesignMessage(incompleteShells));
870
1068
  }
871
1069
  const unverifiedRefs = findUnverifiedArtifactReferences(text, baseUrl, documents, decks, dashboards, analyses, images, generatedDesigns);
872
1070
  if (unverifiedRefs.length > 0) {
873
- return formatUnverifiedArtifactMessage(unverifiedRefs, documents, decks, dashboards, analyses, images, generatedDesigns, baseUrl);
1071
+ return finalize(formatUnverifiedArtifactMessage(unverifiedRefs, documents, decks, dashboards, analyses, images, generatedDesigns, baseUrl));
874
1072
  }
875
1073
  const missingLines = [];
876
1074
  for (const document of documents) {
@@ -927,10 +1125,11 @@ export function appendA2AArtifactLinks(responseText, toolResults, options = {})
927
1125
  missingLines.push(formatFormLine(form));
928
1126
  }
929
1127
  }
930
- if (missingLines.length === 0)
931
- return text;
1128
+ if (missingLines.length === 0) {
1129
+ return finalize(text);
1130
+ }
932
1131
  const artifactBlock = `Artifacts:\n${missingLines.join("\n")}`;
933
- return text ? `${text}\n\n${artifactBlock}` : artifactBlock;
1132
+ return finalize(text ? `${text}\n\n${artifactBlock}` : artifactBlock);
934
1133
  }
935
1134
  export function buildA2ARecoverableArtifactMessage(toolResults, options = {}) {
936
1135
  const baseUrl = normalizeBaseUrl(options.baseUrl);