@flamingo-stack/openframe-frontend-core 0.0.215 → 0.0.216-snapshot.20260530192723

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 (230) hide show
  1. package/dist/chunk-2V4SACHE.js +302 -0
  2. package/dist/chunk-2V4SACHE.js.map +1 -0
  3. package/dist/chunk-572WQWIX.cjs +348 -0
  4. package/dist/chunk-572WQWIX.cjs.map +1 -0
  5. package/dist/{chunk-WT5JV2GS.cjs → chunk-5V6MSE3B.cjs} +39 -39
  6. package/dist/chunk-5V6MSE3B.cjs.map +1 -0
  7. package/dist/{chunk-WQZP3JIZ.js → chunk-CDLYRFDE.js} +1894 -1472
  8. package/dist/chunk-CDLYRFDE.js.map +1 -0
  9. package/dist/chunk-GVNQAGXB.js +232 -0
  10. package/dist/chunk-GVNQAGXB.js.map +1 -0
  11. package/dist/{chunk-P5EE2VJX.cjs → chunk-HOHDXYPR.cjs} +1 -1
  12. package/dist/chunk-HOHDXYPR.cjs.map +1 -0
  13. package/dist/chunk-IH76P5R6.cjs +232 -0
  14. package/dist/chunk-IH76P5R6.cjs.map +1 -0
  15. package/dist/{chunk-24KCAECR.cjs → chunk-JJR27M56.cjs} +3 -3
  16. package/dist/{chunk-24KCAECR.cjs.map → chunk-JJR27M56.cjs.map} +1 -1
  17. package/dist/chunk-K4DFAVSO.cjs +302 -0
  18. package/dist/chunk-K4DFAVSO.cjs.map +1 -0
  19. package/dist/{chunk-HICZPTRR.js → chunk-LCLTCCXS.js} +14 -14
  20. package/dist/chunk-LCLTCCXS.js.map +1 -0
  21. package/dist/{chunk-VFKQMAUF.cjs → chunk-OB45JHDY.cjs} +3 -3
  22. package/dist/{chunk-VFKQMAUF.cjs.map → chunk-OB45JHDY.cjs.map} +1 -1
  23. package/dist/{chunk-4XLJWX2N.js → chunk-ORJREQ2W.js} +4 -4
  24. package/dist/{chunk-7PCP7YQR.js → chunk-QTKU6ULP.js} +6 -6
  25. package/dist/{chunk-CIPO6DXK.js → chunk-QY75VKAS.js} +5 -5
  26. package/dist/{chunk-ZG2YY5E7.js → chunk-RFONYT63.js} +1 -1
  27. package/dist/chunk-RFONYT63.js.map +1 -0
  28. package/dist/{chunk-NGFP4RVL.cjs → chunk-SMCG2CCC.cjs} +30 -30
  29. package/dist/{chunk-NGFP4RVL.cjs.map → chunk-SMCG2CCC.cjs.map} +1 -1
  30. package/dist/{chunk-MX5MIFWA.js → chunk-UEBM4PC4.js} +5 -5
  31. package/dist/chunk-VC3ND5RB.js +348 -0
  32. package/dist/chunk-VC3ND5RB.js.map +1 -0
  33. package/dist/{chunk-UXZ3ZJ3M.cjs → chunk-XDPSSE4O.cjs} +4 -4
  34. package/dist/{chunk-UXZ3ZJ3M.cjs.map → chunk-XDPSSE4O.cjs.map} +1 -1
  35. package/dist/{chunk-D4MNFY67.cjs → chunk-ZGTDUPTW.cjs} +1316 -894
  36. package/dist/chunk-ZGTDUPTW.cjs.map +1 -0
  37. package/dist/components/chat/entity-cards/blog-card.d.ts +1 -1
  38. package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -1
  39. package/dist/components/chat/entity-cards/case-study-card.d.ts +1 -1
  40. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  41. package/dist/components/chat/entity-cards/customer-interview-card.d.ts +1 -1
  42. package/dist/components/chat/entity-cards/customer-interview-card.d.ts.map +1 -1
  43. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
  44. package/dist/components/chat/entity-cards/investor-update-card.d.ts +1 -1
  45. package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -1
  46. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts +1 -1
  47. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
  48. package/dist/components/chat/entity-cards/program-card.d.ts +1 -1
  49. package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -1
  50. package/dist/components/chat/entity-cards/use-entity-card-link.d.ts +14 -0
  51. package/dist/components/chat/entity-cards/use-entity-card-link.d.ts.map +1 -0
  52. package/dist/components/chat/entity-cards/use-entity-card-placeholder.d.ts +13 -0
  53. package/dist/components/chat/entity-cards/use-entity-card-placeholder.d.ts.map +1 -0
  54. package/dist/components/chat/index.cjs +11 -11
  55. package/dist/components/chat/index.js +10 -10
  56. package/dist/components/contact/index.cjs +12 -12
  57. package/dist/components/contact/index.js +11 -11
  58. package/dist/components/features/captions-url.d.ts +18 -0
  59. package/dist/components/features/captions-url.d.ts.map +1 -0
  60. package/dist/components/features/index.cjs +23 -11
  61. package/dist/components/features/index.cjs.map +1 -1
  62. package/dist/components/features/index.d.ts +2 -0
  63. package/dist/components/features/index.d.ts.map +1 -1
  64. package/dist/components/features/index.js +24 -12
  65. package/dist/components/features/mux-origins.cjs +10 -0
  66. package/dist/components/features/mux-origins.cjs.map +1 -0
  67. package/dist/components/features/mux-origins.d.ts +26 -0
  68. package/dist/components/features/mux-origins.d.ts.map +1 -0
  69. package/dist/components/features/mux-origins.js +7 -0
  70. package/dist/components/features/mux-origins.js.map +1 -0
  71. package/dist/components/features/notifications/index.d.ts +2 -0
  72. package/dist/components/features/notifications/index.d.ts.map +1 -1
  73. package/dist/components/features/notifications/notification-drawer.d.ts +2 -1
  74. package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
  75. package/dist/components/features/notifications/notification-popups.d.ts +10 -0
  76. package/dist/components/features/notifications/notification-popups.d.ts.map +1 -0
  77. package/dist/components/features/notifications/notifications-context.d.ts +8 -1
  78. package/dist/components/features/notifications/notifications-context.d.ts.map +1 -1
  79. package/dist/components/features/notifications/types.d.ts +1 -0
  80. package/dist/components/features/notifications/types.d.ts.map +1 -1
  81. package/dist/components/features/use-video-warmup.d.ts +53 -0
  82. package/dist/components/features/use-video-warmup.d.ts.map +1 -0
  83. package/dist/components/icons/index.cjs +3 -3
  84. package/dist/components/icons/index.js +2 -2
  85. package/dist/components/icons-v2-generated/index.cjs +2 -2
  86. package/dist/components/icons-v2-generated/index.cjs.map +1 -1
  87. package/dist/components/icons-v2-generated/index.js +4 -4
  88. package/dist/components/index.cjs +133 -103
  89. package/dist/components/index.cjs.map +1 -1
  90. package/dist/components/index.d.ts +1 -0
  91. package/dist/components/index.d.ts.map +1 -1
  92. package/dist/components/index.js +95 -65
  93. package/dist/components/index.js.map +1 -1
  94. package/dist/components/navigation/index.cjs +11 -11
  95. package/dist/components/navigation/index.js +10 -10
  96. package/dist/components/onboarding-guides/build-default-href.d.ts +15 -0
  97. package/dist/components/onboarding-guides/build-default-href.d.ts.map +1 -0
  98. package/dist/components/onboarding-guides/hooks/use-onboarding-guides.d.ts +28 -0
  99. package/dist/components/onboarding-guides/hooks/use-onboarding-guides.d.ts.map +1 -0
  100. package/dist/components/onboarding-guides/index.cjs +373 -0
  101. package/dist/components/onboarding-guides/index.cjs.map +1 -0
  102. package/dist/components/onboarding-guides/index.d.ts +25 -0
  103. package/dist/components/onboarding-guides/index.d.ts.map +1 -0
  104. package/dist/components/onboarding-guides/index.js +373 -0
  105. package/dist/components/onboarding-guides/index.js.map +1 -0
  106. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts +52 -0
  107. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -0
  108. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts +17 -0
  109. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts.map +1 -0
  110. package/dist/components/onboarding-guides/onboarding-guides-catalog-view.d.ts +43 -0
  111. package/dist/components/onboarding-guides/onboarding-guides-catalog-view.d.ts.map +1 -0
  112. package/dist/components/shared/doc-search/doc-search-bar.d.ts +59 -0
  113. package/dist/components/shared/doc-search/doc-search-bar.d.ts.map +1 -0
  114. package/dist/components/shared/doc-search/doc-search-result-row.d.ts +18 -0
  115. package/dist/components/shared/doc-search/doc-search-result-row.d.ts.map +1 -0
  116. package/dist/components/shared/doc-search/format-relative-path.d.ts +10 -0
  117. package/dist/components/shared/doc-search/format-relative-path.d.ts.map +1 -0
  118. package/dist/components/shared/doc-search/index.d.ts +8 -0
  119. package/dist/components/shared/doc-search/index.d.ts.map +1 -0
  120. package/dist/components/shared/doc-search/map-doc-search-results.d.ts +15 -0
  121. package/dist/components/shared/doc-search/map-doc-search-results.d.ts.map +1 -0
  122. package/dist/components/shared/doc-search/resolve-search-result-action.d.ts +37 -0
  123. package/dist/components/shared/doc-search/resolve-search-result-action.d.ts.map +1 -0
  124. package/dist/components/shared/doc-search/types.d.ts +29 -0
  125. package/dist/components/shared/doc-search/types.d.ts.map +1 -0
  126. package/dist/components/shared/doc-search/use-doc-search.d.ts +46 -0
  127. package/dist/components/shared/doc-search/use-doc-search.d.ts.map +1 -0
  128. package/dist/components/shared/legal-document/use-legal-docs.d.ts.map +1 -1
  129. package/dist/components/tickets/help-center-card.d.ts +5 -1
  130. package/dist/components/tickets/help-center-card.d.ts.map +1 -1
  131. package/dist/components/tickets/hooks/use-ticket-actions.d.ts +8 -0
  132. package/dist/components/tickets/hooks/use-ticket-actions.d.ts.map +1 -1
  133. package/dist/components/tickets/index.cjs +321 -145
  134. package/dist/components/tickets/index.cjs.map +1 -1
  135. package/dist/components/tickets/index.js +242 -66
  136. package/dist/components/tickets/index.js.map +1 -1
  137. package/dist/components/tickets/ticket-detail-drawer.d.ts +11 -2
  138. package/dist/components/tickets/ticket-detail-drawer.d.ts.map +1 -1
  139. package/dist/components/tickets/types.d.ts +50 -1
  140. package/dist/components/tickets/types.d.ts.map +1 -1
  141. package/dist/components/ui/file-manager/index.cjs +51 -51
  142. package/dist/components/ui/file-manager/index.cjs.map +1 -1
  143. package/dist/components/ui/file-manager/index.js +2 -2
  144. package/dist/components/ui/filter-pill-row.d.ts +20 -0
  145. package/dist/components/ui/filter-pill-row.d.ts.map +1 -0
  146. package/dist/components/ui/index.cjs +16 -14
  147. package/dist/components/ui/index.cjs.map +1 -1
  148. package/dist/components/ui/index.d.ts +1 -0
  149. package/dist/components/ui/index.d.ts.map +1 -1
  150. package/dist/components/ui/index.js +21 -19
  151. package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -1
  152. package/dist/contexts/chat-runtime-context.d.ts +42 -0
  153. package/dist/contexts/chat-runtime-context.d.ts.map +1 -1
  154. package/dist/contexts/index.cjs +2 -2
  155. package/dist/contexts/index.js +1 -1
  156. package/dist/embed-shims/index.cjs +3 -3
  157. package/dist/embed-shims/index.cjs.map +1 -1
  158. package/dist/embed-shims/index.js +5 -5
  159. package/dist/hooks/index.cjs +6 -6
  160. package/dist/hooks/index.js +5 -5
  161. package/dist/index.cjs +28 -14
  162. package/dist/index.cjs.map +1 -1
  163. package/dist/index.js +59 -45
  164. package/dist/utils/dev-sections/openframe-dev-sections.d.ts +2 -2
  165. package/dist/utils/dev-sections/openframe-dev-sections.d.ts.map +1 -1
  166. package/dist/utils/index.cjs +11 -5
  167. package/dist/utils/index.cjs.map +1 -1
  168. package/dist/utils/index.js +11 -5
  169. package/dist/utils/index.js.map +1 -1
  170. package/package.json +13 -1
  171. package/src/components/chat/entity-cards/blog-card.tsx +17 -5
  172. package/src/components/chat/entity-cards/case-study-card.tsx +23 -1
  173. package/src/components/chat/entity-cards/customer-interview-card.tsx +23 -1
  174. package/src/components/chat/entity-cards/dispatch.tsx +21 -0
  175. package/src/components/chat/entity-cards/investor-update-card.tsx +23 -1
  176. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +30 -4
  177. package/src/components/chat/entity-cards/program-card.tsx +17 -3
  178. package/src/components/chat/entity-cards/use-entity-card-link.ts +66 -0
  179. package/src/components/chat/entity-cards/use-entity-card-placeholder.ts +50 -0
  180. package/src/components/features/captions-url.ts +25 -0
  181. package/src/components/features/index.ts +2 -0
  182. package/src/components/features/mux-origins.ts +27 -0
  183. package/src/components/features/notifications/index.ts +2 -0
  184. package/src/components/features/notifications/notification-drawer.tsx +100 -16
  185. package/src/components/features/notifications/notification-popups.tsx +105 -0
  186. package/src/components/features/notifications/notifications-context.tsx +16 -0
  187. package/src/components/features/notifications/types.ts +1 -0
  188. package/src/components/features/use-video-warmup.ts +176 -0
  189. package/src/components/index.ts +5 -0
  190. package/src/components/onboarding-guides/build-default-href.ts +16 -0
  191. package/src/components/onboarding-guides/hooks/use-onboarding-guides.ts +90 -0
  192. package/src/components/onboarding-guides/index.ts +39 -0
  193. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +215 -0
  194. package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +62 -0
  195. package/src/components/onboarding-guides/onboarding-guides-catalog-view.tsx +230 -0
  196. package/src/components/shared/doc-search/doc-search-bar.tsx +100 -0
  197. package/src/components/shared/doc-search/doc-search-result-row.tsx +73 -0
  198. package/src/components/shared/doc-search/format-relative-path.ts +17 -0
  199. package/src/components/shared/doc-search/index.ts +24 -0
  200. package/src/components/shared/doc-search/map-doc-search-results.ts +113 -0
  201. package/src/components/shared/doc-search/resolve-search-result-action.ts +68 -0
  202. package/src/components/shared/doc-search/types.ts +28 -0
  203. package/src/components/shared/doc-search/use-doc-search.ts +263 -0
  204. package/src/components/shared/legal-document/use-legal-docs.ts +5 -1
  205. package/src/components/tickets/help-center-card.tsx +8 -0
  206. package/src/components/tickets/help-center-list.tsx +17 -3
  207. package/src/components/tickets/hooks/use-ticket-actions.ts +210 -14
  208. package/src/components/tickets/ticket-detail-drawer.tsx +175 -5
  209. package/src/components/tickets/types.ts +55 -0
  210. package/src/components/ui/filter-pill-row.tsx +72 -0
  211. package/src/components/ui/index.ts +1 -0
  212. package/src/components/ui/simple-markdown-renderer.tsx +24 -1
  213. package/src/components/ui/toaster.tsx +3 -3
  214. package/src/contexts/chat-runtime-context.tsx +41 -0
  215. package/src/stories/NotificationDrawer.stories.tsx +18 -2
  216. package/src/utils/dev-sections/openframe-dev-sections.ts +12 -5
  217. package/dist/chunk-2G3NXF6J.cjs +0 -521
  218. package/dist/chunk-2G3NXF6J.cjs.map +0 -1
  219. package/dist/chunk-D4MNFY67.cjs.map +0 -1
  220. package/dist/chunk-HICZPTRR.js.map +0 -1
  221. package/dist/chunk-P5EE2VJX.cjs.map +0 -1
  222. package/dist/chunk-R6MLPU4A.js +0 -521
  223. package/dist/chunk-R6MLPU4A.js.map +0 -1
  224. package/dist/chunk-WQZP3JIZ.js.map +0 -1
  225. package/dist/chunk-WT5JV2GS.cjs.map +0 -1
  226. package/dist/chunk-ZG2YY5E7.js.map +0 -1
  227. /package/dist/{chunk-4XLJWX2N.js.map → chunk-ORJREQ2W.js.map} +0 -0
  228. /package/dist/{chunk-7PCP7YQR.js.map → chunk-QTKU6ULP.js.map} +0 -0
  229. /package/dist/{chunk-CIPO6DXK.js.map → chunk-QY75VKAS.js.map} +0 -0
  230. /package/dist/{chunk-MX5MIFWA.js.map → chunk-UEBM4PC4.js.map} +0 -0
@@ -4,17 +4,18 @@
4
4
 
5
5
 
6
6
 
7
+ var _chunkK4DFAVSOcjs = require('../../chunk-K4DFAVSO.cjs');
7
8
 
8
9
 
9
10
 
10
11
 
11
12
 
12
- var _chunk2G3NXF6Jcjs = require('../../chunk-2G3NXF6J.cjs');
13
- require('../../chunk-VFKQMAUF.cjs');
14
13
 
14
+ var _chunkIH76P5R6cjs = require('../../chunk-IH76P5R6.cjs');
15
+ require('../../chunk-OB45JHDY.cjs');
15
16
 
16
- var _chunkNGFP4RVLcjs = require('../../chunk-NGFP4RVL.cjs');
17
17
 
18
+ var _chunkSMCG2CCCcjs = require('../../chunk-SMCG2CCC.cjs');
18
19
 
19
20
 
20
21
 
@@ -36,43 +37,45 @@ var _chunkNGFP4RVLcjs = require('../../chunk-NGFP4RVL.cjs');
36
37
 
37
38
 
38
39
 
39
- var _chunkD4MNFY67cjs = require('../../chunk-D4MNFY67.cjs');
40
40
 
41
41
 
42
- var _chunkWT5JV2GScjs = require('../../chunk-WT5JV2GS.cjs');
43
- require('../../chunk-24KCAECR.cjs');
44
- require('../../chunk-65CPJ4SX.cjs');
45
- require('../../chunk-XQFFGR6U.cjs');
46
- require('../../chunk-P5EE2VJX.cjs');
47
- require('../../chunk-27APPAJN.cjs');
42
+ var _chunkZGTDUPTWcjs = require('../../chunk-ZGTDUPTW.cjs');
48
43
  require('../../chunk-XL4V2PYG.cjs');
49
44
  require('../../chunk-BZFW3FOF.cjs');
50
45
 
51
46
 
52
47
 
53
48
 
54
- var _chunkG7UE6RKVcjs = require('../../chunk-G7UE6RKV.cjs');
55
- require('../../chunk-OZ3GH6OQ.cjs');
49
+
50
+ var _chunkXDPSSE4Ocjs = require('../../chunk-XDPSSE4O.cjs');
51
+ require('../../chunk-WBR7H6E3.cjs');
56
52
 
57
53
 
54
+ var _chunk5V6MSE3Bcjs = require('../../chunk-5V6MSE3B.cjs');
58
55
 
59
56
 
60
57
 
61
- var _chunkUXZ3ZJ3Mcjs = require('../../chunk-UXZ3ZJ3M.cjs');
58
+
59
+ var _chunkG7UE6RKVcjs = require('../../chunk-G7UE6RKV.cjs');
60
+ require('../../chunk-JJR27M56.cjs');
62
61
  require('../../chunk-664KA5FI.cjs');
62
+ require('../../chunk-65CPJ4SX.cjs');
63
63
  require('../../chunk-WZW7C7TF.cjs');
64
- require('../../chunk-WBR7H6E3.cjs');
64
+ require('../../chunk-XQFFGR6U.cjs');
65
+ require('../../chunk-HOHDXYPR.cjs');
66
+ require('../../chunk-27APPAJN.cjs');
67
+ require('../../chunk-OZ3GH6OQ.cjs');
65
68
  require('../../chunk-VRHGVLSL.cjs');
66
69
 
67
70
  // src/components/tickets/ticket-center.tsx
68
71
  var _react = require('react');
69
72
  var _reactquery = require('@tanstack/react-query');
70
- _chunkUXZ3ZJ3Mcjs.init_button2.call(void 0, );
73
+ _chunkXDPSSE4Ocjs.init_button2.call(void 0, );
71
74
  var _lucidereact = require('lucide-react');
72
75
 
73
76
  // src/components/tickets/ticket-open-form.tsx
74
77
 
75
- _chunkUXZ3ZJ3Mcjs.init_button2.call(void 0, );
78
+ _chunkXDPSSE4Ocjs.init_button2.call(void 0, );
76
79
 
77
80
  // src/components/tickets/types.ts
78
81
  function isOptimistic(t) {
@@ -99,7 +102,7 @@ function TicketOpenForm({
99
102
  }) {
100
103
  const [subject, setSubject] = _react.useState.call(void 0, "");
101
104
  const [content, setContent] = _react.useState.call(void 0, "");
102
- const { attachments, readyAttachments, hasInflightUploads, addFiles, removeAttachment, clear } = _chunkD4MNFY67cjs.useChatAttachments.call(void 0, );
105
+ const { attachments, readyAttachments, hasInflightUploads, addFiles, removeAttachment, clear } = _chunkZGTDUPTWcjs.useChatAttachments.call(void 0, );
103
106
  const trimmedSubject = subject.trim();
104
107
  const trimmedContent = content.trim();
105
108
  const overCap = content.length > TICKET_TEXT_MAX_CHARS;
@@ -119,7 +122,7 @@ function TicketOpenForm({
119
122
  clear();
120
123
  }
121
124
  };
122
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.Card, { className: "p-6", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { onSubmit: handleSubmit, className: "flex flex-col md:flex-row gap-6", children: [
125
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "p-6", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { onSubmit: handleSubmit, className: "flex flex-col md:flex-row gap-6", children: [
123
126
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex-1 min-w-0 md:max-w-md", children: [
124
127
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-2xl font-semibold text-ods-text-primary mb-2", children: "Need Support?" }),
125
128
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-sm", children: "Can't find what you're looking for? Submit a support ticket below \u2014 we'll follow up shortly." }),
@@ -136,7 +139,7 @@ function TicketOpenForm({
136
139
  }
137
140
  ),
138
141
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
139
- _chunkUXZ3ZJ3Mcjs.Input,
142
+ _chunkXDPSSE4Ocjs.Input,
140
143
  {
141
144
  id: "ticket-subject",
142
145
  type: "text",
@@ -158,7 +161,7 @@ function TicketOpenForm({
158
161
  }
159
162
  ),
160
163
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
161
- _chunkD4MNFY67cjs.Textarea,
164
+ _chunkZGTDUPTWcjs.Textarea,
162
165
  {
163
166
  id: "ticket-content",
164
167
  placeholder: "Describe your issue or question in detail...",
@@ -182,7 +185,7 @@ function TicketOpenForm({
182
185
  )
183
186
  ] }),
184
187
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
185
- _chunkD4MNFY67cjs.ChatAttachmentChipStrip,
188
+ _chunkZGTDUPTWcjs.ChatAttachmentChipStrip,
186
189
  {
187
190
  attachments,
188
191
  onRemove: removeAttachment,
@@ -191,7 +194,7 @@ function TicketOpenForm({
191
194
  ),
192
195
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between gap-3", children: [
193
196
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
194
- _chunkD4MNFY67cjs.ChatAttachmentAddButton,
197
+ _chunkZGTDUPTWcjs.ChatAttachmentAddButton,
195
198
  {
196
199
  attachmentsEnabled: !supportSystemDown,
197
200
  attachmentsCount: attachments.length,
@@ -200,7 +203,7 @@ function TicketOpenForm({
200
203
  }
201
204
  ),
202
205
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
203
- _chunkUXZ3ZJ3Mcjs.Button,
206
+ _chunkXDPSSE4Ocjs.Button,
204
207
  {
205
208
  type: "submit",
206
209
  disabled: !canSubmit,
@@ -222,14 +225,14 @@ var Collapsible = CollapsiblePrimitive.Root;
222
225
  var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
223
226
 
224
227
  // src/components/tickets/ticket-detail-drawer.tsx
225
- _chunkUXZ3ZJ3Mcjs.init_button2.call(void 0, );
228
+ _chunkXDPSSE4Ocjs.init_button2.call(void 0, );
226
229
 
227
230
 
228
231
  // src/components/tickets/hooks/use-ticket-engagements.ts
229
232
 
230
233
  var LIST_ENGAGEMENTS_ENDPOINT = "/api/chat/agent/list-engagements";
231
234
  function useTicketEngagements(externalTicketId, enabled = true) {
232
- const identity = _chunkD4MNFY67cjs.useChatIdentity.call(void 0, );
235
+ const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
233
236
  const identityKey = _nullishCoalesce(_optionalChain([identity, 'access', _ => _.user, 'optionalAccess', _2 => _2.email]), () => ( "anon"));
234
237
  const queryEnabled = enabled && identity.authTier !== "anon" && !!_optionalChain([identity, 'access', _3 => _3.user, 'optionalAccess', _4 => _4.email]) && !!externalTicketId && !externalTicketId.startsWith("temp-");
235
238
  const query = _reactquery.useQuery.call(void 0, {
@@ -243,7 +246,7 @@ function useTicketEngagements(externalTicketId, enabled = true) {
243
246
  refetchOnMount: "always",
244
247
  refetchOnWindowFocus: true,
245
248
  queryFn: async () => {
246
- const response = await _chunkD4MNFY67cjs.embedAuthedFetch.call(void 0, LIST_ENGAGEMENTS_ENDPOINT, {
249
+ const response = await _chunkZGTDUPTWcjs.embedAuthedFetch.call(void 0, LIST_ENGAGEMENTS_ENDPOINT, {
247
250
  method: "POST",
248
251
  body: JSON.stringify({ ticket_id: externalTicketId })
249
252
  });
@@ -291,7 +294,7 @@ function TicketLinkedDeliveryCard({
291
294
  {
292
295
  className: `rounded-md border border-ods-border bg-ods-bg overflow-hidden ${_nullishCoalesce(className, () => ( ""))}`,
293
296
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
294
- _chunk2G3NXF6Jcjs.DeliveryRow,
297
+ _chunkK4DFAVSOcjs.DeliveryRow,
295
298
  {
296
299
  item,
297
300
  href: clickup.delivery_href,
@@ -311,43 +314,59 @@ function TicketDetailDrawer({
311
314
  onSendMessage,
312
315
  onClose,
313
316
  onReopen,
314
- onActionCollapsed
317
+ onActionCollapsed,
318
+ replyError,
319
+ onClearReplyError
315
320
  }) {
316
321
  const isClosed = (_nullishCoalesce(ticket.status, () => ( ""))).toUpperCase() === "CLOSED";
317
322
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-ods-card border-t border-ods-border px-4 py-4 flex flex-col gap-4", children: [
323
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssignedAgentRow, { assignedOwner: ticket.assignedOwner }),
318
324
  ticket.clickup && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketLinkedDeliveryCard, { clickup: ticket.clickup }),
319
325
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
320
326
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-xs font-medium text-ods-text-secondary mb-2 uppercase tracking-wider", children: "Conversation" }),
321
327
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketTimelinePanel, { ticket })
322
328
  ] }),
323
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "border-t border-ods-border pt-4", children: isClosed ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
324
- ReopenAction,
325
- {
326
- ticketRef: { id: ticket.id, external_id: ticket.external_id },
327
- busy,
328
- supportSystemDown,
329
- onReopen,
330
- onActionCollapsed
331
- }
332
- ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
333
- OpenActions,
334
- {
335
- ticket,
336
- busy,
337
- supportSystemDown,
338
- onSendMessage,
339
- onClose,
340
- onActionCollapsed
341
- }
342
- ) })
329
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "border-t border-ods-border pt-4", children: [
330
+ replyError && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
331
+ ReplyFailureBanner,
332
+ {
333
+ error: replyError,
334
+ onDismiss: _nullishCoalesce(onClearReplyError, () => ( (() => void 0)))
335
+ }
336
+ ),
337
+ isClosed ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
338
+ ReopenAction,
339
+ {
340
+ ticketRef: { id: ticket.id, external_id: ticket.external_id },
341
+ busy,
342
+ supportSystemDown,
343
+ onReopen,
344
+ onActionCollapsed
345
+ }
346
+ ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
347
+ OpenActions,
348
+ {
349
+ ticket,
350
+ busy,
351
+ supportSystemDown,
352
+ onSendMessage,
353
+ onClose,
354
+ onActionCollapsed
355
+ }
356
+ )
357
+ ] })
343
358
  ] });
344
359
  }
345
360
  var TURN_SEPARATOR_RE = /[\s]{1,16}---[\s]{1,16}/g;
346
361
  function TicketTimelinePanel({ ticket }) {
347
- const identity = _chunkD4MNFY67cjs.useChatIdentity.call(void 0, );
362
+ const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
348
363
  const externalId = isOptimistic(ticket) ? null : ticket.external_id;
349
364
  const { engagements, isLoading } = useTicketEngagements(externalId, !!externalId);
350
365
  const bodyTurns = ticket.body ? ticket.body.split(TURN_SEPARATOR_RE).map((t) => t.trim()).filter(Boolean) : [];
366
+ const customerEngagementBodies = new Set(
367
+ engagements.filter((e) => e.authorRole === "customer").map((e) => (_nullishCoalesce(e.body, () => ( ""))).trim()).filter(Boolean)
368
+ );
369
+ const suppressBodyTurnZero = bodyTurns.length > 0 && customerEngagementBodies.has(bodyTurns[0]);
351
370
  const sessionEmailLower = _nullishCoalesce(_optionalChain([identity, 'access', _5 => _5.user, 'optionalAccess', _6 => _6.email, 'optionalAccess', _7 => _7.trim, 'call', _8 => _8(), 'access', _9 => _9.toLowerCase, 'call', _10 => _10()]), () => ( null));
352
371
  const isViewerTheCustomer = !!sessionEmailLower && ticket.customer_emails.some((e) => e.trim().toLowerCase() === sessionEmailLower);
353
372
  const viewerName = _optionalChain([identity, 'access', _11 => _11.user, 'optionalAccess', _12 => _12.name, 'optionalAccess', _13 => _13.trim, 'call', _14 => _14()]) || null;
@@ -356,10 +375,10 @@ function TicketTimelinePanel({ ticket }) {
356
375
  const customerAvatar = isViewerTheCustomer ? _nullishCoalesce(_optionalChain([identity, 'access', _20 => _20.user, 'optionalAccess', _21 => _21.avatarUrl]), () => ( void 0)) : void 0;
357
376
  if (bodyTurns.length === 0 && engagements.length === 0) {
358
377
  if (isLoading) {
359
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.ConversationCardRowSkeletonList, { rows: 2 });
378
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.ConversationCardRowSkeletonList, { rows: 2 });
360
379
  }
361
380
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
362
- _chunk2G3NXF6Jcjs.EmptyState,
381
+ _chunkK4DFAVSOcjs.EmptyState,
363
382
  {
364
383
  type: "generic",
365
384
  title: "No conversation yet",
@@ -370,11 +389,12 @@ function TicketTimelinePanel({ ticket }) {
370
389
  }
371
390
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full", children: [
372
391
  bodyTurns.map((turn, i) => {
392
+ if (i === 0 && suppressBodyTurnZero) return null;
373
393
  const isResolution = turn.startsWith("[Resolution]");
374
394
  const role = i === 0 ? "Original message" : isResolution ? "Resolution" : `Update ${i}`;
375
395
  const text = isResolution ? turn.replace(/^\[Resolution\]\s*/, "") : turn;
376
396
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
377
- _chunk2G3NXF6Jcjs.ConversationCardRow,
397
+ _chunkIH76P5R6cjs.ConversationCardRow,
378
398
  {
379
399
  author: customerName,
380
400
  role,
@@ -404,7 +424,7 @@ function TicketTimelinePanel({ ticket }) {
404
424
  avatarSrc = void 0;
405
425
  }
406
426
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
407
- _chunk2G3NXF6Jcjs.ConversationCardRow,
427
+ _chunkIH76P5R6cjs.ConversationCardRow,
408
428
  {
409
429
  author,
410
430
  role: "Reply",
@@ -421,7 +441,7 @@ function TicketTimelinePanel({ ticket }) {
421
441
  // content rendered — drawer is showing the customer's body
422
442
  // turns + cached engagements while a background refetch is
423
443
  // in flight. Single row keeps the placeholder modest.
424
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.ConversationCardRowSkeletonList, { rows: 1 })
444
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.ConversationCardRowSkeletonList, { rows: 1 })
425
445
  ] });
426
446
  }
427
447
  function mapEngagementAttachments(files) {
@@ -449,11 +469,10 @@ function ReopenAction({
449
469
  onActionCollapsed
450
470
  }) {
451
471
  const handleReopen = async () => {
452
- const ok = await onReopen(ticketRef);
453
- if (ok) onActionCollapsed();
472
+ void await onReopen(ticketRef);
454
473
  };
455
474
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-end", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
456
- _chunkUXZ3ZJ3Mcjs.Button,
475
+ _chunkXDPSSE4Ocjs.Button,
457
476
  {
458
477
  type: "button",
459
478
  onClick: () => void handleReopen(),
@@ -474,7 +493,7 @@ function OpenActions({
474
493
  const [messageText, setMessageText] = _react.useState.call(void 0, "");
475
494
  const [resolution, setResolution] = _react.useState.call(void 0, "");
476
495
  const [closeDialogOpen, setCloseDialogOpen] = _react.useState.call(void 0, false);
477
- const attachments = _chunkD4MNFY67cjs.useChatAttachments.call(void 0, );
496
+ const attachments = _chunkZGTDUPTWcjs.useChatAttachments.call(void 0, );
478
497
  const disabled = busy || supportSystemDown;
479
498
  const ticketRef = { id: ticket.id, external_id: ticket.external_id };
480
499
  const hasText = messageText.trim().length > 0;
@@ -490,14 +509,13 @@ function OpenActions({
490
509
  };
491
510
  const confirmClose = async () => {
492
511
  setCloseDialogOpen(false);
493
- const ok = await onClose(ticketRef, resolution.trim() || void 0);
512
+ await onClose(ticketRef, resolution.trim() || void 0);
494
513
  setResolution("");
495
- if (ok) onActionCollapsed();
496
514
  };
497
515
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-3", children: [
498
516
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2", children: [
499
517
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
500
- _chunkD4MNFY67cjs.Textarea,
518
+ _chunkZGTDUPTWcjs.Textarea,
501
519
  {
502
520
  value: messageText,
503
521
  onChange: (e) => setMessageText(e.target.value),
@@ -508,7 +526,7 @@ function OpenActions({
508
526
  }
509
527
  ),
510
528
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
511
- _chunkD4MNFY67cjs.ChatAttachmentChipStrip,
529
+ _chunkZGTDUPTWcjs.ChatAttachmentChipStrip,
512
530
  {
513
531
  attachments: attachments.attachments,
514
532
  onRemove: attachments.removeAttachment,
@@ -518,7 +536,7 @@ function OpenActions({
518
536
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex justify-between items-center gap-2 flex-wrap", children: [
519
537
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
520
538
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
521
- _chunkD4MNFY67cjs.ChatAttachmentAddButton,
539
+ _chunkZGTDUPTWcjs.ChatAttachmentAddButton,
522
540
  {
523
541
  attachmentsEnabled: !supportSystemDown,
524
542
  attachmentsCount: attachments.attachments.length,
@@ -530,7 +548,7 @@ function OpenActions({
530
548
  ] }),
531
549
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
532
550
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
533
- _chunkUXZ3ZJ3Mcjs.Button,
551
+ _chunkXDPSSE4Ocjs.Button,
534
552
  {
535
553
  type: "button",
536
554
  variant: "transparent",
@@ -541,7 +559,7 @@ function OpenActions({
541
559
  }
542
560
  ),
543
561
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
544
- _chunkUXZ3ZJ3Mcjs.Button,
562
+ _chunkXDPSSE4Ocjs.Button,
545
563
  {
546
564
  type: "button",
547
565
  onClick: () => void sendMessage(),
@@ -553,13 +571,13 @@ function OpenActions({
553
571
  ] })
554
572
  ] })
555
573
  ] }),
556
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.AlertDialog, { open: closeDialogOpen, onOpenChange: setCloseDialogOpen, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkD4MNFY67cjs.AlertDialogContent, { className: "bg-ods-card border-ods-border", children: [
557
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkD4MNFY67cjs.AlertDialogHeader, { children: [
558
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.AlertDialogTitle, { className: "text-ods-text-primary font-['DM_Sans'] text-[20px] font-semibold", children: "Close this ticket?" }),
559
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.AlertDialogDescription, { className: "text-ods-text-secondary font-['DM_Sans'] text-[14px]", children: "Add an optional resolution note below. You can reopen the ticket later if needed." })
574
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.AlertDialog, { open: closeDialogOpen, onOpenChange: setCloseDialogOpen, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.AlertDialogContent, { className: "bg-ods-card border-ods-border", children: [
575
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.AlertDialogHeader, { children: [
576
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.AlertDialogTitle, { className: "text-ods-text-primary font-['DM_Sans'] text-[20px] font-semibold", children: "Close this ticket?" }),
577
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.AlertDialogDescription, { className: "text-ods-text-secondary font-['DM_Sans'] text-[14px]", children: "Add an optional resolution note below. You can reopen the ticket later if needed." })
560
578
  ] }),
561
579
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
562
- _chunkD4MNFY67cjs.Textarea,
580
+ _chunkZGTDUPTWcjs.Textarea,
563
581
  {
564
582
  value: resolution,
565
583
  onChange: (e) => setResolution(e.target.value),
@@ -569,9 +587,9 @@ function OpenActions({
569
587
  className: "mt-2"
570
588
  }
571
589
  ),
572
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkD4MNFY67cjs.AlertDialogFooter, { children: [
590
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.AlertDialogFooter, { children: [
573
591
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
574
- _chunkD4MNFY67cjs.AlertDialogCancel,
592
+ _chunkZGTDUPTWcjs.AlertDialogCancel,
575
593
  {
576
594
  disabled: busy,
577
595
  className: "bg-transparent border-ods-border text-ods-text-primary hover:bg-ods-border",
@@ -579,7 +597,7 @@ function OpenActions({
579
597
  }
580
598
  ),
581
599
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
582
- _chunkD4MNFY67cjs.AlertDialogAction,
600
+ _chunkZGTDUPTWcjs.AlertDialogAction,
583
601
  {
584
602
  onClick: () => void confirmClose(),
585
603
  disabled: busy,
@@ -591,6 +609,56 @@ function OpenActions({
591
609
  ] }) })
592
610
  ] });
593
611
  }
612
+ function ReplyFailureBanner({
613
+ error,
614
+ onDismiss
615
+ }) {
616
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
617
+ "div",
618
+ {
619
+ role: "status",
620
+ "aria-live": "polite",
621
+ className: "mb-3 flex items-start gap-3 rounded-md border border-ods-attention-red-error bg-ods-attention-red-error-secondary px-3 py-2 text-sm text-ods-attention-red-error",
622
+ children: [
623
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "font-medium leading-snug", children: error.message }),
624
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
625
+ _chunkXDPSSE4Ocjs.Button,
626
+ {
627
+ type: "button",
628
+ variant: "transparent",
629
+ onClick: onDismiss,
630
+ "aria-label": "Dismiss reply failure",
631
+ className: "ml-auto px-2 py-0.5 text-xs font-medium uppercase tracking-wider text-ods-attention-red-error hover:bg-ods-attention-red-error/10 border-transparent",
632
+ children: "Dismiss"
633
+ }
634
+ )
635
+ ]
636
+ }
637
+ );
638
+ }
639
+ function AssignedAgentRow({
640
+ assignedOwner
641
+ }) {
642
+ const trimmedName = _optionalChain([assignedOwner, 'optionalAccess', _30 => _30.name, 'optionalAccess', _31 => _31.trim, 'call', _32 => _32()]) || null;
643
+ const emailFallback = _optionalChain([assignedOwner, 'optionalAccess', _33 => _33.email, 'optionalAccess', _34 => _34.trim, 'call', _35 => _35()]) || null;
644
+ const displayLabel = _nullishCoalesce(trimmedName, () => ( (emailFallback ? emailFallback.split("@")[0] : null)));
645
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 text-xs", children: [
646
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-secondary uppercase tracking-wider font-medium", children: "Assigned to" }),
647
+ displayLabel ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-1.5 text-ods-text-primary font-medium", children: [
648
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
649
+ _chunkZGTDUPTWcjs.SquareAvatar,
650
+ {
651
+ size: "sm",
652
+ variant: "round",
653
+ src: _nullishCoalesce(_optionalChain([assignedOwner, 'optionalAccess', _36 => _36.avatarUrl]), () => ( void 0)),
654
+ alt: displayLabel,
655
+ fallback: displayLabel
656
+ }
657
+ ),
658
+ displayLabel
659
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-secondary italic", children: "Unassigned" })
660
+ ] });
661
+ }
594
662
 
595
663
  // src/components/tickets/ticket-row.tsx
596
664
 
@@ -609,7 +677,7 @@ function TicketRow({
609
677
  const rowRef = _react.useRef.call(void 0, null);
610
678
  const handleClick = _react.useCallback.call(void 0, () => {
611
679
  onToggle(ticket.id);
612
- _chunkD4MNFY67cjs.scrollElementIntoView.call(void 0, rowRef.current, {
680
+ _chunkZGTDUPTWcjs.scrollElementIntoView.call(void 0, rowRef.current, {
613
681
  adjustTargetY: (raw) => {
614
682
  if (!rowRef.current) return raw;
615
683
  const expandedDrawer = document.querySelector(
@@ -635,7 +703,7 @@ function TicketRow({
635
703
  // so the badge accurately reflects "Closed" with a checkmark.
636
704
  statusLabel: _nullishCoalesce(ticket.pipeline_stage_label, () => ( void 0)),
637
705
  category: _nullishCoalesce(ticket.customer_company, () => ( void 0)),
638
- timeAgo: ticket.hubspot_updated_at ? _chunkD4MNFY67cjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : void 0,
706
+ timeAgo: ticket.hubspot_updated_at ? _chunkZGTDUPTWcjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : void 0,
639
707
  // Linked-work chip: surfaced whenever the ticket has a linked
640
708
  // ClickUp task. Uses the linked task's own status so the chip text
641
709
  // reads "Working" / "Waiting on version release" / etc. — useful
@@ -650,7 +718,7 @@ function TicketRow({
650
718
  className: "border-b border-ods-border last:border-b-0",
651
719
  children: [
652
720
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
653
- _chunkD4MNFY67cjs.ChatTicketItem,
721
+ _chunkZGTDUPTWcjs.ChatTicketItem,
654
722
  {
655
723
  ticket: tileData,
656
724
  onClick: optimistic ? void 0 : handleClick,
@@ -714,7 +782,7 @@ function useTicketsList(filters) {
714
782
  pageSize
715
783
  };
716
784
  if (statusFilter) body.status = statusFilter;
717
- const response = await _chunkD4MNFY67cjs.embedAuthedFetch.call(void 0, FIND_TICKET_ENDPOINT, {
785
+ const response = await _chunkZGTDUPTWcjs.embedAuthedFetch.call(void 0, FIND_TICKET_ENDPOINT, {
718
786
  method: "POST",
719
787
  body: JSON.stringify(body)
720
788
  });
@@ -726,12 +794,12 @@ function useTicketsList(filters) {
726
794
  }
727
795
  });
728
796
  const data = query.data;
729
- const totalCount = _nullishCoalesce(_nullishCoalesce(_optionalChain([data, 'optionalAccess', _30 => _30.totalCount]), () => ( _optionalChain([data, 'optionalAccess', _31 => _31.count]))), () => ( (_nullishCoalesce(_optionalChain([data, 'optionalAccess', _32 => _32.tickets, 'optionalAccess', _33 => _33.length]), () => ( 0)))));
730
- const echoedPage = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _34 => _34.page]), () => ( page));
731
- const echoedPageSize = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _35 => _35.pageSize]), () => ( pageSize));
732
- const totalPages = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _36 => _36.totalPages]), () => ( Math.max(1, Math.ceil(totalCount / echoedPageSize))));
797
+ const totalCount = _nullishCoalesce(_nullishCoalesce(_optionalChain([data, 'optionalAccess', _37 => _37.totalCount]), () => ( _optionalChain([data, 'optionalAccess', _38 => _38.count]))), () => ( (_nullishCoalesce(_optionalChain([data, 'optionalAccess', _39 => _39.tickets, 'optionalAccess', _40 => _40.length]), () => ( 0)))));
798
+ const echoedPage = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _41 => _41.page]), () => ( page));
799
+ const echoedPageSize = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _42 => _42.pageSize]), () => ( pageSize));
800
+ const totalPages = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _43 => _43.totalPages]), () => ( Math.max(1, Math.ceil(totalCount / echoedPageSize))));
733
801
  return {
734
- tickets: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _37 => _37.tickets]), () => ( [])),
802
+ tickets: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _44 => _44.tickets]), () => ( [])),
735
803
  // Loading-state-truth = `data === undefined`. TanStack v5's
736
804
  // `isPending` / `isLoading` flags can be `false` in transient
737
805
  // windows where the query is enabled-but-fetch-not-yet-fired
@@ -753,7 +821,7 @@ function useTicketsList(filters) {
753
821
  // - Background refetch with existing data: data !== undefined → no load
754
822
  // - Filter-change refetch landing on empty results: data?.tickets===[]
755
823
  // + isFetching → bridge skeleton (the `||` branch)
756
- isLoading: enabled && (data === void 0 || query.isFetching && (_nullishCoalesce(_optionalChain([data, 'optionalAccess', _38 => _38.tickets]), () => ( []))).length === 0),
824
+ isLoading: enabled && (data === void 0 || query.isFetching && (_nullishCoalesce(_optionalChain([data, 'optionalAccess', _45 => _45.tickets]), () => ( []))).length === 0),
757
825
  isFetching: query.isFetching,
758
826
  error: _nullishCoalesce(query.error, () => ( null)),
759
827
  refetch: () => {
@@ -771,6 +839,12 @@ function useTicketsList(filters) {
771
839
 
772
840
 
773
841
  var TICKET_ACTION_ENDPOINT = "/api/chat/agent/ticket-action";
842
+ var REPLY_BANNER_CODES = /* @__PURE__ */ new Set([
843
+ "HUBSPOT_5XX",
844
+ "HUBSPOT_400_VALIDATION",
845
+ "HUBSPOT_404_THREAD",
846
+ "HUBSPOT_REPLY_UNKNOWN"
847
+ ]);
774
848
  var MIRROR_SYNC_BACKOFF_MS = [3e3, 6e3, 12e3];
775
849
  function useTicketActions(options) {
776
850
  const queryClient = _reactquery.useQueryClient.call(void 0, );
@@ -785,6 +859,26 @@ function useTicketActions(options) {
785
859
  setBusyRows(new Set(busyRowsRef.current));
786
860
  }, []);
787
861
  const isRowBusy = _react.useCallback.call(void 0, (id) => busyRows.has(id), [busyRows]);
862
+ const [replyErrorByTicket, setReplyErrorByTicket] = _react.useState.call(void 0, () => /* @__PURE__ */ new Map());
863
+ const setReplyError = _react.useCallback.call(void 0,
864
+ (externalId, mapped) => {
865
+ setReplyErrorByTicket((prev) => {
866
+ const next = new Map(prev);
867
+ if (mapped) next.set(externalId, mapped);
868
+ else next.delete(externalId);
869
+ return next;
870
+ });
871
+ },
872
+ []
873
+ );
874
+ const replyErrorFor = _react.useCallback.call(void 0,
875
+ (externalId) => _nullishCoalesce(replyErrorByTicket.get(externalId), () => ( null)),
876
+ [replyErrorByTicket]
877
+ );
878
+ const clearReplyError = _react.useCallback.call(void 0,
879
+ (externalId) => setReplyError(externalId, null),
880
+ [setReplyError]
881
+ );
788
882
  const watcherControllersRef = _react.useRef.call(void 0, /* @__PURE__ */ new Map());
789
883
  _react.useEffect.call(void 0, () => {
790
884
  return () => {
@@ -802,7 +896,7 @@ function useTicketActions(options) {
802
896
  }, []);
803
897
  const executeTicketAction = _react.useCallback.call(void 0,
804
898
  async (toolName, args) => {
805
- const res = await _chunkD4MNFY67cjs.embedAuthedFetch.call(void 0, TICKET_ACTION_ENDPOINT, {
899
+ const res = await _chunkZGTDUPTWcjs.embedAuthedFetch.call(void 0, TICKET_ACTION_ENDPOINT, {
806
900
  method: "POST",
807
901
  body: JSON.stringify({ tool_name: toolName, args })
808
902
  });
@@ -862,9 +956,11 @@ function useTicketActions(options) {
862
956
  },
863
957
  [queryClient, removeOptimistic, toast2]
864
958
  );
959
+ const lastUpdateErrorRef = _react.useRef.call(void 0, null);
865
960
  const surfaceError = _react.useCallback.call(void 0,
866
961
  (err, action) => {
867
962
  const mapped = mapTicketActionError(err);
963
+ lastUpdateErrorRef.current = mapped;
868
964
  if (mapped.supportSystemDown) onSupportSystemDown();
869
965
  toast2({
870
966
  title: `Could not ${action}`,
@@ -899,6 +995,10 @@ function useTicketActions(options) {
899
995
  // seconds via the mirror refetch. Drawer uses live chat
900
996
  // identity for own-replies during this window anyway.
901
997
  customer_name: null,
998
+ // No assignee until the real ticket lands. Drawer renders
999
+ // "Unassigned" for this brief window.
1000
+ assigned_to: null,
1001
+ assignedOwner: null,
902
1002
  hubspot_updated_at: (/* @__PURE__ */ new Date()).toISOString(),
903
1003
  _optimistic: true
904
1004
  };
@@ -908,7 +1008,7 @@ function useTicketActions(options) {
908
1008
  const result = await executeTicketAction("create_ticket", {
909
1009
  subject: input.subject.trim(),
910
1010
  content: input.content.trim(),
911
- ..._optionalChain([input, 'access', _39 => _39.attachments, 'optionalAccess', _40 => _40.length]) ? { attachments: input.attachments } : {}
1011
+ ..._optionalChain([input, 'access', _46 => _46.attachments, 'optionalAccess', _47 => _47.length]) ? { attachments: input.attachments } : {}
912
1012
  });
913
1013
  if (result.mirror_synced === false) {
914
1014
  toast2(TOAST_COPY.open_mirror_pending);
@@ -951,10 +1051,23 @@ function useTicketActions(options) {
951
1051
  ticket_id: ticket.external_id
952
1052
  });
953
1053
  toast2(successCopy);
954
- await Promise.all([
955
- queryClient.invalidateQueries({ queryKey: ["tickets"] }),
956
- queryClient.invalidateQueries({ queryKey: ["ticket-engagements"] })
957
- ]);
1054
+ const statusUpdate = _nullishCoalesce(serverArgs.status, () => ( null));
1055
+ if (statusUpdate) {
1056
+ queryClient.setQueriesData(
1057
+ { queryKey: ["tickets"] },
1058
+ (prev) => {
1059
+ if (!prev || !Array.isArray(prev.tickets)) return prev;
1060
+ let mutated = false;
1061
+ const nextTickets = prev.tickets.map((t) => {
1062
+ if (t.id !== ticket.id || t.status === statusUpdate) return t;
1063
+ mutated = true;
1064
+ return { ...t, status: statusUpdate };
1065
+ });
1066
+ return mutated ? { ...prev, tickets: nextTickets } : prev;
1067
+ }
1068
+ );
1069
+ }
1070
+ await queryClient.invalidateQueries({ queryKey: ["ticket-engagements"] });
958
1071
  return true;
959
1072
  });
960
1073
  } catch (err) {
@@ -974,12 +1087,13 @@ function useTicketActions(options) {
974
1087
  [setRowBusy, enqueue, executeTicketAction, queryClient, toast2, surfaceError, removeTicketFromCache]
975
1088
  );
976
1089
  const sendMessage = _react.useCallback.call(void 0,
977
- (ticket, text, attachments) => {
1090
+ async (ticket, text, attachments) => {
978
1091
  const trimmed = text.trim();
979
1092
  const hasText = trimmed.length > 0;
980
1093
  const hasFiles = attachments.length > 0;
981
- if (!hasText && !hasFiles) return Promise.resolve(false);
982
- return updateTicket(
1094
+ if (!hasText && !hasFiles) return false;
1095
+ lastUpdateErrorRef.current = null;
1096
+ const ok = await updateTicket(
983
1097
  ticket,
984
1098
  {
985
1099
  ...hasText ? { content_addendum: trimmed } : {},
@@ -988,15 +1102,25 @@ function useTicketActions(options) {
988
1102
  TOAST_COPY.comment_success,
989
1103
  "send message"
990
1104
  );
1105
+ if (ok) {
1106
+ clearReplyError(ticket.external_id);
1107
+ } else {
1108
+ const mapped = lastUpdateErrorRef.current;
1109
+ if (mapped && REPLY_BANNER_CODES.has(mapped.code)) {
1110
+ setReplyError(ticket.external_id, mapped);
1111
+ }
1112
+ lastUpdateErrorRef.current = null;
1113
+ }
1114
+ return ok;
991
1115
  },
992
- [updateTicket]
1116
+ [updateTicket, clearReplyError, setReplyError]
993
1117
  );
994
1118
  const closeTicket = _react.useCallback.call(void 0,
995
1119
  (ticket, resolution) => updateTicket(
996
1120
  ticket,
997
1121
  {
998
1122
  status: "CLOSED",
999
- ..._optionalChain([resolution, 'optionalAccess', _41 => _41.trim, 'call', _42 => _42()]) ? { resolution: resolution.trim() } : {}
1123
+ ..._optionalChain([resolution, 'optionalAccess', _48 => _48.trim, 'call', _49 => _49()]) ? { resolution: resolution.trim() } : {}
1000
1124
  },
1001
1125
  TOAST_COPY.close_success,
1002
1126
  "close ticket"
@@ -1014,9 +1138,20 @@ function useTicketActions(options) {
1014
1138
  closeTicket,
1015
1139
  reopenTicket,
1016
1140
  isSubmittingForm,
1017
- isRowBusy
1141
+ isRowBusy,
1142
+ replyErrorFor,
1143
+ clearReplyError
1018
1144
  }),
1019
- [submitTicket, sendMessage, closeTicket, reopenTicket, isSubmittingForm, isRowBusy]
1145
+ [
1146
+ submitTicket,
1147
+ sendMessage,
1148
+ closeTicket,
1149
+ reopenTicket,
1150
+ isSubmittingForm,
1151
+ isRowBusy,
1152
+ replyErrorFor,
1153
+ clearReplyError
1154
+ ]
1020
1155
  );
1021
1156
  }
1022
1157
  var TicketActionFailure = class extends Error {
@@ -1058,7 +1193,7 @@ function mapTicketActionError(err) {
1058
1193
  removeRowFromCache: false
1059
1194
  };
1060
1195
  case "RATE_LIMITED": {
1061
- const retryAfterRaw = _optionalChain([err, 'access', _43 => _43.response, 'optionalAccess', _44 => _44.headers, 'access', _45 => _45.get, 'call', _46 => _46("Retry-After")]);
1196
+ const retryAfterRaw = _optionalChain([err, 'access', _50 => _50.response, 'optionalAccess', _51 => _51.headers, 'access', _52 => _52.get, 'call', _53 => _53("Retry-After")]);
1062
1197
  const retryAfterSeconds = retryAfterRaw ? parseInt(retryAfterRaw, 10) : void 0;
1063
1198
  return {
1064
1199
  code: err.code,
@@ -1075,6 +1210,34 @@ function mapTicketActionError(err) {
1075
1210
  supportSystemDown: false,
1076
1211
  removeRowFromCache: false
1077
1212
  };
1213
+ case "HUBSPOT_5XX":
1214
+ return {
1215
+ code: err.code,
1216
+ message: "We couldn't reach the support system. Your reply wasn't sent \u2014 please retry in a moment.",
1217
+ supportSystemDown: false,
1218
+ removeRowFromCache: false
1219
+ };
1220
+ case "HUBSPOT_400_VALIDATION":
1221
+ return {
1222
+ code: err.code,
1223
+ message: "Your reply was rejected. Please rephrase or remove unsupported content and try again.",
1224
+ supportSystemDown: false,
1225
+ removeRowFromCache: false
1226
+ };
1227
+ case "HUBSPOT_404_THREAD":
1228
+ return {
1229
+ code: err.code,
1230
+ message: "This conversation is no longer accepting replies. Open a new ticket to continue.",
1231
+ supportSystemDown: false,
1232
+ removeRowFromCache: false
1233
+ };
1234
+ case "HUBSPOT_REPLY_UNKNOWN":
1235
+ return {
1236
+ code: err.code,
1237
+ message: "Your reply didn't go through. Please retry.",
1238
+ supportSystemDown: false,
1239
+ removeRowFromCache: false
1240
+ };
1078
1241
  default:
1079
1242
  return {
1080
1243
  code: "UNKNOWN",
@@ -1098,9 +1261,11 @@ function cryptoRandomId() {
1098
1261
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
1099
1262
  }
1100
1263
  function cacheContainsTicket(queryClient, expectedTicketId) {
1101
- const entries = queryClient.getQueriesData({ queryKey: ["tickets"] });
1264
+ const entries = queryClient.getQueriesData({
1265
+ queryKey: ["tickets"]
1266
+ });
1102
1267
  for (const [, data] of entries) {
1103
- if (Array.isArray(data) && data.some((t) => t.external_id === expectedTicketId)) {
1268
+ if (data && Array.isArray(data.tickets) && data.tickets.some((t) => t.external_id === expectedTicketId)) {
1104
1269
  return true;
1105
1270
  }
1106
1271
  }
@@ -1115,14 +1280,14 @@ function resolveErrorCode(bodyCode, status) {
1115
1280
 
1116
1281
  // src/components/tickets/ticket-center.tsx
1117
1282
 
1118
- function TicketCenter({ toast: toast2 = _chunkWT5JV2GScjs.toast } = {}) {
1119
- const identity = _chunkD4MNFY67cjs.useChatIdentity.call(void 0, );
1283
+ function TicketCenter({ toast: toast2 = _chunk5V6MSE3Bcjs.toast } = {}) {
1284
+ const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
1120
1285
  if (identity.isLoading) {
1121
1286
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketCenterSkeleton, {});
1122
1287
  }
1123
- if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _47 => _47.user, 'optionalAccess', _48 => _48.email])) {
1288
+ if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _54 => _54.user, 'optionalAccess', _55 => _55.email])) {
1124
1289
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1125
- _chunk2G3NXF6Jcjs.EmptyState,
1290
+ _chunkK4DFAVSOcjs.EmptyState,
1126
1291
  {
1127
1292
  type: "generic",
1128
1293
  title: "Sign in to manage tickets",
@@ -1193,10 +1358,10 @@ function TicketCenterAuthed({
1193
1358
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-3 text-xs text-ods-text-secondary", children: [
1194
1359
  lastUpdatedAt && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
1195
1360
  "Updated ",
1196
- _chunkD4MNFY67cjs.formatRelativeTime.call(void 0, new Date(lastUpdatedAt))
1361
+ _chunkZGTDUPTWcjs.formatRelativeTime.call(void 0, new Date(lastUpdatedAt))
1197
1362
  ] }),
1198
1363
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1199
- _chunkUXZ3ZJ3Mcjs.Button,
1364
+ _chunkXDPSSE4Ocjs.Button,
1200
1365
  {
1201
1366
  type: "button",
1202
1367
  variant: "transparent",
@@ -1209,15 +1374,15 @@ function TicketCenterAuthed({
1209
1374
  )
1210
1375
  ] })
1211
1376
  ] }),
1212
- isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketListSkeleton, {}) : merged.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.Card, { className: "p-6", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1213
- _chunk2G3NXF6Jcjs.EmptyState,
1377
+ isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketListSkeleton, {}) : merged.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "p-6", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1378
+ _chunkK4DFAVSOcjs.EmptyState,
1214
1379
  {
1215
1380
  type: "generic",
1216
1381
  title: "No tickets yet",
1217
1382
  description: "Open one above to start the conversation.",
1218
1383
  showCTA: false
1219
1384
  }
1220
- ) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.Card, { className: "overflow-hidden", children: merged.map((ticket) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1385
+ ) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "overflow-hidden", children: merged.map((ticket) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1221
1386
  TicketRow,
1222
1387
  {
1223
1388
  ticket,
@@ -1237,29 +1402,29 @@ function TicketCenterAuthed({
1237
1402
  }
1238
1403
  function TicketCenterSkeleton() {
1239
1404
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-6", children: [
1240
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkD4MNFY67cjs.Card, { className: "p-6", children: [
1241
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-7 w-48 mb-4" }),
1242
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-10 w-full mb-3" }),
1243
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-24 w-full" })
1405
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "p-6", children: [
1406
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-7 w-48 mb-4" }),
1407
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-10 w-full mb-3" }),
1408
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-24 w-full" })
1244
1409
  ] }),
1245
1410
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TicketListSkeleton, {})
1246
1411
  ] });
1247
1412
  }
1248
1413
  function TicketListSkeleton() {
1249
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD4MNFY67cjs.Card, { className: "overflow-hidden", children: [0, 1, 2].map((i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "h-20 px-4 flex items-center gap-4 border-b border-ods-border last:border-b-0", children: [
1414
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZGTDUPTWcjs.Card, { className: "overflow-hidden", children: [0, 1, 2].map((i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "h-20 px-4 flex items-center gap-4 border-b border-ods-border last:border-b-0", children: [
1250
1415
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex-1 flex flex-col gap-2", children: [
1251
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-4 w-2/3" }),
1252
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-3 w-full" })
1416
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-4 w-2/3" }),
1417
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-3 w-full" })
1253
1418
  ] }),
1254
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-8 w-20" }),
1255
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Skeleton, { className: "h-8 w-16" })
1419
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-8 w-20" }),
1420
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Skeleton, { className: "h-8 w-16" })
1256
1421
  ] }, i)) });
1257
1422
  }
1258
1423
 
1259
1424
  // src/components/tickets/help-center-list.tsx
1260
1425
 
1261
1426
 
1262
- _chunk2G3NXF6Jcjs.init_unified_pagination.call(void 0, );
1427
+ _chunkK4DFAVSOcjs.init_unified_pagination.call(void 0, );
1263
1428
 
1264
1429
  // src/components/tickets/help-center-card.tsx
1265
1430
 
@@ -1274,12 +1439,14 @@ function HelpCenterCard({
1274
1439
  onSendMessage,
1275
1440
  onClose,
1276
1441
  onReopen,
1277
- onActionCollapsed
1442
+ onActionCollapsed,
1443
+ replyError,
1444
+ onClearReplyError
1278
1445
  }) {
1279
1446
  const optimistic = isOptimistic(ticket);
1280
1447
  const rawStatus = (_nullishCoalesce(ticket.status, () => ( "OPEN"))).toUpperCase();
1281
1448
  const priority = (_nullishCoalesce(ticket.priority, () => ( ""))).toUpperCase();
1282
- const relativeUpdated = ticket.hubspot_updated_at ? _chunkD4MNFY67cjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : "recently";
1449
+ const relativeUpdated = ticket.hubspot_updated_at ? _chunkZGTDUPTWcjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : "recently";
1283
1450
  const title = (ticket.subject || "").trim() || "(untitled)";
1284
1451
  const subtitle = `UPDATED ${relativeUpdated}, #${ticket.external_id || "\u2014"}${ticket.pipeline_stage_label ? `, ${ticket.pipeline_stage_label}` : ""}`;
1285
1452
  const description = _nullishCoalesce(_nullishCoalesce(ticket.preview, () => ( ticket.body)), () => ( ""));
@@ -1288,7 +1455,7 @@ function HelpCenterCard({
1288
1455
  const rowRef = _react.useRef.call(void 0, null);
1289
1456
  const handleClick = _react.useCallback.call(void 0, () => {
1290
1457
  onToggle(ticket.id);
1291
- _chunkD4MNFY67cjs.scrollElementIntoView.call(void 0, rowRef.current, {
1458
+ _chunkZGTDUPTWcjs.scrollElementIntoView.call(void 0, rowRef.current, {
1292
1459
  headerOffset: STICKY_HEADER_OFFSET_PX,
1293
1460
  adjustTargetY: (raw) => {
1294
1461
  if (!rowRef.current) return raw;
@@ -1305,16 +1472,16 @@ function HelpCenterCard({
1305
1472
  }, [onToggle, ticket.id]);
1306
1473
  const rightBadges = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1307
1474
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1308
- _chunkD4MNFY67cjs.StatusBadge,
1475
+ _chunkZGTDUPTWcjs.StatusBadge,
1309
1476
  {
1310
1477
  text: rawStatus,
1311
- colorScheme: _chunkD4MNFY67cjs.getStatusColorScheme.call(void 0, rawStatus),
1478
+ colorScheme: _chunkZGTDUPTWcjs.getStatusColorScheme.call(void 0, rawStatus),
1312
1479
  variant: "card",
1313
1480
  className: "border border-ods-border"
1314
1481
  }
1315
1482
  ),
1316
1483
  priority && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1317
- _chunkD4MNFY67cjs.StatusBadge,
1484
+ _chunkZGTDUPTWcjs.StatusBadge,
1318
1485
  {
1319
1486
  text: priority,
1320
1487
  colorScheme: mapPriorityScheme(priority),
@@ -1341,7 +1508,7 @@ function HelpCenterCard({
1341
1508
  "aria-controls": isExpanded ? `help-center-drawer-${ticket.id}` : void 0,
1342
1509
  className: "w-full text-left p-[12px] md:p-[16px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent focus-visible:ring-inset disabled:cursor-default",
1343
1510
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1344
- _chunk2G3NXF6Jcjs.DevCardRowContent,
1511
+ _chunkIH76P5R6cjs.DevCardRowContent,
1345
1512
  {
1346
1513
  title,
1347
1514
  subtitle,
@@ -1361,7 +1528,9 @@ function HelpCenterCard({
1361
1528
  onSendMessage,
1362
1529
  onClose,
1363
1530
  onReopen,
1364
- onActionCollapsed
1531
+ onActionCollapsed,
1532
+ replyError,
1533
+ onClearReplyError
1365
1534
  }
1366
1535
  ) })
1367
1536
  ]
@@ -1414,12 +1583,12 @@ function HelpCenterCreateForm({
1414
1583
  const [subject, setSubject] = _react.useState.call(void 0, "");
1415
1584
  const [subjectError, setSubjectError] = _react.useState.call(void 0, null);
1416
1585
  const subjectField = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [
1417
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkD4MNFY67cjs.Label, { htmlFor: "help-center-subject", children: [
1586
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZGTDUPTWcjs.Label, { htmlFor: "help-center-subject", children: [
1418
1587
  "Subject",
1419
1588
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-accent", children: "*" })
1420
1589
  ] }),
1421
1590
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1422
- _chunkUXZ3ZJ3Mcjs.Input,
1591
+ _chunkXDPSSE4Ocjs.Input,
1423
1592
  {
1424
1593
  id: "help-center-subject",
1425
1594
  type: "text",
@@ -1446,7 +1615,7 @@ function HelpCenterCreateForm({
1446
1615
  )
1447
1616
  ] });
1448
1617
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1449
- _chunkNGFP4RVLcjs.ContactForm,
1618
+ _chunkSMCG2CCCcjs.ContactForm,
1450
1619
  {
1451
1620
  title: "Open a new ticket",
1452
1621
  footerText: "The support team typically responds within one business day.",
@@ -1483,8 +1652,8 @@ function HelpCenterCreateForm({
1483
1652
 
1484
1653
  // src/components/tickets/help-center-list.tsx
1485
1654
 
1486
- function HelpCenterList({ toast: toast2 = _chunkWT5JV2GScjs.toast } = {}) {
1487
- const identity = _chunkD4MNFY67cjs.useChatIdentity.call(void 0, );
1655
+ function HelpCenterList({ toast: toast2 = _chunk5V6MSE3Bcjs.toast } = {}) {
1656
+ const identity = _chunkZGTDUPTWcjs.useChatIdentity.call(void 0, );
1488
1657
  const searchParams = _chunkG7UE6RKVcjs.useSearchParams.call(void 0, );
1489
1658
  const router = _chunkG7UE6RKVcjs.useRouter.call(void 0, );
1490
1659
  const pathname = _chunkG7UE6RKVcjs.usePathname.call(void 0, );
@@ -1493,11 +1662,11 @@ function HelpCenterList({ toast: toast2 = _chunkWT5JV2GScjs.toast } = {}) {
1493
1662
  const rawPage = Number(searchParams.get("page"));
1494
1663
  const page = Number.isFinite(rawPage) && rawPage > 0 ? Math.floor(rawPage) : 1;
1495
1664
  if (identity.isLoading) {
1496
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.DevSectionPage, { sectionKey: "tickets", preControls: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpCenterCreateFormSkeleton, {}), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.DevCardRowSkeletonList, {}) });
1665
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevSectionPage, { sectionKey: "tickets", preControls: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpCenterCreateFormSkeleton, {}), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevCardRowSkeletonList, {}) });
1497
1666
  }
1498
- if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _49 => _49.user, 'optionalAccess', _50 => _50.email])) {
1499
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.DevSectionPage, { sectionKey: "tickets", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1500
- _chunk2G3NXF6Jcjs.EmptyState,
1667
+ if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _56 => _56.user, 'optionalAccess', _57 => _57.email])) {
1668
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevSectionPage, { sectionKey: "tickets", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1669
+ _chunkK4DFAVSOcjs.EmptyState,
1501
1670
  {
1502
1671
  type: "generic",
1503
1672
  title: "Sign in to manage tickets",
@@ -1506,7 +1675,7 @@ function HelpCenterList({ toast: toast2 = _chunkWT5JV2GScjs.toast } = {}) {
1506
1675
  }
1507
1676
  ) });
1508
1677
  }
1509
- const sessionName = [_optionalChain([identity, 'access', _51 => _51.user, 'optionalAccess', _52 => _52.firstName]), _optionalChain([identity, 'access', _53 => _53.user, 'optionalAccess', _54 => _54.lastName])].filter(Boolean).join(" ").trim() || _optionalChain([identity, 'access', _55 => _55.user, 'optionalAccess', _56 => _56.email, 'optionalAccess', _57 => _57.split, 'call', _58 => _58("@"), 'access', _59 => _59[0]]) || "Customer";
1678
+ const sessionName = [_optionalChain([identity, 'access', _58 => _58.user, 'optionalAccess', _59 => _59.firstName]), _optionalChain([identity, 'access', _60 => _60.user, 'optionalAccess', _61 => _61.lastName])].filter(Boolean).join(" ").trim() || _optionalChain([identity, 'access', _62 => _62.user, 'optionalAccess', _63 => _63.email, 'optionalAccess', _64 => _64.split, 'call', _65 => _65("@"), 'access', _66 => _66[0]]) || "Customer";
1510
1679
  const sessionEmail = identity.user.email;
1511
1680
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1512
1681
  HelpCenterListAuthed,
@@ -1561,7 +1730,12 @@ function HelpCenterListAuthed({
1561
1730
  (ticketId) => {
1562
1731
  queryClient.setQueriesData(
1563
1732
  { queryKey: ["tickets"] },
1564
- (prev) => (_nullishCoalesce(prev, () => ( []))).filter((t) => t.id !== ticketId)
1733
+ (prev) => {
1734
+ if (!prev || !Array.isArray(prev.tickets)) return prev;
1735
+ const nextTickets = prev.tickets.filter((t) => t.id !== ticketId);
1736
+ if (nextTickets.length === prev.tickets.length) return prev;
1737
+ return { ...prev, tickets: nextTickets };
1738
+ }
1565
1739
  );
1566
1740
  setExpandedTicketId((prev) => prev === ticketId ? null : prev);
1567
1741
  },
@@ -1595,17 +1769,17 @@ function HelpCenterListAuthed({
1595
1769
  "Couldn\u2019t load your tickets. ",
1596
1770
  error.message
1597
1771
  ] }),
1598
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUXZ3ZJ3Mcjs.Button, { type: "button", variant: "accent", onClick: () => refetch(), children: "Retry" })
1772
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXDPSSE4Ocjs.Button, { type: "button", variant: "accent", onClick: () => refetch(), children: "Retry" })
1599
1773
  ] }),
1600
- !error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.DevCardRowSkeletonList, {}) : !hasResults && isFetching ? (
1774
+ !error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevCardRowSkeletonList, {}) : !hasResults && isFetching ? (
1601
1775
  // Bridge state — background refetch in flight and the
1602
1776
  // optimistic placeholder was just removed by the mutation
1603
1777
  // callback. Without this branch "No tickets yet" would flash
1604
1778
  // for ~50ms between `removeOptimistic` and the server
1605
1779
  // response landing.
1606
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.DevCardRowSkeletonList, { rows: 1 })
1780
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevCardRowSkeletonList, { rows: 1 })
1607
1781
  ) : !hasResults ? hasActiveFilters ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1608
- _chunk2G3NXF6Jcjs.EmptyState,
1782
+ _chunkK4DFAVSOcjs.EmptyState,
1609
1783
  {
1610
1784
  type: "search",
1611
1785
  title: "No tickets found",
@@ -1620,7 +1794,7 @@ function HelpCenterListAuthed({
1620
1794
  }
1621
1795
  }
1622
1796
  ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1623
- _chunk2G3NXF6Jcjs.EmptyState,
1797
+ _chunkK4DFAVSOcjs.EmptyState,
1624
1798
  {
1625
1799
  type: "generic",
1626
1800
  title: "No tickets yet",
@@ -1647,14 +1821,16 @@ function HelpCenterListAuthed({
1647
1821
  onSendMessage: actions.sendMessage,
1648
1822
  onClose: actions.closeTicket,
1649
1823
  onReopen: actions.reopenTicket,
1650
- onActionCollapsed: () => setExpandedTicketId(null)
1824
+ onActionCollapsed: () => setExpandedTicketId(null),
1825
+ replyError: actions.replyErrorFor(ticket.external_id),
1826
+ onClearReplyError: () => actions.clearReplyError(ticket.external_id)
1651
1827
  },
1652
1828
  ticket.id
1653
1829
  )) })
1654
1830
  ) }),
1655
- !error && totalPages > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.UnifiedPagination, { currentPage: page, totalPages })
1831
+ !error && totalPages > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkK4DFAVSOcjs.UnifiedPagination, { currentPage: page, totalPages })
1656
1832
  ] });
1657
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2G3NXF6Jcjs.DevSectionPage, { sectionKey: "tickets", preControls: form, children: body });
1833
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIH76P5R6cjs.DevSectionPage, { sectionKey: "tickets", preControls: form, children: body });
1658
1834
  }
1659
1835
 
1660
1836