@aglyn/plugins-ai 1.0.0-beta.231 → 1.0.0-beta.232

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 (220) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.js +8 -4
  3. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  4. package/src/lib/components/ai-job-follow.component.js +1 -0
  5. package/src/lib/components/ai-job-follow.component.js.map +1 -1
  6. package/src/lib/components/ai-job-links.js +13 -0
  7. package/src/lib/components/ai-job-links.js.map +1 -1
  8. package/src/lib/components/ai-jobs-list-page.component.js +1 -0
  9. package/src/lib/components/ai-jobs-list-page.component.js.map +1 -1
  10. package/src/lib/components/ai-media-create.component.d.ts +20 -7
  11. package/src/lib/components/ai-media-create.component.js +107 -55
  12. package/src/lib/components/ai-media-create.component.js.map +1 -1
  13. package/src/lib/components/ai-seo-fields-card.component.js +1 -0
  14. package/src/lib/components/ai-seo-fields-card.component.js.map +1 -1
  15. package/src/lib/components/ai-site-memory-card.component.d.ts +32 -0
  16. package/src/lib/components/ai-site-memory-card.component.js +187 -0
  17. package/src/lib/components/ai-site-memory-card.component.js.map +1 -0
  18. package/src/lib/components/ai-site-start-card.component.js +80 -77
  19. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  20. package/src/lib/components/ai-theme-proposal-card.component.js +4 -0
  21. package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -1
  22. package/src/lib/components/ai-usage-strip.component.js +1 -0
  23. package/src/lib/components/ai-usage-strip.component.js.map +1 -1
  24. package/src/lib/components/assist-panel.component.d.ts +10 -0
  25. package/src/lib/components/assist-panel.component.js +119 -9
  26. package/src/lib/components/assist-panel.component.js.map +1 -1
  27. package/src/lib/components/assist-signals-page.component.js +2 -0
  28. package/src/lib/components/assist-signals-page.component.js.map +1 -1
  29. package/src/lib/components/billing-ai-allotments.component.js +3 -0
  30. package/src/lib/components/billing-ai-allotments.component.js.map +1 -1
  31. package/src/lib/components/billing-ai-top-users.component.js +1 -0
  32. package/src/lib/components/billing-ai-top-users.component.js.map +1 -1
  33. package/src/lib/components/billing-assist-overage-card.component.js +2 -0
  34. package/src/lib/components/billing-assist-overage-card.component.js.map +1 -1
  35. package/src/lib/components/member-ai-usage-card.component.js +10 -0
  36. package/src/lib/components/member-ai-usage-card.component.js.map +1 -1
  37. package/src/lib/components/staff-org-ai-card.component.js +1 -0
  38. package/src/lib/components/staff-org-ai-card.component.js.map +1 -1
  39. package/src/lib/components/staff-org-ai-conversations.component.d.ts +23 -0
  40. package/src/lib/components/staff-org-ai-conversations.component.js +346 -0
  41. package/src/lib/components/staff-org-ai-conversations.component.js.map +1 -0
  42. package/src/lib/jobs/ai-build-capabilities.d.ts +13 -1
  43. package/src/lib/jobs/ai-build-capabilities.js +101 -7
  44. package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
  45. package/src/lib/jobs/ai-business-profile-prefill.d.ts +29 -0
  46. package/src/lib/jobs/ai-business-profile-prefill.js +85 -0
  47. package/src/lib/jobs/ai-business-profile-prefill.js.map +1 -0
  48. package/src/lib/jobs/ai-job-build-step.js +3 -1
  49. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  50. package/src/lib/jobs/ai-job-edit-step.d.ts +225 -0
  51. package/src/lib/jobs/ai-job-edit-step.js +631 -0
  52. package/src/lib/jobs/ai-job-edit-step.js.map +1 -0
  53. package/src/lib/jobs/ai-job-insight-step.js +21 -4
  54. package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
  55. package/src/lib/jobs/ai-job-layout-language.d.ts +8 -3
  56. package/src/lib/jobs/ai-job-layout-language.js +8 -2
  57. package/src/lib/jobs/ai-job-layout-language.js.map +1 -1
  58. package/src/lib/jobs/ai-job-layout-step.js +7 -6
  59. package/src/lib/jobs/ai-job-layout-step.js.map +1 -1
  60. package/src/lib/jobs/ai-job-logic-step.d.ts +20 -0
  61. package/src/lib/jobs/ai-job-logic-step.js +87 -6
  62. package/src/lib/jobs/ai-job-logic-step.js.map +1 -1
  63. package/src/lib/jobs/ai-job-page-language.d.ts +52 -7
  64. package/src/lib/jobs/ai-job-page-language.js +72 -9
  65. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  66. package/src/lib/jobs/ai-job-page-step.js +12 -2
  67. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  68. package/src/lib/jobs/ai-job-plan-step.d.ts +19 -5
  69. package/src/lib/jobs/ai-job-plan-step.js +54 -20
  70. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  71. package/src/lib/jobs/ai-job-site-content.d.ts +163 -0
  72. package/src/lib/jobs/ai-job-site-content.js +443 -0
  73. package/src/lib/jobs/ai-job-site-content.js.map +1 -0
  74. package/src/lib/jobs/ai-job-site-look.d.ts +112 -0
  75. package/src/lib/jobs/ai-job-site-look.js +322 -0
  76. package/src/lib/jobs/ai-job-site-look.js.map +1 -0
  77. package/src/lib/jobs/ai-job-site-step.d.ts +26 -5
  78. package/src/lib/jobs/ai-job-site-step.js +163 -24
  79. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  80. package/src/lib/jobs/ai-jobs-notify.d.ts +6 -1
  81. package/src/lib/jobs/ai-jobs-notify.js +15 -3
  82. package/src/lib/jobs/ai-jobs-notify.js.map +1 -1
  83. package/src/lib/layout-language/ai-layout-compiler.d.ts +9 -0
  84. package/src/lib/layout-language/ai-layout-compiler.js +120 -33
  85. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  86. package/src/lib/layout-language/ai-layout-frame.js +5 -4
  87. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  88. package/src/lib/layout-language/ai-layout-language.d.ts +12 -5
  89. package/src/lib/layout-language/ai-layout-language.js +92 -9
  90. package/src/lib/layout-language/ai-layout-language.js.map +1 -1
  91. package/src/lib/layout-language/ai-layout-pictures.d.ts +144 -0
  92. package/src/lib/layout-language/ai-layout-pictures.js +214 -0
  93. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -0
  94. package/src/lib/layout-language/ai-layout-store.d.ts +2 -0
  95. package/src/lib/layout-language/ai-layout-store.js +7 -1
  96. package/src/lib/layout-language/ai-layout-store.js.map +1 -1
  97. package/src/lib/model/ai-build-progress.js +4 -1
  98. package/src/lib/model/ai-build-progress.js.map +1 -1
  99. package/src/lib/model/ai-edit-job.d.ts +109 -0
  100. package/src/lib/model/ai-edit-job.js +157 -0
  101. package/src/lib/model/ai-edit-job.js.map +1 -0
  102. package/src/lib/model/ai-job-activity.js +1 -0
  103. package/src/lib/model/ai-job-activity.js.map +1 -1
  104. package/src/lib/model/ai-jobs.types.d.ts +3 -1
  105. package/src/lib/model/ai-jobs.types.js.map +1 -1
  106. package/src/lib/model/ai-logic-job.d.ts +18 -1
  107. package/src/lib/model/ai-logic-job.js +24 -3
  108. package/src/lib/model/ai-logic-job.js.map +1 -1
  109. package/src/lib/model/ai-media-credits.d.ts +8 -4
  110. package/src/lib/model/ai-media-credits.js +11 -4
  111. package/src/lib/model/ai-media-credits.js.map +1 -1
  112. package/src/lib/model/ai-media-kinds.d.ts +68 -0
  113. package/src/lib/model/ai-media-kinds.js +98 -0
  114. package/src/lib/model/ai-media-kinds.js.map +1 -0
  115. package/src/lib/model/ai-site-build-progress.d.ts +4 -0
  116. package/src/lib/model/ai-site-build-progress.js +28 -11
  117. package/src/lib/model/ai-site-build-progress.js.map +1 -1
  118. package/src/lib/model/ai-site-context.d.ts +111 -0
  119. package/src/lib/model/ai-site-context.js +222 -0
  120. package/src/lib/model/ai-site-context.js.map +1 -0
  121. package/src/lib/model/ai-site-job.d.ts +10 -2
  122. package/src/lib/model/ai-site-job.js +12 -5
  123. package/src/lib/model/ai-site-job.js.map +1 -1
  124. package/src/lib/model/ai-site-kinds.d.ts +164 -0
  125. package/src/lib/model/ai-site-kinds.js +1942 -0
  126. package/src/lib/model/ai-site-kinds.js.map +1 -0
  127. package/src/lib/model/ai-site-look.d.ts +150 -0
  128. package/src/lib/model/ai-site-look.js +1236 -0
  129. package/src/lib/model/ai-site-look.js.map +1 -0
  130. package/src/lib/model/ai-site-memory.d.ts +80 -0
  131. package/src/lib/model/ai-site-memory.js +171 -0
  132. package/src/lib/model/ai-site-memory.js.map +1 -0
  133. package/src/lib/model/ai-site-start.d.ts +10 -1
  134. package/src/lib/model/ai-site-start.js +16 -2
  135. package/src/lib/model/ai-site-start.js.map +1 -1
  136. package/src/lib/model/assist-follow-up.d.ts +92 -0
  137. package/src/lib/model/assist-follow-up.js +128 -0
  138. package/src/lib/model/assist-follow-up.js.map +1 -0
  139. package/src/lib/plugin-config.js +2 -0
  140. package/src/lib/plugin-config.js.map +1 -1
  141. package/src/lib/plugin.js +20 -1
  142. package/src/lib/plugin.js.map +1 -1
  143. package/src/lib/providers/anthropic.d.ts +9 -1
  144. package/src/lib/providers/anthropic.js +143 -9
  145. package/src/lib/providers/anthropic.js.map +1 -1
  146. package/src/lib/providers/catalog.d.ts +37 -7
  147. package/src/lib/providers/catalog.js +103 -11
  148. package/src/lib/providers/catalog.js.map +1 -1
  149. package/src/lib/providers/contract.d.ts +29 -0
  150. package/src/lib/providers/contract.js.map +1 -1
  151. package/src/lib/providers/image-contract.d.ts +22 -1
  152. package/src/lib/providers/image-contract.js +40 -1
  153. package/src/lib/providers/image-contract.js.map +1 -1
  154. package/src/lib/providers/image-endpoints.d.ts +24 -0
  155. package/src/lib/providers/image-endpoints.js +28 -0
  156. package/src/lib/providers/image-endpoints.js.map +1 -0
  157. package/src/lib/providers/model-choice.js +23 -2
  158. package/src/lib/providers/model-choice.js.map +1 -1
  159. package/src/lib/providers/routing.js +18 -0
  160. package/src/lib/providers/routing.js.map +1 -1
  161. package/src/lib/providers/vertex-image-endpoint.d.ts +48 -0
  162. package/src/lib/providers/vertex-image-endpoint.js +80 -0
  163. package/src/lib/providers/vertex-image-endpoint.js.map +1 -0
  164. package/src/lib/providers/vertex-image.d.ts +13 -27
  165. package/src/lib/providers/vertex-image.js +15 -42
  166. package/src/lib/providers/vertex-image.js.map +1 -1
  167. package/src/lib/runtime/ai-blog-post-generation.d.ts +62 -0
  168. package/src/lib/runtime/ai-blog-post-generation.js +89 -0
  169. package/src/lib/runtime/ai-blog-post-generation.js.map +1 -0
  170. package/src/lib/runtime/ai-dev-env.d.ts +53 -0
  171. package/src/lib/runtime/ai-dev-env.js +72 -0
  172. package/src/lib/runtime/ai-dev-env.js.map +1 -0
  173. package/src/lib/runtime/ai-dev-replay.d.ts +116 -0
  174. package/src/lib/runtime/ai-dev-replay.js +313 -0
  175. package/src/lib/runtime/ai-dev-replay.js.map +1 -0
  176. package/src/lib/runtime/ai-doctrine.js +5 -1
  177. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  178. package/src/lib/runtime/ai-eval-live.js +4 -0
  179. package/src/lib/runtime/ai-eval-live.js.map +1 -1
  180. package/src/lib/runtime/ai-eval.d.ts +13 -1
  181. package/src/lib/runtime/ai-eval.js +84 -1
  182. package/src/lib/runtime/ai-eval.js.map +1 -1
  183. package/src/lib/runtime/ai-live-batch.d.ts +45 -0
  184. package/src/lib/runtime/ai-live-batch.js +89 -0
  185. package/src/lib/runtime/ai-live-batch.js.map +1 -0
  186. package/src/lib/runtime/ai-runtime.js +46 -2
  187. package/src/lib/runtime/ai-runtime.js.map +1 -1
  188. package/src/lib/runtime/site-context.d.ts +58 -0
  189. package/src/lib/runtime/site-context.js +127 -0
  190. package/src/lib/runtime/site-context.js.map +1 -0
  191. package/src/lib/server/ai-admin-conversations.d.ts +22 -0
  192. package/src/lib/server/ai-admin-conversations.js +197 -0
  193. package/src/lib/server/ai-admin-conversations.js.map +1 -0
  194. package/src/lib/server/ai-media-image.d.ts +5 -5
  195. package/src/lib/server/ai-media-image.js +25 -11
  196. package/src/lib/server/ai-media-image.js.map +1 -1
  197. package/src/lib/server/ai-media-raster-prompt.d.ts +34 -0
  198. package/src/lib/server/ai-media-raster-prompt.js +53 -0
  199. package/src/lib/server/ai-media-raster-prompt.js.map +1 -0
  200. package/src/lib/server/assist-chat.d.ts +11 -0
  201. package/src/lib/server/assist-chat.js +57 -18
  202. package/src/lib/server/assist-chat.js.map +1 -1
  203. package/src/lib/server/assist-edit-applied.js +16 -3
  204. package/src/lib/server/assist-edit-applied.js.map +1 -1
  205. package/src/lib/server/assist-view-context.d.ts +19 -1
  206. package/src/lib/server/assist-view-context.js +38 -1
  207. package/src/lib/server/assist-view-context.js.map +1 -1
  208. package/src/lib/server.js +10 -0
  209. package/src/lib/server.js.map +1 -1
  210. package/src/lib/subprocessors.js +17 -1
  211. package/src/lib/subprocessors.js.map +1 -1
  212. package/src/lib/tools/ai-blog-post-tool.d.ts +60 -0
  213. package/src/lib/tools/ai-blog-post-tool.js +175 -0
  214. package/src/lib/tools/ai-blog-post-tool.js.map +1 -0
  215. package/src/lib/usage/assist-usage.d.ts +3 -0
  216. package/src/lib/usage/assist-usage.js +4 -2
  217. package/src/lib/usage/assist-usage.js.map +1 -1
  218. package/src/lib/usage/staff-org-ai-conversations.d.ts +103 -0
  219. package/src/lib/usage/staff-org-ai-conversations.js +152 -0
  220. package/src/lib/usage/staff-org-ai-conversations.js.map +1 -0
@@ -32,6 +32,7 @@ import { applyAssistEdit, describeAssistEditCanvas } from "./assist-edit-canvas.
32
32
  import { AssistEditCard } from "./assist-edit-card.component.js";
33
33
  import { AssistBuildCard } from "./assist-build-card.component.js";
34
34
  import { isAssistBuildProposal } from "../model/assist-build.js";
35
+ import { assistBesignerVersionOf, assistBuildDraftLinks, isLiveAssistFollowUp } from "../model/assist-follow-up.js";
35
36
  import { startAssistBuildRequest } from "./ai-job-requests.js";
36
37
  import { aiInsightSurfaceForPath } from "../model/ai-insight.js";
37
38
  import { AssistJobsDrawer } from "./assist-jobs-drawer.component.js";
@@ -43,6 +44,39 @@ import { useAiModelChoice } from "./use-ai-model-choice.js";
43
44
  import { usePublishAiUsageMeter } from "./use-ai-usage-meter.js";
44
45
  import { pluginDocsHelp } from "@aglyn/aglyn/app-utils/docs-help";
45
46
  import { HelpTip } from "@aglyn/shared-ui-jsx";
47
+ /** The key a follow-up waiting for its canvas is kept under, per org (AGL-3616). */ const followUpKey = (orgId)=>`aglyn-assist-follow-up:${orgId}`;
48
+ function loadFollowUp(orgId) {
49
+ if (!orgId || typeof sessionStorage === 'undefined') return null;
50
+ try {
51
+ var _sessionStorage_getItem;
52
+ const parsed = JSON.parse((_sessionStorage_getItem = sessionStorage.getItem(followUpKey(orgId))) != null ? _sessionStorage_getItem : 'null');
53
+ if (isLiveAssistFollowUp(parsed, Date.now())) return parsed;
54
+ // One past its time is never asked: forget it.
55
+ if (parsed !== null) sessionStorage.removeItem(followUpKey(orgId));
56
+ return null;
57
+ } catch (unused) {
58
+ return null;
59
+ }
60
+ }
61
+ function saveFollowUp(orgId, followUp) {
62
+ if (!orgId || typeof sessionStorage === 'undefined') return;
63
+ try {
64
+ if (followUp) sessionStorage.setItem(followUpKey(orgId), JSON.stringify(followUp));
65
+ else sessionStorage.removeItem(followUpKey(orgId));
66
+ } catch (unused) {
67
+ // Storage that refuses only loses the re-ask; the draft still opens.
68
+ }
69
+ }
70
+ /**
71
+ * The drafts this thread's builds made that open in the Besigner, newest
72
+ * build first (AGL-3616): what a follow-up such as "make the about page
73
+ * shorter" may open.
74
+ */ export function assistThreadDraftLinks(messages, orgSlug) {
75
+ const jobs = messages.flatMap((message)=>message.buildJob ? [
76
+ message.buildJob
77
+ ] : []).reverse();
78
+ return assistBuildDraftLinks(jobs, orgSlug);
79
+ }
46
80
  /** What a stored build that never got its job says, rather than planning forever. */ const BUILD_NOT_STARTED = 'This build was not started. Ask again to plan it.';
47
81
  const HISTORY_TURNS_SENT = 12;
48
82
  const storageKey = (orgId)=>`aglyn-assist:${orgId}`;
@@ -309,6 +343,15 @@ function saveThread(orgId, messages) {
309
343
  "."
310
344
  ]
311
345
  }),
346
+ proposal.followUp && /*#__PURE__*/ _jsx(Typography, {
347
+ variant: "caption",
348
+ color: "text.secondary",
349
+ component: "div",
350
+ sx: {
351
+ mt: 1
352
+ },
353
+ children: `${brand} Assist asks “${proposal.followUp}” again there. Nothing changes until you apply the edit it proposes.`
354
+ }),
312
355
  proposal.values.length > 0 && /*#__PURE__*/ _jsxs(Box, {
313
356
  sx: {
314
357
  mt: 1
@@ -340,7 +383,7 @@ function saveThread(orgId, messages) {
340
383
  })
341
384
  ]
342
385
  }),
343
- /*#__PURE__*/ _jsxs(Typography, {
386
+ !proposal.followUp && /*#__PURE__*/ _jsxs(Typography, {
344
387
  variant: "caption",
345
388
  color: "text.secondary",
346
389
  component: "div",
@@ -382,7 +425,7 @@ function saveThread(orgId, messages) {
382
425
  });
383
426
  }
384
427
  export function AssistPanelComponent(props) {
385
- var _ref;
428
+ var _ref, _ref1;
386
429
  const { org, orgId, orgReady, scopedOrgId, orgSlug, hostId, productName, assistVisible, assistStaffPreview, generativeVisible, isStaff, aiPermissions: ai } = props;
387
430
  const verdict = {
388
431
  visible: assistVisible,
@@ -485,11 +528,14 @@ export function AssistPanelComponent(props) {
485
528
  jobsVisible,
486
529
  pathname
487
530
  ]);
488
- const send = useCallback(async ()=>{
489
- const question = input.trim();
531
+ const send = useCallback(async (asked)=>{
532
+ const question = (asked != null ? asked : input).trim();
490
533
  if (!question || busy || !scopedOrgId || !ai.use) return;
491
534
  setBusy(true);
492
- setInput('');
535
+ if (asked === undefined) setInput('');
536
+ // The drafts this thread's builds made (AGL-3616): the chat sees refs and
537
+ // labels; the addresses stay here, for the card a follow-up raises.
538
+ const draftLinks = hostId ? assistThreadDraftLinks(messages, orgSlug) : [];
493
539
  const history = messages.slice(-HISTORY_TURNS_SENT).map(({ role, text })=>({
494
540
  role,
495
541
  text
@@ -555,6 +601,12 @@ export function AssistPanelComponent(props) {
555
601
  model: modelChoice.model
556
602
  } : {}, canvasOutline ? {
557
603
  canvas: canvasOutline
604
+ } : {}, draftLinks.length ? {
605
+ drafts: draftLinks.map(({ ref, label, noun })=>({
606
+ ref,
607
+ label,
608
+ noun
609
+ }))
558
610
  } : {}))
559
611
  });
560
612
  if (!response.ok || !response.body) {
@@ -625,7 +677,18 @@ export function AssistPanelComponent(props) {
625
677
  // to the view the question was asked from, plus a destination
626
678
  // this client did not choose. Null on every turn that proposed
627
679
  // nothing, which is most of them.
628
- const proposal = (_event_proposal = event.proposal) != null ? _event_proposal : null;
680
+ const resolved = (_event_proposal = event.proposal) != null ? _event_proposal : null;
681
+ // An open-draft proposal goes to that draft's own Besigner, from
682
+ // this panel's record of its build, and asks the request again
683
+ // there; one naming a draft this panel does not hold is dropped.
684
+ const draftLink = (resolved == null ? void 0 : resolved.draft) ? draftLinks.find((link)=>{
685
+ var _resolved_draft;
686
+ return link.ref === ((_resolved_draft = resolved.draft) == null ? void 0 : _resolved_draft.ref);
687
+ }) : null;
688
+ const proposal = (resolved == null ? void 0 : resolved.draft) ? draftLink ? _extends({}, resolved, {
689
+ href: draftLink.href,
690
+ followUp: question
691
+ }) : null : resolved;
629
692
  // The edit proposal (AGL-2906), shape-checked before it can reach
630
693
  // a card whose Apply drives the canvas.
631
694
  const edit = isAssistEditProposal(event.edit) ? event.edit : null;
@@ -702,6 +765,50 @@ export function AssistPanelComponent(props) {
702
765
  pathname,
703
766
  user
704
767
  ]);
768
+ // A follow-up waiting for its draft's canvas (AGL-3616): kept per org, so a
769
+ // panel the Besigner's layout mounts afresh still asks it.
770
+ const [followUp, setFollowUp] = useState(null);
771
+ useEffect(()=>{
772
+ setFollowUp(loadFollowUp(scopedOrgId));
773
+ }, [
774
+ scopedOrgId
775
+ ]);
776
+ const followUpVersion = (_ref = editorSession == null ? void 0 : editorSession.versionId) != null ? _ref : null;
777
+ useEffect(()=>{
778
+ if (!followUp) return;
779
+ if (!isLiveAssistFollowUp(followUp, Date.now())) {
780
+ setFollowUp(null);
781
+ saveFollowUp(scopedOrgId, null);
782
+ return;
783
+ }
784
+ // Asked once the draft's own canvas is open, so the edit rung reads it.
785
+ if (busy || !ai.use || pathname !== followUp.path) return;
786
+ if (!followUpVersion || followUpVersion !== assistBesignerVersionOf(followUp.path)) return;
787
+ setFollowUp(null);
788
+ saveFollowUp(scopedOrgId, null);
789
+ setOpen(true);
790
+ void send(followUp.question);
791
+ }, [
792
+ ai.use,
793
+ busy,
794
+ followUp,
795
+ followUpVersion,
796
+ pathname,
797
+ scopedOrgId,
798
+ send
799
+ ]);
800
+ /** Keep a confirmed open-draft proposal's request for the draft's canvas. */ const holdFollowUp = useCallback((proposal)=>{
801
+ if (!proposal.followUp) return;
802
+ const pending = {
803
+ path: proposal.href,
804
+ question: proposal.followUp,
805
+ at: Date.now()
806
+ };
807
+ setFollowUp(pending);
808
+ saveFollowUp(scopedOrgId, pending);
809
+ }, [
810
+ scopedOrgId
811
+ ]);
705
812
  /**
706
813
  * Retire a card once it has been acted on or waved away. Local state only
707
814
  * — there is nothing to tell the server, because the proposal was never
@@ -851,7 +958,7 @@ export function AssistPanelComponent(props) {
851
958
  badgeContent: jobsActivity ? jobsActivity.count : 0,
852
959
  invisible: !jobsActivity,
853
960
  overlap: "circular",
854
- "data-ai-jobs-badge": (_ref = jobsActivity == null ? void 0 : jobsActivity.state) != null ? _ref : undefined,
961
+ "data-ai-jobs-badge": (_ref1 = jobsActivity == null ? void 0 : jobsActivity.state) != null ? _ref1 : undefined,
855
962
  children: /*#__PURE__*/ _jsx(MdiIcon, {
856
963
  path: mdiCreation.path,
857
964
  fontSize: "medium"
@@ -1006,12 +1113,15 @@ export function AssistPanelComponent(props) {
1006
1113
  brand: productName,
1007
1114
  onConfirm: ()=>{
1008
1115
  var _ref;
1009
- var _message_proposal;
1116
+ var _message_proposal, _message_proposal1;
1010
1117
  trackEvent('assistant_proposal_confirmed', {
1011
1118
  action: (_ref = (_message_proposal = message.proposal) == null ? void 0 : _message_proposal.id) != null ? _ref : ''
1012
1119
  });
1013
1120
  resolveProposal(index);
1014
- setOpen(false);
1121
+ // A follow-up keeps the panel open: its answer
1122
+ // arrives here once the draft's canvas is.
1123
+ if ((_message_proposal1 = message.proposal) == null ? void 0 : _message_proposal1.followUp) holdFollowUp(message.proposal);
1124
+ else setOpen(false);
1015
1125
  },
1016
1126
  onDismiss: ()=>resolveProposal(index)
1017
1127
  }),